aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--arch/alpha/kernel/srm_env.c93
-rw-r--r--arch/arm/kernel/atags_proc.c28
-rw-r--r--arch/arm/kernel/swp_emulate.c43
-rw-r--r--arch/arm/mach-msm/last_radio_log.c20
-rw-r--r--arch/arm/mach-omap1/pm.c78
-rw-r--r--arch/blackfin/kernel/cplbinfo.c4
-rw-r--r--arch/cris/arch-v10/kernel/fasttimer.c301
-rw-r--r--arch/cris/arch-v32/kernel/fasttimer.c299
-rw-r--r--arch/h8300/kernel/gpio.c35
-rw-r--r--arch/ia64/kernel/palinfo.c502
-rw-r--r--arch/ia64/kernel/salinfo.c57
-rw-r--r--arch/ia64/sn/kernel/sn2/prominfo_proc.c146
-rw-r--r--arch/mips/kernel/smtc-proc.c64
-rw-r--r--arch/mips/lasat/picvue_proc.c4
-rw-r--r--arch/mips/mm/init.c1
-rw-r--r--arch/mips/pci/ops-pmcmsp.c95
-rw-r--r--arch/mips/sibyte/sb1250/bus_watcher.c81
-rw-r--r--arch/parisc/kernel/pdc_chassis.c47
-rw-r--r--arch/powerpc/kernel/lparcfg.c11
-rw-r--r--arch/powerpc/kernel/proc_powerpc.c21
-rw-r--r--arch/powerpc/kernel/rtas_flash.c452
-rw-r--r--arch/powerpc/kvm/book3s_64_mmu_hv.c2
-rw-r--r--arch/powerpc/kvm/book3s_64_vio.c2
-rw-r--r--arch/powerpc/kvm/book3s_hv.c2
-rw-r--r--arch/powerpc/platforms/cell/spufs/file.c2
-rw-r--r--arch/powerpc/platforms/pseries/reconfig.c2
-rw-r--r--arch/powerpc/platforms/pseries/scanlog.c32
-rw-r--r--arch/s390/kernel/compat_wrapper.S16
-rw-r--r--arch/s390/kernel/irq.c6
-rw-r--r--arch/s390/kernel/os_info.c1
-rw-r--r--arch/s390/kernel/syscalls.S4
-rw-r--r--arch/score/mm/init.c2
-rw-r--r--arch/sh/drivers/dma/dma-api.c28
-rw-r--r--arch/sh/mm/alignment.c2
-rw-r--r--arch/sparc/kernel/ioport.c2
-rw-r--r--arch/sparc/kernel/sun4d_irq.c1
-rw-r--r--arch/tile/kernel/hardwall.c2
-rw-r--r--arch/um/drivers/mconsole_kern.c3
-rw-r--r--arch/x86/ia32/ia32_aout.c30
-rw-r--r--arch/x86/mm/init_64.c1
-rw-r--r--arch/x86/platform/efi/efi.c1
-rw-r--r--arch/x86/platform/efi/efi_64.c1
-rw-r--r--arch/xtensa/platforms/iss/simdisk.c36
-rw-r--r--drivers/acpi/ac.c2
-rw-r--r--drivers/acpi/battery.c2
-rw-r--r--drivers/acpi/button.c2
-rw-r--r--drivers/acpi/proc.c4
-rw-r--r--drivers/acpi/sbs.c29
-rw-r--r--drivers/ata/sata_svw.c29
-rw-r--r--drivers/block/DAC960.c8
-rw-r--r--drivers/block/cciss.c2
-rw-r--r--drivers/block/cciss_scsi.c96
-rw-r--r--drivers/block/cpqarray.c2
-rw-r--r--drivers/block/drbd/drbd_proc.c2
-rw-r--r--drivers/block/loop.c2
-rw-r--r--drivers/block/pktcdvd.c2
-rw-r--r--drivers/block/ps3vram.c2
-rw-r--r--drivers/char/ds1620.c34
-rw-r--r--drivers/char/efirtc.c83
-rw-r--r--drivers/char/genrtc.c48
-rw-r--r--drivers/char/ipmi/ipmi_msghandler.c8
-rw-r--r--drivers/char/ipmi/ipmi_si_intf.c6
-rw-r--r--drivers/firmware/efi/efi-pstore.c1
-rw-r--r--drivers/firmware/efi/efivars.c1
-rw-r--r--drivers/gpu/drm/drm_proc.c43
-rw-r--r--drivers/gpu/drm/drm_stub.c2
-rw-r--r--drivers/ide/ide-cd.c2
-rw-r--r--drivers/ide/ide-disk_proc.c8
-rw-r--r--drivers/ide/ide-floppy_proc.c2
-rw-r--r--drivers/ide/ide-proc.c22
-rw-r--r--drivers/ide/ide-tape.c2
-rw-r--r--drivers/input/misc/hp_sdc_rtc.c58
-rw-r--r--drivers/isdn/gigaset/capi.c2
-rw-r--r--drivers/isdn/hardware/avm/b1.c2
-rw-r--r--drivers/isdn/hardware/avm/b1dma.c2
-rw-r--r--drivers/isdn/hardware/avm/c4.c2
-rw-r--r--drivers/isdn/hardware/eicon/divasproc.c12
-rw-r--r--drivers/isdn/hysdn/hycapi.c2
-rw-r--r--drivers/isdn/hysdn/hysdn_procconf.c32
-rw-r--r--drivers/isdn/hysdn/hysdn_proclog.c71
-rw-r--r--drivers/isdn/mISDN/timerdev.c76
-rw-r--r--drivers/macintosh/via-pmu.c2
-rw-r--r--drivers/media/dvb-core/dvb_frontend.c5
-rw-r--r--drivers/media/dvb-core/dvb_net.c5
-rw-r--r--drivers/media/pci/cx25821/cx25821-audio-upstream.c179
-rw-r--r--drivers/media/pci/ttpci/av7110_ir.c2
-rw-r--r--drivers/media/pci/zoran/zoran_procfs.c4
-rw-r--r--drivers/media/rc/ir-lirc-codec.c2
-rw-r--r--drivers/media/rc/lirc_dev.c2
-rw-r--r--drivers/message/fusion/mptbase.c4
-rw-r--r--drivers/message/fusion/mptctl.c8
-rw-r--r--drivers/message/fusion/mptfc.c2
-rw-r--r--drivers/message/fusion/mptsas.c2
-rw-r--r--drivers/message/fusion/mptscsih.c98
-rw-r--r--drivers/message/fusion/mptscsih.h2
-rw-r--r--drivers/message/fusion/mptspi.c2
-rw-r--r--drivers/message/i2o/i2o_proc.c97
-rw-r--r--drivers/misc/lis3lv02d/lis3lv02d.c1
-rw-r--r--drivers/misc/sgi-gru/gruprocfs.c2
-rw-r--r--drivers/mtd/mtdcore.c1
-rw-r--r--drivers/net/bonding/bond_procfs.c4
-rw-r--r--drivers/net/irda/vlsi_ir.c4
-rw-r--r--drivers/net/wireless/airo.c116
-rw-r--r--drivers/net/wireless/ath/wil6210/debugfs.c4
-rw-r--r--drivers/net/wireless/atmel.c69
-rw-r--r--drivers/net/wireless/hostap/hostap_ap.c375
-rw-r--r--drivers/net/wireless/hostap/hostap_download.c68
-rw-r--r--drivers/net/wireless/hostap/hostap_hw.c38
-rw-r--r--drivers/net/wireless/hostap/hostap_proc.c609
-rw-r--r--drivers/net/wireless/hostap/hostap_wlan.h3
-rw-r--r--drivers/net/wireless/ray_cs.c2
-rw-r--r--drivers/nubus/nubus.c55
-rw-r--r--drivers/nubus/proc.c80
-rw-r--r--drivers/of/base.c11
-rw-r--r--drivers/parisc/led.c4
-rw-r--r--drivers/pci/proc.c34
-rw-r--r--drivers/platform/x86/thinkpad_acpi.c4
-rw-r--r--drivers/platform/x86/toshiba_acpi.c18
-rw-r--r--drivers/pnp/isapnp/proc.c6
-rw-r--r--drivers/pnp/pnpbios/proc.c4
-rw-r--r--drivers/pps/clients/pps_parport.c1
-rw-r--r--drivers/rtc/rtc-proc.c2
-rw-r--r--drivers/s390/cio/qdio_debug.c2
-rw-r--r--drivers/scsi/BusLogic.c83
-rw-r--r--drivers/scsi/BusLogic.h1
-rw-r--r--drivers/scsi/NCR5380.c61
-rw-r--r--drivers/scsi/NCR5380.h6
-rw-r--r--drivers/scsi/a2091.c3
-rw-r--r--drivers/scsi/a3000.c3
-rw-r--r--drivers/scsi/advansys.c1164
-rw-r--r--drivers/scsi/aha152x.c61
-rw-r--r--drivers/scsi/aha1740.c29
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_osm.c9
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_osm.h12
-rw-r--r--drivers/scsi/aic7xxx/aic79xx_proc.c163
-rw-r--r--drivers/scsi/aic7xxx/aic7xxx_osm.c9
-rw-r--r--drivers/scsi/aic7xxx/aic7xxx_osm.h12
-rw-r--r--drivers/scsi/aic7xxx/aic7xxx_proc.c153
-rw-r--r--drivers/scsi/aic7xxx_old.c2
-rw-r--r--drivers/scsi/aic7xxx_old/aic7xxx_proc.c221
-rw-r--r--drivers/scsi/arm/acornscsi.c58
-rw-r--r--drivers/scsi/arm/arxescsi.c40
-rw-r--r--drivers/scsi/arm/cumana_1.c1
-rw-r--r--drivers/scsi/arm/cumana_2.c43
-rw-r--r--drivers/scsi/arm/eesox.c42
-rw-r--r--drivers/scsi/arm/fas216.c31
-rw-r--r--drivers/scsi/arm/fas216.h6
-rw-r--r--drivers/scsi/arm/oak.c6
-rw-r--r--drivers/scsi/arm/powertec.c29
-rw-r--r--drivers/scsi/atari_NCR5380.c145
-rw-r--r--drivers/scsi/atari_scsi.c2
-rw-r--r--drivers/scsi/atari_scsi.h2
-rw-r--r--drivers/scsi/atp870u.c40
-rw-r--r--drivers/scsi/dc395x.c20
-rw-r--r--drivers/scsi/dpt_i2o.c102
-rw-r--r--drivers/scsi/dtc.c3
-rw-r--r--drivers/scsi/dtc.h3
-rw-r--r--drivers/scsi/eata_pio.c56
-rw-r--r--drivers/scsi/g_NCR5380.c51
-rw-r--r--drivers/scsi/gdth.c3
-rw-r--r--drivers/scsi/gdth.h3
-rw-r--r--drivers/scsi/gdth_proc.c211
-rw-r--r--drivers/scsi/gdth_proc.h5
-rw-r--r--drivers/scsi/gvp11.c3
-rw-r--r--drivers/scsi/imm.c40
-rw-r--r--drivers/scsi/in2000.c178
-rw-r--r--drivers/scsi/ips.c238
-rw-r--r--drivers/scsi/ips.h9
-rw-r--r--drivers/scsi/lpfc/lpfc_init.c33
-rw-r--r--drivers/scsi/mac_scsi.c3
-rw-r--r--drivers/scsi/mac_scsi.h3
-rw-r--r--drivers/scsi/megaraid.c1040
-rw-r--r--drivers/scsi/megaraid.h17
-rw-r--r--drivers/scsi/mpt2sas/mpt2sas_ctl.c14
-rw-r--r--drivers/scsi/mpt3sas/mpt3sas_ctl.c14
-rw-r--r--drivers/scsi/mvme147.c3
-rw-r--r--drivers/scsi/nsp32.c39
-rw-r--r--drivers/scsi/pas16.c3
-rw-r--r--drivers/scsi/pas16.h3
-rw-r--r--drivers/scsi/pcmcia/nsp_cs.c36
-rw-r--r--drivers/scsi/pcmcia/nsp_cs.h9
-rw-r--r--drivers/scsi/pmcraid.c14
-rw-r--r--drivers/scsi/ppa.c36
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c2
-rw-r--r--drivers/scsi/scsi_debug.c53
-rw-r--r--drivers/scsi/scsi_proc.c74
-rw-r--r--drivers/scsi/sym53c8xx_2/sym_glue.c115
-rw-r--r--drivers/scsi/t128.c3
-rw-r--r--drivers/scsi/t128.h3
-rw-r--r--drivers/scsi/wd33c93.c194
-rw-r--r--drivers/scsi/wd33c93.h3
-rw-r--r--drivers/scsi/wd7000.c31
-rw-r--r--drivers/staging/comedi/proc.c55
-rw-r--r--drivers/staging/csr/csr_wifi_hip_udi.c353
-rw-r--r--drivers/staging/csr/csr_wifi_hip_unifi_udi.h17
-rw-r--r--drivers/staging/csr/drv.c4
-rw-r--r--drivers/staging/csr/io.c151
-rw-r--r--drivers/staging/cxt1e1/Makefile3
-rw-r--r--drivers/staging/cxt1e1/sbeproc.c460
-rw-r--r--drivers/staging/cxt1e1/sbeproc.h14
-rw-r--r--drivers/staging/dgrp/dgrp_common.c31
-rw-r--r--drivers/staging/dgrp/dgrp_common.h65
-rw-r--r--drivers/staging/dgrp/dgrp_dpa_ops.c29
-rw-r--r--drivers/staging/dgrp/dgrp_mon_ops.c26
-rw-r--r--drivers/staging/dgrp/dgrp_net_ops.c30
-rw-r--r--drivers/staging/dgrp/dgrp_ports_ops.c18
-rw-r--r--drivers/staging/dgrp/dgrp_specproc.c399
-rw-r--r--drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c130
-rw-r--r--drivers/staging/ft1000/ft1000-usb/ft1000_debug.c2
-rw-r--r--drivers/staging/ft1000/ft1000-usb/ft1000_proc.c129
-rw-r--r--drivers/staging/keucr/scsiglue.c45
-rw-r--r--drivers/staging/rtl8187se/r8180.h1
-rw-r--r--drivers/staging/rtl8187se/r8180_core.c146
-rw-r--r--drivers/staging/rtl8192e/rtl8192e/Makefile1
-rw-r--r--drivers/staging/rtl8192e/rtl8192e/rtl_core.c5
-rw-r--r--drivers/staging/rtl8192e/rtl8192e/rtl_core.h6
-rw-r--r--drivers/staging/rtl8192e/rtl8192e/rtl_debug.c1029
-rw-r--r--drivers/staging/rtl8192e/rtllib_crypt_ccmp.c21
-rw-r--r--drivers/staging/rtl8192e/rtllib_crypt_tkip.c44
-rw-r--r--drivers/staging/rtl8192e/rtllib_crypt_wep.c6
-rw-r--r--drivers/staging/rtl8192e/rtllib_module.c54
-rw-r--r--drivers/staging/rtl8192u/ieee80211/ieee80211_module.c53
-rw-r--r--drivers/staging/rtl8192u/ieee80211/proc.c8
-rw-r--r--drivers/staging/rtl8192u/r8192U.h1
-rw-r--r--drivers/staging/rtl8192u/r8192U_core.c211
-rw-r--r--drivers/staging/rts5139/rts51x_scsi.c30
-rw-r--r--drivers/staging/rts5139/rts51x_scsi.h2
-rw-r--r--drivers/staging/silicom/Makefile3
-rw-r--r--drivers/staging/silicom/bp_proc.c1327
-rw-r--r--drivers/staging/silicom/bpctl_mod.c (renamed from drivers/staging/silicom/bp_mod.c)1925
-rw-r--r--drivers/staging/vt6655/device_main.c74
-rw-r--r--drivers/staging/vt6656/main_usb.c63
-rw-r--r--drivers/staging/wlags49_h2/wl_main.c331
-rw-r--r--drivers/target/loopback/tcm_loop.c9
-rw-r--r--drivers/tty/serial/serial_core.c2
-rw-r--r--drivers/usb/gadget/at91_udc.c2
-rw-r--r--drivers/usb/gadget/f_fs.c2
-rw-r--r--drivers/usb/gadget/fsl_udc_core.c124
-rw-r--r--drivers/usb/gadget/goku_udc.c89
-rw-r--r--drivers/usb/gadget/inode.c2
-rw-r--r--drivers/usb/gadget/lpc32xx_udc.c2
-rw-r--r--drivers/usb/gadget/rndis.c4
-rw-r--r--drivers/usb/host/isp1362-hcd.c7
-rw-r--r--drivers/usb/host/sl811-hcd.c2
-rw-r--r--drivers/usb/misc/yurex.c2
-rw-r--r--drivers/usb/storage/scsiglue.c42
-rw-r--r--drivers/video/bfin_adv7393fb.c43
-rw-r--r--drivers/video/pxa3xx-gcu.c36
-rw-r--r--drivers/zorro/proc.c6
-rw-r--r--fs/Makefile2
-rw-r--r--fs/afs/proc.c8
-rw-r--r--fs/aio.c4
-rw-r--r--fs/binfmt_aout.c25
-rw-r--r--fs/binfmt_elf_fdpic.c7
-rw-r--r--fs/binfmt_flat.c37
-rw-r--r--fs/btrfs/file.c3
-rw-r--r--fs/cachefiles/rdwr.c2
-rw-r--r--fs/cifs/file.c3
-rw-r--r--fs/coda/file.c2
-rw-r--r--fs/compat.c184
-rw-r--r--fs/coredump.c6
-rw-r--r--fs/efivarfs/file.c1
-rw-r--r--fs/efivarfs/inode.c1
-rw-r--r--fs/efivarfs/super.c2
-rw-r--r--fs/exec.c9
-rw-r--r--fs/ext4/mballoc.c2
-rw-r--r--fs/ext4/super.c2
-rw-r--r--fs/f2fs/acl.c2
-rw-r--r--fs/f2fs/dir.c2
-rw-r--r--fs/f2fs/file.c4
-rw-r--r--fs/fifo.c153
-rw-r--r--fs/file.c68
-rw-r--r--fs/fuse/dev.c2
-rw-r--r--fs/fuse/file.c2
-rw-r--r--fs/hpfs/file.c36
-rw-r--r--fs/hppfs/hppfs.c20
-rw-r--r--fs/inode.c2
-rw-r--r--fs/internal.h5
-rw-r--r--fs/jbd2/journal.c2
-rw-r--r--fs/mount.h7
-rw-r--r--fs/namespace.c341
-rw-r--r--fs/nfsd/nfsctl.c4
-rw-r--r--fs/notify/inotify/inotify_user.c3
-rw-r--r--fs/ntfs/file.c2
-rw-r--r--fs/ocfs2/file.c9
-rw-r--r--fs/pipe.c458
-rw-r--r--fs/pnode.c10
-rw-r--r--fs/pnode.h7
-rw-r--r--fs/proc/base.c56
-rw-r--r--fs/proc/fd.h5
-rw-r--r--fs/proc/generic.c377
-rw-r--r--fs/proc/inode.c283
-rw-r--r--fs/proc/internal.h313
-rw-r--r--fs/proc/kcore.c2
-rw-r--r--fs/proc/namespaces.c17
-rw-r--r--fs/proc/proc_devtree.c2
-rw-r--r--fs/proc/proc_net.c4
-rw-r--r--fs/proc/root.c2
-rw-r--r--fs/proc/self.c47
-rw-r--r--fs/proc/vmcore.c5
-rw-r--r--fs/read_write.c205
-rw-r--r--fs/read_write.h5
-rw-r--r--fs/reiserfs/file.c61
-rw-r--r--fs/reiserfs/procfs.c62
-rw-r--r--fs/seq_file.c18
-rw-r--r--fs/splice.c14
-rw-r--r--fs/xfs/xfs_file.c3
-rw-r--r--include/drm/drmP.h5
-rw-r--r--include/linux/binfmts.h1
-rw-r--r--include/linux/cgroup.h2
-rw-r--r--include/linux/cpuset.h3
-rw-r--r--include/linux/fdtable.h1
-rw-r--r--include/linux/fs.h19
-rw-r--r--include/linux/kcore.h38
-rw-r--r--include/linux/nubus.h4
-rw-r--r--include/linux/of.h10
-rw-r--r--include/linux/pid_namespace.h1
-rw-r--r--include/linux/pipe_fs_i.h11
-rw-r--r--include/linux/proc_fs.h325
-rw-r--r--include/linux/proc_ns.h74
-rw-r--r--include/linux/profile.h4
-rw-r--r--include/linux/seq_file.h1
-rw-r--r--include/linux/signal.h5
-rw-r--r--include/linux/tty.h7
-rw-r--r--include/net/bluetooth/bluetooth.h3
-rw-r--r--include/net/lib80211.h4
-rw-r--r--include/scsi/scsi_host.h6
-rw-r--r--init/version.c2
-rw-r--r--ipc/msgutil.c2
-rw-r--r--ipc/namespace.c2
-rw-r--r--ipc/util.c2
-rw-r--r--kernel/acct.c2
-rw-r--r--kernel/cgroup.c15
-rw-r--r--kernel/configs.c2
-rw-r--r--kernel/cpuset.c15
-rw-r--r--kernel/exit.c2
-rw-r--r--kernel/irq/proc.c20
-rw-r--r--kernel/nsproxy.c6
-rw-r--r--kernel/pid.c1
-rw-r--r--kernel/pid_namespace.c2
-rw-r--r--kernel/profile.c6
-rw-r--r--kernel/sched/stats.c7
-rw-r--r--kernel/user.c2
-rw-r--r--kernel/user_namespace.c2
-rw-r--r--kernel/utsname.c2
-rw-r--r--lib/notifier-error-inject.c4
-rw-r--r--mm/filemap.c2
-rw-r--r--mm/filemap_xip.c3
-rw-r--r--mm/vmalloc.c45
-rw-r--r--net/8021q/vlanproc.c11
-rw-r--r--net/atm/proc.c2
-rw-r--r--net/bluetooth/af_bluetooth.c27
-rw-r--r--net/bluetooth/bnep/sock.c2
-rw-r--r--net/bluetooth/cmtp/capi.c2
-rw-r--r--net/bluetooth/cmtp/sock.c2
-rw-r--r--net/bluetooth/hci_sock.c2
-rw-r--r--net/bluetooth/hidp/sock.c2
-rw-r--r--net/bluetooth/l2cap_sock.c2
-rw-r--r--net/bluetooth/rfcomm/sock.c2
-rw-r--r--net/bluetooth/sco.c2
-rw-r--r--net/can/bcm.c2
-rw-r--r--net/can/proc.c2
-rw-r--r--net/core/neighbour.c2
-rw-r--r--net/core/net_namespace.c7
-rw-r--r--net/core/pktgen.c12
-rw-r--r--net/ipv4/netfilter/ipt_CLUSTERIP.c10
-rw-r--r--net/ipv4/tcp_ipv4.c2
-rw-r--r--net/ipv4/udp.c2
-rw-r--r--net/ipv6/proc.c5
-rw-r--r--net/netfilter/x_tables.c6
-rw-r--r--net/netfilter/xt_hashlimit.c16
-rw-r--r--net/netfilter/xt_recent.c9
-rw-r--r--net/socket.c9
-rw-r--r--net/sunrpc/cache.c24
-rw-r--r--net/sunrpc/stats.c2
-rw-r--r--net/wireless/lib80211_crypt_ccmp.c29
-rw-r--r--net/wireless/lib80211_crypt_tkip.c44
-rw-r--r--net/wireless/lib80211_crypt_wep.c5
-rw-r--r--net/x25/x25_proc.c47
-rw-r--r--security/tomoyo/common.c5
-rw-r--r--security/tomoyo/common.h2
-rw-r--r--security/tomoyo/securityfs_if.c5
-rw-r--r--sound/core/info.c45
-rw-r--r--sound/oss/dmasound/dmasound_core.c6
-rw-r--r--sound/sound_firmware.c9
385 files changed, 7395 insertions, 14539 deletions
diff --git a/arch/alpha/kernel/srm_env.c b/arch/alpha/kernel/srm_env.c
index e64559f0a82d..ffe996a54fad 100644
--- a/arch/alpha/kernel/srm_env.c
+++ b/arch/alpha/kernel/srm_env.c
@@ -51,13 +51,11 @@ MODULE_LICENSE("GPL");
51typedef struct _srm_env { 51typedef struct _srm_env {
52 char *name; 52 char *name;
53 unsigned long id; 53 unsigned long id;
54 struct proc_dir_entry *proc_entry;
55} srm_env_t; 54} srm_env_t;
56 55
57static struct proc_dir_entry *base_dir; 56static struct proc_dir_entry *base_dir;
58static struct proc_dir_entry *named_dir; 57static struct proc_dir_entry *named_dir;
59static struct proc_dir_entry *numbered_dir; 58static struct proc_dir_entry *numbered_dir;
60static char number[256][4];
61 59
62static srm_env_t srm_named_entries[] = { 60static srm_env_t srm_named_entries[] = {
63 { "auto_action", ENV_AUTO_ACTION }, 61 { "auto_action", ENV_AUTO_ACTION },
@@ -77,21 +75,18 @@ static srm_env_t srm_named_entries[] = {
77 { "tty_dev", ENV_TTY_DEV }, 75 { "tty_dev", ENV_TTY_DEV },
78 { NULL, 0 }, 76 { NULL, 0 },
79}; 77};
80static srm_env_t srm_numbered_entries[256];
81
82 78
83static int srm_env_proc_show(struct seq_file *m, void *v) 79static int srm_env_proc_show(struct seq_file *m, void *v)
84{ 80{
85 unsigned long ret; 81 unsigned long ret;
86 srm_env_t *entry; 82 unsigned long id = (unsigned long)m->private;
87 char *page; 83 char *page;
88 84
89 entry = m->private;
90 page = (char *)__get_free_page(GFP_USER); 85 page = (char *)__get_free_page(GFP_USER);
91 if (!page) 86 if (!page)
92 return -ENOMEM; 87 return -ENOMEM;
93 88
94 ret = callback_getenv(entry->id, page, PAGE_SIZE); 89 ret = callback_getenv(id, page, PAGE_SIZE);
95 90
96 if ((ret >> 61) == 0) { 91 if ((ret >> 61) == 0) {
97 seq_write(m, page, ret); 92 seq_write(m, page, ret);
@@ -104,14 +99,14 @@ static int srm_env_proc_show(struct seq_file *m, void *v)
104 99
105static int srm_env_proc_open(struct inode *inode, struct file *file) 100static int srm_env_proc_open(struct inode *inode, struct file *file)
106{ 101{
107 return single_open(file, srm_env_proc_show, PDE(inode)->data); 102 return single_open(file, srm_env_proc_show, PDE_DATA(inode));
108} 103}
109 104
110static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer, 105static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,
111 size_t count, loff_t *pos) 106 size_t count, loff_t *pos)
112{ 107{
113 int res; 108 int res;
114 srm_env_t *entry = PDE(file_inode(file))->data; 109 unsigned long id = (unsigned long)PDE_DATA(file_inode(file));
115 char *buf = (char *) __get_free_page(GFP_USER); 110 char *buf = (char *) __get_free_page(GFP_USER);
116 unsigned long ret1, ret2; 111 unsigned long ret1, ret2;
117 112
@@ -127,7 +122,7 @@ static ssize_t srm_env_proc_write(struct file *file, const char __user *buffer,
127 goto out; 122 goto out;
128 buf[count] = '\0'; 123 buf[count] = '\0';
129 124
130 ret1 = callback_setenv(entry->id, buf, count); 125 ret1 = callback_setenv(id, buf, count);
131 if ((ret1 >> 61) == 0) { 126 if ((ret1 >> 61) == 0) {
132 do 127 do
133 ret2 = callback_save_env(); 128 ret2 = callback_save_env();
@@ -149,52 +144,6 @@ static const struct file_operations srm_env_proc_fops = {
149 .write = srm_env_proc_write, 144 .write = srm_env_proc_write,
150}; 145};
151 146
152static void
153srm_env_cleanup(void)
154{
155 srm_env_t *entry;
156 unsigned long var_num;
157
158 if (base_dir) {
159 /*
160 * Remove named entries
161 */
162 if (named_dir) {
163 entry = srm_named_entries;
164 while (entry->name != NULL && entry->id != 0) {
165 if (entry->proc_entry) {
166 remove_proc_entry(entry->name,
167 named_dir);
168 entry->proc_entry = NULL;
169 }
170 entry++;
171 }
172 remove_proc_entry(NAMED_DIR, base_dir);
173 }
174
175 /*
176 * Remove numbered entries
177 */
178 if (numbered_dir) {
179 for (var_num = 0; var_num <= 255; var_num++) {
180 entry = &srm_numbered_entries[var_num];
181
182 if (entry->proc_entry) {
183 remove_proc_entry(entry->name,
184 numbered_dir);
185 entry->proc_entry = NULL;
186 entry->name = NULL;
187 }
188 }
189 remove_proc_entry(NUMBERED_DIR, base_dir);
190 }
191
192 remove_proc_entry(BASE_DIR, NULL);
193 }
194
195 return;
196}
197
198static int __init 147static int __init
199srm_env_init(void) 148srm_env_init(void)
200{ 149{
@@ -213,19 +162,13 @@ srm_env_init(void)
213 } 162 }
214 163
215 /* 164 /*
216 * Init numbers
217 */
218 for (var_num = 0; var_num <= 255; var_num++)
219 sprintf(number[var_num], "%ld", var_num);
220
221 /*
222 * Create base directory 165 * Create base directory
223 */ 166 */
224 base_dir = proc_mkdir(BASE_DIR, NULL); 167 base_dir = proc_mkdir(BASE_DIR, NULL);
225 if (!base_dir) { 168 if (!base_dir) {
226 printk(KERN_ERR "Couldn't create base dir /proc/%s\n", 169 printk(KERN_ERR "Couldn't create base dir /proc/%s\n",
227 BASE_DIR); 170 BASE_DIR);
228 goto cleanup; 171 return -ENOMEM;
229 } 172 }
230 173
231 /* 174 /*
@@ -254,9 +197,8 @@ srm_env_init(void)
254 */ 197 */
255 entry = srm_named_entries; 198 entry = srm_named_entries;
256 while (entry->name && entry->id) { 199 while (entry->name && entry->id) {
257 entry->proc_entry = proc_create_data(entry->name, 0644, named_dir, 200 if (!proc_create_data(entry->name, 0644, named_dir,
258 &srm_env_proc_fops, entry); 201 &srm_env_proc_fops, (void *)entry->id))
259 if (!entry->proc_entry)
260 goto cleanup; 202 goto cleanup;
261 entry++; 203 entry++;
262 } 204 }
@@ -265,15 +207,11 @@ srm_env_init(void)
265 * Create all numbered nodes 207 * Create all numbered nodes
266 */ 208 */
267 for (var_num = 0; var_num <= 255; var_num++) { 209 for (var_num = 0; var_num <= 255; var_num++) {
268 entry = &srm_numbered_entries[var_num]; 210 char name[4];
269 entry->name = number[var_num]; 211 sprintf(name, "%ld", var_num);
270 212 if (!proc_create_data(name, 0644, numbered_dir,
271 entry->proc_entry = proc_create_data(entry->name, 0644, numbered_dir, 213 &srm_env_proc_fops, (void *)var_num))
272 &srm_env_proc_fops, entry);
273 if (!entry->proc_entry)
274 goto cleanup; 214 goto cleanup;
275
276 entry->id = var_num;
277 } 215 }
278 216
279 printk(KERN_INFO "%s: version %s loaded successfully\n", NAME, 217 printk(KERN_INFO "%s: version %s loaded successfully\n", NAME,
@@ -282,18 +220,15 @@ srm_env_init(void)
282 return 0; 220 return 0;
283 221
284cleanup: 222cleanup:
285 srm_env_cleanup(); 223 remove_proc_subtree(BASE_DIR, NULL);
286
287 return -ENOMEM; 224 return -ENOMEM;
288} 225}
289 226
290static void __exit 227static void __exit
291srm_env_exit(void) 228srm_env_exit(void)
292{ 229{
293 srm_env_cleanup(); 230 remove_proc_subtree(BASE_DIR, NULL);
294 printk(KERN_INFO "%s: unloaded successfully\n", NAME); 231 printk(KERN_INFO "%s: unloaded successfully\n", NAME);
295
296 return;
297} 232}
298 233
299module_init(srm_env_init); 234module_init(srm_env_init);
diff --git a/arch/arm/kernel/atags_proc.c b/arch/arm/kernel/atags_proc.c
index 42a1a1415fa6..c7ff8073416f 100644
--- a/arch/arm/kernel/atags_proc.c
+++ b/arch/arm/kernel/atags_proc.c
@@ -9,24 +9,18 @@ struct buffer {
9 char data[]; 9 char data[];
10}; 10};
11 11
12static int 12static ssize_t atags_read(struct file *file, char __user *buf,
13read_buffer(char* page, char** start, off_t off, int count, 13 size_t count, loff_t *ppos)
14 int* eof, void* data)
15{ 14{
16 struct buffer *buffer = (struct buffer *)data; 15 struct buffer *b = PDE_DATA(file_inode(file));
17 16 return simple_read_from_buffer(buf, count, ppos, b->data, b->size);
18 if (off >= buffer->size) {
19 *eof = 1;
20 return 0;
21 }
22
23 count = min((int) (buffer->size - off), count);
24
25 memcpy(page, &buffer->data[off], count);
26
27 return count;
28} 17}
29 18
19static const struct file_operations atags_fops = {
20 .read = atags_read,
21 .llseek = default_llseek,
22};
23
30#define BOOT_PARAMS_SIZE 1536 24#define BOOT_PARAMS_SIZE 1536
31static char __initdata atags_copy[BOOT_PARAMS_SIZE]; 25static char __initdata atags_copy[BOOT_PARAMS_SIZE];
32 26
@@ -66,9 +60,7 @@ static int __init init_atags_procfs(void)
66 b->size = size; 60 b->size = size;
67 memcpy(b->data, atags_copy, size); 61 memcpy(b->data, atags_copy, size);
68 62
69 tags_entry = create_proc_read_entry("atags", 0400, 63 tags_entry = proc_create_data("atags", 0400, NULL, &atags_fops, b);
70 NULL, read_buffer, b);
71
72 if (!tags_entry) 64 if (!tags_entry)
73 goto nomem; 65 goto nomem;
74 66
diff --git a/arch/arm/kernel/swp_emulate.c b/arch/arm/kernel/swp_emulate.c
index ab1017bd1667..087fc321e9e5 100644
--- a/arch/arm/kernel/swp_emulate.c
+++ b/arch/arm/kernel/swp_emulate.c
@@ -21,6 +21,7 @@
21#include <linux/init.h> 21#include <linux/init.h>
22#include <linux/kernel.h> 22#include <linux/kernel.h>
23#include <linux/proc_fs.h> 23#include <linux/proc_fs.h>
24#include <linux/seq_file.h>
24#include <linux/sched.h> 25#include <linux/sched.h>
25#include <linux/syscalls.h> 26#include <linux/syscalls.h>
26#include <linux/perf_event.h> 27#include <linux/perf_event.h>
@@ -79,27 +80,27 @@ static unsigned long abtcounter;
79static pid_t previous_pid; 80static pid_t previous_pid;
80 81
81#ifdef CONFIG_PROC_FS 82#ifdef CONFIG_PROC_FS
82static int proc_read_status(char *page, char **start, off_t off, int count, 83static int proc_status_show(struct seq_file *m, void *v)
83 int *eof, void *data)
84{ 84{
85 char *p = page; 85 seq_printf(m, "Emulated SWP:\t\t%lu\n", swpcounter);
86 int len; 86 seq_printf(m, "Emulated SWPB:\t\t%lu\n", swpbcounter);
87 87 seq_printf(m, "Aborted SWP{B}:\t\t%lu\n", abtcounter);
88 p += sprintf(p, "Emulated SWP:\t\t%lu\n", swpcounter);
89 p += sprintf(p, "Emulated SWPB:\t\t%lu\n", swpbcounter);
90 p += sprintf(p, "Aborted SWP{B}:\t\t%lu\n", abtcounter);
91 if (previous_pid != 0) 88 if (previous_pid != 0)
92 p += sprintf(p, "Last process:\t\t%d\n", previous_pid); 89 seq_printf(m, "Last process:\t\t%d\n", previous_pid);
93 90 return 0;
94 len = (p - page) - off; 91}
95 if (len < 0)
96 len = 0;
97
98 *eof = (len <= count) ? 1 : 0;
99 *start = page + off;
100 92
101 return len; 93static int proc_status_open(struct inode *inode, struct file *file)
94{
95 return single_open(file, proc_status_show, PDE_DATA(inode));
102} 96}
97
98static const struct file_operations proc_status_fops = {
99 .open = proc_status_open,
100 .read = seq_read,
101 .llseek = seq_lseek,
102 .release = seq_release,
103};
103#endif 104#endif
104 105
105/* 106/*
@@ -266,14 +267,8 @@ static struct undef_hook swp_hook = {
266static int __init swp_emulation_init(void) 267static int __init swp_emulation_init(void)
267{ 268{
268#ifdef CONFIG_PROC_FS 269#ifdef CONFIG_PROC_FS
269 struct proc_dir_entry *res; 270 if (!proc_create("cpu/swp_emulation", S_IRUGO, NULL, &proc_status_fops))
270
271 res = create_proc_entry("cpu/swp_emulation", S_IRUGO, NULL);
272
273 if (!res)
274 return -ENOMEM; 271 return -ENOMEM;
275
276 res->read_proc = proc_read_status;
277#endif /* CONFIG_PROC_FS */ 272#endif /* CONFIG_PROC_FS */
278 273
279 printk(KERN_NOTICE "Registering SWP/SWPB emulation handler\n"); 274 printk(KERN_NOTICE "Registering SWP/SWPB emulation handler\n");
diff --git a/arch/arm/mach-msm/last_radio_log.c b/arch/arm/mach-msm/last_radio_log.c
index 1e243f46a969..7777767ee89a 100644
--- a/arch/arm/mach-msm/last_radio_log.c
+++ b/arch/arm/mach-msm/last_radio_log.c
@@ -31,20 +31,8 @@ extern void *smem_item(unsigned id, unsigned *size);
31static ssize_t last_radio_log_read(struct file *file, char __user *buf, 31static ssize_t last_radio_log_read(struct file *file, char __user *buf,
32 size_t len, loff_t *offset) 32 size_t len, loff_t *offset)
33{ 33{
34 loff_t pos = *offset; 34 return simple_read_from_buffer(buf, len, offset,
35 ssize_t count; 35 radio_log_base, radio_log_size);
36
37 if (pos >= radio_log_size)
38 return 0;
39
40 count = min(len, (size_t)(radio_log_size - pos));
41 if (copy_to_user(buf, radio_log_base + pos, count)) {
42 pr_err("%s: copy to user failed\n", __func__);
43 return -EFAULT;
44 }
45
46 *offset += count;
47 return count;
48} 36}
49 37
50static struct file_operations last_radio_log_fops = { 38static struct file_operations last_radio_log_fops = {
@@ -67,7 +55,8 @@ void msm_init_last_radio_log(struct module *owner)
67 return; 55 return;
68 } 56 }
69 57
70 entry = create_proc_entry("last_radio_log", S_IFREG | S_IRUGO, NULL); 58 entry = proc_create("last_radio_log", S_IRUGO, NULL,
59 &last_radio_log_fops);
71 if (!entry) { 60 if (!entry) {
72 pr_err("%s: could not create proc entry for radio log\n", 61 pr_err("%s: could not create proc entry for radio log\n",
73 __func__); 62 __func__);
@@ -77,7 +66,6 @@ void msm_init_last_radio_log(struct module *owner)
77 pr_err("%s: last radio log is %d bytes long\n", __func__, 66 pr_err("%s: last radio log is %d bytes long\n", __func__,
78 radio_log_size); 67 radio_log_size);
79 last_radio_log_fops.owner = owner; 68 last_radio_log_fops.owner = owner;
80 entry->proc_fops = &last_radio_log_fops;
81 entry->size = radio_log_size; 69 entry->size = radio_log_size;
82} 70}
83EXPORT_SYMBOL(msm_init_last_radio_log); 71EXPORT_SYMBOL(msm_init_last_radio_log);
diff --git a/arch/arm/mach-omap1/pm.c b/arch/arm/mach-omap1/pm.c
index db37f49da5ac..dd712f109738 100644
--- a/arch/arm/mach-omap1/pm.c
+++ b/arch/arm/mach-omap1/pm.c
@@ -37,7 +37,8 @@
37 37
38#include <linux/suspend.h> 38#include <linux/suspend.h>
39#include <linux/sched.h> 39#include <linux/sched.h>
40#include <linux/proc_fs.h> 40#include <linux/debugfs.h>
41#include <linux/seq_file.h>
41#include <linux/interrupt.h> 42#include <linux/interrupt.h>
42#include <linux/sysfs.h> 43#include <linux/sysfs.h>
43#include <linux/module.h> 44#include <linux/module.h>
@@ -423,23 +424,12 @@ void omap1_pm_suspend(void)
423 omap_rev()); 424 omap_rev());
424} 425}
425 426
426#if defined(DEBUG) && defined(CONFIG_PROC_FS) 427#ifdef CONFIG_DEBUG_FS
427static int g_read_completed;
428
429/* 428/*
430 * Read system PM registers for debugging 429 * Read system PM registers for debugging
431 */ 430 */
432static int omap_pm_read_proc( 431static int omap_pm_debug_show(struct seq_file *m, void *v)
433 char *page_buffer,
434 char **my_first_byte,
435 off_t virtual_start,
436 int length,
437 int *eof,
438 void *data)
439{ 432{
440 int my_buffer_offset = 0;
441 char * const my_base = page_buffer;
442
443 ARM_SAVE(ARM_CKCTL); 433 ARM_SAVE(ARM_CKCTL);
444 ARM_SAVE(ARM_IDLECT1); 434 ARM_SAVE(ARM_IDLECT1);
445 ARM_SAVE(ARM_IDLECT2); 435 ARM_SAVE(ARM_IDLECT2);
@@ -480,10 +470,7 @@ static int omap_pm_read_proc(
480 MPUI1610_SAVE(EMIFS_CONFIG); 470 MPUI1610_SAVE(EMIFS_CONFIG);
481 } 471 }
482 472
483 if (virtual_start == 0) { 473 seq_printf(m,
484 g_read_completed = 0;
485
486 my_buffer_offset += sprintf(my_base + my_buffer_offset,
487 "ARM_CKCTL_REG: 0x%-8x \n" 474 "ARM_CKCTL_REG: 0x%-8x \n"
488 "ARM_IDLECT1_REG: 0x%-8x \n" 475 "ARM_IDLECT1_REG: 0x%-8x \n"
489 "ARM_IDLECT2_REG: 0x%-8x \n" 476 "ARM_IDLECT2_REG: 0x%-8x \n"
@@ -513,8 +500,8 @@ static int omap_pm_read_proc(
513 ULPD_SHOW(ULPD_STATUS_REQ), 500 ULPD_SHOW(ULPD_STATUS_REQ),
514 ULPD_SHOW(ULPD_POWER_CTRL)); 501 ULPD_SHOW(ULPD_POWER_CTRL));
515 502
516 if (cpu_is_omap7xx()) { 503 if (cpu_is_omap7xx()) {
517 my_buffer_offset += sprintf(my_base + my_buffer_offset, 504 seq_printf(m,
518 "MPUI7XX_CTRL_REG 0x%-8x \n" 505 "MPUI7XX_CTRL_REG 0x%-8x \n"
519 "MPUI7XX_DSP_STATUS_REG: 0x%-8x \n" 506 "MPUI7XX_DSP_STATUS_REG: 0x%-8x \n"
520 "MPUI7XX_DSP_BOOT_CONFIG_REG: 0x%-8x \n" 507 "MPUI7XX_DSP_BOOT_CONFIG_REG: 0x%-8x \n"
@@ -527,8 +514,8 @@ static int omap_pm_read_proc(
527 MPUI7XX_SHOW(MPUI_DSP_API_CONFIG), 514 MPUI7XX_SHOW(MPUI_DSP_API_CONFIG),
528 MPUI7XX_SHOW(EMIFF_SDRAM_CONFIG), 515 MPUI7XX_SHOW(EMIFF_SDRAM_CONFIG),
529 MPUI7XX_SHOW(EMIFS_CONFIG)); 516 MPUI7XX_SHOW(EMIFS_CONFIG));
530 } else if (cpu_is_omap15xx()) { 517 } else if (cpu_is_omap15xx()) {
531 my_buffer_offset += sprintf(my_base + my_buffer_offset, 518 seq_printf(m,
532 "MPUI1510_CTRL_REG 0x%-8x \n" 519 "MPUI1510_CTRL_REG 0x%-8x \n"
533 "MPUI1510_DSP_STATUS_REG: 0x%-8x \n" 520 "MPUI1510_DSP_STATUS_REG: 0x%-8x \n"
534 "MPUI1510_DSP_BOOT_CONFIG_REG: 0x%-8x \n" 521 "MPUI1510_DSP_BOOT_CONFIG_REG: 0x%-8x \n"
@@ -541,8 +528,8 @@ static int omap_pm_read_proc(
541 MPUI1510_SHOW(MPUI_DSP_API_CONFIG), 528 MPUI1510_SHOW(MPUI_DSP_API_CONFIG),
542 MPUI1510_SHOW(EMIFF_SDRAM_CONFIG), 529 MPUI1510_SHOW(EMIFF_SDRAM_CONFIG),
543 MPUI1510_SHOW(EMIFS_CONFIG)); 530 MPUI1510_SHOW(EMIFS_CONFIG));
544 } else if (cpu_is_omap16xx()) { 531 } else if (cpu_is_omap16xx()) {
545 my_buffer_offset += sprintf(my_base + my_buffer_offset, 532 seq_printf(m,
546 "MPUI1610_CTRL_REG 0x%-8x \n" 533 "MPUI1610_CTRL_REG 0x%-8x \n"
547 "MPUI1610_DSP_STATUS_REG: 0x%-8x \n" 534 "MPUI1610_DSP_STATUS_REG: 0x%-8x \n"
548 "MPUI1610_DSP_BOOT_CONFIG_REG: 0x%-8x \n" 535 "MPUI1610_DSP_BOOT_CONFIG_REG: 0x%-8x \n"
@@ -555,28 +542,37 @@ static int omap_pm_read_proc(
555 MPUI1610_SHOW(MPUI_DSP_API_CONFIG), 542 MPUI1610_SHOW(MPUI_DSP_API_CONFIG),
556 MPUI1610_SHOW(EMIFF_SDRAM_CONFIG), 543 MPUI1610_SHOW(EMIFF_SDRAM_CONFIG),
557 MPUI1610_SHOW(EMIFS_CONFIG)); 544 MPUI1610_SHOW(EMIFS_CONFIG));
558 }
559
560 g_read_completed++;
561 } else if (g_read_completed >= 1) {
562 *eof = 1;
563 return 0;
564 } 545 }
565 g_read_completed++;
566 546
567 *my_first_byte = page_buffer; 547 return 0;
568 return my_buffer_offset; 548}
549
550static int omap_pm_debug_open(struct inode *inode, struct file *file)
551{
552 return single_open(file, omap_pm_debug_show,
553 &inode->i_private);
569} 554}
570 555
571static void omap_pm_init_proc(void) 556static const struct file_operations omap_pm_debug_fops = {
557 .open = omap_pm_debug_open,
558 .read = seq_read,
559 .llseek = seq_lseek,
560 .release = seq_release,
561};
562
563static void omap_pm_init_debugfs(void)
572{ 564{
573 /* XXX Appears to leak memory */ 565 struct dentry *d;
574 create_proc_read_entry("driver/omap_pm", 566
575 S_IWUSR | S_IRUGO, NULL, 567 d = debugfs_create_dir("pm_debug", NULL);
576 omap_pm_read_proc, NULL); 568 if (!d)
569 return;
570
571 (void) debugfs_create_file("omap_pm", S_IWUSR | S_IRUGO,
572 d, NULL, &omap_pm_debug_fops);
577} 573}
578 574
579#endif /* DEBUG && CONFIG_PROC_FS */ 575#endif /* CONFIG_DEBUG_FS */
580 576
581/* 577/*
582 * omap_pm_prepare - Do preliminary suspend work. 578 * omap_pm_prepare - Do preliminary suspend work.
@@ -701,8 +697,8 @@ static int __init omap_pm_init(void)
701 697
702 suspend_set_ops(&omap_pm_ops); 698 suspend_set_ops(&omap_pm_ops);
703 699
704#if defined(DEBUG) && defined(CONFIG_PROC_FS) 700#ifdef CONFIG_DEBUG_FS
705 omap_pm_init_proc(); 701 omap_pm_init_debugfs();
706#endif 702#endif
707 703
708#ifdef CONFIG_OMAP_32K_TIMER 704#ifdef CONFIG_OMAP_32K_TIMER
diff --git a/arch/blackfin/kernel/cplbinfo.c b/arch/blackfin/kernel/cplbinfo.c
index e1d0b24c6070..404045dcc5e4 100644
--- a/arch/blackfin/kernel/cplbinfo.c
+++ b/arch/blackfin/kernel/cplbinfo.c
@@ -116,14 +116,12 @@ static const struct seq_operations cplbinfo_sops = {
116 116
117static int cplbinfo_open(struct inode *inode, struct file *file) 117static int cplbinfo_open(struct inode *inode, struct file *file)
118{ 118{
119 struct proc_dir_entry *pde = PDE(file_inode(file));
120 char cplb_type; 119 char cplb_type;
121 unsigned int cpu; 120 unsigned int cpu = (unsigned long)PDE_DATA(file_inode(file));
122 int ret; 121 int ret;
123 struct seq_file *m; 122 struct seq_file *m;
124 struct cplbinfo_data *cdata; 123 struct cplbinfo_data *cdata;
125 124
126 cpu = (unsigned int)pde->data;
127 cplb_type = cpu & CPLBINFO_DCPLB_FLAG ? 'D' : 'I'; 125 cplb_type = cpu & CPLBINFO_DCPLB_FLAG ? 'D' : 'I';
128 cpu &= ~CPLBINFO_DCPLB_FLAG; 126 cpu &= ~CPLBINFO_DCPLB_FLAG;
129 127
diff --git a/arch/cris/arch-v10/kernel/fasttimer.c b/arch/cris/arch-v10/kernel/fasttimer.c
index 082f1890bacb..ce6f512968a4 100644
--- a/arch/cris/arch-v10/kernel/fasttimer.c
+++ b/arch/cris/arch-v10/kernel/fasttimer.c
@@ -25,6 +25,7 @@
25#include <arch/svinto.h> 25#include <arch/svinto.h>
26#include <asm/fasttimer.h> 26#include <asm/fasttimer.h>
27#include <linux/proc_fs.h> 27#include <linux/proc_fs.h>
28#include <linux/seq_file.h>
28 29
29 30
30#define DEBUG_LOG_INCLUDED 31#define DEBUG_LOG_INCLUDED
@@ -489,197 +490,162 @@ void schedule_usleep(unsigned long us)
489} 490}
490 491
491#ifdef CONFIG_PROC_FS 492#ifdef CONFIG_PROC_FS
492static int proc_fasttimer_read(char *buf, char **start, off_t offset, int len
493 ,int *eof, void *data_unused);
494static struct proc_dir_entry *fasttimer_proc_entry;
495#endif /* CONFIG_PROC_FS */
496
497#ifdef CONFIG_PROC_FS
498
499/* This value is very much based on testing */ 493/* This value is very much based on testing */
500#define BIG_BUF_SIZE (500 + NUM_TIMER_STATS * 300) 494#define BIG_BUF_SIZE (500 + NUM_TIMER_STATS * 300)
501 495
502static int proc_fasttimer_read(char *buf, char **start, off_t offset, int len 496static int proc_fasttimer_show(struct seq_file *m, void *v)
503 ,int *eof, void *data_unused)
504{ 497{
505 unsigned long flags; 498 unsigned long flags;
506 int i = 0; 499 int i = 0;
507 int num_to_show; 500 int num_to_show;
508 struct fasttime_t tv; 501 struct fasttime_t tv;
509 struct fast_timer *t, *nextt; 502 struct fast_timer *t, *nextt;
510 static char *bigbuf = NULL; 503
511 static unsigned long used; 504 do_gettimeofday_fast(&tv);
512 505
513 if (!bigbuf && !(bigbuf = vmalloc(BIG_BUF_SIZE))) 506 seq_printf(m, "Fast timers added: %i\n", fast_timers_added);
514 { 507 seq_printf(m, "Fast timers started: %i\n", fast_timers_started);
515 used = 0; 508 seq_printf(m, "Fast timer interrupts: %i\n", fast_timer_ints);
516 if (buf) 509 seq_printf(m, "Fast timers expired: %i\n", fast_timers_expired);
517 buf[0] = '\0'; 510 seq_printf(m, "Fast timers deleted: %i\n", fast_timers_deleted);
518 return 0; 511 seq_printf(m, "Fast timer running: %s\n",
519 } 512 fast_timer_running ? "yes" : "no");
520 513 seq_printf(m, "Current time: %lu.%06lu\n",
521 if (!offset || !used) 514 (unsigned long)tv.tv_jiff,
522 { 515 (unsigned long)tv.tv_usec);
523 do_gettimeofday_fast(&tv);
524
525 used = 0;
526 used += sprintf(bigbuf + used, "Fast timers added: %i\n",
527 fast_timers_added);
528 used += sprintf(bigbuf + used, "Fast timers started: %i\n",
529 fast_timers_started);
530 used += sprintf(bigbuf + used, "Fast timer interrupts: %i\n",
531 fast_timer_ints);
532 used += sprintf(bigbuf + used, "Fast timers expired: %i\n",
533 fast_timers_expired);
534 used += sprintf(bigbuf + used, "Fast timers deleted: %i\n",
535 fast_timers_deleted);
536 used += sprintf(bigbuf + used, "Fast timer running: %s\n",
537 fast_timer_running ? "yes" : "no");
538 used += sprintf(bigbuf + used, "Current time: %lu.%06lu\n",
539 (unsigned long)tv.tv_jiff,
540 (unsigned long)tv.tv_usec);
541#ifdef FAST_TIMER_SANITY_CHECKS 516#ifdef FAST_TIMER_SANITY_CHECKS
542 used += sprintf(bigbuf + used, "Sanity failed: %i\n", 517 seq_printf(m, "Sanity failed: %i\n", sanity_failed);
543 sanity_failed);
544#endif 518#endif
545 used += sprintf(bigbuf + used, "\n"); 519 seq_putc(m, '\n');
546 520
547#ifdef DEBUG_LOG_INCLUDED 521#ifdef DEBUG_LOG_INCLUDED
548 { 522 {
549 int end_i = debug_log_cnt; 523 int end_i = debug_log_cnt;
550 i = 0; 524 i = 0;
551 525
552 if (debug_log_cnt_wrapped) 526 if (debug_log_cnt_wrapped)
553 { 527 i = debug_log_cnt;
554 i = debug_log_cnt; 528
555 } 529 while (i != end_i || debug_log_cnt_wrapped) {
556 530 if (seq_printf(m, debug_log_string[i], debug_log_value[i]) < 0)
557 while ((i != end_i || (debug_log_cnt_wrapped && !used)) && 531 return 0;
558 used+100 < BIG_BUF_SIZE) 532 i = (i+1) % DEBUG_LOG_MAX;
559 { 533 }
560 used += sprintf(bigbuf + used, debug_log_string[i], 534 }
561 debug_log_value[i]); 535 seq_putc(m, '\n');
562 i = (i+1) % DEBUG_LOG_MAX;
563 }
564 }
565 used += sprintf(bigbuf + used, "\n");
566#endif 536#endif
567 537
568 num_to_show = (fast_timers_started < NUM_TIMER_STATS ? fast_timers_started: 538 num_to_show = (fast_timers_started < NUM_TIMER_STATS ? fast_timers_started:
569 NUM_TIMER_STATS); 539 NUM_TIMER_STATS);
570 used += sprintf(bigbuf + used, "Timers started: %i\n", fast_timers_started); 540 seq_printf(m, "Timers started: %i\n", fast_timers_started);
571 for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE) ; i++) 541 for (i = 0; i < num_to_show; i++) {
572 { 542 int cur = (fast_timers_started - i - 1) % NUM_TIMER_STATS;
573 int cur = (fast_timers_started - i - 1) % NUM_TIMER_STATS;
574 543
575#if 1 //ndef FAST_TIMER_LOG 544#if 1 //ndef FAST_TIMER_LOG
576 used += sprintf(bigbuf + used, "div: %i freq: %i delay: %i" 545 seq_printf(m, "div: %i freq: %i delay: %i"
577 "\n", 546 "\n",
578 timer_div_settings[cur], 547 timer_div_settings[cur],
579 timer_freq_settings[cur], 548 timer_freq_settings[cur],
580 timer_delay_settings[cur] 549 timer_delay_settings[cur]);
581 );
582#endif 550#endif
583#ifdef FAST_TIMER_LOG 551#ifdef FAST_TIMER_LOG
584 t = &timer_started_log[cur]; 552 t = &timer_started_log[cur];
585 used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu " 553 if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
586 "d: %6li us data: 0x%08lX" 554 "d: %6li us data: 0x%08lX"
587 "\n", 555 "\n",
588 t->name, 556 t->name,
589 (unsigned long)t->tv_set.tv_jiff, 557 (unsigned long)t->tv_set.tv_jiff,
590 (unsigned long)t->tv_set.tv_usec, 558 (unsigned long)t->tv_set.tv_usec,
591 (unsigned long)t->tv_expires.tv_jiff, 559 (unsigned long)t->tv_expires.tv_jiff,
592 (unsigned long)t->tv_expires.tv_usec, 560 (unsigned long)t->tv_expires.tv_usec,
593 t->delay_us, 561 t->delay_us,
594 t->data 562 t->data) < 0)
595 ); 563 return 0;
596#endif 564#endif
597 } 565 }
598 used += sprintf(bigbuf + used, "\n"); 566 seq_putc(m, '\n');
599 567
600#ifdef FAST_TIMER_LOG 568#ifdef FAST_TIMER_LOG
601 num_to_show = (fast_timers_added < NUM_TIMER_STATS ? fast_timers_added: 569 num_to_show = (fast_timers_added < NUM_TIMER_STATS ? fast_timers_added:
602 NUM_TIMER_STATS); 570 NUM_TIMER_STATS);
603 used += sprintf(bigbuf + used, "Timers added: %i\n", fast_timers_added); 571 seq_printf(m, "Timers added: %i\n", fast_timers_added);
604 for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE); i++) 572 for (i = 0; i < num_to_show; i++) {
605 { 573 t = &timer_added_log[(fast_timers_added - i - 1) % NUM_TIMER_STATS];
606 t = &timer_added_log[(fast_timers_added - i - 1) % NUM_TIMER_STATS]; 574 if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
607 used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu " 575 "d: %6li us data: 0x%08lX"
608 "d: %6li us data: 0x%08lX" 576 "\n",
609 "\n", 577 t->name,
610 t->name, 578 (unsigned long)t->tv_set.tv_jiff,
611 (unsigned long)t->tv_set.tv_jiff, 579 (unsigned long)t->tv_set.tv_usec,
612 (unsigned long)t->tv_set.tv_usec, 580 (unsigned long)t->tv_expires.tv_jiff,
613 (unsigned long)t->tv_expires.tv_jiff, 581 (unsigned long)t->tv_expires.tv_usec,
614 (unsigned long)t->tv_expires.tv_usec, 582 t->delay_us,
615 t->delay_us, 583 t->data) < 0)
616 t->data 584 return 0;
617 ); 585 }
618 } 586 seq_putc(m, '\n');
619 used += sprintf(bigbuf + used, "\n"); 587
620 588 num_to_show = (fast_timers_expired < NUM_TIMER_STATS ? fast_timers_expired:
621 num_to_show = (fast_timers_expired < NUM_TIMER_STATS ? fast_timers_expired: 589 NUM_TIMER_STATS);
622 NUM_TIMER_STATS); 590 seq_printf(m, "Timers expired: %i\n", fast_timers_expired);
623 used += sprintf(bigbuf + used, "Timers expired: %i\n", fast_timers_expired); 591 for (i = 0; i < num_to_show; i++) {
624 for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE); i++) 592 t = &timer_expired_log[(fast_timers_expired - i - 1) % NUM_TIMER_STATS];
625 { 593 if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
626 t = &timer_expired_log[(fast_timers_expired - i - 1) % NUM_TIMER_STATS]; 594 "d: %6li us data: 0x%08lX"
627 used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu " 595 "\n",
628 "d: %6li us data: 0x%08lX" 596 t->name,
629 "\n", 597 (unsigned long)t->tv_set.tv_jiff,
630 t->name, 598 (unsigned long)t->tv_set.tv_usec,
631 (unsigned long)t->tv_set.tv_jiff, 599 (unsigned long)t->tv_expires.tv_jiff,
632 (unsigned long)t->tv_set.tv_usec, 600 (unsigned long)t->tv_expires.tv_usec,
633 (unsigned long)t->tv_expires.tv_jiff, 601 t->delay_us,
634 (unsigned long)t->tv_expires.tv_usec, 602 t->data) < 0)
635 t->delay_us, 603 return 0;
636 t->data 604 }
637 ); 605 seq_putc(m, '\n');
638 }
639 used += sprintf(bigbuf + used, "\n");
640#endif 606#endif
641 607
642 used += sprintf(bigbuf + used, "Active timers:\n"); 608 seq_puts(m, "Active timers:\n");
643 local_irq_save(flags); 609 local_irq_save(flags);
644 t = fast_timer_list; 610 t = fast_timer_list;
645 while (t != NULL && (used+100 < BIG_BUF_SIZE)) 611 while (t) {
646 { 612 nextt = t->next;
647 nextt = t->next; 613 local_irq_restore(flags);
648 local_irq_restore(flags); 614 if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
649 used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu " 615 "d: %6li us data: 0x%08lX"
650 "d: %6li us data: 0x%08lX"
651/* " func: 0x%08lX" */ 616/* " func: 0x%08lX" */
652 "\n", 617 "\n",
653 t->name, 618 t->name,
654 (unsigned long)t->tv_set.tv_jiff, 619 (unsigned long)t->tv_set.tv_jiff,
655 (unsigned long)t->tv_set.tv_usec, 620 (unsigned long)t->tv_set.tv_usec,
656 (unsigned long)t->tv_expires.tv_jiff, 621 (unsigned long)t->tv_expires.tv_jiff,
657 (unsigned long)t->tv_expires.tv_usec, 622 (unsigned long)t->tv_expires.tv_usec,
658 t->delay_us, 623 t->delay_us,
659 t->data 624 t->data
660/* , t->function */ 625/* , t->function */
661 ); 626 ) < 0)
662 local_irq_save(flags); 627 return 0;
663 if (t->next != nextt) 628 local_irq_save(flags);
664 { 629 if (t->next != nextt)
665 printk(KERN_WARNING "timer removed!\n"); 630 printk(KERN_WARNING "timer removed!\n");
666 } 631 t = nextt;
667 t = nextt; 632 }
668 } 633 local_irq_restore(flags);
669 local_irq_restore(flags);
670 }
671
672 if (used - offset < len)
673 {
674 len = used - offset;
675 }
676 634
677 memcpy(buf, bigbuf + offset, len); 635 return 0;
678 *start = buf; 636}
679 *eof = 1;
680 637
681 return len; 638static int proc_fasttimer_open(struct inode *inode, struct file *file)
639{
640 return single_open_size(file, proc_fasttimer_show, PDE_DATA(inode), BIG_BUF_SIZE);
682} 641}
642
643static const struct file_operations proc_fasttimer_fops = {
644 .open = proc_fasttimer_open,
645 .read = seq_read,
646 .llseek = seq_lseek,
647 .release = seq_release,
648};
683#endif /* PROC_FS */ 649#endif /* PROC_FS */
684 650
685#ifdef FAST_TIMER_TEST 651#ifdef FAST_TIMER_TEST
@@ -857,8 +823,7 @@ int fast_timer_init(void)
857 } 823 }
858#endif 824#endif
859#ifdef CONFIG_PROC_FS 825#ifdef CONFIG_PROC_FS
860 if ((fasttimer_proc_entry = create_proc_entry( "fasttimer", 0, 0 ))) 826 proc_create("fasttimer", 0, NULL, &proc_fasttimer_fops);
861 fasttimer_proc_entry->read_proc = proc_fasttimer_read;
862#endif /* PROC_FS */ 827#endif /* PROC_FS */
863 if(request_irq(TIMER1_IRQ_NBR, timer1_handler, 0, 828 if(request_irq(TIMER1_IRQ_NBR, timer1_handler, 0,
864 "fast timer int", NULL)) 829 "fast timer int", NULL))
diff --git a/arch/cris/arch-v32/kernel/fasttimer.c b/arch/cris/arch-v32/kernel/fasttimer.c
index ab1551ee43c5..e43dd70acd96 100644
--- a/arch/cris/arch-v32/kernel/fasttimer.c
+++ b/arch/cris/arch-v32/kernel/fasttimer.c
@@ -23,6 +23,7 @@
23#include <hwregs/timer_defs.h> 23#include <hwregs/timer_defs.h>
24#include <asm/fasttimer.h> 24#include <asm/fasttimer.h>
25#include <linux/proc_fs.h> 25#include <linux/proc_fs.h>
26#include <linux/seq_file.h>
26 27
27/* 28/*
28 * timer0 is running at 100MHz and generating jiffies timer ticks 29 * timer0 is running at 100MHz and generating jiffies timer ticks
@@ -463,195 +464,161 @@ void schedule_usleep(unsigned long us)
463} 464}
464 465
465#ifdef CONFIG_PROC_FS 466#ifdef CONFIG_PROC_FS
466static int proc_fasttimer_read(char *buf, char **start, off_t offset, int len
467 ,int *eof, void *data_unused);
468static struct proc_dir_entry *fasttimer_proc_entry;
469#endif /* CONFIG_PROC_FS */
470
471#ifdef CONFIG_PROC_FS
472
473/* This value is very much based on testing */ 467/* This value is very much based on testing */
474#define BIG_BUF_SIZE (500 + NUM_TIMER_STATS * 300) 468#define BIG_BUF_SIZE (500 + NUM_TIMER_STATS * 300)
475 469
476static int proc_fasttimer_read(char *buf, char **start, off_t offset, int len 470static int proc_fasttimer_show(struct seq_file *m, void *v)
477 ,int *eof, void *data_unused)
478{ 471{
479 unsigned long flags; 472 unsigned long flags;
480 int i = 0; 473 int i = 0;
481 int num_to_show; 474 int num_to_show;
482 struct fasttime_t tv; 475 struct fasttime_t tv;
483 struct fast_timer *t, *nextt; 476 struct fast_timer *t, *nextt;
484 static char *bigbuf = NULL; 477
485 static unsigned long used; 478 do_gettimeofday_fast(&tv);
486 479
487 if (!bigbuf) { 480 seq_printf(m, "Fast timers added: %i\n", fast_timers_added);
488 bigbuf = vmalloc(BIG_BUF_SIZE); 481 seq_printf(m, "Fast timers started: %i\n", fast_timers_started);
489 if (!bigbuf) { 482 seq_printf(m, "Fast timer interrupts: %i\n", fast_timer_ints);
490 used = 0; 483 seq_printf(m, "Fast timers expired: %i\n", fast_timers_expired);
491 if (buf) 484 seq_printf(m, "Fast timers deleted: %i\n", fast_timers_deleted);
492 buf[0] = '\0'; 485 seq_printf(m, "Fast timer running: %s\n",
493 return 0; 486 fast_timer_running ? "yes" : "no");
494 } 487 seq_printf(m, "Current time: %lu.%06lu\n",
495 } 488 (unsigned long)tv.tv_jiff,
496 489 (unsigned long)tv.tv_usec);
497 if (!offset || !used) {
498 do_gettimeofday_fast(&tv);
499
500 used = 0;
501 used += sprintf(bigbuf + used, "Fast timers added: %i\n",
502 fast_timers_added);
503 used += sprintf(bigbuf + used, "Fast timers started: %i\n",
504 fast_timers_started);
505 used += sprintf(bigbuf + used, "Fast timer interrupts: %i\n",
506 fast_timer_ints);
507 used += sprintf(bigbuf + used, "Fast timers expired: %i\n",
508 fast_timers_expired);
509 used += sprintf(bigbuf + used, "Fast timers deleted: %i\n",
510 fast_timers_deleted);
511 used += sprintf(bigbuf + used, "Fast timer running: %s\n",
512 fast_timer_running ? "yes" : "no");
513 used += sprintf(bigbuf + used, "Current time: %lu.%06lu\n",
514 (unsigned long)tv.tv_jiff,
515 (unsigned long)tv.tv_usec);
516#ifdef FAST_TIMER_SANITY_CHECKS 490#ifdef FAST_TIMER_SANITY_CHECKS
517 used += sprintf(bigbuf + used, "Sanity failed: %i\n", 491 seq_printf(m, "Sanity failed: %i\n", sanity_failed);
518 sanity_failed);
519#endif 492#endif
520 used += sprintf(bigbuf + used, "\n"); 493 seq_putc(m, '\n');
521 494
522#ifdef DEBUG_LOG_INCLUDED 495#ifdef DEBUG_LOG_INCLUDED
523 { 496 {
524 int end_i = debug_log_cnt; 497 int end_i = debug_log_cnt;
525 i = 0; 498 i = 0;
526 499
527 if (debug_log_cnt_wrapped) 500 if (debug_log_cnt_wrapped)
528 i = debug_log_cnt; 501 i = debug_log_cnt;
529 502
530 while ((i != end_i || (debug_log_cnt_wrapped && !used)) && 503 while ((i != end_i || debug_log_cnt_wrapped)) {
531 used+100 < BIG_BUF_SIZE) 504 if (seq_printf(m, debug_log_string[i], debug_log_value[i]) < 0)
532 { 505 return 0;
533 used += sprintf(bigbuf + used, debug_log_string[i], 506 i = (i+1) % DEBUG_LOG_MAX;
534 debug_log_value[i]); 507 }
535 i = (i+1) % DEBUG_LOG_MAX; 508 }
536 } 509 seq_putc(m, '\n');
537 }
538 used += sprintf(bigbuf + used, "\n");
539#endif 510#endif
540 511
541 num_to_show = (fast_timers_started < NUM_TIMER_STATS ? fast_timers_started: 512 num_to_show = (fast_timers_started < NUM_TIMER_STATS ? fast_timers_started:
542 NUM_TIMER_STATS); 513 NUM_TIMER_STATS);
543 used += sprintf(bigbuf + used, "Timers started: %i\n", fast_timers_started); 514 seq_printf(m, "Timers started: %i\n", fast_timers_started);
544 for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE) ; i++) 515 for (i = 0; i < num_to_show; i++) {
545 { 516 int cur = (fast_timers_started - i - 1) % NUM_TIMER_STATS;
546 int cur = (fast_timers_started - i - 1) % NUM_TIMER_STATS;
547 517
548#if 1 //ndef FAST_TIMER_LOG 518#if 1 //ndef FAST_TIMER_LOG
549 used += sprintf(bigbuf + used, "div: %i delay: %i" 519 seq_printf(m, "div: %i delay: %i"
550 "\n", 520 "\n",
551 timer_div_settings[cur], 521 timer_div_settings[cur],
552 timer_delay_settings[cur] 522 timer_delay_settings[cur]);
553 );
554#endif 523#endif
555#ifdef FAST_TIMER_LOG 524#ifdef FAST_TIMER_LOG
556 t = &timer_started_log[cur]; 525 t = &timer_started_log[cur];
557 used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu " 526 if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
558 "d: %6li us data: 0x%08lX" 527 "d: %6li us data: 0x%08lX"
559 "\n", 528 "\n",
560 t->name, 529 t->name,
561 (unsigned long)t->tv_set.tv_jiff, 530 (unsigned long)t->tv_set.tv_jiff,
562 (unsigned long)t->tv_set.tv_usec, 531 (unsigned long)t->tv_set.tv_usec,
563 (unsigned long)t->tv_expires.tv_jiff, 532 (unsigned long)t->tv_expires.tv_jiff,
564 (unsigned long)t->tv_expires.tv_usec, 533 (unsigned long)t->tv_expires.tv_usec,
565 t->delay_us, 534 t->delay_us,
566 t->data 535 t->data) < 0)
567 ); 536 return 0;
568#endif 537#endif
569 } 538 }
570 used += sprintf(bigbuf + used, "\n"); 539 seq_putc(m, '\n');
571 540
572#ifdef FAST_TIMER_LOG 541#ifdef FAST_TIMER_LOG
573 num_to_show = (fast_timers_added < NUM_TIMER_STATS ? fast_timers_added: 542 num_to_show = (fast_timers_added < NUM_TIMER_STATS ? fast_timers_added:
574 NUM_TIMER_STATS); 543 NUM_TIMER_STATS);
575 used += sprintf(bigbuf + used, "Timers added: %i\n", fast_timers_added); 544 seq_printf(m, "Timers added: %i\n", fast_timers_added);
576 for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE); i++) 545 for (i = 0; i < num_to_show; i++) {
577 { 546 t = &timer_added_log[(fast_timers_added - i - 1) % NUM_TIMER_STATS];
578 t = &timer_added_log[(fast_timers_added - i - 1) % NUM_TIMER_STATS]; 547 if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
579 used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu " 548 "d: %6li us data: 0x%08lX"
580 "d: %6li us data: 0x%08lX" 549 "\n",
581 "\n", 550 t->name,
582 t->name, 551 (unsigned long)t->tv_set.tv_jiff,
583 (unsigned long)t->tv_set.tv_jiff, 552 (unsigned long)t->tv_set.tv_usec,
584 (unsigned long)t->tv_set.tv_usec, 553 (unsigned long)t->tv_expires.tv_jiff,
585 (unsigned long)t->tv_expires.tv_jiff, 554 (unsigned long)t->tv_expires.tv_usec,
586 (unsigned long)t->tv_expires.tv_usec, 555 t->delay_us,
587 t->delay_us, 556 t->data) < 0)
588 t->data 557 return 0;
589 ); 558 }
590 } 559 seq_putc(m, '\n');
591 used += sprintf(bigbuf + used, "\n"); 560
592 561 num_to_show = (fast_timers_expired < NUM_TIMER_STATS ? fast_timers_expired:
593 num_to_show = (fast_timers_expired < NUM_TIMER_STATS ? fast_timers_expired: 562 NUM_TIMER_STATS);
594 NUM_TIMER_STATS); 563 seq_printf(m, "Timers expired: %i\n", fast_timers_expired);
595 used += sprintf(bigbuf + used, "Timers expired: %i\n", fast_timers_expired); 564 for (i = 0; i < num_to_show; i++){
596 for (i = 0; i < num_to_show && (used+100 < BIG_BUF_SIZE); i++) 565 t = &timer_expired_log[(fast_timers_expired - i - 1) % NUM_TIMER_STATS];
597 { 566 if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
598 t = &timer_expired_log[(fast_timers_expired - i - 1) % NUM_TIMER_STATS]; 567 "d: %6li us data: 0x%08lX"
599 used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu " 568 "\n",
600 "d: %6li us data: 0x%08lX" 569 t->name,
601 "\n", 570 (unsigned long)t->tv_set.tv_jiff,
602 t->name, 571 (unsigned long)t->tv_set.tv_usec,
603 (unsigned long)t->tv_set.tv_jiff, 572 (unsigned long)t->tv_expires.tv_jiff,
604 (unsigned long)t->tv_set.tv_usec, 573 (unsigned long)t->tv_expires.tv_usec,
605 (unsigned long)t->tv_expires.tv_jiff, 574 t->delay_us,
606 (unsigned long)t->tv_expires.tv_usec, 575 t->data) < 0)
607 t->delay_us, 576 return 0;
608 t->data 577 }
609 ); 578 seq_putc(m, '\n');
610 }
611 used += sprintf(bigbuf + used, "\n");
612#endif 579#endif
613 580
614 used += sprintf(bigbuf + used, "Active timers:\n"); 581 seq_puts(m, "Active timers:\n");
615 local_irq_save(flags); 582 local_irq_save(flags);
616 t = fast_timer_list; 583 t = fast_timer_list;
617 while (t != NULL && (used+100 < BIG_BUF_SIZE)) 584 while (t != NULL){
618 { 585 nextt = t->next;
619 nextt = t->next; 586 local_irq_restore(flags);
620 local_irq_restore(flags); 587 if (seq_printf(m, "%-14s s: %6lu.%06lu e: %6lu.%06lu "
621 used += sprintf(bigbuf + used, "%-14s s: %6lu.%06lu e: %6lu.%06lu " 588 "d: %6li us data: 0x%08lX"
622 "d: %6li us data: 0x%08lX"
623/* " func: 0x%08lX" */ 589/* " func: 0x%08lX" */
624 "\n", 590 "\n",
625 t->name, 591 t->name,
626 (unsigned long)t->tv_set.tv_jiff, 592 (unsigned long)t->tv_set.tv_jiff,
627 (unsigned long)t->tv_set.tv_usec, 593 (unsigned long)t->tv_set.tv_usec,
628 (unsigned long)t->tv_expires.tv_jiff, 594 (unsigned long)t->tv_expires.tv_jiff,
629 (unsigned long)t->tv_expires.tv_usec, 595 (unsigned long)t->tv_expires.tv_usec,
630 t->delay_us, 596 t->delay_us,
631 t->data 597 t->data
632/* , t->function */ 598/* , t->function */
633 ); 599 ) < 0)
634 local_irq_save(flags); 600 return 0;
635 if (t->next != nextt) 601 local_irq_save(flags);
636 { 602 if (t->next != nextt)
637 printk("timer removed!\n"); 603 printk("timer removed!\n");
638 } 604 t = nextt;
639 t = nextt; 605 }
640 } 606 local_irq_restore(flags);
641 local_irq_restore(flags); 607 return 0;
642 } 608}
643 609
644 if (used - offset < len) 610static int proc_fasttimer_open(struct inode *inode, struct file *file)
645 { 611{
646 len = used - offset; 612 return single_open_size(file, proc_fasttimer_show, PDE_DATA(inode), BIG_BUF_SIZE);
647 } 613}
648 614
649 memcpy(buf, bigbuf + offset, len); 615static const struct file_operations proc_fasttimer_fops = {
650 *start = buf; 616 .open = proc_fasttimer_open,
651 *eof = 1; 617 .read = seq_read,
618 .llseek = seq_lseek,
619 .release = seq_release,
620};
652 621
653 return len;
654}
655#endif /* PROC_FS */ 622#endif /* PROC_FS */
656 623
657#ifdef FAST_TIMER_TEST 624#ifdef FAST_TIMER_TEST
@@ -816,9 +783,7 @@ int fast_timer_init(void)
816 printk("fast_timer_init()\n"); 783 printk("fast_timer_init()\n");
817 784
818#ifdef CONFIG_PROC_FS 785#ifdef CONFIG_PROC_FS
819 fasttimer_proc_entry = create_proc_entry("fasttimer", 0, 0); 786 proc_create("fasttimer", 0, NULL, &proc_fasttimer_fops);
820 if (fasttimer_proc_entry)
821 fasttimer_proc_entry->read_proc = proc_fasttimer_read;
822#endif /* PROC_FS */ 787#endif /* PROC_FS */
823 if (request_irq(TIMER0_INTR_VECT, timer_trig_interrupt, 788 if (request_irq(TIMER0_INTR_VECT, timer_trig_interrupt,
824 IRQF_SHARED | IRQF_DISABLED, 789 IRQF_SHARED | IRQF_DISABLED,
diff --git a/arch/h8300/kernel/gpio.c b/arch/h8300/kernel/gpio.c
index 6a25dd5530e7..b02c752cd326 100644
--- a/arch/h8300/kernel/gpio.c
+++ b/arch/h8300/kernel/gpio.c
@@ -11,6 +11,7 @@
11 11
12#include <linux/stddef.h> 12#include <linux/stddef.h>
13#include <linux/proc_fs.h> 13#include <linux/proc_fs.h>
14#include <linux/seq_file.h>
14#include <linux/kernel.h> 15#include <linux/kernel.h>
15#include <linux/string.h> 16#include <linux/string.h>
16#include <linux/fs.h> 17#include <linux/fs.h>
@@ -138,30 +139,34 @@ static char *port_status(int portno)
138 return result; 139 return result;
139} 140}
140 141
141static int gpio_proc_read(char *buf, char **start, off_t offset, 142static int gpio_proc_show(struct seq_file *m, void *v)
142 int len, int *unused_i, void *unused_v)
143{ 143{
144 int c,outlen;
145 static const char port_name[]="123456789ABCDEFGH"; 144 static const char port_name[]="123456789ABCDEFGH";
146 outlen = 0; 145 int c;
146
147 for (c = 0; c < MAX_PORT; c++) { 147 for (c = 0; c < MAX_PORT; c++) {
148 if (ddrs[c] == NULL) 148 if (ddrs[c] == NULL)
149 continue ; 149 continue;
150 len = sprintf(buf,"P%c: %s\n",port_name[c],port_status(c)); 150 seq_printf(m, "P%c: %s\n", port_name[c], port_status(c));
151 buf += len;
152 outlen += len;
153 } 151 }
154 return outlen; 152 return 0;
155} 153}
156 154
157static __init int register_proc(void) 155static int gpio_proc_open(struct inode *inode, struct file *file)
158{ 156{
159 struct proc_dir_entry *proc_gpio; 157 return single_open(file, gpio_proc_show, PDE_DATA(inode));
158}
160 159
161 proc_gpio = create_proc_entry("gpio", S_IRUGO, NULL); 160static const struct file_operations gpio_proc_fops = {
162 if (proc_gpio) 161 .open = gpio_proc_open,
163 proc_gpio->read_proc = gpio_proc_read; 162 .read = seq_read,
164 return proc_gpio != NULL; 163 .llseek = seq_lseek,
164 .release = seq_release,
165};
166
167static __init int register_proc(void)
168{
169 return proc_create("gpio", S_IRUGO, NULL, &gpio_proc_fops) != NULL;
165} 170}
166 171
167__initcall(register_proc); 172__initcall(register_proc);
diff --git a/arch/ia64/kernel/palinfo.c b/arch/ia64/kernel/palinfo.c
index 79521d5499f9..b17129e3b7c8 100644
--- a/arch/ia64/kernel/palinfo.c
+++ b/arch/ia64/kernel/palinfo.c
@@ -22,6 +22,7 @@
22#include <linux/errno.h> 22#include <linux/errno.h>
23#include <linux/init.h> 23#include <linux/init.h>
24#include <linux/proc_fs.h> 24#include <linux/proc_fs.h>
25#include <linux/seq_file.h>
25#include <linux/mm.h> 26#include <linux/mm.h>
26#include <linux/module.h> 27#include <linux/module.h>
27#include <linux/efi.h> 28#include <linux/efi.h>
@@ -41,7 +42,7 @@ MODULE_LICENSE("GPL");
41 42
42#define PALINFO_VERSION "0.5" 43#define PALINFO_VERSION "0.5"
43 44
44typedef int (*palinfo_func_t)(char*); 45typedef int (*palinfo_func_t)(struct seq_file *);
45 46
46typedef struct { 47typedef struct {
47 const char *name; /* name of the proc entry */ 48 const char *name; /* name of the proc entry */
@@ -54,7 +55,7 @@ typedef struct {
54 * A bunch of string array to get pretty printing 55 * A bunch of string array to get pretty printing
55 */ 56 */
56 57
57static char *cache_types[] = { 58static const char *cache_types[] = {
58 "", /* not used */ 59 "", /* not used */
59 "Instruction", 60 "Instruction",
60 "Data", 61 "Data",
@@ -122,19 +123,16 @@ static const char *mem_attrib[]={
122 * - a pointer to the end of the buffer 123 * - a pointer to the end of the buffer
123 * 124 *
124 */ 125 */
125static char * 126static void bitvector_process(struct seq_file *m, u64 vector)
126bitvector_process(char *p, u64 vector)
127{ 127{
128 int i,j; 128 int i,j;
129 const char *units[]={ "", "K", "M", "G", "T" }; 129 static const char *units[]={ "", "K", "M", "G", "T" };
130 130
131 for (i=0, j=0; i < 64; i++ , j=i/10) { 131 for (i=0, j=0; i < 64; i++ , j=i/10) {
132 if (vector & 0x1) { 132 if (vector & 0x1)
133 p += sprintf(p, "%d%s ", 1 << (i-j*10), units[j]); 133 seq_printf(m, "%d%s ", 1 << (i-j*10), units[j]);
134 }
135 vector >>= 1; 134 vector >>= 1;
136 } 135 }
137 return p;
138} 136}
139 137
140/* 138/*
@@ -149,8 +147,7 @@ bitvector_process(char *p, u64 vector)
149 * - a pointer to the end of the buffer 147 * - a pointer to the end of the buffer
150 * 148 *
151 */ 149 */
152static char * 150static void bitregister_process(struct seq_file *m, u64 *reg_info, int max)
153bitregister_process(char *p, u64 *reg_info, int max)
154{ 151{
155 int i, begin, skip = 0; 152 int i, begin, skip = 0;
156 u64 value = reg_info[0]; 153 u64 value = reg_info[0];
@@ -163,9 +160,9 @@ bitregister_process(char *p, u64 *reg_info, int max)
163 160
164 if ((value & 0x1) == 0 && skip == 0) { 161 if ((value & 0x1) == 0 && skip == 0) {
165 if (begin <= i - 2) 162 if (begin <= i - 2)
166 p += sprintf(p, "%d-%d ", begin, i-1); 163 seq_printf(m, "%d-%d ", begin, i-1);
167 else 164 else
168 p += sprintf(p, "%d ", i-1); 165 seq_printf(m, "%d ", i-1);
169 skip = 1; 166 skip = 1;
170 begin = -1; 167 begin = -1;
171 } else if ((value & 0x1) && skip == 1) { 168 } else if ((value & 0x1) && skip == 1) {
@@ -176,19 +173,15 @@ bitregister_process(char *p, u64 *reg_info, int max)
176 } 173 }
177 if (begin > -1) { 174 if (begin > -1) {
178 if (begin < 127) 175 if (begin < 127)
179 p += sprintf(p, "%d-127", begin); 176 seq_printf(m, "%d-127", begin);
180 else 177 else
181 p += sprintf(p, "127"); 178 seq_puts(m, "127");
182 } 179 }
183
184 return p;
185} 180}
186 181
187static int 182static int power_info(struct seq_file *m)
188power_info(char *page)
189{ 183{
190 s64 status; 184 s64 status;
191 char *p = page;
192 u64 halt_info_buffer[8]; 185 u64 halt_info_buffer[8];
193 pal_power_mgmt_info_u_t *halt_info =(pal_power_mgmt_info_u_t *)halt_info_buffer; 186 pal_power_mgmt_info_u_t *halt_info =(pal_power_mgmt_info_u_t *)halt_info_buffer;
194 int i; 187 int i;
@@ -198,26 +191,25 @@ power_info(char *page)
198 191
199 for (i=0; i < 8 ; i++ ) { 192 for (i=0; i < 8 ; i++ ) {
200 if (halt_info[i].pal_power_mgmt_info_s.im == 1) { 193 if (halt_info[i].pal_power_mgmt_info_s.im == 1) {
201 p += sprintf(p, "Power level %d:\n" 194 seq_printf(m,
202 "\tentry_latency : %d cycles\n" 195 "Power level %d:\n"
203 "\texit_latency : %d cycles\n" 196 "\tentry_latency : %d cycles\n"
204 "\tpower consumption : %d mW\n" 197 "\texit_latency : %d cycles\n"
205 "\tCache+TLB coherency : %s\n", i, 198 "\tpower consumption : %d mW\n"
206 halt_info[i].pal_power_mgmt_info_s.entry_latency, 199 "\tCache+TLB coherency : %s\n", i,
207 halt_info[i].pal_power_mgmt_info_s.exit_latency, 200 halt_info[i].pal_power_mgmt_info_s.entry_latency,
208 halt_info[i].pal_power_mgmt_info_s.power_consumption, 201 halt_info[i].pal_power_mgmt_info_s.exit_latency,
209 halt_info[i].pal_power_mgmt_info_s.co ? "Yes" : "No"); 202 halt_info[i].pal_power_mgmt_info_s.power_consumption,
203 halt_info[i].pal_power_mgmt_info_s.co ? "Yes" : "No");
210 } else { 204 } else {
211 p += sprintf(p,"Power level %d: not implemented\n",i); 205 seq_printf(m,"Power level %d: not implemented\n", i);
212 } 206 }
213 } 207 }
214 return p - page; 208 return 0;
215} 209}
216 210
217static int 211static int cache_info(struct seq_file *m)
218cache_info(char *page)
219{ 212{
220 char *p = page;
221 unsigned long i, levels, unique_caches; 213 unsigned long i, levels, unique_caches;
222 pal_cache_config_info_t cci; 214 pal_cache_config_info_t cci;
223 int j, k; 215 int j, k;
@@ -228,73 +220,74 @@ cache_info(char *page)
228 return 0; 220 return 0;
229 } 221 }
230 222
231 p += sprintf(p, "Cache levels : %ld\nUnique caches : %ld\n\n", levels, unique_caches); 223 seq_printf(m, "Cache levels : %ld\nUnique caches : %ld\n\n",
224 levels, unique_caches);
232 225
233 for (i=0; i < levels; i++) { 226 for (i=0; i < levels; i++) {
234
235 for (j=2; j >0 ; j--) { 227 for (j=2; j >0 ; j--) {
236
237 /* even without unification some level may not be present */ 228 /* even without unification some level may not be present */
238 if ((status=ia64_pal_cache_config_info(i,j, &cci)) != 0) { 229 if ((status=ia64_pal_cache_config_info(i,j, &cci)) != 0)
239 continue; 230 continue;
240 } 231
241 p += sprintf(p, 232 seq_printf(m,
242 "%s Cache level %lu:\n" 233 "%s Cache level %lu:\n"
243 "\tSize : %u bytes\n" 234 "\tSize : %u bytes\n"
244 "\tAttributes : ", 235 "\tAttributes : ",
245 cache_types[j+cci.pcci_unified], i+1, 236 cache_types[j+cci.pcci_unified], i+1,
246 cci.pcci_cache_size); 237 cci.pcci_cache_size);
247 238
248 if (cci.pcci_unified) p += sprintf(p, "Unified "); 239 if (cci.pcci_unified)
249 240 seq_puts(m, "Unified ");
250 p += sprintf(p, "%s\n", cache_mattrib[cci.pcci_cache_attr]); 241
251 242 seq_printf(m, "%s\n", cache_mattrib[cci.pcci_cache_attr]);
252 p += sprintf(p, 243
253 "\tAssociativity : %d\n" 244 seq_printf(m,
254 "\tLine size : %d bytes\n" 245 "\tAssociativity : %d\n"
255 "\tStride : %d bytes\n", 246 "\tLine size : %d bytes\n"
256 cci.pcci_assoc, 1<<cci.pcci_line_size, 1<<cci.pcci_stride); 247 "\tStride : %d bytes\n",
248 cci.pcci_assoc,
249 1<<cci.pcci_line_size,
250 1<<cci.pcci_stride);
257 if (j == 1) 251 if (j == 1)
258 p += sprintf(p, "\tStore latency : N/A\n"); 252 seq_puts(m, "\tStore latency : N/A\n");
259 else 253 else
260 p += sprintf(p, "\tStore latency : %d cycle(s)\n", 254 seq_printf(m, "\tStore latency : %d cycle(s)\n",
261 cci.pcci_st_latency); 255 cci.pcci_st_latency);
262 256
263 p += sprintf(p, 257 seq_printf(m,
264 "\tLoad latency : %d cycle(s)\n" 258 "\tLoad latency : %d cycle(s)\n"
265 "\tStore hints : ", cci.pcci_ld_latency); 259 "\tStore hints : ", cci.pcci_ld_latency);
266 260
267 for(k=0; k < 8; k++ ) { 261 for(k=0; k < 8; k++ ) {
268 if ( cci.pcci_st_hints & 0x1) 262 if ( cci.pcci_st_hints & 0x1)
269 p += sprintf(p, "[%s]", cache_st_hints[k]); 263 seq_printf(m, "[%s]", cache_st_hints[k]);
270 cci.pcci_st_hints >>=1; 264 cci.pcci_st_hints >>=1;
271 } 265 }
272 p += sprintf(p, "\n\tLoad hints : "); 266 seq_puts(m, "\n\tLoad hints : ");
273 267
274 for(k=0; k < 8; k++ ) { 268 for(k=0; k < 8; k++ ) {
275 if (cci.pcci_ld_hints & 0x1) 269 if (cci.pcci_ld_hints & 0x1)
276 p += sprintf(p, "[%s]", cache_ld_hints[k]); 270 seq_printf(m, "[%s]", cache_ld_hints[k]);
277 cci.pcci_ld_hints >>=1; 271 cci.pcci_ld_hints >>=1;
278 } 272 }
279 p += sprintf(p, 273 seq_printf(m,
280 "\n\tAlias boundary : %d byte(s)\n" 274 "\n\tAlias boundary : %d byte(s)\n"
281 "\tTag LSB : %d\n" 275 "\tTag LSB : %d\n"
282 "\tTag MSB : %d\n", 276 "\tTag MSB : %d\n",
283 1<<cci.pcci_alias_boundary, cci.pcci_tag_lsb, 277 1<<cci.pcci_alias_boundary, cci.pcci_tag_lsb,
284 cci.pcci_tag_msb); 278 cci.pcci_tag_msb);
285 279
286 /* when unified, data(j=2) is enough */ 280 /* when unified, data(j=2) is enough */
287 if (cci.pcci_unified) break; 281 if (cci.pcci_unified)
282 break;
288 } 283 }
289 } 284 }
290 return p - page; 285 return 0;
291} 286}
292 287
293 288
294static int 289static int vm_info(struct seq_file *m)
295vm_info(char *page)
296{ 290{
297 char *p = page;
298 u64 tr_pages =0, vw_pages=0, tc_pages; 291 u64 tr_pages =0, vw_pages=0, tc_pages;
299 u64 attrib; 292 u64 attrib;
300 pal_vm_info_1_u_t vm_info_1; 293 pal_vm_info_1_u_t vm_info_1;
@@ -309,7 +302,7 @@ vm_info(char *page)
309 printk(KERN_ERR "ia64_pal_vm_summary=%ld\n", status); 302 printk(KERN_ERR "ia64_pal_vm_summary=%ld\n", status);
310 } else { 303 } else {
311 304
312 p += sprintf(p, 305 seq_printf(m,
313 "Physical Address Space : %d bits\n" 306 "Physical Address Space : %d bits\n"
314 "Virtual Address Space : %d bits\n" 307 "Virtual Address Space : %d bits\n"
315 "Protection Key Registers(PKR) : %d\n" 308 "Protection Key Registers(PKR) : %d\n"
@@ -324,49 +317,49 @@ vm_info(char *page)
324 vm_info_1.pal_vm_info_1_s.hash_tag_id, 317 vm_info_1.pal_vm_info_1_s.hash_tag_id,
325 vm_info_2.pal_vm_info_2_s.rid_size); 318 vm_info_2.pal_vm_info_2_s.rid_size);
326 if (vm_info_2.pal_vm_info_2_s.max_purges == PAL_MAX_PURGES) 319 if (vm_info_2.pal_vm_info_2_s.max_purges == PAL_MAX_PURGES)
327 p += sprintf(p, "unlimited\n"); 320 seq_puts(m, "unlimited\n");
328 else 321 else
329 p += sprintf(p, "%d\n", 322 seq_printf(m, "%d\n",
330 vm_info_2.pal_vm_info_2_s.max_purges ? 323 vm_info_2.pal_vm_info_2_s.max_purges ?
331 vm_info_2.pal_vm_info_2_s.max_purges : 1); 324 vm_info_2.pal_vm_info_2_s.max_purges : 1);
332 } 325 }
333 326
334 if (ia64_pal_mem_attrib(&attrib) == 0) { 327 if (ia64_pal_mem_attrib(&attrib) == 0) {
335 p += sprintf(p, "Supported memory attributes : "); 328 seq_puts(m, "Supported memory attributes : ");
336 sep = ""; 329 sep = "";
337 for (i = 0; i < 8; i++) { 330 for (i = 0; i < 8; i++) {
338 if (attrib & (1 << i)) { 331 if (attrib & (1 << i)) {
339 p += sprintf(p, "%s%s", sep, mem_attrib[i]); 332 seq_printf(m, "%s%s", sep, mem_attrib[i]);
340 sep = ", "; 333 sep = ", ";
341 } 334 }
342 } 335 }
343 p += sprintf(p, "\n"); 336 seq_putc(m, '\n');
344 } 337 }
345 338
346 if ((status = ia64_pal_vm_page_size(&tr_pages, &vw_pages)) !=0) { 339 if ((status = ia64_pal_vm_page_size(&tr_pages, &vw_pages)) !=0) {
347 printk(KERN_ERR "ia64_pal_vm_page_size=%ld\n", status); 340 printk(KERN_ERR "ia64_pal_vm_page_size=%ld\n", status);
348 } else { 341 } else {
349 342
350 p += sprintf(p, 343 seq_printf(m,
351 "\nTLB walker : %simplemented\n" 344 "\nTLB walker : %simplemented\n"
352 "Number of DTR : %d\n" 345 "Number of DTR : %d\n"
353 "Number of ITR : %d\n" 346 "Number of ITR : %d\n"
354 "TLB insertable page sizes : ", 347 "TLB insertable page sizes : ",
355 vm_info_1.pal_vm_info_1_s.vw ? "" : "not ", 348 vm_info_1.pal_vm_info_1_s.vw ? "" : "not ",
356 vm_info_1.pal_vm_info_1_s.max_dtr_entry+1, 349 vm_info_1.pal_vm_info_1_s.max_dtr_entry+1,
357 vm_info_1.pal_vm_info_1_s.max_itr_entry+1); 350 vm_info_1.pal_vm_info_1_s.max_itr_entry+1);
358
359 351
360 p = bitvector_process(p, tr_pages); 352 bitvector_process(m, tr_pages);
361 353
362 p += sprintf(p, "\nTLB purgeable page sizes : "); 354 seq_puts(m, "\nTLB purgeable page sizes : ");
363 355
364 p = bitvector_process(p, vw_pages); 356 bitvector_process(m, vw_pages);
365 } 357 }
366 if ((status=ia64_get_ptce(&ptce)) != 0) { 358
359 if ((status = ia64_get_ptce(&ptce)) != 0) {
367 printk(KERN_ERR "ia64_get_ptce=%ld\n", status); 360 printk(KERN_ERR "ia64_get_ptce=%ld\n", status);
368 } else { 361 } else {
369 p += sprintf(p, 362 seq_printf(m,
370 "\nPurge base address : 0x%016lx\n" 363 "\nPurge base address : 0x%016lx\n"
371 "Purge outer loop count : %d\n" 364 "Purge outer loop count : %d\n"
372 "Purge inner loop count : %d\n" 365 "Purge inner loop count : %d\n"
@@ -375,7 +368,7 @@ vm_info(char *page)
375 ptce.base, ptce.count[0], ptce.count[1], 368 ptce.base, ptce.count[0], ptce.count[1],
376 ptce.stride[0], ptce.stride[1]); 369 ptce.stride[0], ptce.stride[1]);
377 370
378 p += sprintf(p, 371 seq_printf(m,
379 "TC Levels : %d\n" 372 "TC Levels : %d\n"
380 "Unique TC(s) : %d\n", 373 "Unique TC(s) : %d\n",
381 vm_info_1.pal_vm_info_1_s.num_tc_levels, 374 vm_info_1.pal_vm_info_1_s.num_tc_levels,
@@ -385,13 +378,11 @@ vm_info(char *page)
385 for (j=2; j>0 ; j--) { 378 for (j=2; j>0 ; j--) {
386 tc_pages = 0; /* just in case */ 379 tc_pages = 0; /* just in case */
387 380
388
389 /* even without unification, some levels may not be present */ 381 /* even without unification, some levels may not be present */
390 if ((status=ia64_pal_vm_info(i,j, &tc_info, &tc_pages)) != 0) { 382 if ((status=ia64_pal_vm_info(i,j, &tc_info, &tc_pages)) != 0)
391 continue; 383 continue;
392 }
393 384
394 p += sprintf(p, 385 seq_printf(m,
395 "\n%s Translation Cache Level %d:\n" 386 "\n%s Translation Cache Level %d:\n"
396 "\tHash sets : %d\n" 387 "\tHash sets : %d\n"
397 "\tAssociativity : %d\n" 388 "\tAssociativity : %d\n"
@@ -403,15 +394,15 @@ vm_info(char *page)
403 tc_info.tc_num_entries); 394 tc_info.tc_num_entries);
404 395
405 if (tc_info.tc_pf) 396 if (tc_info.tc_pf)
406 p += sprintf(p, "PreferredPageSizeOptimized "); 397 seq_puts(m, "PreferredPageSizeOptimized ");
407 if (tc_info.tc_unified) 398 if (tc_info.tc_unified)
408 p += sprintf(p, "Unified "); 399 seq_puts(m, "Unified ");
409 if (tc_info.tc_reduce_tr) 400 if (tc_info.tc_reduce_tr)
410 p += sprintf(p, "TCReduction"); 401 seq_puts(m, "TCReduction");
411 402
412 p += sprintf(p, "\n\tSupported page sizes: "); 403 seq_puts(m, "\n\tSupported page sizes: ");
413 404
414 p = bitvector_process(p, tc_pages); 405 bitvector_process(m, tc_pages);
415 406
416 /* when unified date (j=2) is enough */ 407 /* when unified date (j=2) is enough */
417 if (tc_info.tc_unified) 408 if (tc_info.tc_unified)
@@ -419,16 +410,14 @@ vm_info(char *page)
419 } 410 }
420 } 411 }
421 } 412 }
422 p += sprintf(p, "\n");
423 413
424 return p - page; 414 seq_putc(m, '\n');
415 return 0;
425} 416}
426 417
427 418
428static int 419static int register_info(struct seq_file *m)
429register_info(char *page)
430{ 420{
431 char *p = page;
432 u64 reg_info[2]; 421 u64 reg_info[2];
433 u64 info; 422 u64 info;
434 unsigned long phys_stacked; 423 unsigned long phys_stacked;
@@ -442,35 +431,31 @@ register_info(char *page)
442 }; 431 };
443 432
444 for(info=0; info < 4; info++) { 433 for(info=0; info < 4; info++) {
445 434 if (ia64_pal_register_info(info, &reg_info[0], &reg_info[1]) != 0)
446 if (ia64_pal_register_info(info, &reg_info[0], &reg_info[1]) != 0) return 0; 435 return 0;
447 436 seq_printf(m, "%-32s : ", info_type[info]);
448 p += sprintf(p, "%-32s : ", info_type[info]); 437 bitregister_process(m, reg_info, 128);
449 438 seq_putc(m, '\n');
450 p = bitregister_process(p, reg_info, 128);
451
452 p += sprintf(p, "\n");
453 } 439 }
454 440
455 if (ia64_pal_rse_info(&phys_stacked, &hints) == 0) { 441 if (ia64_pal_rse_info(&phys_stacked, &hints) == 0)
442 seq_printf(m,
443 "RSE stacked physical registers : %ld\n"
444 "RSE load/store hints : %ld (%s)\n",
445 phys_stacked, hints.ph_data,
446 hints.ph_data < RSE_HINTS_COUNT ? rse_hints[hints.ph_data]: "(??)");
456 447
457 p += sprintf(p,
458 "RSE stacked physical registers : %ld\n"
459 "RSE load/store hints : %ld (%s)\n",
460 phys_stacked, hints.ph_data,
461 hints.ph_data < RSE_HINTS_COUNT ? rse_hints[hints.ph_data]: "(??)");
462 }
463 if (ia64_pal_debug_info(&iregs, &dregs)) 448 if (ia64_pal_debug_info(&iregs, &dregs))
464 return 0; 449 return 0;
465 450
466 p += sprintf(p, 451 seq_printf(m,
467 "Instruction debug register pairs : %ld\n" 452 "Instruction debug register pairs : %ld\n"
468 "Data debug register pairs : %ld\n", iregs, dregs); 453 "Data debug register pairs : %ld\n", iregs, dregs);
469 454
470 return p - page; 455 return 0;
471} 456}
472 457
473static char *proc_features_0[]={ /* Feature set 0 */ 458static const char *const proc_features_0[]={ /* Feature set 0 */
474 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 459 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
475 NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL, 460 NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,
476 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 461 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
@@ -502,7 +487,7 @@ static char *proc_features_0[]={ /* Feature set 0 */
502 "Enable BERR promotion" 487 "Enable BERR promotion"
503}; 488};
504 489
505static char *proc_features_16[]={ /* Feature set 16 */ 490static const char *const proc_features_16[]={ /* Feature set 16 */
506 "Disable ETM", 491 "Disable ETM",
507 "Enable ETM", 492 "Enable ETM",
508 "Enable MCA on half-way timer", 493 "Enable MCA on half-way timer",
@@ -522,7 +507,7 @@ static char *proc_features_16[]={ /* Feature set 16 */
522 NULL, NULL, NULL, NULL, NULL 507 NULL, NULL, NULL, NULL, NULL
523}; 508};
524 509
525static char **proc_features[]={ 510static const char *const *const proc_features[]={
526 proc_features_0, 511 proc_features_0,
527 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 512 NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
528 NULL, NULL, NULL, NULL, 513 NULL, NULL, NULL, NULL,
@@ -530,11 +515,10 @@ static char **proc_features[]={
530 NULL, NULL, NULL, NULL, 515 NULL, NULL, NULL, NULL,
531}; 516};
532 517
533static char * feature_set_info(char *page, u64 avail, u64 status, u64 control, 518static void feature_set_info(struct seq_file *m, u64 avail, u64 status, u64 control,
534 unsigned long set) 519 unsigned long set)
535{ 520{
536 char *p = page; 521 const char *const *vf, *const *v;
537 char **vf, **v;
538 int i; 522 int i;
539 523
540 vf = v = proc_features[set]; 524 vf = v = proc_features[set];
@@ -547,13 +531,13 @@ static char * feature_set_info(char *page, u64 avail, u64 status, u64 control,
547 if (vf) 531 if (vf)
548 v = vf + i; 532 v = vf + i;
549 if ( v && *v ) { 533 if ( v && *v ) {
550 p += sprintf(p, "%-40s : %s %s\n", *v, 534 seq_printf(m, "%-40s : %s %s\n", *v,
551 avail & 0x1 ? (status & 0x1 ? 535 avail & 0x1 ? (status & 0x1 ?
552 "On " : "Off"): "", 536 "On " : "Off"): "",
553 avail & 0x1 ? (control & 0x1 ? 537 avail & 0x1 ? (control & 0x1 ?
554 "Ctrl" : "NoCtrl"): ""); 538 "Ctrl" : "NoCtrl"): "");
555 } else { 539 } else {
556 p += sprintf(p, "Feature set %2ld bit %2d\t\t\t" 540 seq_printf(m, "Feature set %2ld bit %2d\t\t\t"
557 " : %s %s\n", 541 " : %s %s\n",
558 set, i, 542 set, i,
559 avail & 0x1 ? (status & 0x1 ? 543 avail & 0x1 ? (status & 0x1 ?
@@ -562,36 +546,32 @@ static char * feature_set_info(char *page, u64 avail, u64 status, u64 control,
562 "Ctrl" : "NoCtrl"): ""); 546 "Ctrl" : "NoCtrl"): "");
563 } 547 }
564 } 548 }
565 return p;
566} 549}
567 550
568static int 551static int processor_info(struct seq_file *m)
569processor_info(char *page)
570{ 552{
571 char *p = page;
572 u64 avail=1, status=1, control=1, feature_set=0; 553 u64 avail=1, status=1, control=1, feature_set=0;
573 s64 ret; 554 s64 ret;
574 555
575 do { 556 do {
576 ret = ia64_pal_proc_get_features(&avail, &status, &control, 557 ret = ia64_pal_proc_get_features(&avail, &status, &control,
577 feature_set); 558 feature_set);
578 if (ret < 0) { 559 if (ret < 0)
579 return p - page; 560 return 0;
580 } 561
581 if (ret == 1) { 562 if (ret == 1) {
582 feature_set++; 563 feature_set++;
583 continue; 564 continue;
584 } 565 }
585 566
586 p = feature_set_info(p, avail, status, control, feature_set); 567 feature_set_info(m, avail, status, control, feature_set);
587
588 feature_set++; 568 feature_set++;
589 } while(1); 569 } while(1);
590 570
591 return p - page; 571 return 0;
592} 572}
593 573
594static const char *bus_features[]={ 574static const char *const bus_features[]={
595 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 575 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
596 NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL, 576 NULL,NULL,NULL,NULL,NULL,NULL,NULL, NULL,NULL,
597 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL, 577 NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
@@ -617,125 +597,118 @@ static const char *bus_features[]={
617}; 597};
618 598
619 599
620static int 600static int bus_info(struct seq_file *m)
621bus_info(char *page)
622{ 601{
623 char *p = page; 602 const char *const *v = bus_features;
624 const char **v = bus_features;
625 pal_bus_features_u_t av, st, ct; 603 pal_bus_features_u_t av, st, ct;
626 u64 avail, status, control; 604 u64 avail, status, control;
627 int i; 605 int i;
628 s64 ret; 606 s64 ret;
629 607
630 if ((ret=ia64_pal_bus_get_features(&av, &st, &ct)) != 0) return 0; 608 if ((ret=ia64_pal_bus_get_features(&av, &st, &ct)) != 0)
609 return 0;
631 610
632 avail = av.pal_bus_features_val; 611 avail = av.pal_bus_features_val;
633 status = st.pal_bus_features_val; 612 status = st.pal_bus_features_val;
634 control = ct.pal_bus_features_val; 613 control = ct.pal_bus_features_val;
635 614
636 for(i=0; i < 64; i++, v++, avail >>=1, status >>=1, control >>=1) { 615 for(i=0; i < 64; i++, v++, avail >>=1, status >>=1, control >>=1) {
637 if ( ! *v ) continue; 616 if ( ! *v )
638 p += sprintf(p, "%-48s : %s%s %s\n", *v, 617 continue;
639 avail & 0x1 ? "" : "NotImpl", 618 seq_printf(m, "%-48s : %s%s %s\n", *v,
640 avail & 0x1 ? (status & 0x1 ? "On" : "Off"): "", 619 avail & 0x1 ? "" : "NotImpl",
641 avail & 0x1 ? (control & 0x1 ? "Ctrl" : "NoCtrl"): ""); 620 avail & 0x1 ? (status & 0x1 ? "On" : "Off"): "",
621 avail & 0x1 ? (control & 0x1 ? "Ctrl" : "NoCtrl"): "");
642 } 622 }
643 return p - page; 623 return 0;
644} 624}
645 625
646static int 626static int version_info(struct seq_file *m)
647version_info(char *page)
648{ 627{
649 pal_version_u_t min_ver, cur_ver; 628 pal_version_u_t min_ver, cur_ver;
650 char *p = page;
651 629
652 if (ia64_pal_version(&min_ver, &cur_ver) != 0) 630 if (ia64_pal_version(&min_ver, &cur_ver) != 0)
653 return 0; 631 return 0;
654 632
655 p += sprintf(p, 633 seq_printf(m,
656 "PAL_vendor : 0x%02x (min=0x%02x)\n" 634 "PAL_vendor : 0x%02x (min=0x%02x)\n"
657 "PAL_A : %02x.%02x (min=%02x.%02x)\n" 635 "PAL_A : %02x.%02x (min=%02x.%02x)\n"
658 "PAL_B : %02x.%02x (min=%02x.%02x)\n", 636 "PAL_B : %02x.%02x (min=%02x.%02x)\n",
659 cur_ver.pal_version_s.pv_pal_vendor, 637 cur_ver.pal_version_s.pv_pal_vendor,
660 min_ver.pal_version_s.pv_pal_vendor, 638 min_ver.pal_version_s.pv_pal_vendor,
661 cur_ver.pal_version_s.pv_pal_a_model, 639 cur_ver.pal_version_s.pv_pal_a_model,
662 cur_ver.pal_version_s.pv_pal_a_rev, 640 cur_ver.pal_version_s.pv_pal_a_rev,
663 min_ver.pal_version_s.pv_pal_a_model, 641 min_ver.pal_version_s.pv_pal_a_model,
664 min_ver.pal_version_s.pv_pal_a_rev, 642 min_ver.pal_version_s.pv_pal_a_rev,
665 cur_ver.pal_version_s.pv_pal_b_model, 643 cur_ver.pal_version_s.pv_pal_b_model,
666 cur_ver.pal_version_s.pv_pal_b_rev, 644 cur_ver.pal_version_s.pv_pal_b_rev,
667 min_ver.pal_version_s.pv_pal_b_model, 645 min_ver.pal_version_s.pv_pal_b_model,
668 min_ver.pal_version_s.pv_pal_b_rev); 646 min_ver.pal_version_s.pv_pal_b_rev);
669 return p - page; 647 return 0;
670} 648}
671 649
672static int 650static int perfmon_info(struct seq_file *m)
673perfmon_info(char *page)
674{ 651{
675 char *p = page;
676 u64 pm_buffer[16]; 652 u64 pm_buffer[16];
677 pal_perf_mon_info_u_t pm_info; 653 pal_perf_mon_info_u_t pm_info;
678 654
679 if (ia64_pal_perf_mon_info(pm_buffer, &pm_info) != 0) return 0; 655 if (ia64_pal_perf_mon_info(pm_buffer, &pm_info) != 0)
680 656 return 0;
681 p += sprintf(p,
682 "PMC/PMD pairs : %d\n"
683 "Counter width : %d bits\n"
684 "Cycle event number : %d\n"
685 "Retired event number : %d\n"
686 "Implemented PMC : ",
687 pm_info.pal_perf_mon_info_s.generic, pm_info.pal_perf_mon_info_s.width,
688 pm_info.pal_perf_mon_info_s.cycles, pm_info.pal_perf_mon_info_s.retired);
689 657
690 p = bitregister_process(p, pm_buffer, 256); 658 seq_printf(m,
691 p += sprintf(p, "\nImplemented PMD : "); 659 "PMC/PMD pairs : %d\n"
692 p = bitregister_process(p, pm_buffer+4, 256); 660 "Counter width : %d bits\n"
693 p += sprintf(p, "\nCycles count capable : "); 661 "Cycle event number : %d\n"
694 p = bitregister_process(p, pm_buffer+8, 256); 662 "Retired event number : %d\n"
695 p += sprintf(p, "\nRetired bundles count capable : "); 663 "Implemented PMC : ",
664 pm_info.pal_perf_mon_info_s.generic,
665 pm_info.pal_perf_mon_info_s.width,
666 pm_info.pal_perf_mon_info_s.cycles,
667 pm_info.pal_perf_mon_info_s.retired);
668
669 bitregister_process(m, pm_buffer, 256);
670 seq_puts(m, "\nImplemented PMD : ");
671 bitregister_process(m, pm_buffer+4, 256);
672 seq_puts(m, "\nCycles count capable : ");
673 bitregister_process(m, pm_buffer+8, 256);
674 seq_puts(m, "\nRetired bundles count capable : ");
696 675
697#ifdef CONFIG_ITANIUM 676#ifdef CONFIG_ITANIUM
698 /* 677 /*
699 * PAL_PERF_MON_INFO reports that only PMC4 can be used to count CPU_CYCLES 678 * PAL_PERF_MON_INFO reports that only PMC4 can be used to count CPU_CYCLES
700 * which is wrong, both PMC4 and PMD5 support it. 679 * which is wrong, both PMC4 and PMD5 support it.
701 */ 680 */
702 if (pm_buffer[12] == 0x10) pm_buffer[12]=0x30; 681 if (pm_buffer[12] == 0x10)
682 pm_buffer[12]=0x30;
703#endif 683#endif
704 684
705 p = bitregister_process(p, pm_buffer+12, 256); 685 bitregister_process(m, pm_buffer+12, 256);
706 686 seq_putc(m, '\n');
707 p += sprintf(p, "\n"); 687 return 0;
708
709 return p - page;
710} 688}
711 689
712static int 690static int frequency_info(struct seq_file *m)
713frequency_info(char *page)
714{ 691{
715 char *p = page;
716 struct pal_freq_ratio proc, itc, bus; 692 struct pal_freq_ratio proc, itc, bus;
717 unsigned long base; 693 unsigned long base;
718 694
719 if (ia64_pal_freq_base(&base) == -1) 695 if (ia64_pal_freq_base(&base) == -1)
720 p += sprintf(p, "Output clock : not implemented\n"); 696 seq_puts(m, "Output clock : not implemented\n");
721 else 697 else
722 p += sprintf(p, "Output clock : %ld ticks/s\n", base); 698 seq_printf(m, "Output clock : %ld ticks/s\n", base);
723 699
724 if (ia64_pal_freq_ratios(&proc, &bus, &itc) != 0) return 0; 700 if (ia64_pal_freq_ratios(&proc, &bus, &itc) != 0) return 0;
725 701
726 p += sprintf(p, 702 seq_printf(m,
727 "Processor/Clock ratio : %d/%d\n" 703 "Processor/Clock ratio : %d/%d\n"
728 "Bus/Clock ratio : %d/%d\n" 704 "Bus/Clock ratio : %d/%d\n"
729 "ITC/Clock ratio : %d/%d\n", 705 "ITC/Clock ratio : %d/%d\n",
730 proc.num, proc.den, bus.num, bus.den, itc.num, itc.den); 706 proc.num, proc.den, bus.num, bus.den, itc.num, itc.den);
731 707 return 0;
732 return p - page;
733} 708}
734 709
735static int 710static int tr_info(struct seq_file *m)
736tr_info(char *page)
737{ 711{
738 char *p = page;
739 long status; 712 long status;
740 pal_tr_valid_u_t tr_valid; 713 pal_tr_valid_u_t tr_valid;
741 u64 tr_buffer[4]; 714 u64 tr_buffer[4];
@@ -794,39 +767,40 @@ tr_info(char *page)
794 767
795 ifa_reg = (struct ifa_reg *)&tr_buffer[2]; 768 ifa_reg = (struct ifa_reg *)&tr_buffer[2];
796 769
797 if (ifa_reg->valid == 0) continue; 770 if (ifa_reg->valid == 0)
771 continue;
798 772
799 gr_reg = (struct gr_reg *)tr_buffer; 773 gr_reg = (struct gr_reg *)tr_buffer;
800 itir_reg = (struct itir_reg *)&tr_buffer[1]; 774 itir_reg = (struct itir_reg *)&tr_buffer[1];
801 rid_reg = (struct rid_reg *)&tr_buffer[3]; 775 rid_reg = (struct rid_reg *)&tr_buffer[3];
802 776
803 pgm = -1 << (itir_reg->ps - 12); 777 pgm = -1 << (itir_reg->ps - 12);
804 p += sprintf(p, 778 seq_printf(m,
805 "%cTR%lu: av=%d pv=%d dv=%d mv=%d\n" 779 "%cTR%lu: av=%d pv=%d dv=%d mv=%d\n"
806 "\tppn : 0x%lx\n" 780 "\tppn : 0x%lx\n"
807 "\tvpn : 0x%lx\n" 781 "\tvpn : 0x%lx\n"
808 "\tps : ", 782 "\tps : ",
809 "ID"[i], j, 783 "ID"[i], j,
810 tr_valid.pal_tr_valid_s.access_rights_valid, 784 tr_valid.pal_tr_valid_s.access_rights_valid,
811 tr_valid.pal_tr_valid_s.priv_level_valid, 785 tr_valid.pal_tr_valid_s.priv_level_valid,
812 tr_valid.pal_tr_valid_s.dirty_bit_valid, 786 tr_valid.pal_tr_valid_s.dirty_bit_valid,
813 tr_valid.pal_tr_valid_s.mem_attr_valid, 787 tr_valid.pal_tr_valid_s.mem_attr_valid,
814 (gr_reg->ppn & pgm)<< 12, (ifa_reg->vpn & pgm)<< 12); 788 (gr_reg->ppn & pgm)<< 12, (ifa_reg->vpn & pgm)<< 12);
815 789
816 p = bitvector_process(p, 1<< itir_reg->ps); 790 bitvector_process(m, 1<< itir_reg->ps);
817 791
818 p += sprintf(p, 792 seq_printf(m,
819 "\n\tpl : %d\n" 793 "\n\tpl : %d\n"
820 "\tar : %d\n" 794 "\tar : %d\n"
821 "\trid : %x\n" 795 "\trid : %x\n"
822 "\tp : %d\n" 796 "\tp : %d\n"
823 "\tma : %d\n" 797 "\tma : %d\n"
824 "\td : %d\n", 798 "\td : %d\n",
825 gr_reg->pl, gr_reg->ar, rid_reg->rid, gr_reg->p, gr_reg->ma, 799 gr_reg->pl, gr_reg->ar, rid_reg->rid, gr_reg->p, gr_reg->ma,
826 gr_reg->d); 800 gr_reg->d);
827 } 801 }
828 } 802 }
829 return p - page; 803 return 0;
830} 804}
831 805
832 806
@@ -834,7 +808,7 @@ tr_info(char *page)
834/* 808/*
835 * List {name,function} pairs for every entry in /proc/palinfo/cpu* 809 * List {name,function} pairs for every entry in /proc/palinfo/cpu*
836 */ 810 */
837static palinfo_entry_t palinfo_entries[]={ 811static const palinfo_entry_t palinfo_entries[]={
838 { "version_info", version_info, }, 812 { "version_info", version_info, },
839 { "vm_info", vm_info, }, 813 { "vm_info", vm_info, },
840 { "cache_info", cache_info, }, 814 { "cache_info", cache_info, },
@@ -876,7 +850,7 @@ typedef union {
876 */ 850 */
877typedef struct { 851typedef struct {
878 palinfo_func_t func; /* pointer to function to call */ 852 palinfo_func_t func; /* pointer to function to call */
879 char *page; /* buffer to store results */ 853 struct seq_file *m; /* buffer to store results */
880 int ret; /* return value from call */ 854 int ret; /* return value from call */
881} palinfo_smp_data_t; 855} palinfo_smp_data_t;
882 856
@@ -889,7 +863,7 @@ static void
889palinfo_smp_call(void *info) 863palinfo_smp_call(void *info)
890{ 864{
891 palinfo_smp_data_t *data = (palinfo_smp_data_t *)info; 865 palinfo_smp_data_t *data = (palinfo_smp_data_t *)info;
892 data->ret = (*data->func)(data->page); 866 data->ret = (*data->func)(data->m);
893} 867}
894 868
895/* 869/*
@@ -899,13 +873,13 @@ palinfo_smp_call(void *info)
899 * otherwise how many bytes in the "page" buffer were written 873 * otherwise how many bytes in the "page" buffer were written
900 */ 874 */
901static 875static
902int palinfo_handle_smp(pal_func_cpu_u_t *f, char *page) 876int palinfo_handle_smp(struct seq_file *m, pal_func_cpu_u_t *f)
903{ 877{
904 palinfo_smp_data_t ptr; 878 palinfo_smp_data_t ptr;
905 int ret; 879 int ret;
906 880
907 ptr.func = palinfo_entries[f->func_id].proc_read; 881 ptr.func = palinfo_entries[f->func_id].proc_read;
908 ptr.page = page; 882 ptr.m = m;
909 ptr.ret = 0; /* just in case */ 883 ptr.ret = 0; /* just in case */
910 884
911 885
@@ -919,7 +893,7 @@ int palinfo_handle_smp(pal_func_cpu_u_t *f, char *page)
919} 893}
920#else /* ! CONFIG_SMP */ 894#else /* ! CONFIG_SMP */
921static 895static
922int palinfo_handle_smp(pal_func_cpu_u_t *f, char *page) 896int palinfo_handle_smp(struct seq_file *m, pal_func_cpu_u_t *f)
923{ 897{
924 printk(KERN_ERR "palinfo: should not be called with non SMP kernel\n"); 898 printk(KERN_ERR "palinfo: should not be called with non SMP kernel\n");
925 return 0; 899 return 0;
@@ -929,34 +903,35 @@ int palinfo_handle_smp(pal_func_cpu_u_t *f, char *page)
929/* 903/*
930 * Entry point routine: all calls go through this function 904 * Entry point routine: all calls go through this function
931 */ 905 */
932static int 906static int proc_palinfo_show(struct seq_file *m, void *v)
933palinfo_read_entry(char *page, char **start, off_t off, int count, int *eof, void *data)
934{ 907{
935 int len=0; 908 pal_func_cpu_u_t *f = (pal_func_cpu_u_t *)&m->private;
936 pal_func_cpu_u_t *f = (pal_func_cpu_u_t *)&data;
937 909
938 /* 910 /*
939 * in SMP mode, we may need to call another CPU to get correct 911 * in SMP mode, we may need to call another CPU to get correct
940 * information. PAL, by definition, is processor specific 912 * information. PAL, by definition, is processor specific
941 */ 913 */
942 if (f->req_cpu == get_cpu()) 914 if (f->req_cpu == get_cpu())
943 len = (*palinfo_entries[f->func_id].proc_read)(page); 915 (*palinfo_entries[f->func_id].proc_read)(m);
944 else 916 else
945 len = palinfo_handle_smp(f, page); 917 palinfo_handle_smp(m, f);
946 918
947 put_cpu(); 919 put_cpu();
920 return 0;
921}
948 922
949 if (len <= off+count) *eof = 1; 923static int proc_palinfo_open(struct inode *inode, struct file *file)
950 924{
951 *start = page + off; 925 return single_open(file, proc_palinfo_show, PDE_DATA(inode));
952 len -= off;
953
954 if (len>count) len = count;
955 if (len<0) len = 0;
956
957 return len;
958} 926}
959 927
928static const struct file_operations proc_palinfo_fops = {
929 .open = proc_palinfo_open,
930 .read = seq_read,
931 .llseek = seq_lseek,
932 .release = seq_release,
933};
934
960static void __cpuinit 935static void __cpuinit
961create_palinfo_proc_entries(unsigned int cpu) 936create_palinfo_proc_entries(unsigned int cpu)
962{ 937{
@@ -974,9 +949,8 @@ create_palinfo_proc_entries(unsigned int cpu)
974 949
975 for (j=0; j < NR_PALINFO_ENTRIES; j++) { 950 for (j=0; j < NR_PALINFO_ENTRIES; j++) {
976 f.func_id = j; 951 f.func_id = j;
977 create_proc_read_entry( 952 proc_create_data(palinfo_entries[j].name, 0, cpu_dir,
978 palinfo_entries[j].name, 0, cpu_dir, 953 &proc_palinfo_fops, (void *)f.value);
979 palinfo_read_entry, (void *)f.value);
980 } 954 }
981} 955}
982 956
diff --git a/arch/ia64/kernel/salinfo.c b/arch/ia64/kernel/salinfo.c
index aa527d7e91f2..5035245cb258 100644
--- a/arch/ia64/kernel/salinfo.c
+++ b/arch/ia64/kernel/salinfo.c
@@ -40,6 +40,7 @@
40#include <linux/cpu.h> 40#include <linux/cpu.h>
41#include <linux/types.h> 41#include <linux/types.h>
42#include <linux/proc_fs.h> 42#include <linux/proc_fs.h>
43#include <linux/seq_file.h>
43#include <linux/module.h> 44#include <linux/module.h>
44#include <linux/smp.h> 45#include <linux/smp.h>
45#include <linux/timer.h> 46#include <linux/timer.h>
@@ -53,7 +54,7 @@ MODULE_AUTHOR("Jesse Barnes <jbarnes@sgi.com>");
53MODULE_DESCRIPTION("/proc interface to IA-64 SAL features"); 54MODULE_DESCRIPTION("/proc interface to IA-64 SAL features");
54MODULE_LICENSE("GPL"); 55MODULE_LICENSE("GPL");
55 56
56static int salinfo_read(char *page, char **start, off_t off, int count, int *eof, void *data); 57static const struct file_operations proc_salinfo_fops;
57 58
58typedef struct { 59typedef struct {
59 const char *name; /* name of the proc entry */ 60 const char *name; /* name of the proc entry */
@@ -65,7 +66,7 @@ typedef struct {
65 * List {name,feature} pairs for every entry in /proc/sal/<feature> 66 * List {name,feature} pairs for every entry in /proc/sal/<feature>
66 * that this module exports 67 * that this module exports
67 */ 68 */
68static salinfo_entry_t salinfo_entries[]={ 69static const salinfo_entry_t salinfo_entries[]={
69 { "bus_lock", IA64_SAL_PLATFORM_FEATURE_BUS_LOCK, }, 70 { "bus_lock", IA64_SAL_PLATFORM_FEATURE_BUS_LOCK, },
70 { "irq_redirection", IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT, }, 71 { "irq_redirection", IA64_SAL_PLATFORM_FEATURE_IRQ_REDIR_HINT, },
71 { "ipi_redirection", IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT, }, 72 { "ipi_redirection", IA64_SAL_PLATFORM_FEATURE_IPI_REDIR_HINT, },
@@ -301,9 +302,7 @@ salinfo_event_open(struct inode *inode, struct file *file)
301static ssize_t 302static ssize_t
302salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) 303salinfo_event_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
303{ 304{
304 struct inode *inode = file_inode(file); 305 struct salinfo_data *data = PDE_DATA(file_inode(file));
305 struct proc_dir_entry *entry = PDE(inode);
306 struct salinfo_data *data = entry->data;
307 char cmd[32]; 306 char cmd[32];
308 size_t size; 307 size_t size;
309 int i, n, cpu = -1; 308 int i, n, cpu = -1;
@@ -360,8 +359,7 @@ static const struct file_operations salinfo_event_fops = {
360static int 359static int
361salinfo_log_open(struct inode *inode, struct file *file) 360salinfo_log_open(struct inode *inode, struct file *file)
362{ 361{
363 struct proc_dir_entry *entry = PDE(inode); 362 struct salinfo_data *data = PDE_DATA(inode);
364 struct salinfo_data *data = entry->data;
365 363
366 if (!capable(CAP_SYS_ADMIN)) 364 if (!capable(CAP_SYS_ADMIN))
367 return -EPERM; 365 return -EPERM;
@@ -386,8 +384,7 @@ salinfo_log_open(struct inode *inode, struct file *file)
386static int 384static int
387salinfo_log_release(struct inode *inode, struct file *file) 385salinfo_log_release(struct inode *inode, struct file *file)
388{ 386{
389 struct proc_dir_entry *entry = PDE(inode); 387 struct salinfo_data *data = PDE_DATA(inode);
390 struct salinfo_data *data = entry->data;
391 388
392 if (data->state == STATE_NO_DATA) { 389 if (data->state == STATE_NO_DATA) {
393 vfree(data->log_buffer); 390 vfree(data->log_buffer);
@@ -463,9 +460,7 @@ retry:
463static ssize_t 460static ssize_t
464salinfo_log_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos) 461salinfo_log_read(struct file *file, char __user *buffer, size_t count, loff_t *ppos)
465{ 462{
466 struct inode *inode = file_inode(file); 463 struct salinfo_data *data = PDE_DATA(file_inode(file));
467 struct proc_dir_entry *entry = PDE(inode);
468 struct salinfo_data *data = entry->data;
469 u8 *buf; 464 u8 *buf;
470 u64 bufsize; 465 u64 bufsize;
471 466
@@ -524,9 +519,7 @@ salinfo_log_clear(struct salinfo_data *data, int cpu)
524static ssize_t 519static ssize_t
525salinfo_log_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos) 520salinfo_log_write(struct file *file, const char __user *buffer, size_t count, loff_t *ppos)
526{ 521{
527 struct inode *inode = file_inode(file); 522 struct salinfo_data *data = PDE_DATA(file_inode(file));
528 struct proc_dir_entry *entry = PDE(inode);
529 struct salinfo_data *data = entry->data;
530 char cmd[32]; 523 char cmd[32];
531 size_t size; 524 size_t size;
532 u32 offset; 525 u32 offset;
@@ -637,8 +630,9 @@ salinfo_init(void)
637 630
638 for (i=0; i < NR_SALINFO_ENTRIES; i++) { 631 for (i=0; i < NR_SALINFO_ENTRIES; i++) {
639 /* pass the feature bit in question as misc data */ 632 /* pass the feature bit in question as misc data */
640 *sdir++ = create_proc_read_entry (salinfo_entries[i].name, 0, salinfo_dir, 633 *sdir++ = proc_create_data(salinfo_entries[i].name, 0, salinfo_dir,
641 salinfo_read, (void *)salinfo_entries[i].feature); 634 &proc_salinfo_fops,
635 (void *)salinfo_entries[i].feature);
642 } 636 }
643 637
644 for (i = 0; i < ARRAY_SIZE(salinfo_log_name); i++) { 638 for (i = 0; i < ARRAY_SIZE(salinfo_log_name); i++) {
@@ -684,22 +678,23 @@ salinfo_init(void)
684 * 'data' contains an integer that corresponds to the feature we're 678 * 'data' contains an integer that corresponds to the feature we're
685 * testing 679 * testing
686 */ 680 */
687static int 681static int proc_salinfo_show(struct seq_file *m, void *v)
688salinfo_read(char *page, char **start, off_t off, int count, int *eof, void *data)
689{ 682{
690 int len = 0; 683 unsigned long data = (unsigned long)v;
691 684 seq_puts(m, (sal_platform_features & data) ? "1\n" : "0\n");
692 len = sprintf(page, (sal_platform_features & (unsigned long)data) ? "1\n" : "0\n"); 685 return 0;
693 686}
694 if (len <= off+count) *eof = 1;
695
696 *start = page + off;
697 len -= off;
698
699 if (len>count) len = count;
700 if (len<0) len = 0;
701 687
702 return len; 688static int proc_salinfo_open(struct inode *inode, struct file *file)
689{
690 return single_open(file, proc_salinfo_show, PDE_DATA(inode));
703} 691}
704 692
693static const struct file_operations proc_salinfo_fops = {
694 .open = proc_salinfo_open,
695 .read = seq_read,
696 .llseek = seq_lseek,
697 .release = seq_release,
698};
699
705module_init(salinfo_init); 700module_init(salinfo_init);
diff --git a/arch/ia64/sn/kernel/sn2/prominfo_proc.c b/arch/ia64/sn/kernel/sn2/prominfo_proc.c
index 20b88cb1881a..daa8d6badb16 100644
--- a/arch/ia64/sn/kernel/sn2/prominfo_proc.c
+++ b/arch/ia64/sn/kernel/sn2/prominfo_proc.c
@@ -11,6 +11,7 @@
11#include <linux/module.h> 11#include <linux/module.h>
12#include <linux/slab.h> 12#include <linux/slab.h>
13#include <linux/proc_fs.h> 13#include <linux/proc_fs.h>
14#include <linux/seq_file.h>
14#include <linux/nodemask.h> 15#include <linux/nodemask.h>
15#include <asm/io.h> 16#include <asm/io.h>
16#include <asm/sn/sn_sal.h> 17#include <asm/sn/sn_sal.h>
@@ -101,18 +102,18 @@ get_fit_entry(unsigned long nasid, int index, unsigned long *fentry,
101/* 102/*
102 * These two routines display the FIT table for each node. 103 * These two routines display the FIT table for each node.
103 */ 104 */
104static int dump_fit_entry(char *page, unsigned long *fentry) 105static void dump_fit_entry(struct seq_file *m, unsigned long *fentry)
105{ 106{
106 unsigned type; 107 unsigned type;
107 108
108 type = FIT_TYPE(fentry[1]); 109 type = FIT_TYPE(fentry[1]);
109 return sprintf(page, "%02x %-25s %x.%02x %016lx %u\n", 110 seq_printf(m, "%02x %-25s %x.%02x %016lx %u\n",
110 type, 111 type,
111 fit_type_name(type), 112 fit_type_name(type),
112 FIT_MAJOR(fentry[1]), FIT_MINOR(fentry[1]), 113 FIT_MAJOR(fentry[1]), FIT_MINOR(fentry[1]),
113 fentry[0], 114 fentry[0],
114 /* mult by sixteen to get size in bytes */ 115 /* mult by sixteen to get size in bytes */
115 (unsigned)(fentry[1] & 0xffffff) * 16); 116 (unsigned)(fentry[1] & 0xffffff) * 16);
116} 117}
117 118
118 119
@@ -124,31 +125,39 @@ static int dump_fit_entry(char *page, unsigned long *fentry)
124 * OK except for 4kB pages (and no one is going to do that on SN 125 * OK except for 4kB pages (and no one is going to do that on SN
125 * anyway). 126 * anyway).
126 */ 127 */
127static int 128static int proc_fit_show(struct seq_file *m, void *v)
128dump_fit(char *page, unsigned long nasid)
129{ 129{
130 unsigned long nasid = (unsigned long)m->private;
130 unsigned long fentry[2]; 131 unsigned long fentry[2];
131 int index; 132 int index;
132 char *p;
133 133
134 p = page;
135 for (index=0;;index++) { 134 for (index=0;;index++) {
136 BUG_ON(index * 60 > PAGE_SIZE); 135 BUG_ON(index * 60 > PAGE_SIZE);
137 if (get_fit_entry(nasid, index, fentry, NULL, 0)) 136 if (get_fit_entry(nasid, index, fentry, NULL, 0))
138 break; 137 break;
139 p += dump_fit_entry(p, fentry); 138 dump_fit_entry(m, fentry);
140 } 139 }
140 return 0;
141}
141 142
142 return p - page; 143static int proc_fit_open(struct inode *inode, struct file *file)
144{
145 return single_open(file, proc_fit_show, PDE_DATA(inode));
143} 146}
144 147
145static int 148static const struct file_operations proc_fit_fops = {
146dump_version(char *page, unsigned long nasid) 149 .open = proc_fit_open,
150 .read = seq_read,
151 .llseek = seq_lseek,
152 .release = seq_release,
153};
154
155static int proc_version_show(struct seq_file *m, void *v)
147{ 156{
157 unsigned long nasid = (unsigned long)m->private;
148 unsigned long fentry[2]; 158 unsigned long fentry[2];
149 char banner[128]; 159 char banner[128];
150 int index; 160 int index;
151 int len;
152 161
153 for (index = 0; ; index++) { 162 for (index = 0; ; index++) {
154 if (get_fit_entry(nasid, index, fentry, banner, 163 if (get_fit_entry(nasid, index, fentry, banner,
@@ -158,56 +167,24 @@ dump_version(char *page, unsigned long nasid)
158 break; 167 break;
159 } 168 }
160 169
161 len = sprintf(page, "%x.%02x\n", FIT_MAJOR(fentry[1]), 170 seq_printf(m, "%x.%02x\n", FIT_MAJOR(fentry[1]), FIT_MINOR(fentry[1]));
162 FIT_MINOR(fentry[1]));
163 page += len;
164 171
165 if (banner[0]) 172 if (banner[0])
166 len += snprintf(page, PAGE_SIZE-len, "%s\n", banner); 173 seq_printf(m, "%s\n", banner);
167 174 return 0;
168 return len;
169}
170
171/* same as in proc_misc.c */
172static int
173proc_calc_metrics(char *page, char **start, off_t off, int count, int *eof,
174 int len)
175{
176 if (len <= off + count)
177 *eof = 1;
178 *start = page + off;
179 len -= off;
180 if (len > count)
181 len = count;
182 if (len < 0)
183 len = 0;
184 return len;
185} 175}
186 176
187static int 177static int proc_version_open(struct inode *inode, struct file *file)
188read_version_entry(char *page, char **start, off_t off, int count, int *eof,
189 void *data)
190{ 178{
191 int len; 179 return single_open(file, proc_version_show, PDE_DATA(inode));
192
193 /* data holds the NASID of the node */
194 len = dump_version(page, (unsigned long)data);
195 len = proc_calc_metrics(page, start, off, count, eof, len);
196 return len;
197} 180}
198 181
199static int 182static const struct file_operations proc_version_fops = {
200read_fit_entry(char *page, char **start, off_t off, int count, int *eof, 183 .open = proc_version_open,
201 void *data) 184 .read = seq_read,
202{ 185 .llseek = seq_lseek,
203 int len; 186 .release = seq_release,
204 187};
205 /* data holds the NASID of the node */
206 len = dump_fit(page, (unsigned long)data);
207 len = proc_calc_metrics(page, start, off, count, eof, len);
208
209 return len;
210}
211 188
212/* module entry points */ 189/* module entry points */
213int __init prominfo_init(void); 190int __init prominfo_init(void);
@@ -216,58 +193,39 @@ void __exit prominfo_exit(void);
216module_init(prominfo_init); 193module_init(prominfo_init);
217module_exit(prominfo_exit); 194module_exit(prominfo_exit);
218 195
219static struct proc_dir_entry **proc_entries;
220static struct proc_dir_entry *sgi_prominfo_entry;
221
222#define NODE_NAME_LEN 11 196#define NODE_NAME_LEN 11
223 197
224int __init prominfo_init(void) 198int __init prominfo_init(void)
225{ 199{
226 struct proc_dir_entry **entp; 200 struct proc_dir_entry *sgi_prominfo_entry;
227 cnodeid_t cnodeid; 201 cnodeid_t cnodeid;
228 unsigned long nasid;
229 int size;
230 char name[NODE_NAME_LEN];
231 202
232 if (!ia64_platform_is("sn2")) 203 if (!ia64_platform_is("sn2"))
233 return 0; 204 return 0;
234 205
235 size = num_online_nodes() * sizeof(struct proc_dir_entry *);
236 proc_entries = kzalloc(size, GFP_KERNEL);
237 if (!proc_entries)
238 return -ENOMEM;
239
240 sgi_prominfo_entry = proc_mkdir("sgi_prominfo", NULL); 206 sgi_prominfo_entry = proc_mkdir("sgi_prominfo", NULL);
207 if (!sgi_prominfo_entry)
208 return -ENOMEM;
241 209
242 entp = proc_entries;
243 for_each_online_node(cnodeid) { 210 for_each_online_node(cnodeid) {
211 struct proc_dir_entry *dir;
212 unsigned long nasid;
213 char name[NODE_NAME_LEN];
214
244 sprintf(name, "node%d", cnodeid); 215 sprintf(name, "node%d", cnodeid);
245 *entp = proc_mkdir(name, sgi_prominfo_entry); 216 dir = proc_mkdir(name, sgi_prominfo_entry);
217 if (!dir)
218 continue;
246 nasid = cnodeid_to_nasid(cnodeid); 219 nasid = cnodeid_to_nasid(cnodeid);
247 create_proc_read_entry("fit", 0, *entp, read_fit_entry, 220 proc_create_data("fit", 0, dir,
248 (void *)nasid); 221 &proc_fit_fops, (void *)nasid);
249 create_proc_read_entry("version", 0, *entp, 222 proc_create_data("version", 0, dir,
250 read_version_entry, (void *)nasid); 223 &proc_version_fops, (void *)nasid);
251 entp++;
252 } 224 }
253
254 return 0; 225 return 0;
255} 226}
256 227
257void __exit prominfo_exit(void) 228void __exit prominfo_exit(void)
258{ 229{
259 struct proc_dir_entry **entp; 230 remove_proc_subtree("sgi_prominfo", NULL);
260 unsigned int cnodeid;
261 char name[NODE_NAME_LEN];
262
263 entp = proc_entries;
264 for_each_online_node(cnodeid) {
265 remove_proc_entry("fit", *entp);
266 remove_proc_entry("version", *entp);
267 sprintf(name, "node%d", cnodeid);
268 remove_proc_entry(name, sgi_prominfo_entry);
269 entp++;
270 }
271 remove_proc_entry("sgi_prominfo", NULL);
272 kfree(proc_entries);
273} 231}
diff --git a/arch/mips/kernel/smtc-proc.c b/arch/mips/kernel/smtc-proc.c
index aee7c8177b5d..9fb714450e95 100644
--- a/arch/mips/kernel/smtc-proc.c
+++ b/arch/mips/kernel/smtc-proc.c
@@ -16,6 +16,7 @@
16#include <asm/mipsregs.h> 16#include <asm/mipsregs.h>
17#include <asm/cacheflush.h> 17#include <asm/cacheflush.h>
18#include <linux/proc_fs.h> 18#include <linux/proc_fs.h>
19#include <linux/seq_file.h>
19 20
20#include <asm/smtc_proc.h> 21#include <asm/smtc_proc.h>
21 22
@@ -30,51 +31,39 @@ unsigned long selfipis[NR_CPUS];
30 31
31struct smtc_cpu_proc smtc_cpu_stats[NR_CPUS]; 32struct smtc_cpu_proc smtc_cpu_stats[NR_CPUS];
32 33
33static struct proc_dir_entry *smtc_stats;
34
35atomic_t smtc_fpu_recoveries; 34atomic_t smtc_fpu_recoveries;
36 35
37static int proc_read_smtc(char *page, char **start, off_t off, 36static int smtc_proc_show(struct seq_file *m, void *v)
38 int count, int *eof, void *data)
39{ 37{
40 int totalen = 0;
41 int len;
42 int i; 38 int i;
43 extern unsigned long ebase; 39 extern unsigned long ebase;
44 40
45 len = sprintf(page, "SMTC Status Word: 0x%08x\n", smtc_status); 41 seq_printf(m, "SMTC Status Word: 0x%08x\n", smtc_status);
46 totalen += len; 42 seq_printf(m, "Config7: 0x%08x\n", read_c0_config7());
47 page += len; 43 seq_printf(m, "EBASE: 0x%08lx\n", ebase);
48 len = sprintf(page, "Config7: 0x%08x\n", read_c0_config7()); 44 seq_printf(m, "Counter Interrupts taken per CPU (TC)\n");
49 totalen += len; 45 for (i=0; i < NR_CPUS; i++)
50 page += len; 46 seq_printf(m, "%d: %ld\n", i, smtc_cpu_stats[i].timerints);
51 len = sprintf(page, "EBASE: 0x%08lx\n", ebase); 47 seq_printf(m, "Self-IPIs by CPU:\n");
52 totalen += len; 48 for(i = 0; i < NR_CPUS; i++)
53 page += len; 49 seq_printf(m, "%d: %ld\n", i, smtc_cpu_stats[i].selfipis);
54 len = sprintf(page, "Counter Interrupts taken per CPU (TC)\n"); 50 seq_printf(m, "%d Recoveries of \"stolen\" FPU\n",
55 totalen += len; 51 atomic_read(&smtc_fpu_recoveries));
56 page += len; 52 return 0;
57 for (i=0; i < NR_CPUS; i++) { 53}
58 len = sprintf(page, "%d: %ld\n", i, smtc_cpu_stats[i].timerints);
59 totalen += len;
60 page += len;
61 }
62 len = sprintf(page, "Self-IPIs by CPU:\n");
63 totalen += len;
64 page += len;
65 for(i = 0; i < NR_CPUS; i++) {
66 len = sprintf(page, "%d: %ld\n", i, smtc_cpu_stats[i].selfipis);
67 totalen += len;
68 page += len;
69 }
70 len = sprintf(page, "%d Recoveries of \"stolen\" FPU\n",
71 atomic_read(&smtc_fpu_recoveries));
72 totalen += len;
73 page += len;
74 54
75 return totalen; 55static int smtc_proc_open(struct inode *inode, struct file *file)
56{
57 return single_open(file, smtc_proc_show, NULL);
76} 58}
77 59
60static const struct file_operations smtc_proc_fops = {
61 .open = smtc_proc_open,
62 .read = seq_read,
63 .llseek = seq_lseek,
64 .release = seq_release,
65};
66
78void init_smtc_stats(void) 67void init_smtc_stats(void)
79{ 68{
80 int i; 69 int i;
@@ -86,6 +75,5 @@ void init_smtc_stats(void)
86 75
87 atomic_set(&smtc_fpu_recoveries, 0); 76 atomic_set(&smtc_fpu_recoveries, 0);
88 77
89 smtc_stats = create_proc_read_entry("smtc", 0444, NULL, 78 proc_create("smtc", 0444, NULL, &smtc_proc_fops);
90 proc_read_smtc, NULL);
91} 79}
diff --git a/arch/mips/lasat/picvue_proc.c b/arch/mips/lasat/picvue_proc.c
index c592bc8b8c99..638c5db122c9 100644
--- a/arch/mips/lasat/picvue_proc.c
+++ b/arch/mips/lasat/picvue_proc.c
@@ -58,13 +58,13 @@ static int pvc_line_proc_show(struct seq_file *m, void *v)
58 58
59static int pvc_line_proc_open(struct inode *inode, struct file *file) 59static int pvc_line_proc_open(struct inode *inode, struct file *file)
60{ 60{
61 return single_open(file, pvc_line_proc_show, PDE(inode)->data); 61 return single_open(file, pvc_line_proc_show, PDE_DATA(inode));
62} 62}
63 63
64static ssize_t pvc_line_proc_write(struct file *file, const char __user *buf, 64static ssize_t pvc_line_proc_write(struct file *file, const char __user *buf,
65 size_t count, loff_t *pos) 65 size_t count, loff_t *pos)
66{ 66{
67 int lineno = *(int *)PDE(file_inode(file))->data; 67 int lineno = *(int *)PDE_DATA(file_inode(file));
68 char kbuf[PVC_LINELEN]; 68 char kbuf[PVC_LINELEN];
69 size_t len; 69 size_t len;
70 70
diff --git a/arch/mips/mm/init.c b/arch/mips/mm/init.c
index 3d0346dbccf4..9b973e0af9cb 100644
--- a/arch/mips/mm/init.c
+++ b/arch/mips/mm/init.c
@@ -29,6 +29,7 @@
29#include <linux/pfn.h> 29#include <linux/pfn.h>
30#include <linux/hardirq.h> 30#include <linux/hardirq.h>
31#include <linux/gfp.h> 31#include <linux/gfp.h>
32#include <linux/kcore.h>
32 33
33#include <asm/asm-offsets.h> 34#include <asm/asm-offsets.h>
34#include <asm/bootinfo.h> 35#include <asm/bootinfo.h>
diff --git a/arch/mips/pci/ops-pmcmsp.c b/arch/mips/pci/ops-pmcmsp.c
index d0b6f8399b07..4eaab6327369 100644
--- a/arch/mips/pci/ops-pmcmsp.c
+++ b/arch/mips/pci/ops-pmcmsp.c
@@ -53,56 +53,51 @@ static void pci_proc_init(void);
53 53
54/***************************************************************************** 54/*****************************************************************************
55 * 55 *
56 * FUNCTION: read_msp_pci_counts 56 * FUNCTION: show_msp_pci_counts
57 * _________________________________________________________________________ 57 * _________________________________________________________________________
58 * 58 *
59 * DESCRIPTION: Prints the count of how many times each PCI 59 * DESCRIPTION: Prints the count of how many times each PCI
60 * interrupt has asserted. Can be invoked by the 60 * interrupt has asserted. Can be invoked by the
61 * /proc filesystem. 61 * /proc filesystem.
62 * 62 *
63 * INPUTS: page - part of STDOUT calculation 63 * INPUTS: m - synthetic file construction data
64 * off - part of STDOUT calculation 64 * v - iterator
65 * count - part of STDOUT calculation
66 * data - unused
67 * 65 *
68 * OUTPUTS: start - new start location 66 * RETURNS: 0 or error
69 * eof - end of file pointer
70 *
71 * RETURNS: len - STDOUT length
72 * 67 *
73 ****************************************************************************/ 68 ****************************************************************************/
74static int read_msp_pci_counts(char *page, char **start, off_t off, 69static int show_msp_pci_counts(struct seq_file *m, void *v)
75 int count, int *eof, void *data)
76{ 70{
77 int i; 71 int i;
78 int len = 0;
79 unsigned int intcount, total = 0; 72 unsigned int intcount, total = 0;
80 73
81 for (i = 0; i < 32; ++i) { 74 for (i = 0; i < 32; ++i) {
82 intcount = pci_int_count[i]; 75 intcount = pci_int_count[i];
83 if (intcount != 0) { 76 if (intcount != 0) {
84 len += sprintf(page + len, "[%d] = %u\n", i, intcount); 77 seq_printf(m, "[%d] = %u\n", i, intcount);
85 total += intcount; 78 total += intcount;
86 } 79 }
87 } 80 }
88 81
89 len += sprintf(page + len, "total = %u\n", total); 82 seq_printf(m, "total = %u\n", total);
90 if (len <= off+count) 83 return 0;
91 *eof = 1; 84}
92
93 *start = page + off;
94 len -= off;
95 if (len > count)
96 len = count;
97 if (len < 0)
98 len = 0;
99 85
100 return len; 86static int msp_pci_rd_cnt_open(struct inode *inode, struct file *file)
87{
88 return single_open(file, show_msp_pci_counts, NULL);
101} 89}
102 90
91static const struct file_operations msp_pci_rd_cnt_fops = {
92 .open = msp_pci_rd_cnt_open,
93 .read = seq_read,
94 .llseek = seq_lseek,
95 .release = seq_release,
96};
97
103/***************************************************************************** 98/*****************************************************************************
104 * 99 *
105 * FUNCTION: gen_pci_cfg_wr 100 * FUNCTION: gen_pci_cfg_wr_show
106 * _________________________________________________________________________ 101 * _________________________________________________________________________
107 * 102 *
108 * DESCRIPTION: Generates a configuration write cycle for debug purposes. 103 * DESCRIPTION: Generates a configuration write cycle for debug purposes.
@@ -112,37 +107,30 @@ static int read_msp_pci_counts(char *page, char **start, off_t off,
112 * PCI bus. Intent is that this function by invocable from 107 * PCI bus. Intent is that this function by invocable from
113 * the /proc filesystem. 108 * the /proc filesystem.
114 * 109 *
115 * INPUTS: page - part of STDOUT calculation 110 * INPUTS: m - synthetic file construction data
116 * off - part of STDOUT calculation 111 * v - iterator
117 * count - part of STDOUT calculation
118 * data - unused
119 * 112 *
120 * OUTPUTS: start - new start location 113 * RETURNS: 0 or error
121 * eof - end of file pointer
122 *
123 * RETURNS: len - STDOUT length
124 * 114 *
125 ****************************************************************************/ 115 ****************************************************************************/
126static int gen_pci_cfg_wr(char *page, char **start, off_t off, 116static int gen_pci_cfg_wr_show(struct seq_file *m, void *v)
127 int count, int *eof, void *data)
128{ 117{
129 unsigned char where = 0; /* Write to static Device/Vendor ID */ 118 unsigned char where = 0; /* Write to static Device/Vendor ID */
130 unsigned char bus_num = 0; /* Bus 0 */ 119 unsigned char bus_num = 0; /* Bus 0 */
131 unsigned char dev_fn = 0xF; /* Arbitrary device number */ 120 unsigned char dev_fn = 0xF; /* Arbitrary device number */
132 u32 wr_data = 0xFF00AA00; /* Arbitrary data */ 121 u32 wr_data = 0xFF00AA00; /* Arbitrary data */
133 struct msp_pci_regs *preg = (void *)PCI_BASE_REG; 122 struct msp_pci_regs *preg = (void *)PCI_BASE_REG;
134 int len = 0;
135 unsigned long value; 123 unsigned long value;
136 int intr; 124 int intr;
137 125
138 len += sprintf(page + len, "PMC MSP PCI: Beginning\n"); 126 seq_puts(m, "PMC MSP PCI: Beginning\n");
139 127
140 if (proc_init == 0) { 128 if (proc_init == 0) {
141 pci_proc_init(); 129 pci_proc_init();
142 proc_init = ~0; 130 proc_init = ~0;
143 } 131 }
144 132
145 len += sprintf(page + len, "PMC MSP PCI: Before Cfg Wr\n"); 133 seq_puts(m, "PMC MSP PCI: Before Cfg Wr\n");
146 134
147 /* 135 /*
148 * Generate PCI Configuration Write Cycle 136 * Generate PCI Configuration Write Cycle
@@ -168,21 +156,22 @@ static int gen_pci_cfg_wr(char *page, char **start, off_t off,
168 */ 156 */
169 intr = preg->if_status; 157 intr = preg->if_status;
170 158
171 len += sprintf(page + len, "PMC MSP PCI: After Cfg Wr\n"); 159 seq_puts(m, "PMC MSP PCI: After Cfg Wr\n");
172 160 return 0;
173 /* Handle STDOUT calculations */ 161}
174 if (len <= off+count)
175 *eof = 1;
176 *start = page + off;
177 len -= off;
178 if (len > count)
179 len = count;
180 if (len < 0)
181 len = 0;
182 162
183 return len; 163static int gen_pci_cfg_wr_open(struct inode *inode, struct file *file)
164{
165 return single_open(file, gen_pci_cfg_wr_show, NULL);
184} 166}
185 167
168static const struct file_operations gen_pci_cfg_wr_fops = {
169 .open = gen_pci_cfg_wr_open,
170 .read = seq_read,
171 .llseek = seq_lseek,
172 .release = seq_release,
173};
174
186/***************************************************************************** 175/*****************************************************************************
187 * 176 *
188 * FUNCTION: pci_proc_init 177 * FUNCTION: pci_proc_init
@@ -199,10 +188,8 @@ static int gen_pci_cfg_wr(char *page, char **start, off_t off,
199 ****************************************************************************/ 188 ****************************************************************************/
200static void pci_proc_init(void) 189static void pci_proc_init(void)
201{ 190{
202 create_proc_read_entry("pmc_msp_pci_rd_cnt", 0, NULL, 191 proc_create("pmc_msp_pci_rd_cnt", 0, NULL, &msp_pci_rd_cnt_fops);
203 read_msp_pci_counts, NULL); 192 proc_create("pmc_msp_pci_cfg_wr", 0, NULL, &gen_pci_cfg_wr_fops);
204 create_proc_read_entry("pmc_msp_pci_cfg_wr", 0, NULL,
205 gen_pci_cfg_wr, NULL);
206} 193}
207#endif /* CONFIG_PROC_FS && PCI_COUNTERS */ 194#endif /* CONFIG_PROC_FS && PCI_COUNTERS */
208 195
diff --git a/arch/mips/sibyte/sb1250/bus_watcher.c b/arch/mips/sibyte/sb1250/bus_watcher.c
index e651105b3f0b..cb1e3cb37d70 100644
--- a/arch/mips/sibyte/sb1250/bus_watcher.c
+++ b/arch/mips/sibyte/sb1250/bus_watcher.c
@@ -30,6 +30,7 @@
30#include <linux/interrupt.h> 30#include <linux/interrupt.h>
31#include <linux/sched.h> 31#include <linux/sched.h>
32#include <linux/proc_fs.h> 32#include <linux/proc_fs.h>
33#include <linux/seq_file.h>
33#include <asm/io.h> 34#include <asm/io.h>
34 35
35#include <asm/sibyte/sb1250.h> 36#include <asm/sibyte/sb1250.h>
@@ -99,63 +100,60 @@ void check_bus_watcher(void)
99 printk("Bus watcher indicates no error\n"); 100 printk("Bus watcher indicates no error\n");
100} 101}
101 102
102static int bw_print_buffer(char *page, struct bw_stats_struct *stats) 103#ifdef CONFIG_PROC_FS
104
105/* For simplicity, I want to assume a single read is required each
106 time */
107static int bw_proc_show(struct seq_file *m, void *v)
103{ 108{
104 int len; 109 struct bw_stats_struct *stats = m->private;
105 110
106 len = sprintf(page, "SiByte Bus Watcher statistics\n"); 111 seq_puts(m, "SiByte Bus Watcher statistics\n");
107 len += sprintf(page+len, "-----------------------------\n"); 112 seq_puts(m, "-----------------------------\n");
108 len += sprintf(page+len, "L2-d-cor %8ld\nL2-d-bad %8ld\n", 113 seq_printf(m, "L2-d-cor %8ld\nL2-d-bad %8ld\n",
109 stats->l2_cor_d, stats->l2_bad_d); 114 stats->l2_cor_d, stats->l2_bad_d);
110 len += sprintf(page+len, "L2-t-cor %8ld\nL2-t-bad %8ld\n", 115 seq_printf(m, "L2-t-cor %8ld\nL2-t-bad %8ld\n",
111 stats->l2_cor_t, stats->l2_bad_t); 116 stats->l2_cor_t, stats->l2_bad_t);
112 len += sprintf(page+len, "MC-d-cor %8ld\nMC-d-bad %8ld\n", 117 seq_printf(m, "MC-d-cor %8ld\nMC-d-bad %8ld\n",
113 stats->mem_cor_d, stats->mem_bad_d); 118 stats->mem_cor_d, stats->mem_bad_d);
114 len += sprintf(page+len, "IO-err %8ld\n", stats->bus_error); 119 seq_printf(m, "IO-err %8ld\n", stats->bus_error);
115 len += sprintf(page+len, "\nLast recorded signature:\n"); 120 seq_puts(m, "\nLast recorded signature:\n");
116 len += sprintf(page+len, "Request %02x from %d, answered by %d with Dcode %d\n", 121 seq_printf(m, "Request %02x from %d, answered by %d with Dcode %d\n",
117 (unsigned int)(G_SCD_BERR_TID(stats->status) & 0x3f), 122 (unsigned int)(G_SCD_BERR_TID(stats->status) & 0x3f),
118 (int)(G_SCD_BERR_TID(stats->status) >> 6), 123 (int)(G_SCD_BERR_TID(stats->status) >> 6),
119 (int)G_SCD_BERR_RID(stats->status), 124 (int)G_SCD_BERR_RID(stats->status),
120 (int)G_SCD_BERR_DCODE(stats->status)); 125 (int)G_SCD_BERR_DCODE(stats->status));
121 /* XXXKW indicate multiple errors between printings, or stats 126 /* XXXKW indicate multiple errors between printings, or stats
122 collection (or both)? */ 127 collection (or both)? */
123 if (stats->status & M_SCD_BERR_MULTERRS) 128 if (stats->status & M_SCD_BERR_MULTERRS)
124 len += sprintf(page+len, "Multiple errors observed since last check.\n"); 129 seq_puts(m, "Multiple errors observed since last check.\n");
125 if (stats->status_printed) { 130 if (stats->status_printed) {
126 len += sprintf(page+len, "(no change since last printing)\n"); 131 seq_puts(m, "(no change since last printing)\n");
127 } else { 132 } else {
128 stats->status_printed = 1; 133 stats->status_printed = 1;
129 } 134 }
130 135
131 return len; 136 return 0;
132} 137}
133 138
134#ifdef CONFIG_PROC_FS 139static int bw_proc_open(struct inode *inode, struct file *file)
135
136/* For simplicity, I want to assume a single read is required each
137 time */
138static int bw_read_proc(char *page, char **start, off_t off,
139 int count, int *eof, void *data)
140{ 140{
141 int len; 141 return single_open(file, bw_proc_show, PDE_DATA(inode));
142
143 if (off == 0) {
144 len = bw_print_buffer(page, data);
145 *start = page;
146 } else {
147 len = 0;
148 *eof = 1;
149 }
150 return len;
151} 142}
152 143
144static const struct file_operations bw_proc_fops = {
145 .open = bw_proc_open,
146 .read = seq_read,
147 .llseek = seq_lseek,
148 .release = seq_release,
149};
150
153static void create_proc_decoder(struct bw_stats_struct *stats) 151static void create_proc_decoder(struct bw_stats_struct *stats)
154{ 152{
155 struct proc_dir_entry *ent; 153 struct proc_dir_entry *ent;
156 154
157 ent = create_proc_read_entry("bus_watcher", S_IWUSR | S_IRUGO, NULL, 155 ent = proc_create_data("bus_watcher", S_IWUSR | S_IRUGO, NULL,
158 bw_read_proc, stats); 156 &bw_proc_fops, stats);
159 if (!ent) { 157 if (!ent) {
160 printk(KERN_INFO "Unable to initialize bus_watcher /proc entry\n"); 158 printk(KERN_INFO "Unable to initialize bus_watcher /proc entry\n");
161 return; 159 return;
@@ -210,11 +208,6 @@ static irqreturn_t sibyte_bw_int(int irq, void *data)
210 stats->bus_error += G_SCD_MEM_BUSERR(cntr); 208 stats->bus_error += G_SCD_MEM_BUSERR(cntr);
211 csr_out32(0, IOADDR(A_BUS_MEM_IO_ERRORS)); 209 csr_out32(0, IOADDR(A_BUS_MEM_IO_ERRORS));
212 210
213#ifndef CONFIG_PROC_FS
214 bw_print_buffer(bw_buf, stats);
215 printk(bw_buf);
216#endif
217
218 return IRQ_HANDLED; 211 return IRQ_HANDLED;
219} 212}
220 213
diff --git a/arch/parisc/kernel/pdc_chassis.c b/arch/parisc/kernel/pdc_chassis.c
index d47ba1aa8253..8fa314fbfb18 100644
--- a/arch/parisc/kernel/pdc_chassis.c
+++ b/arch/parisc/kernel/pdc_chassis.c
@@ -30,11 +30,13 @@
30#endif 30#endif
31 31
32#include <linux/init.h> 32#include <linux/init.h>
33#include <linux/module.h>
33#include <linux/kernel.h> 34#include <linux/kernel.h>
34#include <linux/reboot.h> 35#include <linux/reboot.h>
35#include <linux/notifier.h> 36#include <linux/notifier.h>
36#include <linux/cache.h> 37#include <linux/cache.h>
37#include <linux/proc_fs.h> 38#include <linux/proc_fs.h>
39#include <linux/seq_file.h>
38 40
39#include <asm/pdc_chassis.h> 41#include <asm/pdc_chassis.h>
40#include <asm/processor.h> 42#include <asm/processor.h>
@@ -244,38 +246,38 @@ int pdc_chassis_send_status(int message)
244 246
245#ifdef CONFIG_PDC_CHASSIS_WARN 247#ifdef CONFIG_PDC_CHASSIS_WARN
246#ifdef CONFIG_PROC_FS 248#ifdef CONFIG_PROC_FS
247static int pdc_chassis_warn_pread(char *page, char **start, off_t off, 249static int pdc_chassis_warn_show(struct seq_file *m, void *v)
248 int count, int *eof, void *data)
249{ 250{
250 char *out = page;
251 int len, ret;
252 unsigned long warn; 251 unsigned long warn;
253 u32 warnreg; 252 u32 warnreg;
254 253
255 ret = pdc_chassis_warn(&warn); 254 if (pdc_chassis_warn(&warn) != PDC_OK)
256 if (ret != PDC_OK)
257 return -EIO; 255 return -EIO;
258 256
259 warnreg = (warn & 0xFFFFFFFF); 257 warnreg = (warn & 0xFFFFFFFF);
260 258
261 if ((warnreg >> 24) & 0xFF) 259 if ((warnreg >> 24) & 0xFF)
262 out += sprintf(out, "Chassis component failure! (eg fan or PSU): 0x%.2x\n", ((warnreg >> 24) & 0xFF)); 260 seq_printf(m, "Chassis component failure! (eg fan or PSU): 0x%.2x\n",
263 261 (warnreg >> 24) & 0xFF);
264 out += sprintf(out, "Battery: %s\n", (warnreg & 0x04) ? "Low!" : "OK"); 262
265 out += sprintf(out, "Temp low: %s\n", (warnreg & 0x02) ? "Exceeded!" : "OK"); 263 seq_printf(m, "Battery: %s\n", (warnreg & 0x04) ? "Low!" : "OK");
266 out += sprintf(out, "Temp mid: %s\n", (warnreg & 0x01) ? "Exceeded!" : "OK"); 264 seq_printf(m, "Temp low: %s\n", (warnreg & 0x02) ? "Exceeded!" : "OK");
267 265 seq_printf(m, "Temp mid: %s\n", (warnreg & 0x01) ? "Exceeded!" : "OK");
268 len = out - page - off; 266 return 0;
269 if (len < count) { 267}
270 *eof = 1; 268
271 if (len <= 0) return 0; 269static int pdc_chassis_warn_open(struct inode *inode, struct file *file)
272 } else { 270{
273 len = count; 271 return single_open(file, pdc_chassis_warn_show, NULL);
274 }
275 *start = page + off;
276 return len;
277} 272}
278 273
274static const struct file_operations pdc_chassis_warn_fops = {
275 .open = pdc_chassis_warn_open,
276 .read = seq_read,
277 .llseek = seq_lseek,
278 .release = seq_release,
279};
280
279static int __init pdc_chassis_create_procfs(void) 281static int __init pdc_chassis_create_procfs(void)
280{ 282{
281 unsigned long test; 283 unsigned long test;
@@ -290,8 +292,7 @@ static int __init pdc_chassis_create_procfs(void)
290 292
291 printk(KERN_INFO "Enabling PDC chassis warnings support v%s\n", 293 printk(KERN_INFO "Enabling PDC chassis warnings support v%s\n",
292 PDC_CHASSIS_VER); 294 PDC_CHASSIS_VER);
293 create_proc_read_entry("chassis", 0400, NULL, pdc_chassis_warn_pread, 295 proc_create("chassis", 0400, NULL, &pdc_chassis_warn_fops);
294 NULL);
295 return 0; 296 return 0;
296} 297}
297 298
diff --git a/arch/powerpc/kernel/lparcfg.c b/arch/powerpc/kernel/lparcfg.c
index f5725bce9ed2..801a757c3630 100644
--- a/arch/powerpc/kernel/lparcfg.c
+++ b/arch/powerpc/kernel/lparcfg.c
@@ -41,8 +41,6 @@
41 41
42/* #define LPARCFG_DEBUG */ 42/* #define LPARCFG_DEBUG */
43 43
44static struct proc_dir_entry *proc_ppc64_lparcfg;
45
46/* 44/*
47 * Track sum of all purrs across all processors. This is used to further 45 * Track sum of all purrs across all processors. This is used to further
48 * calculate usage values by different applications 46 * calculate usage values by different applications
@@ -688,27 +686,22 @@ static const struct file_operations lparcfg_fops = {
688 686
689static int __init lparcfg_init(void) 687static int __init lparcfg_init(void)
690{ 688{
691 struct proc_dir_entry *ent;
692 umode_t mode = S_IRUSR | S_IRGRP | S_IROTH; 689 umode_t mode = S_IRUSR | S_IRGRP | S_IROTH;
693 690
694 /* Allow writing if we have FW_FEATURE_SPLPAR */ 691 /* Allow writing if we have FW_FEATURE_SPLPAR */
695 if (firmware_has_feature(FW_FEATURE_SPLPAR)) 692 if (firmware_has_feature(FW_FEATURE_SPLPAR))
696 mode |= S_IWUSR; 693 mode |= S_IWUSR;
697 694
698 ent = proc_create("powerpc/lparcfg", mode, NULL, &lparcfg_fops); 695 if (!proc_create("powerpc/lparcfg", mode, NULL, &lparcfg_fops)) {
699 if (!ent) {
700 printk(KERN_ERR "Failed to create powerpc/lparcfg\n"); 696 printk(KERN_ERR "Failed to create powerpc/lparcfg\n");
701 return -EIO; 697 return -EIO;
702 } 698 }
703
704 proc_ppc64_lparcfg = ent;
705 return 0; 699 return 0;
706} 700}
707 701
708static void __exit lparcfg_cleanup(void) 702static void __exit lparcfg_cleanup(void)
709{ 703{
710 if (proc_ppc64_lparcfg) 704 remove_proc_subtree("powerpc/lparcfg", NULL);
711 remove_proc_entry("lparcfg", proc_ppc64_lparcfg->parent);
712} 705}
713 706
714module_init(lparcfg_init); 707module_init(lparcfg_init);
diff --git a/arch/powerpc/kernel/proc_powerpc.c b/arch/powerpc/kernel/proc_powerpc.c
index f19d0bdc3241..feb8580fdc84 100644
--- a/arch/powerpc/kernel/proc_powerpc.c
+++ b/arch/powerpc/kernel/proc_powerpc.c
@@ -32,8 +32,6 @@
32static loff_t page_map_seek( struct file *file, loff_t off, int whence) 32static loff_t page_map_seek( struct file *file, loff_t off, int whence)
33{ 33{
34 loff_t new; 34 loff_t new;
35 struct proc_dir_entry *dp = PDE(file_inode(file));
36
37 switch(whence) { 35 switch(whence) {
38 case 0: 36 case 0:
39 new = off; 37 new = off;
@@ -42,12 +40,12 @@ static loff_t page_map_seek( struct file *file, loff_t off, int whence)
42 new = file->f_pos + off; 40 new = file->f_pos + off;
43 break; 41 break;
44 case 2: 42 case 2:
45 new = dp->size + off; 43 new = PAGE_SIZE + off;
46 break; 44 break;
47 default: 45 default:
48 return -EINVAL; 46 return -EINVAL;
49 } 47 }
50 if ( new < 0 || new > dp->size ) 48 if ( new < 0 || new > PAGE_SIZE )
51 return -EINVAL; 49 return -EINVAL;
52 return (file->f_pos = new); 50 return (file->f_pos = new);
53} 51}
@@ -55,19 +53,18 @@ static loff_t page_map_seek( struct file *file, loff_t off, int whence)
55static ssize_t page_map_read( struct file *file, char __user *buf, size_t nbytes, 53static ssize_t page_map_read( struct file *file, char __user *buf, size_t nbytes,
56 loff_t *ppos) 54 loff_t *ppos)
57{ 55{
58 struct proc_dir_entry *dp = PDE(file_inode(file)); 56 return simple_read_from_buffer(buf, nbytes, ppos,
59 return simple_read_from_buffer(buf, nbytes, ppos, dp->data, dp->size); 57 PDE_DATA(file_inode(file)), PAGE_SIZE);
60} 58}
61 59
62static int page_map_mmap( struct file *file, struct vm_area_struct *vma ) 60static int page_map_mmap( struct file *file, struct vm_area_struct *vma )
63{ 61{
64 struct proc_dir_entry *dp = PDE(file_inode(file)); 62 if ((vma->vm_end - vma->vm_start) > PAGE_SIZE)
65
66 if ((vma->vm_end - vma->vm_start) > dp->size)
67 return -EINVAL; 63 return -EINVAL;
68 64
69 remap_pfn_range(vma, vma->vm_start, __pa(dp->data) >> PAGE_SHIFT, 65 remap_pfn_range(vma, vma->vm_start,
70 dp->size, vma->vm_page_prot); 66 __pa(PDE_DATA(file_inode(file))) >> PAGE_SHIFT,
67 PAGE_SIZE, vma->vm_page_prot);
71 return 0; 68 return 0;
72} 69}
73 70
@@ -86,7 +83,7 @@ static int __init proc_ppc64_init(void)
86 &page_map_fops, vdso_data); 83 &page_map_fops, vdso_data);
87 if (!pde) 84 if (!pde)
88 return 1; 85 return 1;
89 pde->size = PAGE_SIZE; 86 proc_set_size(pde, PAGE_SIZE);
90 87
91 return 0; 88 return 0;
92} 89}
diff --git a/arch/powerpc/kernel/rtas_flash.c b/arch/powerpc/kernel/rtas_flash.c
index c642f0132988..5b770262c673 100644
--- a/arch/powerpc/kernel/rtas_flash.c
+++ b/arch/powerpc/kernel/rtas_flash.c
@@ -102,9 +102,10 @@ static struct kmem_cache *flash_block_cache = NULL;
102 102
103#define FLASH_BLOCK_LIST_VERSION (1UL) 103#define FLASH_BLOCK_LIST_VERSION (1UL)
104 104
105/* Local copy of the flash block list. 105/*
106 * We only allow one open of the flash proc file and create this 106 * Local copy of the flash block list.
107 * list as we go. The rtas_firmware_flash_list varable will be 107 *
108 * The rtas_firmware_flash_list varable will be
108 * set once the data is fully read. 109 * set once the data is fully read.
109 * 110 *
110 * For convenience as we build the list we use virtual addrs, 111 * For convenience as we build the list we use virtual addrs,
@@ -125,23 +126,23 @@ struct rtas_update_flash_t
125struct rtas_manage_flash_t 126struct rtas_manage_flash_t
126{ 127{
127 int status; /* Returned status */ 128 int status; /* Returned status */
128 unsigned int op; /* Reject or commit image */
129}; 129};
130 130
131/* Status int must be first member of struct */ 131/* Status int must be first member of struct */
132struct rtas_validate_flash_t 132struct rtas_validate_flash_t
133{ 133{
134 int status; /* Returned status */ 134 int status; /* Returned status */
135 char buf[VALIDATE_BUF_SIZE]; /* Candidate image buffer */ 135 char *buf; /* Candidate image buffer */
136 unsigned int buf_size; /* Size of image buf */ 136 unsigned int buf_size; /* Size of image buf */
137 unsigned int update_results; /* Update results token */ 137 unsigned int update_results; /* Update results token */
138}; 138};
139 139
140static DEFINE_SPINLOCK(flash_file_open_lock); 140static struct rtas_update_flash_t rtas_update_flash_data;
141static struct proc_dir_entry *firmware_flash_pde; 141static struct rtas_manage_flash_t rtas_manage_flash_data;
142static struct proc_dir_entry *firmware_update_pde; 142static struct rtas_validate_flash_t rtas_validate_flash_data;
143static struct proc_dir_entry *validate_pde; 143static DEFINE_MUTEX(rtas_update_flash_mutex);
144static struct proc_dir_entry *manage_pde; 144static DEFINE_MUTEX(rtas_manage_flash_mutex);
145static DEFINE_MUTEX(rtas_validate_flash_mutex);
145 146
146/* Do simple sanity checks on the flash image. */ 147/* Do simple sanity checks on the flash image. */
147static int flash_list_valid(struct flash_block_list *flist) 148static int flash_list_valid(struct flash_block_list *flist)
@@ -191,10 +192,10 @@ static void free_flash_list(struct flash_block_list *f)
191 192
192static int rtas_flash_release(struct inode *inode, struct file *file) 193static int rtas_flash_release(struct inode *inode, struct file *file)
193{ 194{
194 struct proc_dir_entry *dp = PDE(file_inode(file)); 195 struct rtas_update_flash_t *const uf = &rtas_update_flash_data;
195 struct rtas_update_flash_t *uf; 196
196 197 mutex_lock(&rtas_update_flash_mutex);
197 uf = (struct rtas_update_flash_t *) dp->data; 198
198 if (uf->flist) { 199 if (uf->flist) {
199 /* File was opened in write mode for a new flash attempt */ 200 /* File was opened in write mode for a new flash attempt */
200 /* Clear saved list */ 201 /* Clear saved list */
@@ -214,13 +215,14 @@ static int rtas_flash_release(struct inode *inode, struct file *file)
214 uf->flist = NULL; 215 uf->flist = NULL;
215 } 216 }
216 217
217 atomic_dec(&dp->count); 218 mutex_unlock(&rtas_update_flash_mutex);
218 return 0; 219 return 0;
219} 220}
220 221
221static void get_flash_status_msg(int status, char *buf) 222static size_t get_flash_status_msg(int status, char *buf)
222{ 223{
223 char *msg; 224 const char *msg;
225 size_t len;
224 226
225 switch (status) { 227 switch (status) {
226 case FLASH_AUTH: 228 case FLASH_AUTH:
@@ -242,34 +244,51 @@ static void get_flash_status_msg(int status, char *buf)
242 msg = "ready: firmware image ready for flash on reboot\n"; 244 msg = "ready: firmware image ready for flash on reboot\n";
243 break; 245 break;
244 default: 246 default:
245 sprintf(buf, "error: unexpected status value %d\n", status); 247 return sprintf(buf, "error: unexpected status value %d\n",
246 return; 248 status);
247 } 249 }
248 250
249 strcpy(buf, msg); 251 len = strlen(msg);
252 memcpy(buf, msg, len + 1);
253 return len;
250} 254}
251 255
252/* Reading the proc file will show status (not the firmware contents) */ 256/* Reading the proc file will show status (not the firmware contents) */
253static ssize_t rtas_flash_read(struct file *file, char __user *buf, 257static ssize_t rtas_flash_read_msg(struct file *file, char __user *buf,
254 size_t count, loff_t *ppos) 258 size_t count, loff_t *ppos)
255{ 259{
256 struct proc_dir_entry *dp = PDE(file_inode(file)); 260 struct rtas_update_flash_t *const uf = &rtas_update_flash_data;
257 struct rtas_update_flash_t *uf;
258 char msg[RTAS_MSG_MAXLEN]; 261 char msg[RTAS_MSG_MAXLEN];
262 size_t len;
263 int status;
259 264
260 uf = dp->data; 265 mutex_lock(&rtas_update_flash_mutex);
266 status = uf->status;
267 mutex_unlock(&rtas_update_flash_mutex);
261 268
262 if (!strcmp(dp->name, FIRMWARE_FLASH_NAME)) { 269 /* Read as text message */
263 get_flash_status_msg(uf->status, msg); 270 len = get_flash_status_msg(status, msg);
264 } else { /* FIRMWARE_UPDATE_NAME */ 271 return simple_read_from_buffer(buf, count, ppos, msg, len);
265 sprintf(msg, "%d\n", uf->status); 272}
266 } 273
274static ssize_t rtas_flash_read_num(struct file *file, char __user *buf,
275 size_t count, loff_t *ppos)
276{
277 struct rtas_update_flash_t *const uf = &rtas_update_flash_data;
278 char msg[RTAS_MSG_MAXLEN];
279 int status;
267 280
281 mutex_lock(&rtas_update_flash_mutex);
282 status = uf->status;
283 mutex_unlock(&rtas_update_flash_mutex);
284
285 /* Read as number */
286 sprintf(msg, "%d\n", status);
268 return simple_read_from_buffer(buf, count, ppos, msg, strlen(msg)); 287 return simple_read_from_buffer(buf, count, ppos, msg, strlen(msg));
269} 288}
270 289
271/* constructor for flash_block_cache */ 290/* constructor for flash_block_cache */
272void rtas_block_ctor(void *ptr) 291static void rtas_block_ctor(void *ptr)
273{ 292{
274 memset(ptr, 0, RTAS_BLK_SIZE); 293 memset(ptr, 0, RTAS_BLK_SIZE);
275} 294}
@@ -282,16 +301,15 @@ void rtas_block_ctor(void *ptr)
282static ssize_t rtas_flash_write(struct file *file, const char __user *buffer, 301static ssize_t rtas_flash_write(struct file *file, const char __user *buffer,
283 size_t count, loff_t *off) 302 size_t count, loff_t *off)
284{ 303{
285 struct proc_dir_entry *dp = PDE(file_inode(file)); 304 struct rtas_update_flash_t *const uf = &rtas_update_flash_data;
286 struct rtas_update_flash_t *uf;
287 char *p; 305 char *p;
288 int next_free; 306 int next_free, rc;
289 struct flash_block_list *fl; 307 struct flash_block_list *fl;
290 308
291 uf = (struct rtas_update_flash_t *) dp->data; 309 mutex_lock(&rtas_update_flash_mutex);
292 310
293 if (uf->status == FLASH_AUTH || count == 0) 311 if (uf->status == FLASH_AUTH || count == 0)
294 return count; /* discard data */ 312 goto out; /* discard data */
295 313
296 /* In the case that the image is not ready for flashing, the memory 314 /* In the case that the image is not ready for flashing, the memory
297 * allocated for the block list will be freed upon the release of the 315 * allocated for the block list will be freed upon the release of the
@@ -300,7 +318,7 @@ static ssize_t rtas_flash_write(struct file *file, const char __user *buffer,
300 if (uf->flist == NULL) { 318 if (uf->flist == NULL) {
301 uf->flist = kmem_cache_alloc(flash_block_cache, GFP_KERNEL); 319 uf->flist = kmem_cache_alloc(flash_block_cache, GFP_KERNEL);
302 if (!uf->flist) 320 if (!uf->flist)
303 return -ENOMEM; 321 goto nomem;
304 } 322 }
305 323
306 fl = uf->flist; 324 fl = uf->flist;
@@ -311,7 +329,7 @@ static ssize_t rtas_flash_write(struct file *file, const char __user *buffer,
311 /* Need to allocate another block_list */ 329 /* Need to allocate another block_list */
312 fl->next = kmem_cache_alloc(flash_block_cache, GFP_KERNEL); 330 fl->next = kmem_cache_alloc(flash_block_cache, GFP_KERNEL);
313 if (!fl->next) 331 if (!fl->next)
314 return -ENOMEM; 332 goto nomem;
315 fl = fl->next; 333 fl = fl->next;
316 next_free = 0; 334 next_free = 0;
317 } 335 }
@@ -320,52 +338,37 @@ static ssize_t rtas_flash_write(struct file *file, const char __user *buffer,
320 count = RTAS_BLK_SIZE; 338 count = RTAS_BLK_SIZE;
321 p = kmem_cache_alloc(flash_block_cache, GFP_KERNEL); 339 p = kmem_cache_alloc(flash_block_cache, GFP_KERNEL);
322 if (!p) 340 if (!p)
323 return -ENOMEM; 341 goto nomem;
324 342
325 if(copy_from_user(p, buffer, count)) { 343 if(copy_from_user(p, buffer, count)) {
326 kmem_cache_free(flash_block_cache, p); 344 kmem_cache_free(flash_block_cache, p);
327 return -EFAULT; 345 rc = -EFAULT;
346 goto error;
328 } 347 }
329 fl->blocks[next_free].data = p; 348 fl->blocks[next_free].data = p;
330 fl->blocks[next_free].length = count; 349 fl->blocks[next_free].length = count;
331 fl->num_blocks++; 350 fl->num_blocks++;
332 351out:
352 mutex_unlock(&rtas_update_flash_mutex);
333 return count; 353 return count;
334}
335
336static int rtas_excl_open(struct inode *inode, struct file *file)
337{
338 struct proc_dir_entry *dp = PDE(inode);
339
340 /* Enforce exclusive open with use count of PDE */
341 spin_lock(&flash_file_open_lock);
342 if (atomic_read(&dp->count) > 2) {
343 spin_unlock(&flash_file_open_lock);
344 return -EBUSY;
345 }
346
347 atomic_inc(&dp->count);
348 spin_unlock(&flash_file_open_lock);
349
350 return 0;
351}
352
353static int rtas_excl_release(struct inode *inode, struct file *file)
354{
355 struct proc_dir_entry *dp = PDE(inode);
356 354
357 atomic_dec(&dp->count); 355nomem:
358 356 rc = -ENOMEM;
359 return 0; 357error:
358 mutex_unlock(&rtas_update_flash_mutex);
359 return rc;
360} 360}
361 361
362static void manage_flash(struct rtas_manage_flash_t *args_buf) 362/*
363 * Flash management routines.
364 */
365static void manage_flash(struct rtas_manage_flash_t *args_buf, unsigned int op)
363{ 366{
364 s32 rc; 367 s32 rc;
365 368
366 do { 369 do {
367 rc = rtas_call(rtas_token("ibm,manage-flash-image"), 1, 370 rc = rtas_call(rtas_token("ibm,manage-flash-image"), 1, 1,
368 1, NULL, args_buf->op); 371 NULL, op);
369 } while (rtas_busy_delay(rc)); 372 } while (rtas_busy_delay(rc));
370 373
371 args_buf->status = rc; 374 args_buf->status = rc;
@@ -374,55 +377,62 @@ static void manage_flash(struct rtas_manage_flash_t *args_buf)
374static ssize_t manage_flash_read(struct file *file, char __user *buf, 377static ssize_t manage_flash_read(struct file *file, char __user *buf,
375 size_t count, loff_t *ppos) 378 size_t count, loff_t *ppos)
376{ 379{
377 struct proc_dir_entry *dp = PDE(file_inode(file)); 380 struct rtas_manage_flash_t *const args_buf = &rtas_manage_flash_data;
378 struct rtas_manage_flash_t *args_buf;
379 char msg[RTAS_MSG_MAXLEN]; 381 char msg[RTAS_MSG_MAXLEN];
380 int msglen; 382 int msglen, status;
381 383
382 args_buf = dp->data; 384 mutex_lock(&rtas_manage_flash_mutex);
383 if (args_buf == NULL) 385 status = args_buf->status;
384 return 0; 386 mutex_unlock(&rtas_manage_flash_mutex);
385
386 msglen = sprintf(msg, "%d\n", args_buf->status);
387 387
388 msglen = sprintf(msg, "%d\n", status);
388 return simple_read_from_buffer(buf, count, ppos, msg, msglen); 389 return simple_read_from_buffer(buf, count, ppos, msg, msglen);
389} 390}
390 391
391static ssize_t manage_flash_write(struct file *file, const char __user *buf, 392static ssize_t manage_flash_write(struct file *file, const char __user *buf,
392 size_t count, loff_t *off) 393 size_t count, loff_t *off)
393{ 394{
394 struct proc_dir_entry *dp = PDE(file_inode(file)); 395 struct rtas_manage_flash_t *const args_buf = &rtas_manage_flash_data;
395 struct rtas_manage_flash_t *args_buf; 396 static const char reject_str[] = "0";
396 const char reject_str[] = "0"; 397 static const char commit_str[] = "1";
397 const char commit_str[] = "1";
398 char stkbuf[10]; 398 char stkbuf[10];
399 int op; 399 int op, rc;
400
401 mutex_lock(&rtas_manage_flash_mutex);
400 402
401 args_buf = (struct rtas_manage_flash_t *) dp->data;
402 if ((args_buf->status == MANAGE_AUTH) || (count == 0)) 403 if ((args_buf->status == MANAGE_AUTH) || (count == 0))
403 return count; 404 goto out;
404 405
405 op = -1; 406 op = -1;
406 if (buf) { 407 if (buf) {
407 if (count > 9) count = 9; 408 if (count > 9) count = 9;
408 if (copy_from_user (stkbuf, buf, count)) { 409 rc = -EFAULT;
409 return -EFAULT; 410 if (copy_from_user (stkbuf, buf, count))
410 } 411 goto error;
411 if (strncmp(stkbuf, reject_str, strlen(reject_str)) == 0) 412 if (strncmp(stkbuf, reject_str, strlen(reject_str)) == 0)
412 op = RTAS_REJECT_TMP_IMG; 413 op = RTAS_REJECT_TMP_IMG;
413 else if (strncmp(stkbuf, commit_str, strlen(commit_str)) == 0) 414 else if (strncmp(stkbuf, commit_str, strlen(commit_str)) == 0)
414 op = RTAS_COMMIT_TMP_IMG; 415 op = RTAS_COMMIT_TMP_IMG;
415 } 416 }
416 417
417 if (op == -1) /* buf is empty, or contains invalid string */ 418 if (op == -1) { /* buf is empty, or contains invalid string */
418 return -EINVAL; 419 rc = -EINVAL;
419 420 goto error;
420 args_buf->op = op; 421 }
421 manage_flash(args_buf);
422 422
423 manage_flash(args_buf, op);
424out:
425 mutex_unlock(&rtas_manage_flash_mutex);
423 return count; 426 return count;
427
428error:
429 mutex_unlock(&rtas_manage_flash_mutex);
430 return rc;
424} 431}
425 432
433/*
434 * Validation routines.
435 */
426static void validate_flash(struct rtas_validate_flash_t *args_buf) 436static void validate_flash(struct rtas_validate_flash_t *args_buf)
427{ 437{
428 int token = rtas_token("ibm,validate-flash-image"); 438 int token = rtas_token("ibm,validate-flash-image");
@@ -462,14 +472,14 @@ static int get_validate_flash_msg(struct rtas_validate_flash_t *args_buf,
462static ssize_t validate_flash_read(struct file *file, char __user *buf, 472static ssize_t validate_flash_read(struct file *file, char __user *buf,
463 size_t count, loff_t *ppos) 473 size_t count, loff_t *ppos)
464{ 474{
465 struct proc_dir_entry *dp = PDE(file_inode(file)); 475 struct rtas_validate_flash_t *const args_buf =
466 struct rtas_validate_flash_t *args_buf; 476 &rtas_validate_flash_data;
467 char msg[RTAS_MSG_MAXLEN]; 477 char msg[RTAS_MSG_MAXLEN];
468 int msglen; 478 int msglen;
469 479
470 args_buf = dp->data; 480 mutex_lock(&rtas_validate_flash_mutex);
471
472 msglen = get_validate_flash_msg(args_buf, msg); 481 msglen = get_validate_flash_msg(args_buf, msg);
482 mutex_unlock(&rtas_validate_flash_mutex);
473 483
474 return simple_read_from_buffer(buf, count, ppos, msg, msglen); 484 return simple_read_from_buffer(buf, count, ppos, msg, msglen);
475} 485}
@@ -477,24 +487,18 @@ static ssize_t validate_flash_read(struct file *file, char __user *buf,
477static ssize_t validate_flash_write(struct file *file, const char __user *buf, 487static ssize_t validate_flash_write(struct file *file, const char __user *buf,
478 size_t count, loff_t *off) 488 size_t count, loff_t *off)
479{ 489{
480 struct proc_dir_entry *dp = PDE(file_inode(file)); 490 struct rtas_validate_flash_t *const args_buf =
481 struct rtas_validate_flash_t *args_buf; 491 &rtas_validate_flash_data;
482 int rc; 492 int rc;
483 493
484 args_buf = (struct rtas_validate_flash_t *) dp->data; 494 mutex_lock(&rtas_validate_flash_mutex);
485
486 if (dp->data == NULL) {
487 dp->data = kmalloc(sizeof(struct rtas_validate_flash_t),
488 GFP_KERNEL);
489 if (dp->data == NULL)
490 return -ENOMEM;
491 }
492 495
493 /* We are only interested in the first 4K of the 496 /* We are only interested in the first 4K of the
494 * candidate image */ 497 * candidate image */
495 if ((*off >= VALIDATE_BUF_SIZE) || 498 if ((*off >= VALIDATE_BUF_SIZE) ||
496 (args_buf->status == VALIDATE_AUTH)) { 499 (args_buf->status == VALIDATE_AUTH)) {
497 *off += count; 500 *off += count;
501 mutex_unlock(&rtas_validate_flash_mutex);
498 return count; 502 return count;
499 } 503 }
500 504
@@ -517,31 +521,29 @@ static ssize_t validate_flash_write(struct file *file, const char __user *buf,
517 *off += count; 521 *off += count;
518 rc = count; 522 rc = count;
519done: 523done:
520 if (rc < 0) { 524 mutex_unlock(&rtas_validate_flash_mutex);
521 kfree(dp->data);
522 dp->data = NULL;
523 }
524 return rc; 525 return rc;
525} 526}
526 527
527static int validate_flash_release(struct inode *inode, struct file *file) 528static int validate_flash_release(struct inode *inode, struct file *file)
528{ 529{
529 struct proc_dir_entry *dp = PDE(file_inode(file)); 530 struct rtas_validate_flash_t *const args_buf =
530 struct rtas_validate_flash_t *args_buf; 531 &rtas_validate_flash_data;
531 532
532 args_buf = (struct rtas_validate_flash_t *) dp->data; 533 mutex_lock(&rtas_validate_flash_mutex);
533 534
534 if (args_buf->status == VALIDATE_READY) { 535 if (args_buf->status == VALIDATE_READY) {
535 args_buf->buf_size = VALIDATE_BUF_SIZE; 536 args_buf->buf_size = VALIDATE_BUF_SIZE;
536 validate_flash(args_buf); 537 validate_flash(args_buf);
537 } 538 }
538 539
539 /* The matching atomic_inc was in rtas_excl_open() */ 540 mutex_unlock(&rtas_validate_flash_mutex);
540 atomic_dec(&dp->count);
541
542 return 0; 541 return 0;
543} 542}
544 543
544/*
545 * On-reboot flash update applicator.
546 */
545static void rtas_flash_firmware(int reboot_type) 547static void rtas_flash_firmware(int reboot_type)
546{ 548{
547 unsigned long image_size; 549 unsigned long image_size;
@@ -634,75 +636,57 @@ static void rtas_flash_firmware(int reboot_type)
634 spin_unlock(&rtas_data_buf_lock); 636 spin_unlock(&rtas_data_buf_lock);
635} 637}
636 638
637static void remove_flash_pde(struct proc_dir_entry *dp) 639/*
638{ 640 * Manifest of proc files to create
639 if (dp) { 641 */
640 kfree(dp->data); 642struct rtas_flash_file {
641 remove_proc_entry(dp->name, dp->parent); 643 const char *filename;
642 } 644 const char *rtas_call_name;
643}
644
645static int initialize_flash_pde_data(const char *rtas_call_name,
646 size_t buf_size,
647 struct proc_dir_entry *dp)
648{
649 int *status; 645 int *status;
650 int token; 646 const struct file_operations fops;
651
652 dp->data = kzalloc(buf_size, GFP_KERNEL);
653 if (dp->data == NULL)
654 return -ENOMEM;
655
656 /*
657 * This code assumes that the status int is the first member of the
658 * struct
659 */
660 status = (int *) dp->data;
661 token = rtas_token(rtas_call_name);
662 if (token == RTAS_UNKNOWN_SERVICE)
663 *status = FLASH_AUTH;
664 else
665 *status = FLASH_NO_OP;
666
667 return 0;
668}
669
670static struct proc_dir_entry *create_flash_pde(const char *filename,
671 const struct file_operations *fops)
672{
673 return proc_create(filename, S_IRUSR | S_IWUSR, NULL, fops);
674}
675
676static const struct file_operations rtas_flash_operations = {
677 .owner = THIS_MODULE,
678 .read = rtas_flash_read,
679 .write = rtas_flash_write,
680 .open = rtas_excl_open,
681 .release = rtas_flash_release,
682 .llseek = default_llseek,
683};
684
685static const struct file_operations manage_flash_operations = {
686 .owner = THIS_MODULE,
687 .read = manage_flash_read,
688 .write = manage_flash_write,
689 .open = rtas_excl_open,
690 .release = rtas_excl_release,
691 .llseek = default_llseek,
692}; 647};
693 648
694static const struct file_operations validate_flash_operations = { 649static const struct rtas_flash_file rtas_flash_files[] = {
695 .owner = THIS_MODULE, 650 {
696 .read = validate_flash_read, 651 .filename = "powerpc/rtas/" FIRMWARE_FLASH_NAME,
697 .write = validate_flash_write, 652 .rtas_call_name = "ibm,update-flash-64-and-reboot",
698 .open = rtas_excl_open, 653 .status = &rtas_update_flash_data.status,
699 .release = validate_flash_release, 654 .fops.read = rtas_flash_read_msg,
700 .llseek = default_llseek, 655 .fops.write = rtas_flash_write,
656 .fops.release = rtas_flash_release,
657 .fops.llseek = default_llseek,
658 },
659 {
660 .filename = "powerpc/rtas/" FIRMWARE_UPDATE_NAME,
661 .rtas_call_name = "ibm,update-flash-64-and-reboot",
662 .status = &rtas_update_flash_data.status,
663 .fops.read = rtas_flash_read_num,
664 .fops.write = rtas_flash_write,
665 .fops.release = rtas_flash_release,
666 .fops.llseek = default_llseek,
667 },
668 {
669 .filename = "powerpc/rtas/" VALIDATE_FLASH_NAME,
670 .rtas_call_name = "ibm,validate-flash-image",
671 .status = &rtas_validate_flash_data.status,
672 .fops.read = validate_flash_read,
673 .fops.write = validate_flash_write,
674 .fops.release = validate_flash_release,
675 .fops.llseek = default_llseek,
676 },
677 {
678 .filename = "powerpc/rtas/" MANAGE_FLASH_NAME,
679 .rtas_call_name = "ibm,manage-flash-image",
680 .status = &rtas_manage_flash_data.status,
681 .fops.read = manage_flash_read,
682 .fops.write = manage_flash_write,
683 .fops.llseek = default_llseek,
684 }
701}; 685};
702 686
703static int __init rtas_flash_init(void) 687static int __init rtas_flash_init(void)
704{ 688{
705 int rc; 689 int i;
706 690
707 if (rtas_token("ibm,update-flash-64-and-reboot") == 691 if (rtas_token("ibm,update-flash-64-and-reboot") ==
708 RTAS_UNKNOWN_SERVICE) { 692 RTAS_UNKNOWN_SERVICE) {
@@ -710,93 +694,65 @@ static int __init rtas_flash_init(void)
710 return 1; 694 return 1;
711 } 695 }
712 696
713 firmware_flash_pde = create_flash_pde("powerpc/rtas/" 697 rtas_validate_flash_data.buf = kzalloc(VALIDATE_BUF_SIZE, GFP_KERNEL);
714 FIRMWARE_FLASH_NAME, 698 if (!rtas_validate_flash_data.buf)
715 &rtas_flash_operations); 699 return -ENOMEM;
716 if (firmware_flash_pde == NULL) {
717 rc = -ENOMEM;
718 goto cleanup;
719 }
720 700
721 rc = initialize_flash_pde_data("ibm,update-flash-64-and-reboot", 701 flash_block_cache = kmem_cache_create("rtas_flash_cache",
722 sizeof(struct rtas_update_flash_t), 702 RTAS_BLK_SIZE, RTAS_BLK_SIZE, 0,
723 firmware_flash_pde); 703 rtas_block_ctor);
724 if (rc != 0) 704 if (!flash_block_cache) {
725 goto cleanup; 705 printk(KERN_ERR "%s: failed to create block cache\n",
726 706 __func__);
727 firmware_update_pde = create_flash_pde("powerpc/rtas/" 707 goto enomem_buf;
728 FIRMWARE_UPDATE_NAME,
729 &rtas_flash_operations);
730 if (firmware_update_pde == NULL) {
731 rc = -ENOMEM;
732 goto cleanup;
733 } 708 }
734 709
735 rc = initialize_flash_pde_data("ibm,update-flash-64-and-reboot", 710 for (i = 0; i < ARRAY_SIZE(rtas_flash_files); i++) {
736 sizeof(struct rtas_update_flash_t), 711 const struct rtas_flash_file *f = &rtas_flash_files[i];
737 firmware_update_pde); 712 int token;
738 if (rc != 0)
739 goto cleanup;
740
741 validate_pde = create_flash_pde("powerpc/rtas/" VALIDATE_FLASH_NAME,
742 &validate_flash_operations);
743 if (validate_pde == NULL) {
744 rc = -ENOMEM;
745 goto cleanup;
746 }
747 713
748 rc = initialize_flash_pde_data("ibm,validate-flash-image", 714 if (!proc_create(f->filename, S_IRUSR | S_IWUSR, NULL, &f->fops))
749 sizeof(struct rtas_validate_flash_t), 715 goto enomem;
750 validate_pde);
751 if (rc != 0)
752 goto cleanup;
753
754 manage_pde = create_flash_pde("powerpc/rtas/" MANAGE_FLASH_NAME,
755 &manage_flash_operations);
756 if (manage_pde == NULL) {
757 rc = -ENOMEM;
758 goto cleanup;
759 }
760 716
761 rc = initialize_flash_pde_data("ibm,manage-flash-image", 717 /*
762 sizeof(struct rtas_manage_flash_t), 718 * This code assumes that the status int is the first member of the
763 manage_pde); 719 * struct
764 if (rc != 0) 720 */
765 goto cleanup; 721 token = rtas_token(f->rtas_call_name);
722 if (token == RTAS_UNKNOWN_SERVICE)
723 *f->status = FLASH_AUTH;
724 else
725 *f->status = FLASH_NO_OP;
726 }
766 727
767 rtas_flash_term_hook = rtas_flash_firmware; 728 rtas_flash_term_hook = rtas_flash_firmware;
768
769 flash_block_cache = kmem_cache_create("rtas_flash_cache",
770 RTAS_BLK_SIZE, RTAS_BLK_SIZE, 0,
771 rtas_block_ctor);
772 if (!flash_block_cache) {
773 printk(KERN_ERR "%s: failed to create block cache\n",
774 __func__);
775 rc = -ENOMEM;
776 goto cleanup;
777 }
778 return 0; 729 return 0;
779 730
780cleanup: 731enomem:
781 remove_flash_pde(firmware_flash_pde); 732 while (--i >= 0) {
782 remove_flash_pde(firmware_update_pde); 733 const struct rtas_flash_file *f = &rtas_flash_files[i];
783 remove_flash_pde(validate_pde); 734 remove_proc_entry(f->filename, NULL);
784 remove_flash_pde(manage_pde); 735 }
785 736
786 return rc; 737 kmem_cache_destroy(flash_block_cache);
738enomem_buf:
739 kfree(rtas_validate_flash_data.buf);
740 return -ENOMEM;
787} 741}
788 742
789static void __exit rtas_flash_cleanup(void) 743static void __exit rtas_flash_cleanup(void)
790{ 744{
745 int i;
746
791 rtas_flash_term_hook = NULL; 747 rtas_flash_term_hook = NULL;
792 748
793 if (flash_block_cache) 749 for (i = 0; i < ARRAY_SIZE(rtas_flash_files); i++) {
794 kmem_cache_destroy(flash_block_cache); 750 const struct rtas_flash_file *f = &rtas_flash_files[i];
751 remove_proc_entry(f->filename, NULL);
752 }
795 753
796 remove_flash_pde(firmware_flash_pde); 754 kmem_cache_destroy(flash_block_cache);
797 remove_flash_pde(firmware_update_pde); 755 kfree(rtas_validate_flash_data.buf);
798 remove_flash_pde(validate_pde);
799 remove_flash_pde(manage_pde);
800} 756}
801 757
802module_init(rtas_flash_init); 758module_init(rtas_flash_init);
diff --git a/arch/powerpc/kvm/book3s_64_mmu_hv.c b/arch/powerpc/kvm/book3s_64_mmu_hv.c
index 8cc18abd6dde..da98e26f6e45 100644
--- a/arch/powerpc/kvm/book3s_64_mmu_hv.c
+++ b/arch/powerpc/kvm/book3s_64_mmu_hv.c
@@ -1467,7 +1467,7 @@ static int kvm_htab_release(struct inode *inode, struct file *filp)
1467 return 0; 1467 return 0;
1468} 1468}
1469 1469
1470static struct file_operations kvm_htab_fops = { 1470static const struct file_operations kvm_htab_fops = {
1471 .read = kvm_htab_read, 1471 .read = kvm_htab_read,
1472 .write = kvm_htab_write, 1472 .write = kvm_htab_write,
1473 .llseek = default_llseek, 1473 .llseek = default_llseek,
diff --git a/arch/powerpc/kvm/book3s_64_vio.c b/arch/powerpc/kvm/book3s_64_vio.c
index 72ffc899c082..b2d3f3b2de72 100644
--- a/arch/powerpc/kvm/book3s_64_vio.c
+++ b/arch/powerpc/kvm/book3s_64_vio.c
@@ -92,7 +92,7 @@ static int kvm_spapr_tce_release(struct inode *inode, struct file *filp)
92 return 0; 92 return 0;
93} 93}
94 94
95static struct file_operations kvm_spapr_tce_fops = { 95static const struct file_operations kvm_spapr_tce_fops = {
96 .mmap = kvm_spapr_tce_mmap, 96 .mmap = kvm_spapr_tce_mmap,
97 .release = kvm_spapr_tce_release, 97 .release = kvm_spapr_tce_release,
98}; 98};
diff --git a/arch/powerpc/kvm/book3s_hv.c b/arch/powerpc/kvm/book3s_hv.c
index 80dcc53a1aba..b62bd1b97c68 100644
--- a/arch/powerpc/kvm/book3s_hv.c
+++ b/arch/powerpc/kvm/book3s_hv.c
@@ -1483,7 +1483,7 @@ static int kvm_rma_release(struct inode *inode, struct file *filp)
1483 return 0; 1483 return 0;
1484} 1484}
1485 1485
1486static struct file_operations kvm_rma_fops = { 1486static const struct file_operations kvm_rma_fops = {
1487 .mmap = kvm_rma_mmap, 1487 .mmap = kvm_rma_mmap,
1488 .release = kvm_rma_release, 1488 .release = kvm_rma_release,
1489}; 1489};
diff --git a/arch/powerpc/platforms/cell/spufs/file.c b/arch/powerpc/platforms/cell/spufs/file.c
index 68c57d38745a..d43d2d0b90e3 100644
--- a/arch/powerpc/platforms/cell/spufs/file.c
+++ b/arch/powerpc/platforms/cell/spufs/file.c
@@ -149,7 +149,6 @@ static int __fops ## _open(struct inode *inode, struct file *file) \
149 return spufs_attr_open(inode, file, __get, __set, __fmt); \ 149 return spufs_attr_open(inode, file, __get, __set, __fmt); \
150} \ 150} \
151static const struct file_operations __fops = { \ 151static const struct file_operations __fops = { \
152 .owner = THIS_MODULE, \
153 .open = __fops ## _open, \ 152 .open = __fops ## _open, \
154 .release = spufs_attr_release, \ 153 .release = spufs_attr_release, \
155 .read = spufs_attr_read, \ 154 .read = spufs_attr_read, \
@@ -2591,7 +2590,6 @@ static unsigned int spufs_switch_log_poll(struct file *file, poll_table *wait)
2591} 2590}
2592 2591
2593static const struct file_operations spufs_switch_log_fops = { 2592static const struct file_operations spufs_switch_log_fops = {
2594 .owner = THIS_MODULE,
2595 .open = spufs_switch_log_open, 2593 .open = spufs_switch_log_open,
2596 .read = spufs_switch_log_read, 2594 .read = spufs_switch_log_read,
2597 .poll = spufs_switch_log_poll, 2595 .poll = spufs_switch_log_poll,
diff --git a/arch/powerpc/platforms/pseries/reconfig.c b/arch/powerpc/platforms/pseries/reconfig.c
index d6491bd481d0..f93cdf55628c 100644
--- a/arch/powerpc/platforms/pseries/reconfig.c
+++ b/arch/powerpc/platforms/pseries/reconfig.c
@@ -452,7 +452,7 @@ static int proc_ppc64_create_ofdt(void)
452 452
453 ent = proc_create("powerpc/ofdt", S_IWUSR, NULL, &ofdt_fops); 453 ent = proc_create("powerpc/ofdt", S_IWUSR, NULL, &ofdt_fops);
454 if (ent) 454 if (ent)
455 ent->size = 0; 455 proc_set_size(ent, 0);
456 456
457 return 0; 457 return 0;
458} 458}
diff --git a/arch/powerpc/platforms/pseries/scanlog.c b/arch/powerpc/platforms/pseries/scanlog.c
index 47f3cda2a68b..b502ab61aafa 100644
--- a/arch/powerpc/platforms/pseries/scanlog.c
+++ b/arch/powerpc/platforms/pseries/scanlog.c
@@ -41,13 +41,12 @@
41 41
42 42
43static unsigned int ibm_scan_log_dump; /* RTAS token */ 43static unsigned int ibm_scan_log_dump; /* RTAS token */
44static struct proc_dir_entry *proc_ppc64_scan_log_dump; /* The proc file */ 44static unsigned int *scanlog_buffer; /* The data buffer */
45 45
46static ssize_t scanlog_read(struct file *file, char __user *buf, 46static ssize_t scanlog_read(struct file *file, char __user *buf,
47 size_t count, loff_t *ppos) 47 size_t count, loff_t *ppos)
48{ 48{
49 struct proc_dir_entry *dp = PDE(file_inode(file)); 49 unsigned int *data = scanlog_buffer;
50 unsigned int *data = (unsigned int *)dp->data;
51 int status; 50 int status;
52 unsigned long len, off; 51 unsigned long len, off;
53 unsigned int wait_time; 52 unsigned int wait_time;
@@ -135,8 +134,7 @@ static ssize_t scanlog_write(struct file * file, const char __user * buf,
135 134
136static int scanlog_open(struct inode * inode, struct file * file) 135static int scanlog_open(struct inode * inode, struct file * file)
137{ 136{
138 struct proc_dir_entry *dp = PDE(inode); 137 unsigned int *data = scanlog_buffer;
139 unsigned int *data = (unsigned int *)dp->data;
140 138
141 if (data[0] != 0) { 139 if (data[0] != 0) {
142 /* This imperfect test stops a second copy of the 140 /* This imperfect test stops a second copy of the
@@ -152,11 +150,9 @@ static int scanlog_open(struct inode * inode, struct file * file)
152 150
153static int scanlog_release(struct inode * inode, struct file * file) 151static int scanlog_release(struct inode * inode, struct file * file)
154{ 152{
155 struct proc_dir_entry *dp = PDE(inode); 153 unsigned int *data = scanlog_buffer;
156 unsigned int *data = (unsigned int *)dp->data;
157 154
158 data[0] = 0; 155 data[0] = 0;
159
160 return 0; 156 return 0;
161} 157}
162 158
@@ -172,7 +168,6 @@ const struct file_operations scanlog_fops = {
172static int __init scanlog_init(void) 168static int __init scanlog_init(void)
173{ 169{
174 struct proc_dir_entry *ent; 170 struct proc_dir_entry *ent;
175 void *data;
176 int err = -ENOMEM; 171 int err = -ENOMEM;
177 172
178 ibm_scan_log_dump = rtas_token("ibm,scan-log-dump"); 173 ibm_scan_log_dump = rtas_token("ibm,scan-log-dump");
@@ -180,29 +175,24 @@ static int __init scanlog_init(void)
180 return -ENODEV; 175 return -ENODEV;
181 176
182 /* Ideally we could allocate a buffer < 4G */ 177 /* Ideally we could allocate a buffer < 4G */
183 data = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL); 178 scanlog_buffer = kzalloc(RTAS_DATA_BUF_SIZE, GFP_KERNEL);
184 if (!data) 179 if (!scanlog_buffer)
185 goto err; 180 goto err;
186 181
187 ent = proc_create_data("powerpc/rtas/scan-log-dump", S_IRUSR, NULL, 182 ent = proc_create("powerpc/rtas/scan-log-dump", S_IRUSR, NULL,
188 &scanlog_fops, data); 183 &scanlog_fops);
189 if (!ent) 184 if (!ent)
190 goto err; 185 goto err;
191
192 proc_ppc64_scan_log_dump = ent;
193
194 return 0; 186 return 0;
195err: 187err:
196 kfree(data); 188 kfree(scanlog_buffer);
197 return err; 189 return err;
198} 190}
199 191
200static void __exit scanlog_cleanup(void) 192static void __exit scanlog_cleanup(void)
201{ 193{
202 if (proc_ppc64_scan_log_dump) { 194 remove_proc_entry("powerpc/rtas/scan-log-dump", NULL);
203 kfree(proc_ppc64_scan_log_dump->data); 195 kfree(scanlog_buffer);
204 remove_proc_entry("scan-log-dump", proc_ppc64_scan_log_dump->parent);
205 }
206} 196}
207 197
208module_init(scanlog_init); 198module_init(scanlog_init);
diff --git a/arch/s390/kernel/compat_wrapper.S b/arch/s390/kernel/compat_wrapper.S
index 17644c8e10e1..2d72d9e96c15 100644
--- a/arch/s390/kernel/compat_wrapper.S
+++ b/arch/s390/kernel/compat_wrapper.S
@@ -1323,22 +1323,6 @@ ENTRY(compat_sys_keyctl_wrapper)
1323 llgfr %r6,%r6 # u32 1323 llgfr %r6,%r6 # u32
1324 jg compat_sys_keyctl # branch to system call 1324 jg compat_sys_keyctl # branch to system call
1325 1325
1326ENTRY(compat_sys_preadv_wrapper)
1327 llgfr %r2,%r2 # unsigned long
1328 llgtr %r3,%r3 # compat_iovec *
1329 llgfr %r4,%r4 # unsigned long
1330 llgfr %r5,%r5 # u32
1331 llgfr %r6,%r6 # u32
1332 jg compat_sys_preadv # branch to system call
1333
1334ENTRY(compat_sys_pwritev_wrapper)
1335 llgfr %r2,%r2 # unsigned long
1336 llgtr %r3,%r3 # compat_iovec *
1337 llgfr %r4,%r4 # unsigned long
1338 llgfr %r5,%r5 # u32
1339 llgfr %r6,%r6 # u32
1340 jg compat_sys_pwritev # branch to system call
1341
1342ENTRY(sys_perf_event_open_wrapper) 1326ENTRY(sys_perf_event_open_wrapper)
1343 llgtr %r2,%r2 # const struct perf_event_attr * 1327 llgtr %r2,%r2 # const struct perf_event_attr *
1344 lgfr %r3,%r3 # pid_t 1328 lgfr %r3,%r3 # pid_t
diff --git a/arch/s390/kernel/irq.c b/arch/s390/kernel/irq.c
index 4f5ef62934a4..f7fb58903f6a 100644
--- a/arch/s390/kernel/irq.c
+++ b/arch/s390/kernel/irq.c
@@ -162,10 +162,8 @@ asmlinkage void do_softirq(void)
162#ifdef CONFIG_PROC_FS 162#ifdef CONFIG_PROC_FS
163void init_irq_proc(void) 163void init_irq_proc(void)
164{ 164{
165 struct proc_dir_entry *root_irq_dir; 165 if (proc_mkdir("irq", NULL))
166 166 create_prof_cpu_mask();
167 root_irq_dir = proc_mkdir("irq", NULL);
168 create_prof_cpu_mask(root_irq_dir);
169} 167}
170#endif 168#endif
171 169
diff --git a/arch/s390/kernel/os_info.c b/arch/s390/kernel/os_info.c
index 46480d81df00..d112fc66f993 100644
--- a/arch/s390/kernel/os_info.c
+++ b/arch/s390/kernel/os_info.c
@@ -10,6 +10,7 @@
10 10
11#include <linux/crash_dump.h> 11#include <linux/crash_dump.h>
12#include <linux/kernel.h> 12#include <linux/kernel.h>
13#include <linux/slab.h>
13#include <asm/checksum.h> 14#include <asm/checksum.h>
14#include <asm/lowcore.h> 15#include <asm/lowcore.h>
15#include <asm/os_info.h> 16#include <asm/os_info.h>
diff --git a/arch/s390/kernel/syscalls.S b/arch/s390/kernel/syscalls.S
index d2baabed7148..9f214e992eed 100644
--- a/arch/s390/kernel/syscalls.S
+++ b/arch/s390/kernel/syscalls.S
@@ -336,8 +336,8 @@ SYSCALL(sys_inotify_init1,sys_inotify_init1,sys_inotify_init1_wrapper)
336SYSCALL(sys_pipe2,sys_pipe2,sys_pipe2_wrapper) /* 325 */ 336SYSCALL(sys_pipe2,sys_pipe2,sys_pipe2_wrapper) /* 325 */
337SYSCALL(sys_dup3,sys_dup3,sys_dup3_wrapper) 337SYSCALL(sys_dup3,sys_dup3,sys_dup3_wrapper)
338SYSCALL(sys_epoll_create1,sys_epoll_create1,sys_epoll_create1_wrapper) 338SYSCALL(sys_epoll_create1,sys_epoll_create1,sys_epoll_create1_wrapper)
339SYSCALL(sys_preadv,sys_preadv,compat_sys_preadv_wrapper) 339SYSCALL(sys_preadv,sys_preadv,compat_sys_preadv)
340SYSCALL(sys_pwritev,sys_pwritev,compat_sys_pwritev_wrapper) 340SYSCALL(sys_pwritev,sys_pwritev,compat_sys_pwritev)
341SYSCALL(sys_rt_tgsigqueueinfo,sys_rt_tgsigqueueinfo,compat_sys_rt_tgsigqueueinfo) /* 330 */ 341SYSCALL(sys_rt_tgsigqueueinfo,sys_rt_tgsigqueueinfo,compat_sys_rt_tgsigqueueinfo) /* 330 */
342SYSCALL(sys_perf_event_open,sys_perf_event_open,sys_perf_event_open_wrapper) 342SYSCALL(sys_perf_event_open,sys_perf_event_open,sys_perf_event_open_wrapper)
343SYSCALL(sys_fanotify_init,sys_fanotify_init,sys_fanotify_init_wrapper) 343SYSCALL(sys_fanotify_init,sys_fanotify_init,sys_fanotify_init_wrapper)
diff --git a/arch/score/mm/init.c b/arch/score/mm/init.c
index 1592aad7dbc4..d8f988a37d16 100644
--- a/arch/score/mm/init.c
+++ b/arch/score/mm/init.c
@@ -31,7 +31,7 @@
31#include <linux/mm.h> 31#include <linux/mm.h>
32#include <linux/mman.h> 32#include <linux/mman.h>
33#include <linux/pagemap.h> 33#include <linux/pagemap.h>
34#include <linux/proc_fs.h> 34#include <linux/kcore.h>
35#include <linux/sched.h> 35#include <linux/sched.h>
36#include <linux/initrd.h> 36#include <linux/initrd.h>
37 37
diff --git a/arch/sh/drivers/dma/dma-api.c b/arch/sh/drivers/dma/dma-api.c
index f46848f088e4..851e5106e580 100644
--- a/arch/sh/drivers/dma/dma-api.c
+++ b/arch/sh/drivers/dma/dma-api.c
@@ -13,6 +13,7 @@
13#include <linux/module.h> 13#include <linux/module.h>
14#include <linux/spinlock.h> 14#include <linux/spinlock.h>
15#include <linux/proc_fs.h> 15#include <linux/proc_fs.h>
16#include <linux/seq_file.h>
16#include <linux/list.h> 17#include <linux/list.h>
17#include <linux/platform_device.h> 18#include <linux/platform_device.h>
18#include <linux/mm.h> 19#include <linux/mm.h>
@@ -308,11 +309,9 @@ int dma_extend(unsigned int chan, unsigned long op, void *param)
308} 309}
309EXPORT_SYMBOL(dma_extend); 310EXPORT_SYMBOL(dma_extend);
310 311
311static int dma_read_proc(char *buf, char **start, off_t off, 312static int dma_proc_show(struct seq_file *m, void *v)
312 int len, int *eof, void *data)
313{ 313{
314 struct dma_info *info; 314 struct dma_info *info = v;
315 char *p = buf;
316 315
317 if (list_empty(&registered_dmac_list)) 316 if (list_empty(&registered_dmac_list))
318 return 0; 317 return 0;
@@ -332,14 +331,26 @@ static int dma_read_proc(char *buf, char **start, off_t off,
332 if (!(channel->flags & DMA_CONFIGURED)) 331 if (!(channel->flags & DMA_CONFIGURED))
333 continue; 332 continue;
334 333
335 p += sprintf(p, "%2d: %14s %s\n", i, 334 seq_printf(m, "%2d: %14s %s\n", i,
336 info->name, channel->dev_id); 335 info->name, channel->dev_id);
337 } 336 }
338 } 337 }
339 338
340 return p - buf; 339 return 0;
340}
341
342static int dma_proc_open(struct inode *inode, struct file *file)
343{
344 return single_open(file, dma_proc_show, NULL);
341} 345}
342 346
347static const struct file_operations dma_proc_fops = {
348 .open = dma_proc_open,
349 .read = seq_read,
350 .llseek = seq_lseek,
351 .release = seq_release,
352};
353
343int register_dmac(struct dma_info *info) 354int register_dmac(struct dma_info *info)
344{ 355{
345 unsigned int total_channels, i; 356 unsigned int total_channels, i;
@@ -412,8 +423,7 @@ EXPORT_SYMBOL(unregister_dmac);
412static int __init dma_api_init(void) 423static int __init dma_api_init(void)
413{ 424{
414 printk(KERN_NOTICE "DMA: Registering DMA API.\n"); 425 printk(KERN_NOTICE "DMA: Registering DMA API.\n");
415 return create_proc_read_entry("dma", 0, 0, dma_read_proc, 0) 426 return proc_create("dma", 0, NULL, &dma_proc_fops) ? 0 : -ENOMEM;
416 ? 0 : -ENOMEM;
417} 427}
418subsys_initcall(dma_api_init); 428subsys_initcall(dma_api_init);
419 429
diff --git a/arch/sh/mm/alignment.c b/arch/sh/mm/alignment.c
index aea14855e656..ec2b25302427 100644
--- a/arch/sh/mm/alignment.c
+++ b/arch/sh/mm/alignment.c
@@ -140,7 +140,7 @@ static int alignment_proc_open(struct inode *inode, struct file *file)
140static ssize_t alignment_proc_write(struct file *file, 140static ssize_t alignment_proc_write(struct file *file,
141 const char __user *buffer, size_t count, loff_t *pos) 141 const char __user *buffer, size_t count, loff_t *pos)
142{ 142{
143 int *data = PDE(file_inode(file))->data; 143 int *data = PDE_DATA(file_inode(file));
144 char mode; 144 char mode;
145 145
146 if (count > 0) { 146 if (count > 0) {
diff --git a/arch/sparc/kernel/ioport.c b/arch/sparc/kernel/ioport.c
index 0f094db918c7..2096468de9b2 100644
--- a/arch/sparc/kernel/ioport.c
+++ b/arch/sparc/kernel/ioport.c
@@ -693,7 +693,7 @@ static int sparc_io_proc_show(struct seq_file *m, void *v)
693 693
694static int sparc_io_proc_open(struct inode *inode, struct file *file) 694static int sparc_io_proc_open(struct inode *inode, struct file *file)
695{ 695{
696 return single_open(file, sparc_io_proc_show, PDE(inode)->data); 696 return single_open(file, sparc_io_proc_show, PDE_DATA(inode));
697} 697}
698 698
699static const struct file_operations sparc_io_proc_fops = { 699static const struct file_operations sparc_io_proc_fops = {
diff --git a/arch/sparc/kernel/sun4d_irq.c b/arch/sparc/kernel/sun4d_irq.c
index e490ac9327c7..f8933be3ca8b 100644
--- a/arch/sparc/kernel/sun4d_irq.c
+++ b/arch/sparc/kernel/sun4d_irq.c
@@ -6,6 +6,7 @@
6 */ 6 */
7 7
8#include <linux/kernel_stat.h> 8#include <linux/kernel_stat.h>
9#include <linux/slab.h>
9#include <linux/seq_file.h> 10#include <linux/seq_file.h>
10 11
11#include <asm/timer.h> 12#include <asm/timer.h>
diff --git a/arch/tile/kernel/hardwall.c b/arch/tile/kernel/hardwall.c
index 20273ee37deb..38ac189d9575 100644
--- a/arch/tile/kernel/hardwall.c
+++ b/arch/tile/kernel/hardwall.c
@@ -914,7 +914,7 @@ static int hardwall_proc_show(struct seq_file *sf, void *v)
914static int hardwall_proc_open(struct inode *inode, 914static int hardwall_proc_open(struct inode *inode,
915 struct file *file) 915 struct file *file)
916{ 916{
917 return single_open(file, hardwall_proc_show, PDE(inode)->data); 917 return single_open(file, hardwall_proc_show, PDE_DATA(inode));
918} 918}
919 919
920static const struct file_operations hardwall_proc_fops = { 920static const struct file_operations hardwall_proc_fops = {
diff --git a/arch/um/drivers/mconsole_kern.c b/arch/um/drivers/mconsole_kern.c
index 4bd82ac0210f..d7d21851e60c 100644
--- a/arch/um/drivers/mconsole_kern.c
+++ b/arch/um/drivers/mconsole_kern.c
@@ -782,8 +782,7 @@ static int create_proc_mconsole(void)
782 782
783 ent = proc_create("mconsole", 0200, NULL, &mconsole_proc_fops); 783 ent = proc_create("mconsole", 0200, NULL, &mconsole_proc_fops);
784 if (ent == NULL) { 784 if (ent == NULL) {
785 printk(KERN_INFO "create_proc_mconsole : create_proc_entry " 785 printk(KERN_INFO "create_proc_mconsole : proc_create failed\n");
786 "failed\n");
787 return 0; 786 return 0;
788 } 787 }
789 return 0; 788 return 0;
diff --git a/arch/x86/ia32/ia32_aout.c b/arch/x86/ia32/ia32_aout.c
index 81e94d972f1b..805078e08013 100644
--- a/arch/x86/ia32/ia32_aout.c
+++ b/arch/x86/ia32/ia32_aout.c
@@ -322,11 +322,8 @@ static int load_aout_binary(struct linux_binprm *bprm)
322 322
323 if (N_MAGIC(ex) == OMAGIC) { 323 if (N_MAGIC(ex) == OMAGIC) {
324 unsigned long text_addr, map_size; 324 unsigned long text_addr, map_size;
325 loff_t pos;
326 325
327 text_addr = N_TXTADDR(ex); 326 text_addr = N_TXTADDR(ex);
328
329 pos = 32;
330 map_size = ex.a_text+ex.a_data; 327 map_size = ex.a_text+ex.a_data;
331 328
332 error = vm_brk(text_addr & PAGE_MASK, map_size); 329 error = vm_brk(text_addr & PAGE_MASK, map_size);
@@ -336,15 +333,12 @@ static int load_aout_binary(struct linux_binprm *bprm)
336 return error; 333 return error;
337 } 334 }
338 335
339 error = bprm->file->f_op->read(bprm->file, 336 error = read_code(bprm->file, text_addr, 32,
340 (char __user *)text_addr, 337 ex.a_text + ex.a_data);
341 ex.a_text+ex.a_data, &pos);
342 if ((signed long)error < 0) { 338 if ((signed long)error < 0) {
343 send_sig(SIGKILL, current, 0); 339 send_sig(SIGKILL, current, 0);
344 return error; 340 return error;
345 } 341 }
346
347 flush_icache_range(text_addr, text_addr+ex.a_text+ex.a_data);
348 } else { 342 } else {
349#ifdef WARN_OLD 343#ifdef WARN_OLD
350 static unsigned long error_time, error_time2; 344 static unsigned long error_time, error_time2;
@@ -366,15 +360,9 @@ static int load_aout_binary(struct linux_binprm *bprm)
366#endif 360#endif
367 361
368 if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) { 362 if (!bprm->file->f_op->mmap || (fd_offset & ~PAGE_MASK) != 0) {
369 loff_t pos = fd_offset;
370
371 vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); 363 vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
372 bprm->file->f_op->read(bprm->file, 364 read_code(bprm->file, N_TXTADDR(ex), fd_offset,
373 (char __user *)N_TXTADDR(ex), 365 ex.a_text+ex.a_data);
374 ex.a_text+ex.a_data, &pos);
375 flush_icache_range((unsigned long) N_TXTADDR(ex),
376 (unsigned long) N_TXTADDR(ex) +
377 ex.a_text+ex.a_data);
378 goto beyond_if; 366 goto beyond_if;
379 } 367 }
380 368
@@ -451,8 +439,6 @@ static int load_aout_library(struct file *file)
451 start_addr = ex.a_entry & 0xfffff000; 439 start_addr = ex.a_entry & 0xfffff000;
452 440
453 if ((N_TXTOFF(ex) & ~PAGE_MASK) != 0) { 441 if ((N_TXTOFF(ex) & ~PAGE_MASK) != 0) {
454 loff_t pos = N_TXTOFF(ex);
455
456#ifdef WARN_OLD 442#ifdef WARN_OLD
457 static unsigned long error_time; 443 static unsigned long error_time;
458 if (time_after(jiffies, error_time + 5*HZ)) { 444 if (time_after(jiffies, error_time + 5*HZ)) {
@@ -465,12 +451,8 @@ static int load_aout_library(struct file *file)
465#endif 451#endif
466 vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); 452 vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
467 453
468 file->f_op->read(file, (char __user *)start_addr, 454 read_code(file, start_addr, N_TXTOFF(ex),
469 ex.a_text + ex.a_data, &pos); 455 ex.a_text + ex.a_data);
470 flush_icache_range((unsigned long) start_addr,
471 (unsigned long) start_addr + ex.a_text +
472 ex.a_data);
473
474 retval = 0; 456 retval = 0;
475 goto out; 457 goto out;
476 } 458 }
diff --git a/arch/x86/mm/init_64.c b/arch/x86/mm/init_64.c
index caad9a0ee19f..bb00c4672ad6 100644
--- a/arch/x86/mm/init_64.c
+++ b/arch/x86/mm/init_64.c
@@ -32,6 +32,7 @@
32#include <linux/memory_hotplug.h> 32#include <linux/memory_hotplug.h>
33#include <linux/nmi.h> 33#include <linux/nmi.h>
34#include <linux/gfp.h> 34#include <linux/gfp.h>
35#include <linux/kcore.h>
35 36
36#include <asm/processor.h> 37#include <asm/processor.h>
37#include <asm/bios_ebda.h> 38#include <asm/bios_ebda.h>
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c
index 6b85db0a7ccc..55856b2310d3 100644
--- a/arch/x86/platform/efi/efi.c
+++ b/arch/x86/platform/efi/efi.c
@@ -34,6 +34,7 @@
34#include <linux/efi-bgrt.h> 34#include <linux/efi-bgrt.h>
35#include <linux/export.h> 35#include <linux/export.h>
36#include <linux/bootmem.h> 36#include <linux/bootmem.h>
37#include <linux/slab.h>
37#include <linux/memblock.h> 38#include <linux/memblock.h>
38#include <linux/spinlock.h> 39#include <linux/spinlock.h>
39#include <linux/uaccess.h> 40#include <linux/uaccess.h>
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c
index 2b2003860615..39a0e7f1f0a3 100644
--- a/arch/x86/platform/efi/efi_64.c
+++ b/arch/x86/platform/efi/efi_64.c
@@ -27,6 +27,7 @@
27#include <linux/uaccess.h> 27#include <linux/uaccess.h>
28#include <linux/io.h> 28#include <linux/io.h>
29#include <linux/reboot.h> 29#include <linux/reboot.h>
30#include <linux/slab.h>
30 31
31#include <asm/setup.h> 32#include <asm/setup.h>
32#include <asm/page.h> 33#include <asm/page.h>
diff --git a/arch/xtensa/platforms/iss/simdisk.c b/arch/xtensa/platforms/iss/simdisk.c
index f58ffc3b68a8..4a06d70ddf5e 100644
--- a/arch/xtensa/platforms/iss/simdisk.c
+++ b/arch/xtensa/platforms/iss/simdisk.c
@@ -214,20 +214,27 @@ static int simdisk_detach(struct simdisk *dev)
214 return err; 214 return err;
215} 215}
216 216
217static int proc_read_simdisk(char *page, char **start, off_t off, 217static ssize_t proc_read_simdisk(struct file *file, char __user *buf,
218 int count, int *eof, void *data) 218 size_t size, loff_t *ppos)
219{ 219{
220 int len; 220 struct simdisk *dev = PDE_DATA(file_inode(file));
221 struct simdisk *dev = (struct simdisk *) data; 221 char *s = dev->filename;
222 len = sprintf(page, "%s\n", dev->filename ? dev->filename : ""); 222 if (s) {
223 return len; 223 ssize_t n = simple_read_from_buffer(buf, size, ppos,
224 s, strlen(s));
225 if (n < 0)
226 return n;
227 buf += n;
228 size -= n;
229 }
230 return simple_read_from_buffer(buf, size, ppos, "\n", 1);
224} 231}
225 232
226static int proc_write_simdisk(struct file *file, const char *buffer, 233static ssize_t proc_write_simdisk(struct file *file, const char __user *buf,
227 unsigned long count, void *data) 234 size_t size, loff_t *ppos)
228{ 235{
229 char *tmp = kmalloc(count + 1, GFP_KERNEL); 236 char *tmp = kmalloc(count + 1, GFP_KERNEL);
230 struct simdisk *dev = (struct simdisk *) data; 237 struct simdisk *dev = PDE_DATA(file_inode(file));
231 int err; 238 int err;
232 239
233 if (tmp == NULL) 240 if (tmp == NULL)
@@ -256,6 +263,12 @@ out_free:
256 return err; 263 return err;
257} 264}
258 265
266static const struct file_operations fops = {
267 .read = proc_read_simdisk,
268 .write = proc_write_simdisk,
269 .llseek = default_llseek,
270};
271
259static int __init simdisk_setup(struct simdisk *dev, int which, 272static int __init simdisk_setup(struct simdisk *dev, int which,
260 struct proc_dir_entry *procdir) 273 struct proc_dir_entry *procdir)
261{ 274{
@@ -289,10 +302,7 @@ static int __init simdisk_setup(struct simdisk *dev, int which,
289 set_capacity(dev->gd, 0); 302 set_capacity(dev->gd, 0);
290 add_disk(dev->gd); 303 add_disk(dev->gd);
291 304
292 dev->procfile = create_proc_entry(tmp, 0644, procdir); 305 dev->procfile = proc_create_data(tmp, 0644, procdir, &fops, dev);
293 dev->procfile->data = dev;
294 dev->procfile->read_proc = proc_read_simdisk;
295 dev->procfile->write_proc = proc_write_simdisk;
296 return 0; 306 return 0;
297 307
298out_alloc_disk: 308out_alloc_disk:
diff --git a/drivers/acpi/ac.c b/drivers/acpi/ac.c
index 6d5bf649196d..00d2efd674df 100644
--- a/drivers/acpi/ac.c
+++ b/drivers/acpi/ac.c
@@ -194,7 +194,7 @@ static int acpi_ac_seq_show(struct seq_file *seq, void *offset)
194 194
195static int acpi_ac_open_fs(struct inode *inode, struct file *file) 195static int acpi_ac_open_fs(struct inode *inode, struct file *file)
196{ 196{
197 return single_open(file, acpi_ac_seq_show, PDE(inode)->data); 197 return single_open(file, acpi_ac_seq_show, PDE_DATA(inode));
198} 198}
199 199
200static int acpi_ac_add_fs(struct acpi_device *device) 200static int acpi_ac_add_fs(struct acpi_device *device)
diff --git a/drivers/acpi/battery.c b/drivers/acpi/battery.c
index 0cc384b72943..e7100459ac4a 100644
--- a/drivers/acpi/battery.c
+++ b/drivers/acpi/battery.c
@@ -929,7 +929,7 @@ static int acpi_battery_read_##_name(struct seq_file *seq, void *offset) \
929} \ 929} \
930static int acpi_battery_##_name##_open_fs(struct inode *inode, struct file *file) \ 930static int acpi_battery_##_name##_open_fs(struct inode *inode, struct file *file) \
931{ \ 931{ \
932 return single_open(file, acpi_battery_read_##_name, PDE(inode)->data); \ 932 return single_open(file, acpi_battery_read_##_name, PDE_DATA(inode)); \
933} 933}
934 934
935DECLARE_FILE_FUNCTIONS(info); 935DECLARE_FILE_FUNCTIONS(info);
diff --git a/drivers/acpi/button.c b/drivers/acpi/button.c
index 92a659aa6396..d2e617b5b3f6 100644
--- a/drivers/acpi/button.c
+++ b/drivers/acpi/button.c
@@ -129,7 +129,7 @@ static int acpi_button_state_seq_show(struct seq_file *seq, void *offset)
129 129
130static int acpi_button_state_open_fs(struct inode *inode, struct file *file) 130static int acpi_button_state_open_fs(struct inode *inode, struct file *file)
131{ 131{
132 return single_open(file, acpi_button_state_seq_show, PDE(inode)->data); 132 return single_open(file, acpi_button_state_seq_show, PDE_DATA(inode));
133} 133}
134 134
135static const struct file_operations acpi_button_state_fops = { 135static const struct file_operations acpi_button_state_fops = {
diff --git a/drivers/acpi/proc.c b/drivers/acpi/proc.c
index 52ce76725c20..aa1227a7e3f2 100644
--- a/drivers/acpi/proc.c
+++ b/drivers/acpi/proc.c
@@ -120,7 +120,7 @@ static int acpi_system_alarm_seq_show(struct seq_file *seq, void *offset)
120 120
121static int acpi_system_alarm_open_fs(struct inode *inode, struct file *file) 121static int acpi_system_alarm_open_fs(struct inode *inode, struct file *file)
122{ 122{
123 return single_open(file, acpi_system_alarm_seq_show, PDE(inode)->data); 123 return single_open(file, acpi_system_alarm_seq_show, PDE_DATA(inode));
124} 124}
125 125
126static int get_date_field(char **p, u32 * value) 126static int get_date_field(char **p, u32 * value)
@@ -397,7 +397,7 @@ static int
397acpi_system_wakeup_device_open_fs(struct inode *inode, struct file *file) 397acpi_system_wakeup_device_open_fs(struct inode *inode, struct file *file)
398{ 398{
399 return single_open(file, acpi_system_wakeup_device_seq_show, 399 return single_open(file, acpi_system_wakeup_device_seq_show,
400 PDE(inode)->data); 400 PDE_DATA(inode));
401} 401}
402 402
403static const struct file_operations acpi_system_wakeup_device_fops = { 403static const struct file_operations acpi_system_wakeup_device_fops = {
diff --git a/drivers/acpi/sbs.c b/drivers/acpi/sbs.c
index e523245643ac..b6241eeb1132 100644
--- a/drivers/acpi/sbs.c
+++ b/drivers/acpi/sbs.c
@@ -521,19 +521,6 @@ acpi_sbs_add_fs(struct proc_dir_entry **dir,
521 return 0; 521 return 0;
522} 522}
523 523
524static void
525acpi_sbs_remove_fs(struct proc_dir_entry **dir,
526 struct proc_dir_entry *parent_dir)
527{
528 if (*dir) {
529 remove_proc_entry(ACPI_SBS_FILE_INFO, *dir);
530 remove_proc_entry(ACPI_SBS_FILE_STATE, *dir);
531 remove_proc_entry(ACPI_SBS_FILE_ALARM, *dir);
532 remove_proc_entry((*dir)->name, parent_dir);
533 *dir = NULL;
534 }
535}
536
537/* Smart Battery Interface */ 524/* Smart Battery Interface */
538static struct proc_dir_entry *acpi_battery_dir = NULL; 525static struct proc_dir_entry *acpi_battery_dir = NULL;
539 526
@@ -584,7 +571,7 @@ static int acpi_battery_read_info(struct seq_file *seq, void *offset)
584 571
585static int acpi_battery_info_open_fs(struct inode *inode, struct file *file) 572static int acpi_battery_info_open_fs(struct inode *inode, struct file *file)
586{ 573{
587 return single_open(file, acpi_battery_read_info, PDE(inode)->data); 574 return single_open(file, acpi_battery_read_info, PDE_DATA(inode));
588} 575}
589 576
590static int acpi_battery_read_state(struct seq_file *seq, void *offset) 577static int acpi_battery_read_state(struct seq_file *seq, void *offset)
@@ -623,7 +610,7 @@ static int acpi_battery_read_state(struct seq_file *seq, void *offset)
623 610
624static int acpi_battery_state_open_fs(struct inode *inode, struct file *file) 611static int acpi_battery_state_open_fs(struct inode *inode, struct file *file)
625{ 612{
626 return single_open(file, acpi_battery_read_state, PDE(inode)->data); 613 return single_open(file, acpi_battery_read_state, PDE_DATA(inode));
627} 614}
628 615
629static int acpi_battery_read_alarm(struct seq_file *seq, void *offset) 616static int acpi_battery_read_alarm(struct seq_file *seq, void *offset)
@@ -688,7 +675,7 @@ acpi_battery_write_alarm(struct file *file, const char __user * buffer,
688 675
689static int acpi_battery_alarm_open_fs(struct inode *inode, struct file *file) 676static int acpi_battery_alarm_open_fs(struct inode *inode, struct file *file)
690{ 677{
691 return single_open(file, acpi_battery_read_alarm, PDE(inode)->data); 678 return single_open(file, acpi_battery_read_alarm, PDE_DATA(inode));
692} 679}
693 680
694static const struct file_operations acpi_battery_info_fops = { 681static const struct file_operations acpi_battery_info_fops = {
@@ -736,7 +723,7 @@ static int acpi_ac_read_state(struct seq_file *seq, void *offset)
736 723
737static int acpi_ac_state_open_fs(struct inode *inode, struct file *file) 724static int acpi_ac_state_open_fs(struct inode *inode, struct file *file)
738{ 725{
739 return single_open(file, acpi_ac_read_state, PDE(inode)->data); 726 return single_open(file, acpi_ac_read_state, PDE_DATA(inode));
740} 727}
741 728
742static const struct file_operations acpi_ac_state_fops = { 729static const struct file_operations acpi_ac_state_fops = {
@@ -836,8 +823,8 @@ static void acpi_battery_remove(struct acpi_sbs *sbs, int id)
836 power_supply_unregister(&battery->bat); 823 power_supply_unregister(&battery->bat);
837 } 824 }
838#ifdef CONFIG_ACPI_PROCFS_POWER 825#ifdef CONFIG_ACPI_PROCFS_POWER
839 if (battery->proc_entry) 826 proc_remove(battery->proc_entry);
840 acpi_sbs_remove_fs(&battery->proc_entry, acpi_battery_dir); 827 battery->proc_entry = NULL;
841#endif 828#endif
842} 829}
843 830
@@ -873,8 +860,8 @@ static void acpi_charger_remove(struct acpi_sbs *sbs)
873 if (sbs->charger.dev) 860 if (sbs->charger.dev)
874 power_supply_unregister(&sbs->charger); 861 power_supply_unregister(&sbs->charger);
875#ifdef CONFIG_ACPI_PROCFS_POWER 862#ifdef CONFIG_ACPI_PROCFS_POWER
876 if (sbs->charger_entry) 863 proc_remove(sbs->charger_entry);
877 acpi_sbs_remove_fs(&sbs->charger_entry, acpi_ac_dir); 864 sbs->charger_entry = NULL;
878#endif 865#endif
879} 866}
880 867
diff --git a/drivers/ata/sata_svw.c b/drivers/ata/sata_svw.c
index 08608de87e4e..dc4f70179e7d 100644
--- a/drivers/ata/sata_svw.c
+++ b/drivers/ata/sata_svw.c
@@ -322,23 +322,11 @@ static u8 k2_stat_check_status(struct ata_port *ap)
322} 322}
323 323
324#ifdef CONFIG_PPC_OF 324#ifdef CONFIG_PPC_OF
325/* 325static int k2_sata_show_info(struct seq_file *m, struct Scsi_Host *shost)
326 * k2_sata_proc_info
327 * inout : decides on the direction of the dataflow and the meaning of the
328 * variables
329 * buffer: If inout==FALSE data is being written to it else read from it
330 * *start: If inout==FALSE start of the valid data in the buffer
331 * offset: If inout==FALSE offset from the beginning of the imaginary file
332 * from which we start writing into the buffer
333 * length: If inout==FALSE max number of bytes to be written into the buffer
334 * else number of bytes in the buffer
335 */
336static int k2_sata_proc_info(struct Scsi_Host *shost, char *page, char **start,
337 off_t offset, int count, int inout)
338{ 326{
339 struct ata_port *ap; 327 struct ata_port *ap;
340 struct device_node *np; 328 struct device_node *np;
341 int len, index; 329 int index;
342 330
343 /* Find the ata_port */ 331 /* Find the ata_port */
344 ap = ata_shost_to_port(shost); 332 ap = ata_shost_to_port(shost);
@@ -356,15 +344,12 @@ static int k2_sata_proc_info(struct Scsi_Host *shost, char *page, char **start,
356 const u32 *reg = of_get_property(np, "reg", NULL); 344 const u32 *reg = of_get_property(np, "reg", NULL);
357 if (!reg) 345 if (!reg)
358 continue; 346 continue;
359 if (index == *reg) 347 if (index == *reg) {
348 seq_printf(m, "devspec: %s\n", np->full_name);
360 break; 349 break;
350 }
361 } 351 }
362 if (np == NULL) 352 return 0;
363 return 0;
364
365 len = sprintf(page, "devspec: %s\n", np->full_name);
366
367 return len;
368} 353}
369#endif /* CONFIG_PPC_OF */ 354#endif /* CONFIG_PPC_OF */
370 355
@@ -372,7 +357,7 @@ static int k2_sata_proc_info(struct Scsi_Host *shost, char *page, char **start,
372static struct scsi_host_template k2_sata_sht = { 357static struct scsi_host_template k2_sata_sht = {
373 ATA_BMDMA_SHT(DRV_NAME), 358 ATA_BMDMA_SHT(DRV_NAME),
374#ifdef CONFIG_PPC_OF 359#ifdef CONFIG_PPC_OF
375 .proc_info = k2_sata_proc_info, 360 .show_info = k2_sata_show_info,
376#endif 361#endif
377}; 362};
378 363
diff --git a/drivers/block/DAC960.c b/drivers/block/DAC960.c
index 5b5ee79ff236..eb3950113e42 100644
--- a/drivers/block/DAC960.c
+++ b/drivers/block/DAC960.c
@@ -6473,7 +6473,7 @@ static int dac960_initial_status_proc_show(struct seq_file *m, void *v)
6473 6473
6474static int dac960_initial_status_proc_open(struct inode *inode, struct file *file) 6474static int dac960_initial_status_proc_open(struct inode *inode, struct file *file)
6475{ 6475{
6476 return single_open(file, dac960_initial_status_proc_show, PDE(inode)->data); 6476 return single_open(file, dac960_initial_status_proc_show, PDE_DATA(inode));
6477} 6477}
6478 6478
6479static const struct file_operations dac960_initial_status_proc_fops = { 6479static const struct file_operations dac960_initial_status_proc_fops = {
@@ -6519,7 +6519,7 @@ static int dac960_current_status_proc_show(struct seq_file *m, void *v)
6519 6519
6520static int dac960_current_status_proc_open(struct inode *inode, struct file *file) 6520static int dac960_current_status_proc_open(struct inode *inode, struct file *file)
6521{ 6521{
6522 return single_open(file, dac960_current_status_proc_show, PDE(inode)->data); 6522 return single_open(file, dac960_current_status_proc_show, PDE_DATA(inode));
6523} 6523}
6524 6524
6525static const struct file_operations dac960_current_status_proc_fops = { 6525static const struct file_operations dac960_current_status_proc_fops = {
@@ -6540,14 +6540,14 @@ static int dac960_user_command_proc_show(struct seq_file *m, void *v)
6540 6540
6541static int dac960_user_command_proc_open(struct inode *inode, struct file *file) 6541static int dac960_user_command_proc_open(struct inode *inode, struct file *file)
6542{ 6542{
6543 return single_open(file, dac960_user_command_proc_show, PDE(inode)->data); 6543 return single_open(file, dac960_user_command_proc_show, PDE_DATA(inode));
6544} 6544}
6545 6545
6546static ssize_t dac960_user_command_proc_write(struct file *file, 6546static ssize_t dac960_user_command_proc_write(struct file *file,
6547 const char __user *Buffer, 6547 const char __user *Buffer,
6548 size_t Count, loff_t *pos) 6548 size_t Count, loff_t *pos)
6549{ 6549{
6550 DAC960_Controller_T *Controller = (DAC960_Controller_T *) PDE(file_inode(file))->data; 6550 DAC960_Controller_T *Controller = PDE_DATA(file_inode(file));
6551 unsigned char CommandBuffer[80]; 6551 unsigned char CommandBuffer[80];
6552 int Length; 6552 int Length;
6553 if (Count > sizeof(CommandBuffer)-1) return -EINVAL; 6553 if (Count > sizeof(CommandBuffer)-1) return -EINVAL;
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
index 1c1b8e544aa2..e18c99140c0a 100644
--- a/drivers/block/cciss.c
+++ b/drivers/block/cciss.c
@@ -493,7 +493,7 @@ static int cciss_seq_open(struct inode *inode, struct file *file)
493 struct seq_file *seq = file->private_data; 493 struct seq_file *seq = file->private_data;
494 494
495 if (!ret) 495 if (!ret)
496 seq->private = PDE(inode)->data; 496 seq->private = PDE_DATA(inode);
497 497
498 return ret; 498 return ret;
499} 499}
diff --git a/drivers/block/cciss_scsi.c b/drivers/block/cciss_scsi.c
index da3311129a0c..ecd845cd28d8 100644
--- a/drivers/block/cciss_scsi.c
+++ b/drivers/block/cciss_scsi.c
@@ -54,13 +54,11 @@ static CommandList_struct *cmd_special_alloc(ctlr_info_t *h);
54static void cmd_free(ctlr_info_t *h, CommandList_struct *c); 54static void cmd_free(ctlr_info_t *h, CommandList_struct *c);
55static void cmd_special_free(ctlr_info_t *h, CommandList_struct *c); 55static void cmd_special_free(ctlr_info_t *h, CommandList_struct *c);
56 56
57static int cciss_scsi_proc_info( 57static int cciss_scsi_write_info(struct Scsi_Host *sh,
58 struct Scsi_Host *sh,
59 char *buffer, /* data buffer */ 58 char *buffer, /* data buffer */
60 char **start, /* where data in buffer starts */ 59 int length); /* length of data in buffer */
61 off_t offset, /* offset from start of imaginary file */ 60static int cciss_scsi_show_info(struct seq_file *m,
62 int length, /* length of data in buffer */ 61 struct Scsi_Host *sh);
63 int func); /* 0 == read, 1 == write */
64 62
65static int cciss_scsi_queue_command (struct Scsi_Host *h, 63static int cciss_scsi_queue_command (struct Scsi_Host *h,
66 struct scsi_cmnd *cmd); 64 struct scsi_cmnd *cmd);
@@ -82,7 +80,8 @@ static struct scsi_host_template cciss_driver_template = {
82 .module = THIS_MODULE, 80 .module = THIS_MODULE,
83 .name = "cciss", 81 .name = "cciss",
84 .proc_name = "cciss", 82 .proc_name = "cciss",
85 .proc_info = cciss_scsi_proc_info, 83 .write_info = cciss_scsi_write_info,
84 .show_info = cciss_scsi_show_info,
86 .queuecommand = cciss_scsi_queue_command, 85 .queuecommand = cciss_scsi_queue_command,
87 .this_id = 7, 86 .this_id = 7,
88 .cmd_per_lun = 1, 87 .cmd_per_lun = 1,
@@ -1302,59 +1301,54 @@ cciss_scsi_user_command(ctlr_info_t *h, int hostno, char *buffer, int length)
1302 return length; 1301 return length;
1303} 1302}
1304 1303
1305
1306static int 1304static int
1307cciss_scsi_proc_info(struct Scsi_Host *sh, 1305cciss_scsi_write_info(struct Scsi_Host *sh,
1308 char *buffer, /* data buffer */ 1306 char *buffer, /* data buffer */
1309 char **start, /* where data in buffer starts */ 1307 int length) /* length of data in buffer */
1310 off_t offset, /* offset from start of imaginary file */
1311 int length, /* length of data in buffer */
1312 int func) /* 0 == read, 1 == write */
1313{ 1308{
1309 ctlr_info_t *h = (ctlr_info_t *) sh->hostdata[0];
1310 if (h == NULL) /* This really shouldn't ever happen. */
1311 return -EINVAL;
1314 1312
1315 int buflen, datalen; 1313 return cciss_scsi_user_command(h, sh->host_no,
1316 ctlr_info_t *h; 1314 buffer, length);
1315}
1316
1317static int
1318cciss_scsi_show_info(struct seq_file *m, struct Scsi_Host *sh)
1319{
1320
1321 ctlr_info_t *h = (ctlr_info_t *) sh->hostdata[0];
1317 int i; 1322 int i;
1318 1323
1319 h = (ctlr_info_t *) sh->hostdata[0];
1320 if (h == NULL) /* This really shouldn't ever happen. */ 1324 if (h == NULL) /* This really shouldn't ever happen. */
1321 return -EINVAL; 1325 return -EINVAL;
1322 1326
1323 if (func == 0) { /* User is reading from /proc/scsi/ciss*?/?* */ 1327 seq_printf(m, "cciss%d: SCSI host: %d\n",
1324 buflen = sprintf(buffer, "cciss%d: SCSI host: %d\n", 1328 h->ctlr, sh->host_no);
1325 h->ctlr, sh->host_no); 1329
1326 1330 /* this information is needed by apps to know which cciss
1327 /* this information is needed by apps to know which cciss 1331 device corresponds to which scsi host number without
1328 device corresponds to which scsi host number without 1332 having to open a scsi target device node. The device
1329 having to open a scsi target device node. The device 1333 information is not a duplicate of /proc/scsi/scsi because
1330 information is not a duplicate of /proc/scsi/scsi because 1334 the two may be out of sync due to scsi hotplug, rather
1331 the two may be out of sync due to scsi hotplug, rather 1335 this info is for an app to be able to use to know how to
1332 this info is for an app to be able to use to know how to 1336 get them back in sync. */
1333 get them back in sync. */ 1337
1334 1338 for (i = 0; i < ccissscsi[h->ctlr].ndevices; i++) {
1335 for (i = 0; i < ccissscsi[h->ctlr].ndevices; i++) { 1339 struct cciss_scsi_dev_t *sd =
1336 struct cciss_scsi_dev_t *sd = 1340 &ccissscsi[h->ctlr].dev[i];
1337 &ccissscsi[h->ctlr].dev[i]; 1341 seq_printf(m, "c%db%dt%dl%d %02d "
1338 buflen += sprintf(&buffer[buflen], "c%db%dt%dl%d %02d " 1342 "0x%02x%02x%02x%02x%02x%02x%02x%02x\n",
1339 "0x%02x%02x%02x%02x%02x%02x%02x%02x\n", 1343 sh->host_no, sd->bus, sd->target, sd->lun,
1340 sh->host_no, sd->bus, sd->target, sd->lun, 1344 sd->devtype,
1341 sd->devtype, 1345 sd->scsi3addr[0], sd->scsi3addr[1],
1342 sd->scsi3addr[0], sd->scsi3addr[1], 1346 sd->scsi3addr[2], sd->scsi3addr[3],
1343 sd->scsi3addr[2], sd->scsi3addr[3], 1347 sd->scsi3addr[4], sd->scsi3addr[5],
1344 sd->scsi3addr[4], sd->scsi3addr[5], 1348 sd->scsi3addr[6], sd->scsi3addr[7]);
1345 sd->scsi3addr[6], sd->scsi3addr[7]); 1349 }
1346 } 1350 return 0;
1347 datalen = buflen - offset; 1351}
1348 if (datalen < 0) { /* they're reading past EOF. */
1349 datalen = 0;
1350 *start = buffer+buflen;
1351 } else
1352 *start = buffer + offset;
1353 return(datalen);
1354 } else /* User is writing to /proc/scsi/cciss*?/?* ... */
1355 return cciss_scsi_user_command(h, sh->host_no,
1356 buffer, length);
1357}
1358 1352
1359/* cciss_scatter_gather takes a struct scsi_cmnd, (cmd), and does the pci 1353/* cciss_scatter_gather takes a struct scsi_cmnd, (cmd), and does the pci
1360 dma mapping and fills in the scatter gather entries of the 1354 dma mapping and fills in the scatter gather entries of the
diff --git a/drivers/block/cpqarray.c b/drivers/block/cpqarray.c
index 3f087133a25a..3b9e8ebcb96b 100644
--- a/drivers/block/cpqarray.c
+++ b/drivers/block/cpqarray.c
@@ -296,7 +296,7 @@ static int ida_proc_show(struct seq_file *m, void *v)
296 296
297static int ida_proc_open(struct inode *inode, struct file *file) 297static int ida_proc_open(struct inode *inode, struct file *file)
298{ 298{
299 return single_open(file, ida_proc_show, PDE(inode)->data); 299 return single_open(file, ida_proc_show, PDE_DATA(inode));
300} 300}
301 301
302static const struct file_operations ida_proc_fops = { 302static const struct file_operations ida_proc_fops = {
diff --git a/drivers/block/drbd/drbd_proc.c b/drivers/block/drbd/drbd_proc.c
index 56672a61eb94..928adb815b09 100644
--- a/drivers/block/drbd/drbd_proc.c
+++ b/drivers/block/drbd/drbd_proc.c
@@ -314,7 +314,7 @@ static int drbd_seq_show(struct seq_file *seq, void *v)
314static int drbd_proc_open(struct inode *inode, struct file *file) 314static int drbd_proc_open(struct inode *inode, struct file *file)
315{ 315{
316 if (try_module_get(THIS_MODULE)) 316 if (try_module_get(THIS_MODULE))
317 return single_open(file, drbd_seq_show, PDE(inode)->data); 317 return single_open(file, drbd_seq_show, PDE_DATA(inode));
318 return -ENODEV; 318 return -ENODEV;
319} 319}
320 320
diff --git a/drivers/block/loop.c b/drivers/block/loop.c
index dfe758382eaf..b2955b3f2cbc 100644
--- a/drivers/block/loop.c
+++ b/drivers/block/loop.c
@@ -230,9 +230,11 @@ static int __do_lo_send_write(struct file *file,
230 ssize_t bw; 230 ssize_t bw;
231 mm_segment_t old_fs = get_fs(); 231 mm_segment_t old_fs = get_fs();
232 232
233 file_start_write(file);
233 set_fs(get_ds()); 234 set_fs(get_ds());
234 bw = file->f_op->write(file, buf, len, &pos); 235 bw = file->f_op->write(file, buf, len, &pos);
235 set_fs(old_fs); 236 set_fs(old_fs);
237 file_end_write(file);
236 if (likely(bw == len)) 238 if (likely(bw == len))
237 return 0; 239 return 0;
238 printk(KERN_ERR "loop: Write error at byte offset %llu, length %i.\n", 240 printk(KERN_ERR "loop: Write error at byte offset %llu, length %i.\n",
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c
index 2e7de7a59bfc..e0588c6dd86f 100644
--- a/drivers/block/pktcdvd.c
+++ b/drivers/block/pktcdvd.c
@@ -2648,7 +2648,7 @@ static int pkt_seq_show(struct seq_file *m, void *p)
2648 2648
2649static int pkt_seq_open(struct inode *inode, struct file *file) 2649static int pkt_seq_open(struct inode *inode, struct file *file)
2650{ 2650{
2651 return single_open(file, pkt_seq_show, PDE(inode)->data); 2651 return single_open(file, pkt_seq_show, PDE_DATA(inode));
2652} 2652}
2653 2653
2654static const struct file_operations pkt_proc_fops = { 2654static const struct file_operations pkt_proc_fops = {
diff --git a/drivers/block/ps3vram.c b/drivers/block/ps3vram.c
index 75e112d66006..06a2e53e5f37 100644
--- a/drivers/block/ps3vram.c
+++ b/drivers/block/ps3vram.c
@@ -525,7 +525,7 @@ static int ps3vram_proc_show(struct seq_file *m, void *v)
525 525
526static int ps3vram_proc_open(struct inode *inode, struct file *file) 526static int ps3vram_proc_open(struct inode *inode, struct file *file)
527{ 527{
528 return single_open(file, ps3vram_proc_show, PDE(inode)->data); 528 return single_open(file, ps3vram_proc_show, PDE_DATA(inode));
529} 529}
530 530
531static const struct file_operations ps3vram_proc_fops = { 531static const struct file_operations ps3vram_proc_fops = {
diff --git a/drivers/char/ds1620.c b/drivers/char/ds1620.c
index 24ffd8cec51e..544b4ce617f8 100644
--- a/drivers/char/ds1620.c
+++ b/drivers/char/ds1620.c
@@ -6,6 +6,7 @@
6#include <linux/miscdevice.h> 6#include <linux/miscdevice.h>
7#include <linux/delay.h> 7#include <linux/delay.h>
8#include <linux/proc_fs.h> 8#include <linux/proc_fs.h>
9#include <linux/seq_file.h>
9#include <linux/capability.h> 10#include <linux/capability.h>
10#include <linux/init.h> 11#include <linux/init.h>
11#include <linux/mutex.h> 12#include <linux/mutex.h>
@@ -329,9 +330,7 @@ ds1620_unlocked_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
329} 330}
330 331
331#ifdef THERM_USE_PROC 332#ifdef THERM_USE_PROC
332static int 333static int ds1620_proc_therm_show(struct seq_file *m, void *v)
333proc_therm_ds1620_read(char *buf, char **start, off_t offset,
334 int len, int *eof, void *unused)
335{ 334{
336 struct therm th; 335 struct therm th;
337 int temp; 336 int temp;
@@ -339,17 +338,25 @@ proc_therm_ds1620_read(char *buf, char **start, off_t offset,
339 ds1620_read_state(&th); 338 ds1620_read_state(&th);
340 temp = cvt_9_to_int(ds1620_in(THERM_READ_TEMP, 9)); 339 temp = cvt_9_to_int(ds1620_in(THERM_READ_TEMP, 9));
341 340
342 len = sprintf(buf, "Thermostat: HI %i.%i, LOW %i.%i; " 341 seq_printf(m, "Thermostat: HI %i.%i, LOW %i.%i; temperature: %i.%i C, fan %s\n",
343 "temperature: %i.%i C, fan %s\n", 342 th.hi >> 1, th.hi & 1 ? 5 : 0,
344 th.hi >> 1, th.hi & 1 ? 5 : 0, 343 th.lo >> 1, th.lo & 1 ? 5 : 0,
345 th.lo >> 1, th.lo & 1 ? 5 : 0, 344 temp >> 1, temp & 1 ? 5 : 0,
346 temp >> 1, temp & 1 ? 5 : 0, 345 fan_state[netwinder_get_fan()]);
347 fan_state[netwinder_get_fan()]); 346 return 0;
347}
348 348
349 return len; 349static int ds1620_proc_therm_open(struct inode *inode, struct file *file)
350{
351 return single_open(file, ds1620_proc_therm_show, NULL);
350} 352}
351 353
352static struct proc_dir_entry *proc_therm_ds1620; 354static const struct file_operations ds1620_proc_therm_fops = {
355 .open = ds1620_proc_therm_open,
356 .read = seq_read,
357 .llseek = seq_lseek,
358 .release = seq_release,
359};
353#endif 360#endif
354 361
355static const struct file_operations ds1620_fops = { 362static const struct file_operations ds1620_fops = {
@@ -397,10 +404,7 @@ static int __init ds1620_init(void)
397 return ret; 404 return ret;
398 405
399#ifdef THERM_USE_PROC 406#ifdef THERM_USE_PROC
400 proc_therm_ds1620 = create_proc_entry("therm", 0, NULL); 407 if (!proc_create("therm", 0, NULL, &ds1620_proc_therm_fops))
401 if (proc_therm_ds1620)
402 proc_therm_ds1620->read_proc = proc_therm_ds1620_read;
403 else
404 printk(KERN_ERR "therm: unable to register /proc/therm\n"); 408 printk(KERN_ERR "therm: unable to register /proc/therm\n");
405#endif 409#endif
406 410
diff --git a/drivers/char/efirtc.c b/drivers/char/efirtc.c
index a082d00b0f11..ea54a6e3f5ad 100644
--- a/drivers/char/efirtc.c
+++ b/drivers/char/efirtc.c
@@ -34,6 +34,7 @@
34#include <linux/init.h> 34#include <linux/init.h>
35#include <linux/rtc.h> 35#include <linux/rtc.h>
36#include <linux/proc_fs.h> 36#include <linux/proc_fs.h>
37#include <linux/seq_file.h>
37#include <linux/efi.h> 38#include <linux/efi.h>
38#include <linux/uaccess.h> 39#include <linux/uaccess.h>
39 40
@@ -296,12 +297,10 @@ static struct miscdevice efi_rtc_dev= {
296/* 297/*
297 * We export RAW EFI information to /proc/driver/efirtc 298 * We export RAW EFI information to /proc/driver/efirtc
298 */ 299 */
299static int 300static int efi_rtc_proc_show(struct seq_file *m, void *v)
300efi_rtc_get_status(char *buf)
301{ 301{
302 efi_time_t eft, alm; 302 efi_time_t eft, alm;
303 efi_time_cap_t cap; 303 efi_time_cap_t cap;
304 char *p = buf;
305 efi_bool_t enabled, pending; 304 efi_bool_t enabled, pending;
306 unsigned long flags; 305 unsigned long flags;
307 306
@@ -316,64 +315,63 @@ efi_rtc_get_status(char *buf)
316 315
317 spin_unlock_irqrestore(&efi_rtc_lock,flags); 316 spin_unlock_irqrestore(&efi_rtc_lock,flags);
318 317
319 p += sprintf(p, 318 seq_printf(m,
320 "Time : %u:%u:%u.%09u\n" 319 "Time : %u:%u:%u.%09u\n"
321 "Date : %u-%u-%u\n" 320 "Date : %u-%u-%u\n"
322 "Daylight : %u\n", 321 "Daylight : %u\n",
323 eft.hour, eft.minute, eft.second, eft.nanosecond, 322 eft.hour, eft.minute, eft.second, eft.nanosecond,
324 eft.year, eft.month, eft.day, 323 eft.year, eft.month, eft.day,
325 eft.daylight); 324 eft.daylight);
326 325
327 if (eft.timezone == EFI_UNSPECIFIED_TIMEZONE) 326 if (eft.timezone == EFI_UNSPECIFIED_TIMEZONE)
328 p += sprintf(p, "Timezone : unspecified\n"); 327 seq_puts(m, "Timezone : unspecified\n");
329 else 328 else
330 /* XXX fixme: convert to string? */ 329 /* XXX fixme: convert to string? */
331 p += sprintf(p, "Timezone : %u\n", eft.timezone); 330 seq_printf(m, "Timezone : %u\n", eft.timezone);
332 331
333 332
334 p += sprintf(p, 333 seq_printf(m,
335 "Alarm Time : %u:%u:%u.%09u\n" 334 "Alarm Time : %u:%u:%u.%09u\n"
336 "Alarm Date : %u-%u-%u\n" 335 "Alarm Date : %u-%u-%u\n"
337 "Alarm Daylight : %u\n" 336 "Alarm Daylight : %u\n"
338 "Enabled : %s\n" 337 "Enabled : %s\n"
339 "Pending : %s\n", 338 "Pending : %s\n",
340 alm.hour, alm.minute, alm.second, alm.nanosecond, 339 alm.hour, alm.minute, alm.second, alm.nanosecond,
341 alm.year, alm.month, alm.day, 340 alm.year, alm.month, alm.day,
342 alm.daylight, 341 alm.daylight,
343 enabled == 1 ? "yes" : "no", 342 enabled == 1 ? "yes" : "no",
344 pending == 1 ? "yes" : "no"); 343 pending == 1 ? "yes" : "no");
345 344
346 if (eft.timezone == EFI_UNSPECIFIED_TIMEZONE) 345 if (eft.timezone == EFI_UNSPECIFIED_TIMEZONE)
347 p += sprintf(p, "Timezone : unspecified\n"); 346 seq_puts(m, "Timezone : unspecified\n");
348 else 347 else
349 /* XXX fixme: convert to string? */ 348 /* XXX fixme: convert to string? */
350 p += sprintf(p, "Timezone : %u\n", alm.timezone); 349 seq_printf(m, "Timezone : %u\n", alm.timezone);
351 350
352 /* 351 /*
353 * now prints the capabilities 352 * now prints the capabilities
354 */ 353 */
355 p += sprintf(p, 354 seq_printf(m,
356 "Resolution : %u\n" 355 "Resolution : %u\n"
357 "Accuracy : %u\n" 356 "Accuracy : %u\n"
358 "SetstoZero : %u\n", 357 "SetstoZero : %u\n",
359 cap.resolution, cap.accuracy, cap.sets_to_zero); 358 cap.resolution, cap.accuracy, cap.sets_to_zero);
360 359
361 return p - buf; 360 return 0;
362} 361}
363 362
364static int 363static int efi_rtc_proc_open(struct inode *inode, struct file *file)
365efi_rtc_read_proc(char *page, char **start, off_t off,
366 int count, int *eof, void *data)
367{ 364{
368 int len = efi_rtc_get_status(page); 365 return single_open(file, efi_rtc_proc_show, NULL);
369 if (len <= off+count) *eof = 1;
370 *start = page + off;
371 len -= off;
372 if (len>count) len = count;
373 if (len<0) len = 0;
374 return len;
375} 366}
376 367
368static const struct file_operations efi_rtc_proc_fops = {
369 .open = efi_rtc_proc_open,
370 .read = seq_read,
371 .llseek = seq_lseek,
372 .release = seq_release,
373};
374
377static int __init 375static int __init
378efi_rtc_init(void) 376efi_rtc_init(void)
379{ 377{
@@ -389,8 +387,7 @@ efi_rtc_init(void)
389 return ret; 387 return ret;
390 } 388 }
391 389
392 dir = create_proc_read_entry ("driver/efirtc", 0, NULL, 390 dir = proc_create("driver/efirtc", 0, NULL, &efi_rtc_proc_fops);
393 efi_rtc_read_proc, NULL);
394 if (dir == NULL) { 391 if (dir == NULL) {
395 printk(KERN_ERR "efirtc: can't create /proc/driver/efirtc.\n"); 392 printk(KERN_ERR "efirtc: can't create /proc/driver/efirtc.\n");
396 misc_deregister(&efi_rtc_dev); 393 misc_deregister(&efi_rtc_dev);
diff --git a/drivers/char/genrtc.c b/drivers/char/genrtc.c
index 21cb980f1157..bc9b84d56ee4 100644
--- a/drivers/char/genrtc.c
+++ b/drivers/char/genrtc.c
@@ -52,6 +52,7 @@
52#include <linux/init.h> 52#include <linux/init.h>
53#include <linux/poll.h> 53#include <linux/poll.h>
54#include <linux/proc_fs.h> 54#include <linux/proc_fs.h>
55#include <linux/seq_file.h>
55#include <linux/mutex.h> 56#include <linux/mutex.h>
56#include <linux/workqueue.h> 57#include <linux/workqueue.h>
57 58
@@ -386,18 +387,15 @@ static int gen_rtc_release(struct inode *inode, struct file *file)
386 * Info exported via "/proc/driver/rtc". 387 * Info exported via "/proc/driver/rtc".
387 */ 388 */
388 389
389static int gen_rtc_proc_output(char *buf) 390static int gen_rtc_proc_show(struct seq_file *m, void *v)
390{ 391{
391 char *p;
392 struct rtc_time tm; 392 struct rtc_time tm;
393 unsigned int flags; 393 unsigned int flags;
394 struct rtc_pll_info pll; 394 struct rtc_pll_info pll;
395 395
396 p = buf;
397
398 flags = get_rtc_time(&tm); 396 flags = get_rtc_time(&tm);
399 397
400 p += sprintf(p, 398 seq_printf(m,
401 "rtc_time\t: %02d:%02d:%02d\n" 399 "rtc_time\t: %02d:%02d:%02d\n"
402 "rtc_date\t: %04d-%02d-%02d\n" 400 "rtc_date\t: %04d-%02d-%02d\n"
403 "rtc_epoch\t: %04u\n", 401 "rtc_epoch\t: %04u\n",
@@ -406,23 +404,23 @@ static int gen_rtc_proc_output(char *buf)
406 404
407 tm.tm_hour = tm.tm_min = tm.tm_sec = 0; 405 tm.tm_hour = tm.tm_min = tm.tm_sec = 0;
408 406
409 p += sprintf(p, "alarm\t\t: "); 407 seq_puts(m, "alarm\t\t: ");
410 if (tm.tm_hour <= 24) 408 if (tm.tm_hour <= 24)
411 p += sprintf(p, "%02d:", tm.tm_hour); 409 seq_printf(m, "%02d:", tm.tm_hour);
412 else 410 else
413 p += sprintf(p, "**:"); 411 seq_puts(m, "**:");
414 412
415 if (tm.tm_min <= 59) 413 if (tm.tm_min <= 59)
416 p += sprintf(p, "%02d:", tm.tm_min); 414 seq_printf(m, "%02d:", tm.tm_min);
417 else 415 else
418 p += sprintf(p, "**:"); 416 seq_puts(m, "**:");
419 417
420 if (tm.tm_sec <= 59) 418 if (tm.tm_sec <= 59)
421 p += sprintf(p, "%02d\n", tm.tm_sec); 419 seq_printf(m, "%02d\n", tm.tm_sec);
422 else 420 else
423 p += sprintf(p, "**\n"); 421 seq_puts(m, "**\n");
424 422
425 p += sprintf(p, 423 seq_printf(m,
426 "DST_enable\t: %s\n" 424 "DST_enable\t: %s\n"
427 "BCD\t\t: %s\n" 425 "BCD\t\t: %s\n"
428 "24hr\t\t: %s\n" 426 "24hr\t\t: %s\n"
@@ -442,7 +440,7 @@ static int gen_rtc_proc_output(char *buf)
442 0L /* freq */, 440 0L /* freq */,
443 (flags & RTC_BATT_BAD) ? "bad" : "okay"); 441 (flags & RTC_BATT_BAD) ? "bad" : "okay");
444 if (!get_rtc_pll(&pll)) 442 if (!get_rtc_pll(&pll))
445 p += sprintf(p, 443 seq_printf(m,
446 "PLL adjustment\t: %d\n" 444 "PLL adjustment\t: %d\n"
447 "PLL max +ve adjustment\t: %d\n" 445 "PLL max +ve adjustment\t: %d\n"
448 "PLL max -ve adjustment\t: %d\n" 446 "PLL max -ve adjustment\t: %d\n"
@@ -455,26 +453,26 @@ static int gen_rtc_proc_output(char *buf)
455 pll.pll_posmult, 453 pll.pll_posmult,
456 pll.pll_negmult, 454 pll.pll_negmult,
457 pll.pll_clock); 455 pll.pll_clock);
458 return p - buf; 456 return 0;
459} 457}
460 458
461static int gen_rtc_read_proc(char *page, char **start, off_t off, 459static int gen_rtc_proc_open(struct inode *inode, struct file *file)
462 int count, int *eof, void *data)
463{ 460{
464 int len = gen_rtc_proc_output (page); 461 return single_open(file, gen_rtc_proc_show, NULL);
465 if (len <= off+count) *eof = 1;
466 *start = page + off;
467 len -= off;
468 if (len>count) len = count;
469 if (len<0) len = 0;
470 return len;
471} 462}
472 463
464static const struct file_operations gen_rtc_proc_fops = {
465 .open = gen_rtc_proc_open,
466 .read = seq_read,
467 .llseek = seq_lseek,
468 .release = seq_release,
469};
470
473static int __init gen_rtc_proc_init(void) 471static int __init gen_rtc_proc_init(void)
474{ 472{
475 struct proc_dir_entry *r; 473 struct proc_dir_entry *r;
476 474
477 r = create_proc_read_entry("driver/rtc", 0, NULL, gen_rtc_read_proc, NULL); 475 r = proc_create("driver/rtc", 0, NULL, &gen_rtc_proc_fops);
478 if (!r) 476 if (!r)
479 return -ENOMEM; 477 return -ENOMEM;
480 return 0; 478 return 0;
diff --git a/drivers/char/ipmi/ipmi_msghandler.c b/drivers/char/ipmi/ipmi_msghandler.c
index 053201b062a4..4d439d2fcfd6 100644
--- a/drivers/char/ipmi/ipmi_msghandler.c
+++ b/drivers/char/ipmi/ipmi_msghandler.c
@@ -1917,7 +1917,7 @@ static int smi_ipmb_proc_show(struct seq_file *m, void *v)
1917 1917
1918static int smi_ipmb_proc_open(struct inode *inode, struct file *file) 1918static int smi_ipmb_proc_open(struct inode *inode, struct file *file)
1919{ 1919{
1920 return single_open(file, smi_ipmb_proc_show, PDE(inode)->data); 1920 return single_open(file, smi_ipmb_proc_show, PDE_DATA(inode));
1921} 1921}
1922 1922
1923static const struct file_operations smi_ipmb_proc_ops = { 1923static const struct file_operations smi_ipmb_proc_ops = {
@@ -1938,7 +1938,7 @@ static int smi_version_proc_show(struct seq_file *m, void *v)
1938 1938
1939static int smi_version_proc_open(struct inode *inode, struct file *file) 1939static int smi_version_proc_open(struct inode *inode, struct file *file)
1940{ 1940{
1941 return single_open(file, smi_version_proc_show, PDE(inode)->data); 1941 return single_open(file, smi_version_proc_show, PDE_DATA(inode));
1942} 1942}
1943 1943
1944static const struct file_operations smi_version_proc_ops = { 1944static const struct file_operations smi_version_proc_ops = {
@@ -2013,7 +2013,7 @@ static int smi_stats_proc_show(struct seq_file *m, void *v)
2013 2013
2014static int smi_stats_proc_open(struct inode *inode, struct file *file) 2014static int smi_stats_proc_open(struct inode *inode, struct file *file)
2015{ 2015{
2016 return single_open(file, smi_stats_proc_show, PDE(inode)->data); 2016 return single_open(file, smi_stats_proc_show, PDE_DATA(inode));
2017} 2017}
2018 2018
2019static const struct file_operations smi_stats_proc_ops = { 2019static const struct file_operations smi_stats_proc_ops = {
@@ -4541,7 +4541,7 @@ static void __exit cleanup_ipmi(void)
4541 del_timer_sync(&ipmi_timer); 4541 del_timer_sync(&ipmi_timer);
4542 4542
4543#ifdef CONFIG_PROC_FS 4543#ifdef CONFIG_PROC_FS
4544 remove_proc_entry(proc_ipmi_root->name, NULL); 4544 proc_remove(proc_ipmi_root);
4545#endif /* CONFIG_PROC_FS */ 4545#endif /* CONFIG_PROC_FS */
4546 4546
4547 driver_unregister(&ipmidriver.driver); 4547 driver_unregister(&ipmidriver.driver);
diff --git a/drivers/char/ipmi/ipmi_si_intf.c b/drivers/char/ipmi/ipmi_si_intf.c
index 0ac9b45a585e..313538abe63c 100644
--- a/drivers/char/ipmi/ipmi_si_intf.c
+++ b/drivers/char/ipmi/ipmi_si_intf.c
@@ -2839,7 +2839,7 @@ static int smi_type_proc_show(struct seq_file *m, void *v)
2839 2839
2840static int smi_type_proc_open(struct inode *inode, struct file *file) 2840static int smi_type_proc_open(struct inode *inode, struct file *file)
2841{ 2841{
2842 return single_open(file, smi_type_proc_show, PDE(inode)->data); 2842 return single_open(file, smi_type_proc_show, PDE_DATA(inode));
2843} 2843}
2844 2844
2845static const struct file_operations smi_type_proc_ops = { 2845static const struct file_operations smi_type_proc_ops = {
@@ -2882,7 +2882,7 @@ static int smi_si_stats_proc_show(struct seq_file *m, void *v)
2882 2882
2883static int smi_si_stats_proc_open(struct inode *inode, struct file *file) 2883static int smi_si_stats_proc_open(struct inode *inode, struct file *file)
2884{ 2884{
2885 return single_open(file, smi_si_stats_proc_show, PDE(inode)->data); 2885 return single_open(file, smi_si_stats_proc_show, PDE_DATA(inode));
2886} 2886}
2887 2887
2888static const struct file_operations smi_si_stats_proc_ops = { 2888static const struct file_operations smi_si_stats_proc_ops = {
@@ -2910,7 +2910,7 @@ static int smi_params_proc_show(struct seq_file *m, void *v)
2910 2910
2911static int smi_params_proc_open(struct inode *inode, struct file *file) 2911static int smi_params_proc_open(struct inode *inode, struct file *file)
2912{ 2912{
2913 return single_open(file, smi_params_proc_show, PDE(inode)->data); 2913 return single_open(file, smi_params_proc_show, PDE_DATA(inode));
2914} 2914}
2915 2915
2916static const struct file_operations smi_params_proc_ops = { 2916static const struct file_operations smi_params_proc_ops = {
diff --git a/drivers/firmware/efi/efi-pstore.c b/drivers/firmware/efi/efi-pstore.c
index 67615d6d038d..202d2c85ba2e 100644
--- a/drivers/firmware/efi/efi-pstore.c
+++ b/drivers/firmware/efi/efi-pstore.c
@@ -1,6 +1,7 @@
1#include <linux/efi.h> 1#include <linux/efi.h>
2#include <linux/module.h> 2#include <linux/module.h>
3#include <linux/pstore.h> 3#include <linux/pstore.h>
4#include <linux/slab.h>
4#include <linux/ucs2_string.h> 5#include <linux/ucs2_string.h>
5 6
6#define DUMP_NAME_LEN 52 7#define DUMP_NAME_LEN 52
diff --git a/drivers/firmware/efi/efivars.c b/drivers/firmware/efi/efivars.c
index 5e94897244cf..b623c599e572 100644
--- a/drivers/firmware/efi/efivars.c
+++ b/drivers/firmware/efi/efivars.c
@@ -67,6 +67,7 @@
67 67
68#include <linux/efi.h> 68#include <linux/efi.h>
69#include <linux/module.h> 69#include <linux/module.h>
70#include <linux/slab.h>
70#include <linux/ucs2_string.h> 71#include <linux/ucs2_string.h>
71 72
72#define EFIVARS_VERSION "0.08" 73#define EFIVARS_VERSION "0.08"
diff --git a/drivers/gpu/drm/drm_proc.c b/drivers/gpu/drm/drm_proc.c
index ff5456b7df72..d7f2324b4fb1 100644
--- a/drivers/gpu/drm/drm_proc.c
+++ b/drivers/gpu/drm/drm_proc.c
@@ -49,7 +49,7 @@
49/** 49/**
50 * Proc file list. 50 * Proc file list.
51 */ 51 */
52static struct drm_info_list drm_proc_list[] = { 52static const struct drm_info_list drm_proc_list[] = {
53 {"name", drm_name_info, 0}, 53 {"name", drm_name_info, 0},
54 {"vm", drm_vm_info, 0}, 54 {"vm", drm_vm_info, 0},
55 {"clients", drm_clients_info, 0}, 55 {"clients", drm_clients_info, 0},
@@ -63,7 +63,7 @@ static struct drm_info_list drm_proc_list[] = {
63 63
64static int drm_proc_open(struct inode *inode, struct file *file) 64static int drm_proc_open(struct inode *inode, struct file *file)
65{ 65{
66 struct drm_info_node* node = PDE(inode)->data; 66 struct drm_info_node* node = PDE_DATA(inode);
67 67
68 return single_open(file, node->info_ent->show, node); 68 return single_open(file, node->info_ent->show, node);
69} 69}
@@ -89,13 +89,13 @@ static const struct file_operations drm_proc_fops = {
89 * Create a given set of proc files represented by an array of 89 * Create a given set of proc files represented by an array of
90 * gdm_proc_lists in the given root directory. 90 * gdm_proc_lists in the given root directory.
91 */ 91 */
92static int drm_proc_create_files(struct drm_info_list *files, int count, 92static int drm_proc_create_files(const struct drm_info_list *files, int count,
93 struct proc_dir_entry *root, struct drm_minor *minor) 93 struct proc_dir_entry *root, struct drm_minor *minor)
94{ 94{
95 struct drm_device *dev = minor->dev; 95 struct drm_device *dev = minor->dev;
96 struct proc_dir_entry *ent; 96 struct proc_dir_entry *ent;
97 struct drm_info_node *tmp; 97 struct drm_info_node *tmp;
98 int i, ret; 98 int i;
99 99
100 for (i = 0; i < count; i++) { 100 for (i = 0; i < count; i++) {
101 u32 features = files[i].driver_features; 101 u32 features = files[i].driver_features;
@@ -105,10 +105,9 @@ static int drm_proc_create_files(struct drm_info_list *files, int count,
105 continue; 105 continue;
106 106
107 tmp = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL); 107 tmp = kmalloc(sizeof(struct drm_info_node), GFP_KERNEL);
108 if (tmp == NULL) { 108 if (!tmp)
109 ret = -1; 109 return -1;
110 goto fail; 110
111 }
112 tmp->minor = minor; 111 tmp->minor = minor;
113 tmp->info_ent = &files[i]; 112 tmp->info_ent = &files[i];
114 list_add(&tmp->list, &minor->proc_nodes.list); 113 list_add(&tmp->list, &minor->proc_nodes.list);
@@ -116,28 +115,20 @@ static int drm_proc_create_files(struct drm_info_list *files, int count,
116 ent = proc_create_data(files[i].name, S_IRUGO, root, 115 ent = proc_create_data(files[i].name, S_IRUGO, root,
117 &drm_proc_fops, tmp); 116 &drm_proc_fops, tmp);
118 if (!ent) { 117 if (!ent) {
119 DRM_ERROR("Cannot create /proc/dri/%s/%s\n", 118 DRM_ERROR("Cannot create /proc/dri/%u/%s\n",
120 root->name, files[i].name); 119 minor->index, files[i].name);
121 list_del(&tmp->list); 120 list_del(&tmp->list);
122 kfree(tmp); 121 kfree(tmp);
123 ret = -1; 122 return -1;
124 goto fail;
125 } 123 }
126
127 } 124 }
128 return 0; 125 return 0;
129
130fail:
131 for (i = 0; i < count; i++)
132 remove_proc_entry(drm_proc_list[i].name, minor->proc_root);
133 return ret;
134} 126}
135 127
136/** 128/**
137 * Initialize the DRI proc filesystem for a device 129 * Initialize the DRI proc filesystem for a device
138 * 130 *
139 * \param dev DRM device 131 * \param dev DRM device
140 * \param minor device minor number
141 * \param root DRI proc dir entry. 132 * \param root DRI proc dir entry.
142 * \param dev_root resulting DRI device proc dir entry. 133 * \param dev_root resulting DRI device proc dir entry.
143 * \return root entry pointer on success, or NULL on failure. 134 * \return root entry pointer on success, or NULL on failure.
@@ -146,14 +137,13 @@ fail:
146 * "/proc/dri/%minor%/", and each entry in proc_list as 137 * "/proc/dri/%minor%/", and each entry in proc_list as
147 * "/proc/dri/%minor%/%name%". 138 * "/proc/dri/%minor%/%name%".
148 */ 139 */
149int drm_proc_init(struct drm_minor *minor, int minor_id, 140int drm_proc_init(struct drm_minor *minor, struct proc_dir_entry *root)
150 struct proc_dir_entry *root)
151{ 141{
152 char name[64]; 142 char name[12];
153 int ret; 143 int ret;
154 144
155 INIT_LIST_HEAD(&minor->proc_nodes.list); 145 INIT_LIST_HEAD(&minor->proc_nodes.list);
156 sprintf(name, "%d", minor_id); 146 sprintf(name, "%u", minor->index);
157 minor->proc_root = proc_mkdir(name, root); 147 minor->proc_root = proc_mkdir(name, root);
158 if (!minor->proc_root) { 148 if (!minor->proc_root) {
159 DRM_ERROR("Cannot create /proc/dri/%s\n", name); 149 DRM_ERROR("Cannot create /proc/dri/%s\n", name);
@@ -163,7 +153,7 @@ int drm_proc_init(struct drm_minor *minor, int minor_id,
163 ret = drm_proc_create_files(drm_proc_list, DRM_PROC_ENTRIES, 153 ret = drm_proc_create_files(drm_proc_list, DRM_PROC_ENTRIES,
164 minor->proc_root, minor); 154 minor->proc_root, minor);
165 if (ret) { 155 if (ret) {
166 remove_proc_entry(name, root); 156 remove_proc_subtree(name, root);
167 minor->proc_root = NULL; 157 minor->proc_root = NULL;
168 DRM_ERROR("Failed to create core drm proc files\n"); 158 DRM_ERROR("Failed to create core drm proc files\n");
169 return ret; 159 return ret;
@@ -172,7 +162,7 @@ int drm_proc_init(struct drm_minor *minor, int minor_id,
172 return 0; 162 return 0;
173} 163}
174 164
175static int drm_proc_remove_files(struct drm_info_list *files, int count, 165static int drm_proc_remove_files(const struct drm_info_list *files, int count,
176 struct drm_minor *minor) 166 struct drm_minor *minor)
177{ 167{
178 struct list_head *pos, *q; 168 struct list_head *pos, *q;
@@ -213,8 +203,7 @@ int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root)
213 drm_proc_remove_files(drm_proc_list, DRM_PROC_ENTRIES, minor); 203 drm_proc_remove_files(drm_proc_list, DRM_PROC_ENTRIES, minor);
214 204
215 sprintf(name, "%d", minor->index); 205 sprintf(name, "%d", minor->index);
216 remove_proc_entry(name, root); 206 remove_proc_subtree(name, root);
217
218 return 0; 207 return 0;
219} 208}
220 209
diff --git a/drivers/gpu/drm/drm_stub.c b/drivers/gpu/drm/drm_stub.c
index 7d30802a018f..16f3ec579b3b 100644
--- a/drivers/gpu/drm/drm_stub.c
+++ b/drivers/gpu/drm/drm_stub.c
@@ -352,7 +352,7 @@ int drm_get_minor(struct drm_device *dev, struct drm_minor **minor, int type)
352 idr_replace(&drm_minors_idr, new_minor, minor_id); 352 idr_replace(&drm_minors_idr, new_minor, minor_id);
353 353
354 if (type == DRM_MINOR_LEGACY) { 354 if (type == DRM_MINOR_LEGACY) {
355 ret = drm_proc_init(new_minor, minor_id, drm_proc_root); 355 ret = drm_proc_init(new_minor, drm_proc_root);
356 if (ret) { 356 if (ret) {
357 DRM_ERROR("DRM: Failed to initialize /proc/dri.\n"); 357 DRM_ERROR("DRM: Failed to initialize /proc/dri.\n");
358 goto err_mem; 358 goto err_mem;
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c
index 8126824daccb..b23113926388 100644
--- a/drivers/ide/ide-cd.c
+++ b/drivers/ide/ide-cd.c
@@ -1408,7 +1408,7 @@ static int idecd_capacity_proc_show(struct seq_file *m, void *v)
1408 1408
1409static int idecd_capacity_proc_open(struct inode *inode, struct file *file) 1409static int idecd_capacity_proc_open(struct inode *inode, struct file *file)
1410{ 1410{
1411 return single_open(file, idecd_capacity_proc_show, PDE(inode)->data); 1411 return single_open(file, idecd_capacity_proc_show, PDE_DATA(inode));
1412} 1412}
1413 1413
1414static const struct file_operations idecd_capacity_proc_fops = { 1414static const struct file_operations idecd_capacity_proc_fops = {
diff --git a/drivers/ide/ide-disk_proc.c b/drivers/ide/ide-disk_proc.c
index 8b570a17bcd9..0d1fae6cba6d 100644
--- a/drivers/ide/ide-disk_proc.c
+++ b/drivers/ide/ide-disk_proc.c
@@ -53,7 +53,7 @@ static int idedisk_cache_proc_show(struct seq_file *m, void *v)
53 53
54static int idedisk_cache_proc_open(struct inode *inode, struct file *file) 54static int idedisk_cache_proc_open(struct inode *inode, struct file *file)
55{ 55{
56 return single_open(file, idedisk_cache_proc_show, PDE(inode)->data); 56 return single_open(file, idedisk_cache_proc_show, PDE_DATA(inode));
57} 57}
58 58
59static const struct file_operations idedisk_cache_proc_fops = { 59static const struct file_operations idedisk_cache_proc_fops = {
@@ -74,7 +74,7 @@ static int idedisk_capacity_proc_show(struct seq_file *m, void *v)
74 74
75static int idedisk_capacity_proc_open(struct inode *inode, struct file *file) 75static int idedisk_capacity_proc_open(struct inode *inode, struct file *file)
76{ 76{
77 return single_open(file, idedisk_capacity_proc_show, PDE(inode)->data); 77 return single_open(file, idedisk_capacity_proc_show, PDE_DATA(inode));
78} 78}
79 79
80static const struct file_operations idedisk_capacity_proc_fops = { 80static const struct file_operations idedisk_capacity_proc_fops = {
@@ -115,7 +115,7 @@ static int idedisk_sv_proc_show(struct seq_file *m, void *v)
115 115
116static int idedisk_sv_proc_open(struct inode *inode, struct file *file) 116static int idedisk_sv_proc_open(struct inode *inode, struct file *file)
117{ 117{
118 return single_open(file, idedisk_sv_proc_show, PDE(inode)->data); 118 return single_open(file, idedisk_sv_proc_show, PDE_DATA(inode));
119} 119}
120 120
121static const struct file_operations idedisk_sv_proc_fops = { 121static const struct file_operations idedisk_sv_proc_fops = {
@@ -133,7 +133,7 @@ static int idedisk_st_proc_show(struct seq_file *m, void *v)
133 133
134static int idedisk_st_proc_open(struct inode *inode, struct file *file) 134static int idedisk_st_proc_open(struct inode *inode, struct file *file)
135{ 135{
136 return single_open(file, idedisk_st_proc_show, PDE(inode)->data); 136 return single_open(file, idedisk_st_proc_show, PDE_DATA(inode));
137} 137}
138 138
139static const struct file_operations idedisk_st_proc_fops = { 139static const struct file_operations idedisk_st_proc_fops = {
diff --git a/drivers/ide/ide-floppy_proc.c b/drivers/ide/ide-floppy_proc.c
index 1600720f3e86..e7a25ea757df 100644
--- a/drivers/ide/ide-floppy_proc.c
+++ b/drivers/ide/ide-floppy_proc.c
@@ -15,7 +15,7 @@ static int idefloppy_capacity_proc_show(struct seq_file *m, void *v)
15 15
16static int idefloppy_capacity_proc_open(struct inode *inode, struct file *file) 16static int idefloppy_capacity_proc_open(struct inode *inode, struct file *file)
17{ 17{
18 return single_open(file, idefloppy_capacity_proc_show, PDE(inode)->data); 18 return single_open(file, idefloppy_capacity_proc_show, PDE_DATA(inode));
19} 19}
20 20
21static const struct file_operations idefloppy_capacity_proc_fops = { 21static const struct file_operations idefloppy_capacity_proc_fops = {
diff --git a/drivers/ide/ide-proc.c b/drivers/ide/ide-proc.c
index 2abcc4790f12..97c070077774 100644
--- a/drivers/ide/ide-proc.c
+++ b/drivers/ide/ide-proc.c
@@ -58,7 +58,7 @@ static int ide_imodel_proc_show(struct seq_file *m, void *v)
58 58
59static int ide_imodel_proc_open(struct inode *inode, struct file *file) 59static int ide_imodel_proc_open(struct inode *inode, struct file *file)
60{ 60{
61 return single_open(file, ide_imodel_proc_show, PDE(inode)->data); 61 return single_open(file, ide_imodel_proc_show, PDE_DATA(inode));
62} 62}
63 63
64static const struct file_operations ide_imodel_proc_fops = { 64static const struct file_operations ide_imodel_proc_fops = {
@@ -82,7 +82,7 @@ static int ide_mate_proc_show(struct seq_file *m, void *v)
82 82
83static int ide_mate_proc_open(struct inode *inode, struct file *file) 83static int ide_mate_proc_open(struct inode *inode, struct file *file)
84{ 84{
85 return single_open(file, ide_mate_proc_show, PDE(inode)->data); 85 return single_open(file, ide_mate_proc_show, PDE_DATA(inode));
86} 86}
87 87
88static const struct file_operations ide_mate_proc_fops = { 88static const struct file_operations ide_mate_proc_fops = {
@@ -103,7 +103,7 @@ static int ide_channel_proc_show(struct seq_file *m, void *v)
103 103
104static int ide_channel_proc_open(struct inode *inode, struct file *file) 104static int ide_channel_proc_open(struct inode *inode, struct file *file)
105{ 105{
106 return single_open(file, ide_channel_proc_show, PDE(inode)->data); 106 return single_open(file, ide_channel_proc_show, PDE_DATA(inode));
107} 107}
108 108
109static const struct file_operations ide_channel_proc_fops = { 109static const struct file_operations ide_channel_proc_fops = {
@@ -143,7 +143,7 @@ static int ide_identify_proc_show(struct seq_file *m, void *v)
143 143
144static int ide_identify_proc_open(struct inode *inode, struct file *file) 144static int ide_identify_proc_open(struct inode *inode, struct file *file)
145{ 145{
146 return single_open(file, ide_identify_proc_show, PDE(inode)->data); 146 return single_open(file, ide_identify_proc_show, PDE_DATA(inode));
147} 147}
148 148
149static const struct file_operations ide_identify_proc_fops = { 149static const struct file_operations ide_identify_proc_fops = {
@@ -325,7 +325,7 @@ static int ide_settings_proc_show(struct seq_file *m, void *v)
325 325
326static int ide_settings_proc_open(struct inode *inode, struct file *file) 326static int ide_settings_proc_open(struct inode *inode, struct file *file)
327{ 327{
328 return single_open(file, ide_settings_proc_show, PDE(inode)->data); 328 return single_open(file, ide_settings_proc_show, PDE_DATA(inode));
329} 329}
330 330
331#define MAX_LEN 30 331#define MAX_LEN 30
@@ -333,7 +333,7 @@ static int ide_settings_proc_open(struct inode *inode, struct file *file)
333static ssize_t ide_settings_proc_write(struct file *file, const char __user *buffer, 333static ssize_t ide_settings_proc_write(struct file *file, const char __user *buffer,
334 size_t count, loff_t *pos) 334 size_t count, loff_t *pos)
335{ 335{
336 ide_drive_t *drive = (ide_drive_t *) PDE(file_inode(file))->data; 336 ide_drive_t *drive = PDE_DATA(file_inode(file));
337 char name[MAX_LEN + 1]; 337 char name[MAX_LEN + 1];
338 int for_real = 0, mul_factor, div_factor; 338 int for_real = 0, mul_factor, div_factor;
339 unsigned long n; 339 unsigned long n;
@@ -474,7 +474,7 @@ static int ide_geometry_proc_show(struct seq_file *m, void *v)
474 474
475static int ide_geometry_proc_open(struct inode *inode, struct file *file) 475static int ide_geometry_proc_open(struct inode *inode, struct file *file)
476{ 476{
477 return single_open(file, ide_geometry_proc_show, PDE(inode)->data); 477 return single_open(file, ide_geometry_proc_show, PDE_DATA(inode));
478} 478}
479 479
480const struct file_operations ide_geometry_proc_fops = { 480const struct file_operations ide_geometry_proc_fops = {
@@ -497,7 +497,7 @@ static int ide_dmodel_proc_show(struct seq_file *seq, void *v)
497 497
498static int ide_dmodel_proc_open(struct inode *inode, struct file *file) 498static int ide_dmodel_proc_open(struct inode *inode, struct file *file)
499{ 499{
500 return single_open(file, ide_dmodel_proc_show, PDE(inode)->data); 500 return single_open(file, ide_dmodel_proc_show, PDE_DATA(inode));
501} 501}
502 502
503static const struct file_operations ide_dmodel_proc_fops = { 503static const struct file_operations ide_dmodel_proc_fops = {
@@ -525,7 +525,7 @@ static int ide_driver_proc_show(struct seq_file *m, void *v)
525 525
526static int ide_driver_proc_open(struct inode *inode, struct file *file) 526static int ide_driver_proc_open(struct inode *inode, struct file *file)
527{ 527{
528 return single_open(file, ide_driver_proc_show, PDE(inode)->data); 528 return single_open(file, ide_driver_proc_show, PDE_DATA(inode));
529} 529}
530 530
531static int ide_replace_subdriver(ide_drive_t *drive, const char *driver) 531static int ide_replace_subdriver(ide_drive_t *drive, const char *driver)
@@ -558,7 +558,7 @@ static int ide_replace_subdriver(ide_drive_t *drive, const char *driver)
558static ssize_t ide_driver_proc_write(struct file *file, const char __user *buffer, 558static ssize_t ide_driver_proc_write(struct file *file, const char __user *buffer,
559 size_t count, loff_t *pos) 559 size_t count, loff_t *pos)
560{ 560{
561 ide_drive_t *drive = (ide_drive_t *) PDE(file_inode(file))->data; 561 ide_drive_t *drive = PDE_DATA(file_inode(file));
562 char name[32]; 562 char name[32];
563 563
564 if (!capable(CAP_SYS_ADMIN)) 564 if (!capable(CAP_SYS_ADMIN))
@@ -601,7 +601,7 @@ static int ide_media_proc_show(struct seq_file *m, void *v)
601 601
602static int ide_media_proc_open(struct inode *inode, struct file *file) 602static int ide_media_proc_open(struct inode *inode, struct file *file)
603{ 603{
604 return single_open(file, ide_media_proc_show, PDE(inode)->data); 604 return single_open(file, ide_media_proc_show, PDE_DATA(inode));
605} 605}
606 606
607static const struct file_operations ide_media_proc_fops = { 607static const struct file_operations ide_media_proc_fops = {
diff --git a/drivers/ide/ide-tape.c b/drivers/ide/ide-tape.c
index ce8237d36159..89f859591bbb 100644
--- a/drivers/ide/ide-tape.c
+++ b/drivers/ide/ide-tape.c
@@ -1847,7 +1847,7 @@ static int idetape_name_proc_show(struct seq_file *m, void *v)
1847 1847
1848static int idetape_name_proc_open(struct inode *inode, struct file *file) 1848static int idetape_name_proc_open(struct inode *inode, struct file *file)
1849{ 1849{
1850 return single_open(file, idetape_name_proc_show, PDE(inode)->data); 1850 return single_open(file, idetape_name_proc_show, PDE_DATA(inode));
1851} 1851}
1852 1852
1853static const struct file_operations idetape_name_proc_fops = { 1853static const struct file_operations idetape_name_proc_fops = {
diff --git a/drivers/input/misc/hp_sdc_rtc.c b/drivers/input/misc/hp_sdc_rtc.c
index 2e3334b8f82d..770479df8657 100644
--- a/drivers/input/misc/hp_sdc_rtc.c
+++ b/drivers/input/misc/hp_sdc_rtc.c
@@ -41,6 +41,7 @@
41#include <linux/time.h> 41#include <linux/time.h>
42#include <linux/miscdevice.h> 42#include <linux/miscdevice.h>
43#include <linux/proc_fs.h> 43#include <linux/proc_fs.h>
44#include <linux/seq_file.h>
44#include <linux/poll.h> 45#include <linux/poll.h>
45#include <linux/rtc.h> 46#include <linux/rtc.h>
46#include <linux/mutex.h> 47#include <linux/mutex.h>
@@ -74,9 +75,6 @@ static unsigned int hp_sdc_rtc_poll(struct file *file, poll_table *wait);
74static int hp_sdc_rtc_open(struct inode *inode, struct file *file); 75static int hp_sdc_rtc_open(struct inode *inode, struct file *file);
75static int hp_sdc_rtc_fasync (int fd, struct file *filp, int on); 76static int hp_sdc_rtc_fasync (int fd, struct file *filp, int on);
76 77
77static int hp_sdc_rtc_read_proc(char *page, char **start, off_t off,
78 int count, int *eof, void *data);
79
80static void hp_sdc_rtc_isr (int irq, void *dev_id, 78static void hp_sdc_rtc_isr (int irq, void *dev_id,
81 uint8_t status, uint8_t data) 79 uint8_t status, uint8_t data)
82{ 80{
@@ -427,22 +425,19 @@ static int hp_sdc_rtc_fasync (int fd, struct file *filp, int on)
427 return fasync_helper (fd, filp, on, &hp_sdc_rtc_async_queue); 425 return fasync_helper (fd, filp, on, &hp_sdc_rtc_async_queue);
428} 426}
429 427
430static int hp_sdc_rtc_proc_output (char *buf) 428static int hp_sdc_rtc_proc_show(struct seq_file *m, void *v)
431{ 429{
432#define YN(bit) ("no") 430#define YN(bit) ("no")
433#define NY(bit) ("yes") 431#define NY(bit) ("yes")
434 char *p;
435 struct rtc_time tm; 432 struct rtc_time tm;
436 struct timeval tv; 433 struct timeval tv;
437 434
438 memset(&tm, 0, sizeof(struct rtc_time)); 435 memset(&tm, 0, sizeof(struct rtc_time));
439 436
440 p = buf;
441
442 if (hp_sdc_rtc_read_bbrtc(&tm)) { 437 if (hp_sdc_rtc_read_bbrtc(&tm)) {
443 p += sprintf(p, "BBRTC\t\t: READ FAILED!\n"); 438 seq_puts(m, "BBRTC\t\t: READ FAILED!\n");
444 } else { 439 } else {
445 p += sprintf(p, 440 seq_printf(m,
446 "rtc_time\t: %02d:%02d:%02d\n" 441 "rtc_time\t: %02d:%02d:%02d\n"
447 "rtc_date\t: %04d-%02d-%02d\n" 442 "rtc_date\t: %04d-%02d-%02d\n"
448 "rtc_epoch\t: %04lu\n", 443 "rtc_epoch\t: %04lu\n",
@@ -452,41 +447,41 @@ static int hp_sdc_rtc_proc_output (char *buf)
452 } 447 }
453 448
454 if (hp_sdc_rtc_read_rt(&tv)) { 449 if (hp_sdc_rtc_read_rt(&tv)) {
455 p += sprintf(p, "i8042 rtc\t: READ FAILED!\n"); 450 seq_puts(m, "i8042 rtc\t: READ FAILED!\n");
456 } else { 451 } else {
457 p += sprintf(p, "i8042 rtc\t: %ld.%02d seconds\n", 452 seq_printf(m, "i8042 rtc\t: %ld.%02d seconds\n",
458 tv.tv_sec, (int)tv.tv_usec/1000); 453 tv.tv_sec, (int)tv.tv_usec/1000);
459 } 454 }
460 455
461 if (hp_sdc_rtc_read_fhs(&tv)) { 456 if (hp_sdc_rtc_read_fhs(&tv)) {
462 p += sprintf(p, "handshake\t: READ FAILED!\n"); 457 seq_puts(m, "handshake\t: READ FAILED!\n");
463 } else { 458 } else {
464 p += sprintf(p, "handshake\t: %ld.%02d seconds\n", 459 seq_printf(m, "handshake\t: %ld.%02d seconds\n",
465 tv.tv_sec, (int)tv.tv_usec/1000); 460 tv.tv_sec, (int)tv.tv_usec/1000);
466 } 461 }
467 462
468 if (hp_sdc_rtc_read_mt(&tv)) { 463 if (hp_sdc_rtc_read_mt(&tv)) {
469 p += sprintf(p, "alarm\t\t: READ FAILED!\n"); 464 seq_puts(m, "alarm\t\t: READ FAILED!\n");
470 } else { 465 } else {
471 p += sprintf(p, "alarm\t\t: %ld.%02d seconds\n", 466 seq_printf(m, "alarm\t\t: %ld.%02d seconds\n",
472 tv.tv_sec, (int)tv.tv_usec/1000); 467 tv.tv_sec, (int)tv.tv_usec/1000);
473 } 468 }
474 469
475 if (hp_sdc_rtc_read_dt(&tv)) { 470 if (hp_sdc_rtc_read_dt(&tv)) {
476 p += sprintf(p, "delay\t\t: READ FAILED!\n"); 471 seq_puts(m, "delay\t\t: READ FAILED!\n");
477 } else { 472 } else {
478 p += sprintf(p, "delay\t\t: %ld.%02d seconds\n", 473 seq_printf(m, "delay\t\t: %ld.%02d seconds\n",
479 tv.tv_sec, (int)tv.tv_usec/1000); 474 tv.tv_sec, (int)tv.tv_usec/1000);
480 } 475 }
481 476
482 if (hp_sdc_rtc_read_ct(&tv)) { 477 if (hp_sdc_rtc_read_ct(&tv)) {
483 p += sprintf(p, "periodic\t: READ FAILED!\n"); 478 seq_puts(m, "periodic\t: READ FAILED!\n");
484 } else { 479 } else {
485 p += sprintf(p, "periodic\t: %ld.%02d seconds\n", 480 seq_printf(m, "periodic\t: %ld.%02d seconds\n",
486 tv.tv_sec, (int)tv.tv_usec/1000); 481 tv.tv_sec, (int)tv.tv_usec/1000);
487 } 482 }
488 483
489 p += sprintf(p, 484 seq_printf(m,
490 "DST_enable\t: %s\n" 485 "DST_enable\t: %s\n"
491 "BCD\t\t: %s\n" 486 "BCD\t\t: %s\n"
492 "24hr\t\t: %s\n" 487 "24hr\t\t: %s\n"
@@ -506,23 +501,23 @@ static int hp_sdc_rtc_proc_output (char *buf)
506 1UL, 501 1UL,
507 1 ? "okay" : "dead"); 502 1 ? "okay" : "dead");
508 503
509 return p - buf; 504 return 0;
510#undef YN 505#undef YN
511#undef NY 506#undef NY
512} 507}
513 508
514static int hp_sdc_rtc_read_proc(char *page, char **start, off_t off, 509static int hp_sdc_rtc_proc_open(struct inode *inode, struct file *file)
515 int count, int *eof, void *data)
516{ 510{
517 int len = hp_sdc_rtc_proc_output (page); 511 return single_open(file, hp_sdc_rtc_proc_show, NULL);
518 if (len <= off+count) *eof = 1;
519 *start = page + off;
520 len -= off;
521 if (len>count) len = count;
522 if (len<0) len = 0;
523 return len;
524} 512}
525 513
514static const struct file_operations hp_sdc_rtc_proc_fops = {
515 .open = hp_sdc_rtc_proc_open,
516 .read = seq_read,
517 .llseek = seq_lseek,
518 .release = seq_release,
519};
520
526static int hp_sdc_rtc_ioctl(struct file *file, 521static int hp_sdc_rtc_ioctl(struct file *file,
527 unsigned int cmd, unsigned long arg) 522 unsigned int cmd, unsigned long arg)
528{ 523{
@@ -715,8 +710,7 @@ static int __init hp_sdc_rtc_init(void)
715 if (misc_register(&hp_sdc_rtc_dev) != 0) 710 if (misc_register(&hp_sdc_rtc_dev) != 0)
716 printk(KERN_INFO "Could not register misc. dev for i8042 rtc\n"); 711 printk(KERN_INFO "Could not register misc. dev for i8042 rtc\n");
717 712
718 create_proc_read_entry ("driver/rtc", 0, NULL, 713 proc_create("driver/rtc", 0, NULL, &hp_sdc_rtc_proc_fops);
719 hp_sdc_rtc_read_proc, NULL);
720 714
721 printk(KERN_INFO "HP i8042 SDC + MSM-58321 RTC support loaded " 715 printk(KERN_INFO "HP i8042 SDC + MSM-58321 RTC support loaded "
722 "(RTC v " RTC_VERSION ")\n"); 716 "(RTC v " RTC_VERSION ")\n");
diff --git a/drivers/isdn/gigaset/capi.c b/drivers/isdn/gigaset/capi.c
index 03a0a01a4054..3286903a95d2 100644
--- a/drivers/isdn/gigaset/capi.c
+++ b/drivers/isdn/gigaset/capi.c
@@ -2334,7 +2334,7 @@ static int gigaset_proc_show(struct seq_file *m, void *v)
2334 2334
2335static int gigaset_proc_open(struct inode *inode, struct file *file) 2335static int gigaset_proc_open(struct inode *inode, struct file *file)
2336{ 2336{
2337 return single_open(file, gigaset_proc_show, PDE(inode)->data); 2337 return single_open(file, gigaset_proc_show, PDE_DATA(inode));
2338} 2338}
2339 2339
2340static const struct file_operations gigaset_proc_fops = { 2340static const struct file_operations gigaset_proc_fops = {
diff --git a/drivers/isdn/hardware/avm/b1.c b/drivers/isdn/hardware/avm/b1.c
index 821f7ac33b37..4d9b195547c5 100644
--- a/drivers/isdn/hardware/avm/b1.c
+++ b/drivers/isdn/hardware/avm/b1.c
@@ -702,7 +702,7 @@ static int b1ctl_proc_show(struct seq_file *m, void *v)
702 702
703static int b1ctl_proc_open(struct inode *inode, struct file *file) 703static int b1ctl_proc_open(struct inode *inode, struct file *file)
704{ 704{
705 return single_open(file, b1ctl_proc_show, PDE(inode)->data); 705 return single_open(file, b1ctl_proc_show, PDE_DATA(inode));
706} 706}
707 707
708const struct file_operations b1ctl_proc_fops = { 708const struct file_operations b1ctl_proc_fops = {
diff --git a/drivers/isdn/hardware/avm/b1dma.c b/drivers/isdn/hardware/avm/b1dma.c
index 0896aa86fc08..19b113faeb7b 100644
--- a/drivers/isdn/hardware/avm/b1dma.c
+++ b/drivers/isdn/hardware/avm/b1dma.c
@@ -944,7 +944,7 @@ static int b1dmactl_proc_show(struct seq_file *m, void *v)
944 944
945static int b1dmactl_proc_open(struct inode *inode, struct file *file) 945static int b1dmactl_proc_open(struct inode *inode, struct file *file)
946{ 946{
947 return single_open(file, b1dmactl_proc_show, PDE(inode)->data); 947 return single_open(file, b1dmactl_proc_show, PDE_DATA(inode));
948} 948}
949 949
950const struct file_operations b1dmactl_proc_fops = { 950const struct file_operations b1dmactl_proc_fops = {
diff --git a/drivers/isdn/hardware/avm/c4.c b/drivers/isdn/hardware/avm/c4.c
index 1d7fc44e3eef..5d00d72fe482 100644
--- a/drivers/isdn/hardware/avm/c4.c
+++ b/drivers/isdn/hardware/avm/c4.c
@@ -1129,7 +1129,7 @@ static int c4_proc_show(struct seq_file *m, void *v)
1129 1129
1130static int c4_proc_open(struct inode *inode, struct file *file) 1130static int c4_proc_open(struct inode *inode, struct file *file)
1131{ 1131{
1132 return single_open(file, c4_proc_show, PDE(inode)->data); 1132 return single_open(file, c4_proc_show, PDE_DATA(inode));
1133} 1133}
1134 1134
1135static const struct file_operations c4_proc_fops = { 1135static const struct file_operations c4_proc_fops = {
diff --git a/drivers/isdn/hardware/eicon/divasproc.c b/drivers/isdn/hardware/eicon/divasproc.c
index 3a4165c61196..56ce98a4e248 100644
--- a/drivers/isdn/hardware/eicon/divasproc.c
+++ b/drivers/isdn/hardware/eicon/divasproc.c
@@ -145,7 +145,7 @@ void remove_divas_proc(void)
145static ssize_t grp_opt_proc_write(struct file *file, const char __user *buffer, 145static ssize_t grp_opt_proc_write(struct file *file, const char __user *buffer,
146 size_t count, loff_t *pos) 146 size_t count, loff_t *pos)
147{ 147{
148 diva_os_xdi_adapter_t *a = PDE(file_inode(file))->data; 148 diva_os_xdi_adapter_t *a = PDE_DATA(file_inode(file));
149 PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; 149 PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
150 150
151 if ((count == 1) || (count == 2)) { 151 if ((count == 1) || (count == 2)) {
@@ -172,7 +172,7 @@ static ssize_t grp_opt_proc_write(struct file *file, const char __user *buffer,
172static ssize_t d_l1_down_proc_write(struct file *file, const char __user *buffer, 172static ssize_t d_l1_down_proc_write(struct file *file, const char __user *buffer,
173 size_t count, loff_t *pos) 173 size_t count, loff_t *pos)
174{ 174{
175 diva_os_xdi_adapter_t *a = PDE(file_inode(file))->data; 175 diva_os_xdi_adapter_t *a = PDE_DATA(file_inode(file));
176 PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; 176 PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
177 177
178 if ((count == 1) || (count == 2)) { 178 if ((count == 1) || (count == 2)) {
@@ -210,7 +210,7 @@ static int d_l1_down_proc_show(struct seq_file *m, void *v)
210 210
211static int d_l1_down_proc_open(struct inode *inode, struct file *file) 211static int d_l1_down_proc_open(struct inode *inode, struct file *file)
212{ 212{
213 return single_open(file, d_l1_down_proc_show, PDE(inode)->data); 213 return single_open(file, d_l1_down_proc_show, PDE_DATA(inode));
214} 214}
215 215
216static const struct file_operations d_l1_down_proc_fops = { 216static const struct file_operations d_l1_down_proc_fops = {
@@ -236,7 +236,7 @@ static int grp_opt_proc_show(struct seq_file *m, void *v)
236 236
237static int grp_opt_proc_open(struct inode *inode, struct file *file) 237static int grp_opt_proc_open(struct inode *inode, struct file *file)
238{ 238{
239 return single_open(file, grp_opt_proc_show, PDE(inode)->data); 239 return single_open(file, grp_opt_proc_show, PDE_DATA(inode));
240} 240}
241 241
242static const struct file_operations grp_opt_proc_fops = { 242static const struct file_operations grp_opt_proc_fops = {
@@ -251,7 +251,7 @@ static const struct file_operations grp_opt_proc_fops = {
251static ssize_t info_proc_write(struct file *file, const char __user *buffer, 251static ssize_t info_proc_write(struct file *file, const char __user *buffer,
252 size_t count, loff_t *pos) 252 size_t count, loff_t *pos)
253{ 253{
254 diva_os_xdi_adapter_t *a = PDE(file_inode(file))->data; 254 diva_os_xdi_adapter_t *a = PDE_DATA(file_inode(file));
255 PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1]; 255 PISDN_ADAPTER IoAdapter = IoAdapters[a->controller - 1];
256 char c[4]; 256 char c[4];
257 257
@@ -335,7 +335,7 @@ static int info_proc_show(struct seq_file *m, void *v)
335 335
336static int info_proc_open(struct inode *inode, struct file *file) 336static int info_proc_open(struct inode *inode, struct file *file)
337{ 337{
338 return single_open(file, info_proc_show, PDE(inode)->data); 338 return single_open(file, info_proc_show, PDE_DATA(inode));
339} 339}
340 340
341static const struct file_operations info_proc_fops = { 341static const struct file_operations info_proc_fops = {
diff --git a/drivers/isdn/hysdn/hycapi.c b/drivers/isdn/hysdn/hycapi.c
index 931f916c9c23..00aad10507d8 100644
--- a/drivers/isdn/hysdn/hycapi.c
+++ b/drivers/isdn/hysdn/hycapi.c
@@ -469,7 +469,7 @@ static int hycapi_proc_show(struct seq_file *m, void *v)
469 469
470static int hycapi_proc_open(struct inode *inode, struct file *file) 470static int hycapi_proc_open(struct inode *inode, struct file *file)
471{ 471{
472 return single_open(file, hycapi_proc_show, PDE(inode)->data); 472 return single_open(file, hycapi_proc_show, PDE_DATA(inode));
473} 473}
474 474
475static const struct file_operations hycapi_proc_fops = { 475static const struct file_operations hycapi_proc_fops = {
diff --git a/drivers/isdn/hysdn/hysdn_procconf.c b/drivers/isdn/hysdn/hysdn_procconf.c
index 8023d2510fba..73079213ec94 100644
--- a/drivers/isdn/hysdn/hysdn_procconf.c
+++ b/drivers/isdn/hysdn/hysdn_procconf.c
@@ -229,23 +229,12 @@ static int
229hysdn_conf_open(struct inode *ino, struct file *filep) 229hysdn_conf_open(struct inode *ino, struct file *filep)
230{ 230{
231 hysdn_card *card; 231 hysdn_card *card;
232 struct proc_dir_entry *pd;
233 struct conf_writedata *cnf; 232 struct conf_writedata *cnf;
234 char *cp, *tmp; 233 char *cp, *tmp;
235 234
236 /* now search the addressed card */ 235 /* now search the addressed card */
237 mutex_lock(&hysdn_conf_mutex); 236 mutex_lock(&hysdn_conf_mutex);
238 card = card_root; 237 card = PDE_DATA(ino);
239 while (card) {
240 pd = card->procconf;
241 if (pd == PDE(ino))
242 break;
243 card = card->next; /* search next entry */
244 }
245 if (!card) {
246 mutex_unlock(&hysdn_conf_mutex);
247 return (-ENODEV); /* device is unknown/invalid */
248 }
249 if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL)) 238 if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
250 hysdn_addlog(card, "config open for uid=%d gid=%d mode=0x%x", 239 hysdn_addlog(card, "config open for uid=%d gid=%d mode=0x%x",
251 filep->f_cred->fsuid, filep->f_cred->fsgid, 240 filep->f_cred->fsuid, filep->f_cred->fsgid,
@@ -317,21 +306,9 @@ hysdn_conf_close(struct inode *ino, struct file *filep)
317 hysdn_card *card; 306 hysdn_card *card;
318 struct conf_writedata *cnf; 307 struct conf_writedata *cnf;
319 int retval = 0; 308 int retval = 0;
320 struct proc_dir_entry *pd;
321 309
322 mutex_lock(&hysdn_conf_mutex); 310 mutex_lock(&hysdn_conf_mutex);
323 /* search the addressed card */ 311 card = PDE_DATA(ino);
324 card = card_root;
325 while (card) {
326 pd = card->procconf;
327 if (pd == PDE(ino))
328 break;
329 card = card->next; /* search next entry */
330 }
331 if (!card) {
332 mutex_unlock(&hysdn_conf_mutex);
333 return (-ENODEV); /* device is unknown/invalid */
334 }
335 if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL)) 312 if (card->debug_flags & (LOG_PROC_OPEN | LOG_PROC_ALL))
336 hysdn_addlog(card, "config close for uid=%d gid=%d mode=0x%x", 313 hysdn_addlog(card, "config close for uid=%d gid=%d mode=0x%x",
337 filep->f_cred->fsuid, filep->f_cred->fsgid, 314 filep->f_cred->fsuid, filep->f_cred->fsgid,
@@ -394,10 +371,11 @@ hysdn_procconf_init(void)
394 while (card) { 371 while (card) {
395 372
396 sprintf(conf_name, "%s%d", PROC_CONF_BASENAME, card->myid); 373 sprintf(conf_name, "%s%d", PROC_CONF_BASENAME, card->myid);
397 if ((card->procconf = (void *) proc_create(conf_name, 374 if ((card->procconf = (void *) proc_create_data(conf_name,
398 S_IFREG | S_IRUGO | S_IWUSR, 375 S_IFREG | S_IRUGO | S_IWUSR,
399 hysdn_proc_entry, 376 hysdn_proc_entry,
400 &conf_fops)) != NULL) { 377 &conf_fops,
378 card)) != NULL) {
401 hysdn_proclog_init(card); /* init the log file entry */ 379 hysdn_proclog_init(card); /* init the log file entry */
402 } 380 }
403 card = card->next; /* next entry */ 381 card = card->next; /* next entry */
diff --git a/drivers/isdn/hysdn/hysdn_proclog.c b/drivers/isdn/hysdn/hysdn_proclog.c
index 9a3ce93665c5..b61e8d5e84ad 100644
--- a/drivers/isdn/hysdn/hysdn_proclog.c
+++ b/drivers/isdn/hysdn/hysdn_proclog.c
@@ -173,27 +173,14 @@ hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off)
173{ 173{
174 struct log_data *inf; 174 struct log_data *inf;
175 int len; 175 int len;
176 struct proc_dir_entry *pde = PDE(file_inode(file)); 176 hysdn_card *card = PDE_DATA(file_inode(file));
177 struct procdata *pd = NULL;
178 hysdn_card *card;
179 177
180 if (!*((struct log_data **) file->private_data)) { 178 if (!*((struct log_data **) file->private_data)) {
179 struct procdata *pd = card->proclog;
181 if (file->f_flags & O_NONBLOCK) 180 if (file->f_flags & O_NONBLOCK)
182 return (-EAGAIN); 181 return (-EAGAIN);
183 182
184 /* sorry, but we need to search the card */ 183 interruptible_sleep_on(&(pd->rd_queue));
185 card = card_root;
186 while (card) {
187 pd = card->proclog;
188 if (pd->log == pde)
189 break;
190 card = card->next; /* search next entry */
191 }
192 if (card)
193 interruptible_sleep_on(&(pd->rd_queue));
194 else
195 return (-EAGAIN);
196
197 } 184 }
198 if (!(inf = *((struct log_data **) file->private_data))) 185 if (!(inf = *((struct log_data **) file->private_data)))
199 return (0); 186 return (0);
@@ -215,27 +202,15 @@ hysdn_log_read(struct file *file, char __user *buf, size_t count, loff_t *off)
215static int 202static int
216hysdn_log_open(struct inode *ino, struct file *filep) 203hysdn_log_open(struct inode *ino, struct file *filep)
217{ 204{
218 hysdn_card *card; 205 hysdn_card *card = PDE_DATA(ino);
219 struct procdata *pd = NULL;
220 unsigned long flags;
221 206
222 mutex_lock(&hysdn_log_mutex); 207 mutex_lock(&hysdn_log_mutex);
223 card = card_root;
224 while (card) {
225 pd = card->proclog;
226 if (pd->log == PDE(ino))
227 break;
228 card = card->next; /* search next entry */
229 }
230 if (!card) {
231 mutex_unlock(&hysdn_log_mutex);
232 return (-ENODEV); /* device is unknown/invalid */
233 }
234 filep->private_data = card; /* remember our own card */
235
236 if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) { 208 if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) {
237 /* write only access -> write log level only */ 209 /* write only access -> write log level only */
210 filep->private_data = card; /* remember our own card */
238 } else if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) { 211 } else if ((filep->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_READ) {
212 struct procdata *pd = card->proclog;
213 unsigned long flags;
239 214
240 /* read access -> log/debug read */ 215 /* read access -> log/debug read */
241 spin_lock_irqsave(&card->hysdn_lock, flags); 216 spin_lock_irqsave(&card->hysdn_lock, flags);
@@ -275,21 +250,13 @@ hysdn_log_close(struct inode *ino, struct file *filep)
275 } else { 250 } else {
276 /* read access -> log/debug read, mark one further file as closed */ 251 /* read access -> log/debug read, mark one further file as closed */
277 252
278 pd = NULL;
279 inf = *((struct log_data **) filep->private_data); /* get first log entry */ 253 inf = *((struct log_data **) filep->private_data); /* get first log entry */
280 if (inf) 254 if (inf)
281 pd = (struct procdata *) inf->proc_ctrl; /* still entries there */ 255 pd = (struct procdata *) inf->proc_ctrl; /* still entries there */
282 else { 256 else {
283 /* no info available -> search card */ 257 /* no info available -> search card */
284 card = card_root; 258 card = PDE_DATA(file_inode(filep));
285 while (card) { 259 pd = card->proclog; /* pointer to procfs log */
286 pd = card->proclog;
287 if (pd->log == PDE(ino))
288 break;
289 card = card->next; /* search next entry */
290 }
291 if (card)
292 pd = card->proclog; /* pointer to procfs log */
293 } 260 }
294 if (pd) 261 if (pd)
295 pd->if_used--; /* decrement interface usage count by one */ 262 pd->if_used--; /* decrement interface usage count by one */
@@ -319,24 +286,12 @@ static unsigned int
319hysdn_log_poll(struct file *file, poll_table *wait) 286hysdn_log_poll(struct file *file, poll_table *wait)
320{ 287{
321 unsigned int mask = 0; 288 unsigned int mask = 0;
322 struct proc_dir_entry *pde = PDE(file_inode(file)); 289 hysdn_card *card = PDE_DATA(file_inode(file));
323 hysdn_card *card; 290 struct procdata *pd = card->proclog;
324 struct procdata *pd = NULL;
325 291
326 if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE) 292 if ((file->f_mode & (FMODE_READ | FMODE_WRITE)) == FMODE_WRITE)
327 return (mask); /* no polling for write supported */ 293 return (mask); /* no polling for write supported */
328 294
329 /* we need to search the card */
330 card = card_root;
331 while (card) {
332 pd = card->proclog;
333 if (pd->log == pde)
334 break;
335 card = card->next; /* search next entry */
336 }
337 if (!card)
338 return (mask); /* card not found */
339
340 poll_wait(file, &(pd->rd_queue), wait); 295 poll_wait(file, &(pd->rd_queue), wait);
341 296
342 if (*((struct log_data **) file->private_data)) 297 if (*((struct log_data **) file->private_data))
@@ -373,9 +328,9 @@ hysdn_proclog_init(hysdn_card *card)
373 328
374 if ((pd = kzalloc(sizeof(struct procdata), GFP_KERNEL)) != NULL) { 329 if ((pd = kzalloc(sizeof(struct procdata), GFP_KERNEL)) != NULL) {
375 sprintf(pd->log_name, "%s%d", PROC_LOG_BASENAME, card->myid); 330 sprintf(pd->log_name, "%s%d", PROC_LOG_BASENAME, card->myid);
376 pd->log = proc_create(pd->log_name, 331 pd->log = proc_create_data(pd->log_name,
377 S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry, 332 S_IFREG | S_IRUGO | S_IWUSR, hysdn_proc_entry,
378 &log_fops); 333 &log_fops, card);
379 334
380 init_waitqueue_head(&(pd->rd_queue)); 335 init_waitqueue_head(&(pd->rd_queue));
381 336
diff --git a/drivers/isdn/mISDN/timerdev.c b/drivers/isdn/mISDN/timerdev.c
index 1094667d8f31..9438d7ec3308 100644
--- a/drivers/isdn/mISDN/timerdev.c
+++ b/drivers/isdn/mISDN/timerdev.c
@@ -64,7 +64,6 @@ mISDN_open(struct inode *ino, struct file *filep)
64 dev->work = 0; 64 dev->work = 0;
65 init_waitqueue_head(&dev->wait); 65 init_waitqueue_head(&dev->wait);
66 filep->private_data = dev; 66 filep->private_data = dev;
67 __module_get(THIS_MODULE);
68 return nonseekable_open(ino, filep); 67 return nonseekable_open(ino, filep);
69} 68}
70 69
@@ -72,19 +71,28 @@ static int
72mISDN_close(struct inode *ino, struct file *filep) 71mISDN_close(struct inode *ino, struct file *filep)
73{ 72{
74 struct mISDNtimerdev *dev = filep->private_data; 73 struct mISDNtimerdev *dev = filep->private_data;
74 struct list_head *list = &dev->pending;
75 struct mISDNtimer *timer, *next; 75 struct mISDNtimer *timer, *next;
76 76
77 if (*debug & DEBUG_TIMER) 77 if (*debug & DEBUG_TIMER)
78 printk(KERN_DEBUG "%s(%p,%p)\n", __func__, ino, filep); 78 printk(KERN_DEBUG "%s(%p,%p)\n", __func__, ino, filep);
79 list_for_each_entry_safe(timer, next, &dev->pending, list) { 79
80 del_timer(&timer->tl); 80 spin_lock_irq(&dev->lock);
81 while (!list_empty(list)) {
82 timer = list_first_entry(list, struct mISDNtimer, list);
83 spin_unlock_irq(&dev->lock);
84 del_timer_sync(&timer->tl);
85 spin_lock_irq(&dev->lock);
86 /* it might have been moved to ->expired */
87 list_del(&timer->list);
81 kfree(timer); 88 kfree(timer);
82 } 89 }
90 spin_unlock_irq(&dev->lock);
91
83 list_for_each_entry_safe(timer, next, &dev->expired, list) { 92 list_for_each_entry_safe(timer, next, &dev->expired, list) {
84 kfree(timer); 93 kfree(timer);
85 } 94 }
86 kfree(dev); 95 kfree(dev);
87 module_put(THIS_MODULE);
88 return 0; 96 return 0;
89} 97}
90 98
@@ -92,36 +100,41 @@ static ssize_t
92mISDN_read(struct file *filep, char __user *buf, size_t count, loff_t *off) 100mISDN_read(struct file *filep, char __user *buf, size_t count, loff_t *off)
93{ 101{
94 struct mISDNtimerdev *dev = filep->private_data; 102 struct mISDNtimerdev *dev = filep->private_data;
103 struct list_head *list = &dev->expired;
95 struct mISDNtimer *timer; 104 struct mISDNtimer *timer;
96 u_long flags;
97 int ret = 0; 105 int ret = 0;
98 106
99 if (*debug & DEBUG_TIMER) 107 if (*debug & DEBUG_TIMER)
100 printk(KERN_DEBUG "%s(%p, %p, %d, %p)\n", __func__, 108 printk(KERN_DEBUG "%s(%p, %p, %d, %p)\n", __func__,
101 filep, buf, (int)count, off); 109 filep, buf, (int)count, off);
102 110
103 if (list_empty(&dev->expired) && (dev->work == 0)) { 111 if (count < sizeof(int))
112 return -ENOSPC;
113
114 spin_lock_irq(&dev->lock);
115 while (list_empty(list) && (dev->work == 0)) {
116 spin_unlock_irq(&dev->lock);
104 if (filep->f_flags & O_NONBLOCK) 117 if (filep->f_flags & O_NONBLOCK)
105 return -EAGAIN; 118 return -EAGAIN;
106 wait_event_interruptible(dev->wait, (dev->work || 119 wait_event_interruptible(dev->wait, (dev->work ||
107 !list_empty(&dev->expired))); 120 !list_empty(list)));
108 if (signal_pending(current)) 121 if (signal_pending(current))
109 return -ERESTARTSYS; 122 return -ERESTARTSYS;
123 spin_lock_irq(&dev->lock);
110 } 124 }
111 if (count < sizeof(int))
112 return -ENOSPC;
113 if (dev->work) 125 if (dev->work)
114 dev->work = 0; 126 dev->work = 0;
115 if (!list_empty(&dev->expired)) { 127 if (!list_empty(list)) {
116 spin_lock_irqsave(&dev->lock, flags); 128 timer = list_first_entry(list, struct mISDNtimer, list);
117 timer = (struct mISDNtimer *)dev->expired.next;
118 list_del(&timer->list); 129 list_del(&timer->list);
119 spin_unlock_irqrestore(&dev->lock, flags); 130 spin_unlock_irq(&dev->lock);
120 if (put_user(timer->id, (int __user *)buf)) 131 if (put_user(timer->id, (int __user *)buf))
121 ret = -EFAULT; 132 ret = -EFAULT;
122 else 133 else
123 ret = sizeof(int); 134 ret = sizeof(int);
124 kfree(timer); 135 kfree(timer);
136 } else {
137 spin_unlock_irq(&dev->lock);
125 } 138 }
126 return ret; 139 return ret;
127} 140}
@@ -153,7 +166,8 @@ dev_expire_timer(unsigned long data)
153 u_long flags; 166 u_long flags;
154 167
155 spin_lock_irqsave(&timer->dev->lock, flags); 168 spin_lock_irqsave(&timer->dev->lock, flags);
156 list_move_tail(&timer->list, &timer->dev->expired); 169 if (timer->id >= 0)
170 list_move_tail(&timer->list, &timer->dev->expired);
157 spin_unlock_irqrestore(&timer->dev->lock, flags); 171 spin_unlock_irqrestore(&timer->dev->lock, flags);
158 wake_up_interruptible(&timer->dev->wait); 172 wake_up_interruptible(&timer->dev->wait);
159} 173}
@@ -162,7 +176,6 @@ static int
162misdn_add_timer(struct mISDNtimerdev *dev, int timeout) 176misdn_add_timer(struct mISDNtimerdev *dev, int timeout)
163{ 177{
164 int id; 178 int id;
165 u_long flags;
166 struct mISDNtimer *timer; 179 struct mISDNtimer *timer;
167 180
168 if (!timeout) { 181 if (!timeout) {
@@ -173,19 +186,16 @@ misdn_add_timer(struct mISDNtimerdev *dev, int timeout)
173 timer = kzalloc(sizeof(struct mISDNtimer), GFP_KERNEL); 186 timer = kzalloc(sizeof(struct mISDNtimer), GFP_KERNEL);
174 if (!timer) 187 if (!timer)
175 return -ENOMEM; 188 return -ENOMEM;
176 spin_lock_irqsave(&dev->lock, flags); 189 timer->dev = dev;
177 timer->id = dev->next_id++; 190 setup_timer(&timer->tl, dev_expire_timer, (long)timer);
191 spin_lock_irq(&dev->lock);
192 id = timer->id = dev->next_id++;
178 if (dev->next_id < 0) 193 if (dev->next_id < 0)
179 dev->next_id = 1; 194 dev->next_id = 1;
180 list_add_tail(&timer->list, &dev->pending); 195 list_add_tail(&timer->list, &dev->pending);
181 spin_unlock_irqrestore(&dev->lock, flags);
182 timer->dev = dev;
183 timer->tl.data = (long)timer;
184 timer->tl.function = dev_expire_timer;
185 init_timer(&timer->tl);
186 timer->tl.expires = jiffies + ((HZ * (u_long)timeout) / 1000); 196 timer->tl.expires = jiffies + ((HZ * (u_long)timeout) / 1000);
187 add_timer(&timer->tl); 197 add_timer(&timer->tl);
188 id = timer->id; 198 spin_unlock_irq(&dev->lock);
189 } 199 }
190 return id; 200 return id;
191} 201}
@@ -193,26 +203,21 @@ misdn_add_timer(struct mISDNtimerdev *dev, int timeout)
193static int 203static int
194misdn_del_timer(struct mISDNtimerdev *dev, int id) 204misdn_del_timer(struct mISDNtimerdev *dev, int id)
195{ 205{
196 u_long flags;
197 struct mISDNtimer *timer; 206 struct mISDNtimer *timer;
198 int ret = 0;
199 207
200 spin_lock_irqsave(&dev->lock, flags); 208 spin_lock_irq(&dev->lock);
201 list_for_each_entry(timer, &dev->pending, list) { 209 list_for_each_entry(timer, &dev->pending, list) {
202 if (timer->id == id) { 210 if (timer->id == id) {
203 list_del_init(&timer->list); 211 list_del_init(&timer->list);
204 /* RED-PEN AK: race -- timer can be still running on 212 timer->id = -1;
205 * other CPU. Needs reference count I think 213 spin_unlock_irq(&dev->lock);
206 */ 214 del_timer_sync(&timer->tl);
207 del_timer(&timer->tl);
208 ret = timer->id;
209 kfree(timer); 215 kfree(timer);
210 goto unlock; 216 return id;
211 } 217 }
212 } 218 }
213unlock: 219 spin_unlock_irq(&dev->lock);
214 spin_unlock_irqrestore(&dev->lock, flags); 220 return 0;
215 return ret;
216} 221}
217 222
218static long 223static long
@@ -262,6 +267,7 @@ mISDN_ioctl(struct file *filep, unsigned int cmd, unsigned long arg)
262} 267}
263 268
264static const struct file_operations mISDN_fops = { 269static const struct file_operations mISDN_fops = {
270 .owner = THIS_MODULE,
265 .read = mISDN_read, 271 .read = mISDN_read,
266 .poll = mISDN_poll, 272 .poll = mISDN_poll,
267 .unlocked_ioctl = mISDN_ioctl, 273 .unlocked_ioctl = mISDN_ioctl,
diff --git a/drivers/macintosh/via-pmu.c b/drivers/macintosh/via-pmu.c
index 22b8ce4191cc..c31fbab6aa82 100644
--- a/drivers/macintosh/via-pmu.c
+++ b/drivers/macintosh/via-pmu.c
@@ -869,7 +869,7 @@ static int pmu_battery_proc_show(struct seq_file *m, void *v)
869 869
870static int pmu_battery_proc_open(struct inode *inode, struct file *file) 870static int pmu_battery_proc_open(struct inode *inode, struct file *file)
871{ 871{
872 return single_open(file, pmu_battery_proc_show, PDE(inode)->data); 872 return single_open(file, pmu_battery_proc_show, PDE_DATA(inode));
873} 873}
874 874
875static const struct file_operations pmu_battery_proc_fops = { 875static const struct file_operations pmu_battery_proc_fops = {
diff --git a/drivers/media/dvb-core/dvb_frontend.c b/drivers/media/dvb-core/dvb_frontend.c
index 57601c0704c1..1f925e856974 100644
--- a/drivers/media/dvb-core/dvb_frontend.c
+++ b/drivers/media/dvb-core/dvb_frontend.c
@@ -2527,11 +2527,8 @@ static int dvb_frontend_release(struct inode *inode, struct file *file)
2527 2527
2528 if (dvbdev->users == -1) { 2528 if (dvbdev->users == -1) {
2529 wake_up(&fepriv->wait_queue); 2529 wake_up(&fepriv->wait_queue);
2530 if (fepriv->exit != DVB_FE_NO_EXIT) { 2530 if (fepriv->exit != DVB_FE_NO_EXIT)
2531 fops_put(file->f_op);
2532 file->f_op = NULL;
2533 wake_up(&dvbdev->wait_queue); 2531 wake_up(&dvbdev->wait_queue);
2534 }
2535 if (fe->ops.ts_bus_ctrl) 2532 if (fe->ops.ts_bus_ctrl)
2536 fe->ops.ts_bus_ctrl(fe, 0); 2533 fe->ops.ts_bus_ctrl(fe, 0);
2537 } 2534 }
diff --git a/drivers/media/dvb-core/dvb_net.c b/drivers/media/dvb-core/dvb_net.c
index c3cc3b52662b..f91c80c0e9ec 100644
--- a/drivers/media/dvb-core/dvb_net.c
+++ b/drivers/media/dvb-core/dvb_net.c
@@ -1479,11 +1479,8 @@ static int dvb_net_close(struct inode *inode, struct file *file)
1479 1479
1480 dvb_generic_release(inode, file); 1480 dvb_generic_release(inode, file);
1481 1481
1482 if(dvbdev->users == 1 && dvbnet->exit == 1) { 1482 if(dvbdev->users == 1 && dvbnet->exit == 1)
1483 fops_put(file->f_op);
1484 file->f_op = NULL;
1485 wake_up(&dvbdev->wait_queue); 1483 wake_up(&dvbdev->wait_queue);
1486 }
1487 return 0; 1484 return 0;
1488} 1485}
1489 1486
diff --git a/drivers/media/pci/cx25821/cx25821-audio-upstream.c b/drivers/media/pci/cx25821/cx25821-audio-upstream.c
index b9be535e32b8..68dbc2dbc982 100644
--- a/drivers/media/pci/cx25821/cx25821-audio-upstream.c
+++ b/drivers/media/pci/cx25821/cx25821-audio-upstream.c
@@ -259,79 +259,46 @@ void cx25821_free_mem_upstream_audio(struct cx25821_dev *dev)
259static int cx25821_get_audio_data(struct cx25821_dev *dev, 259static int cx25821_get_audio_data(struct cx25821_dev *dev,
260 const struct sram_channel *sram_ch) 260 const struct sram_channel *sram_ch)
261{ 261{
262 struct file *myfile; 262 struct file *file;
263 int frame_index_temp = dev->_audioframe_index; 263 int frame_index_temp = dev->_audioframe_index;
264 int i = 0; 264 int i = 0;
265 int line_size = AUDIO_LINE_SIZE;
266 int frame_size = AUDIO_DATA_BUF_SZ; 265 int frame_size = AUDIO_DATA_BUF_SZ;
267 int frame_offset = frame_size * frame_index_temp; 266 int frame_offset = frame_size * frame_index_temp;
268 ssize_t vfs_read_retval = 0; 267 char mybuf[AUDIO_LINE_SIZE];
269 char mybuf[line_size];
270 loff_t file_offset = dev->_audioframe_count * frame_size; 268 loff_t file_offset = dev->_audioframe_count * frame_size;
271 loff_t pos; 269 char *p = NULL;
272 mm_segment_t old_fs;
273 270
274 if (dev->_audiofile_status == END_OF_FILE) 271 if (dev->_audiofile_status == END_OF_FILE)
275 return 0; 272 return 0;
276 273
277 myfile = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0); 274 file = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0);
275 if (IS_ERR(file)) {
276 pr_err("%s(): ERROR opening file(%s) with errno = %ld!\n",
277 __func__, dev->_audiofilename, -PTR_ERR(file));
278 return PTR_ERR(file);
279 }
278 280
279 if (IS_ERR(myfile)) { 281 if (dev->_audiodata_buf_virt_addr)
280 const int open_errno = -PTR_ERR(myfile); 282 p = (char *)dev->_audiodata_buf_virt_addr + frame_offset;
281 pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
282 __func__, dev->_audiofilename, open_errno);
283 return PTR_ERR(myfile);
284 } else {
285 if (!(myfile->f_op)) {
286 pr_err("%s(): File has no file operations registered!\n",
287 __func__);
288 filp_close(myfile, NULL);
289 return -EIO;
290 }
291 283
292 if (!myfile->f_op->read) { 284 for (i = 0; i < dev->_audio_lines_count; i++) {
293 pr_err("%s(): File has no READ operations registered!\n", 285 int n = kernel_read(file, file_offset, mybuf, AUDIO_LINE_SIZE);
286 if (n < AUDIO_LINE_SIZE) {
287 pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
294 __func__); 288 __func__);
295 filp_close(myfile, NULL); 289 dev->_audiofile_status = END_OF_FILE;
296 return -EIO; 290 fput(file);
291 return 0;
297 } 292 }
298 293 dev->_audiofile_status = IN_PROGRESS;
299 pos = myfile->f_pos; 294 if (p) {
300 old_fs = get_fs(); 295 memcpy(p, mybuf, n);
301 set_fs(KERNEL_DS); 296 p += n;
302
303 for (i = 0; i < dev->_audio_lines_count; i++) {
304 pos = file_offset;
305
306 vfs_read_retval = vfs_read(myfile, mybuf, line_size,
307 &pos);
308
309 if (vfs_read_retval > 0 && vfs_read_retval == line_size
310 && dev->_audiodata_buf_virt_addr != NULL) {
311 memcpy((void *)(dev->_audiodata_buf_virt_addr +
312 frame_offset / 4), mybuf,
313 vfs_read_retval);
314 }
315
316 file_offset += vfs_read_retval;
317 frame_offset += vfs_read_retval;
318
319 if (vfs_read_retval < line_size) {
320 pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
321 __func__);
322 break;
323 }
324 } 297 }
325 298 file_offset += n;
326 if (i > 0)
327 dev->_audioframe_count++;
328
329 dev->_audiofile_status = (vfs_read_retval == line_size) ?
330 IN_PROGRESS : END_OF_FILE;
331
332 set_fs(old_fs);
333 filp_close(myfile, NULL);
334 } 299 }
300 dev->_audioframe_count++;
301 fput(file);
335 302
336 return 0; 303 return 0;
337} 304}
@@ -354,81 +321,41 @@ static void cx25821_audioups_handler(struct work_struct *work)
354static int cx25821_openfile_audio(struct cx25821_dev *dev, 321static int cx25821_openfile_audio(struct cx25821_dev *dev,
355 const struct sram_channel *sram_ch) 322 const struct sram_channel *sram_ch)
356{ 323{
357 struct file *myfile; 324 char *p = (void *)dev->_audiodata_buf_virt_addr;
358 int i = 0, j = 0; 325 struct file *file;
359 int line_size = AUDIO_LINE_SIZE; 326 loff_t offset;
360 ssize_t vfs_read_retval = 0; 327 int i, j;
361 char mybuf[line_size]; 328
362 loff_t pos; 329 file = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0);
363 loff_t offset = (unsigned long)0; 330 if (IS_ERR(file)) {
364 mm_segment_t old_fs; 331 pr_err("%s(): ERROR opening file(%s) with errno = %ld!\n",
365 332 __func__, dev->_audiofilename, PTR_ERR(file));
366 myfile = filp_open(dev->_audiofilename, O_RDONLY | O_LARGEFILE, 0); 333 return PTR_ERR(file);
367 334 }
368 if (IS_ERR(myfile)) {
369 const int open_errno = -PTR_ERR(myfile);
370 pr_err("%s(): ERROR opening file(%s) with errno = %d!\n",
371 __func__, dev->_audiofilename, open_errno);
372 return PTR_ERR(myfile);
373 } else {
374 if (!(myfile->f_op)) {
375 pr_err("%s(): File has no file operations registered!\n",
376 __func__);
377 filp_close(myfile, NULL);
378 return -EIO;
379 }
380
381 if (!myfile->f_op->read) {
382 pr_err("%s(): File has no READ operations registered!\n",
383 __func__);
384 filp_close(myfile, NULL);
385 return -EIO;
386 }
387
388 pos = myfile->f_pos;
389 old_fs = get_fs();
390 set_fs(KERNEL_DS);
391
392 for (j = 0; j < NUM_AUDIO_FRAMES; j++) {
393 for (i = 0; i < dev->_audio_lines_count; i++) {
394 pos = offset;
395
396 vfs_read_retval = vfs_read(myfile, mybuf,
397 line_size, &pos);
398
399 if (vfs_read_retval > 0 &&
400 vfs_read_retval == line_size &&
401 dev->_audiodata_buf_virt_addr != NULL) {
402 memcpy((void *)(dev->
403 _audiodata_buf_virt_addr
404 + offset / 4), mybuf,
405 vfs_read_retval);
406 }
407 335
408 offset += vfs_read_retval; 336 for (j = 0, offset = 0; j < NUM_AUDIO_FRAMES; j++) {
337 for (i = 0; i < dev->_audio_lines_count; i++) {
338 char buf[AUDIO_LINE_SIZE];
339 int n = kernel_read(file, offset, buf,
340 AUDIO_LINE_SIZE);
409 341
410 if (vfs_read_retval < line_size) { 342 if (n < AUDIO_LINE_SIZE) {
411 pr_info("Done: exit %s() since no more bytes to read from Audio file\n", 343 pr_info("Done: exit %s() since no more bytes to read from Audio file\n",
412 __func__); 344 __func__);
413 break; 345 dev->_audiofile_status = END_OF_FILE;
414 } 346 fput(file);
347 return 0;
415 } 348 }
416 349
417 if (i > 0) 350 if (p)
418 dev->_audioframe_count++; 351 memcpy(p + offset, buf, n);
419 352
420 if (vfs_read_retval < line_size) 353 offset += n;
421 break;
422 } 354 }
423 355 dev->_audioframe_count++;
424 dev->_audiofile_status = (vfs_read_retval == line_size) ?
425 IN_PROGRESS : END_OF_FILE;
426
427 set_fs(old_fs);
428 myfile->f_pos = 0;
429 filp_close(myfile, NULL);
430 } 356 }
431 357 dev->_audiofile_status = IN_PROGRESS;
358 fput(file);
432 return 0; 359 return 0;
433} 360}
434 361
diff --git a/drivers/media/pci/ttpci/av7110_ir.c b/drivers/media/pci/ttpci/av7110_ir.c
index eb822862a646..0e763a784e2b 100644
--- a/drivers/media/pci/ttpci/av7110_ir.c
+++ b/drivers/media/pci/ttpci/av7110_ir.c
@@ -375,7 +375,7 @@ int av7110_ir_init(struct av7110 *av7110)
375 if (av_cnt == 1) { 375 if (av_cnt == 1) {
376 e = proc_create("av7110_ir", S_IWUSR, NULL, &av7110_ir_proc_fops); 376 e = proc_create("av7110_ir", S_IWUSR, NULL, &av7110_ir_proc_fops);
377 if (e) 377 if (e)
378 e->size = 4 + 256 * sizeof(u16); 378 proc_set_size(e, 4 + 256 * sizeof(u16));
379 } 379 }
380 380
381 tasklet_init(&av7110->ir.ir_tasklet, av7110_emit_key, (unsigned long) &av7110->ir); 381 tasklet_init(&av7110->ir.ir_tasklet, av7110_emit_key, (unsigned long) &av7110->ir);
diff --git a/drivers/media/pci/zoran/zoran_procfs.c b/drivers/media/pci/zoran/zoran_procfs.c
index 1512b5d40533..f7ceee0cdefd 100644
--- a/drivers/media/pci/zoran/zoran_procfs.c
+++ b/drivers/media/pci/zoran/zoran_procfs.c
@@ -130,14 +130,14 @@ static int zoran_show(struct seq_file *p, void *v)
130 130
131static int zoran_open(struct inode *inode, struct file *file) 131static int zoran_open(struct inode *inode, struct file *file)
132{ 132{
133 struct zoran *data = PDE(inode)->data; 133 struct zoran *data = PDE_DATA(inode);
134 return single_open(file, zoran_show, data); 134 return single_open(file, zoran_show, data);
135} 135}
136 136
137static ssize_t zoran_write(struct file *file, const char __user *buffer, 137static ssize_t zoran_write(struct file *file, const char __user *buffer,
138 size_t count, loff_t *ppos) 138 size_t count, loff_t *ppos)
139{ 139{
140 struct zoran *zr = PDE(file_inode(file))->data; 140 struct zoran *zr = PDE_DATA(file_inode(file));
141 char *string, *sp; 141 char *string, *sp;
142 char *line, *ldelim, *varname, *svar, *tdelim; 142 char *line, *ldelim, *varname, *svar, *tdelim;
143 143
diff --git a/drivers/media/rc/ir-lirc-codec.c b/drivers/media/rc/ir-lirc-codec.c
index ff4d93d1907f..e4561264e124 100644
--- a/drivers/media/rc/ir-lirc-codec.c
+++ b/drivers/media/rc/ir-lirc-codec.c
@@ -307,7 +307,7 @@ static void ir_lirc_close(void *data)
307 return; 307 return;
308} 308}
309 309
310static struct file_operations lirc_fops = { 310static const struct file_operations lirc_fops = {
311 .owner = THIS_MODULE, 311 .owner = THIS_MODULE,
312 .write = ir_lirc_transmit_ir, 312 .write = ir_lirc_transmit_ir,
313 .unlocked_ioctl = ir_lirc_ioctl, 313 .unlocked_ioctl = ir_lirc_ioctl,
diff --git a/drivers/media/rc/lirc_dev.c b/drivers/media/rc/lirc_dev.c
index 5247d94fea29..8dc057b273f2 100644
--- a/drivers/media/rc/lirc_dev.c
+++ b/drivers/media/rc/lirc_dev.c
@@ -152,7 +152,7 @@ static int lirc_thread(void *irctl)
152} 152}
153 153
154 154
155static struct file_operations lirc_dev_fops = { 155static const struct file_operations lirc_dev_fops = {
156 .owner = THIS_MODULE, 156 .owner = THIS_MODULE,
157 .read = lirc_dev_fop_read, 157 .read = lirc_dev_fop_read,
158 .write = lirc_dev_fop_write, 158 .write = lirc_dev_fop_write,
diff --git a/drivers/message/fusion/mptbase.c b/drivers/message/fusion/mptbase.c
index fb69baa06ca8..767ff4d839f4 100644
--- a/drivers/message/fusion/mptbase.c
+++ b/drivers/message/fusion/mptbase.c
@@ -6656,7 +6656,7 @@ static int mpt_summary_proc_show(struct seq_file *m, void *v)
6656 6656
6657static int mpt_summary_proc_open(struct inode *inode, struct file *file) 6657static int mpt_summary_proc_open(struct inode *inode, struct file *file)
6658{ 6658{
6659 return single_open(file, mpt_summary_proc_show, PDE(inode)->data); 6659 return single_open(file, mpt_summary_proc_show, PDE_DATA(inode));
6660} 6660}
6661 6661
6662static const struct file_operations mpt_summary_proc_fops = { 6662static const struct file_operations mpt_summary_proc_fops = {
@@ -6805,7 +6805,7 @@ static int mpt_iocinfo_proc_show(struct seq_file *m, void *v)
6805 6805
6806static int mpt_iocinfo_proc_open(struct inode *inode, struct file *file) 6806static int mpt_iocinfo_proc_open(struct inode *inode, struct file *file)
6807{ 6807{
6808 return single_open(file, mpt_iocinfo_proc_show, PDE(inode)->data); 6808 return single_open(file, mpt_iocinfo_proc_show, PDE_DATA(inode));
6809} 6809}
6810 6810
6811static const struct file_operations mpt_iocinfo_proc_fops = { 6811static const struct file_operations mpt_iocinfo_proc_fops = {
diff --git a/drivers/message/fusion/mptctl.c b/drivers/message/fusion/mptctl.c
index b383b6961e59..dcc8385adeb3 100644
--- a/drivers/message/fusion/mptctl.c
+++ b/drivers/message/fusion/mptctl.c
@@ -597,13 +597,6 @@ mptctl_event_process(MPT_ADAPTER *ioc, EventNotificationReply_t *pEvReply)
597} 597}
598 598
599static int 599static int
600mptctl_release(struct inode *inode, struct file *filep)
601{
602 fasync_helper(-1, filep, 0, &async_queue);
603 return 0;
604}
605
606static int
607mptctl_fasync(int fd, struct file *filep, int mode) 600mptctl_fasync(int fd, struct file *filep, int mode)
608{ 601{
609 MPT_ADAPTER *ioc; 602 MPT_ADAPTER *ioc;
@@ -2822,7 +2815,6 @@ static const struct file_operations mptctl_fops = {
2822 .llseek = no_llseek, 2815 .llseek = no_llseek,
2823 .fasync = mptctl_fasync, 2816 .fasync = mptctl_fasync,
2824 .unlocked_ioctl = mptctl_ioctl, 2817 .unlocked_ioctl = mptctl_ioctl,
2825 .release = mptctl_release,
2826#ifdef CONFIG_COMPAT 2818#ifdef CONFIG_COMPAT
2827 .compat_ioctl = compat_mpctl_ioctl, 2819 .compat_ioctl = compat_mpctl_ioctl,
2828#endif 2820#endif
diff --git a/drivers/message/fusion/mptfc.c b/drivers/message/fusion/mptfc.c
index c13cd9bc590b..fd75108c355e 100644
--- a/drivers/message/fusion/mptfc.c
+++ b/drivers/message/fusion/mptfc.c
@@ -109,7 +109,7 @@ static int mptfc_host_reset(struct scsi_cmnd *SCpnt);
109static struct scsi_host_template mptfc_driver_template = { 109static struct scsi_host_template mptfc_driver_template = {
110 .module = THIS_MODULE, 110 .module = THIS_MODULE,
111 .proc_name = "mptfc", 111 .proc_name = "mptfc",
112 .proc_info = mptscsih_proc_info, 112 .show_info = mptscsih_show_info,
113 .name = "MPT FC Host", 113 .name = "MPT FC Host",
114 .info = mptscsih_info, 114 .info = mptscsih_info,
115 .queuecommand = mptfc_qcmd, 115 .queuecommand = mptfc_qcmd,
diff --git a/drivers/message/fusion/mptsas.c b/drivers/message/fusion/mptsas.c
index fa43c391c8ed..ffee6f781e30 100644
--- a/drivers/message/fusion/mptsas.c
+++ b/drivers/message/fusion/mptsas.c
@@ -1977,7 +1977,7 @@ done:
1977static struct scsi_host_template mptsas_driver_template = { 1977static struct scsi_host_template mptsas_driver_template = {
1978 .module = THIS_MODULE, 1978 .module = THIS_MODULE,
1979 .proc_name = "mptsas", 1979 .proc_name = "mptsas",
1980 .proc_info = mptscsih_proc_info, 1980 .show_info = mptscsih_show_info,
1981 .name = "MPT SAS Host", 1981 .name = "MPT SAS Host",
1982 .info = mptscsih_info, 1982 .info = mptscsih_info,
1983 .queuecommand = mptsas_qcmd, 1983 .queuecommand = mptsas_qcmd,
diff --git a/drivers/message/fusion/mptscsih.c b/drivers/message/fusion/mptscsih.c
index 164afa71bba7..727819cc7034 100644
--- a/drivers/message/fusion/mptscsih.c
+++ b/drivers/message/fusion/mptscsih.c
@@ -1284,101 +1284,17 @@ mptscsih_info(struct Scsi_Host *SChost)
1284 return h->info_kbuf; 1284 return h->info_kbuf;
1285} 1285}
1286 1286
1287struct info_str { 1287int mptscsih_show_info(struct seq_file *m, struct Scsi_Host *host)
1288 char *buffer;
1289 int length;
1290 int offset;
1291 int pos;
1292};
1293
1294static void
1295mptscsih_copy_mem_info(struct info_str *info, char *data, int len)
1296{
1297 if (info->pos + len > info->length)
1298 len = info->length - info->pos;
1299
1300 if (info->pos + len < info->offset) {
1301 info->pos += len;
1302 return;
1303 }
1304
1305 if (info->pos < info->offset) {
1306 data += (info->offset - info->pos);
1307 len -= (info->offset - info->pos);
1308 }
1309
1310 if (len > 0) {
1311 memcpy(info->buffer + info->pos, data, len);
1312 info->pos += len;
1313 }
1314}
1315
1316static int
1317mptscsih_copy_info(struct info_str *info, char *fmt, ...)
1318{
1319 va_list args;
1320 char buf[81];
1321 int len;
1322
1323 va_start(args, fmt);
1324 len = vsprintf(buf, fmt, args);
1325 va_end(args);
1326
1327 mptscsih_copy_mem_info(info, buf, len);
1328 return len;
1329}
1330
1331static int
1332mptscsih_host_info(MPT_ADAPTER *ioc, char *pbuf, off_t offset, int len)
1333{
1334 struct info_str info;
1335
1336 info.buffer = pbuf;
1337 info.length = len;
1338 info.offset = offset;
1339 info.pos = 0;
1340
1341 mptscsih_copy_info(&info, "%s: %s, ", ioc->name, ioc->prod_name);
1342 mptscsih_copy_info(&info, "%s%08xh, ", MPT_FW_REV_MAGIC_ID_STRING, ioc->facts.FWVersion.Word);
1343 mptscsih_copy_info(&info, "Ports=%d, ", ioc->facts.NumberOfPorts);
1344 mptscsih_copy_info(&info, "MaxQ=%d\n", ioc->req_depth);
1345
1346 return ((info.pos > info.offset) ? info.pos - info.offset : 0);
1347}
1348
1349/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
1350/**
1351 * mptscsih_proc_info - Return information about MPT adapter
1352 * @host: scsi host struct
1353 * @buffer: if write, user data; if read, buffer for user
1354 * @start: returns the buffer address
1355 * @offset: if write, 0; if read, the current offset into the buffer from
1356 * the previous read.
1357 * @length: if write, return length;
1358 * @func: write = 1; read = 0
1359 *
1360 * (linux scsi_host_template.info routine)
1361 */
1362int
1363mptscsih_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
1364 int length, int func)
1365{ 1288{
1366 MPT_SCSI_HOST *hd = shost_priv(host); 1289 MPT_SCSI_HOST *hd = shost_priv(host);
1367 MPT_ADAPTER *ioc = hd->ioc; 1290 MPT_ADAPTER *ioc = hd->ioc;
1368 int size = 0;
1369 1291
1370 if (func) { 1292 seq_printf(m, "%s: %s, ", ioc->name, ioc->prod_name);
1371 /* 1293 seq_printf(m, "%s%08xh, ", MPT_FW_REV_MAGIC_ID_STRING, ioc->facts.FWVersion.Word);
1372 * write is not supported 1294 seq_printf(m, "Ports=%d, ", ioc->facts.NumberOfPorts);
1373 */ 1295 seq_printf(m, "MaxQ=%d\n", ioc->req_depth);
1374 } else {
1375 if (start)
1376 *start = buffer;
1377
1378 size = mptscsih_host_info(ioc, buffer, offset, length);
1379 }
1380 1296
1381 return size; 1297 return 0;
1382} 1298}
1383 1299
1384/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/ 1300/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=*/
@@ -3348,7 +3264,7 @@ EXPORT_SYMBOL(mptscsih_shutdown);
3348EXPORT_SYMBOL(mptscsih_suspend); 3264EXPORT_SYMBOL(mptscsih_suspend);
3349EXPORT_SYMBOL(mptscsih_resume); 3265EXPORT_SYMBOL(mptscsih_resume);
3350#endif 3266#endif
3351EXPORT_SYMBOL(mptscsih_proc_info); 3267EXPORT_SYMBOL(mptscsih_show_info);
3352EXPORT_SYMBOL(mptscsih_info); 3268EXPORT_SYMBOL(mptscsih_info);
3353EXPORT_SYMBOL(mptscsih_qcmd); 3269EXPORT_SYMBOL(mptscsih_qcmd);
3354EXPORT_SYMBOL(mptscsih_slave_destroy); 3270EXPORT_SYMBOL(mptscsih_slave_destroy);
diff --git a/drivers/message/fusion/mptscsih.h b/drivers/message/fusion/mptscsih.h
index 43e75ff39921..83f503162f7a 100644
--- a/drivers/message/fusion/mptscsih.h
+++ b/drivers/message/fusion/mptscsih.h
@@ -111,7 +111,7 @@ extern void mptscsih_shutdown(struct pci_dev *);
111extern int mptscsih_suspend(struct pci_dev *pdev, pm_message_t state); 111extern int mptscsih_suspend(struct pci_dev *pdev, pm_message_t state);
112extern int mptscsih_resume(struct pci_dev *pdev); 112extern int mptscsih_resume(struct pci_dev *pdev);
113#endif 113#endif
114extern int mptscsih_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int func); 114extern int mptscsih_show_info(struct seq_file *, struct Scsi_Host *);
115extern const char * mptscsih_info(struct Scsi_Host *SChost); 115extern const char * mptscsih_info(struct Scsi_Host *SChost);
116extern int mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *)); 116extern int mptscsih_qcmd(struct scsi_cmnd *SCpnt, void (*done)(struct scsi_cmnd *));
117extern int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel, 117extern int mptscsih_IssueTaskMgmt(MPT_SCSI_HOST *hd, u8 type, u8 channel,
diff --git a/drivers/message/fusion/mptspi.c b/drivers/message/fusion/mptspi.c
index c3aabde2dc4f..5653e505f91f 100644
--- a/drivers/message/fusion/mptspi.c
+++ b/drivers/message/fusion/mptspi.c
@@ -831,7 +831,7 @@ static void mptspi_slave_destroy(struct scsi_device *sdev)
831static struct scsi_host_template mptspi_driver_template = { 831static struct scsi_host_template mptspi_driver_template = {
832 .module = THIS_MODULE, 832 .module = THIS_MODULE,
833 .proc_name = "mptspi", 833 .proc_name = "mptspi",
834 .proc_info = mptscsih_proc_info, 834 .show_info = mptscsih_show_info,
835 .name = "MPT SPI Host", 835 .name = "MPT SPI Host",
836 .info = mptscsih_info, 836 .info = mptscsih_info,
837 .queuecommand = mptspi_qcmd, 837 .queuecommand = mptspi_qcmd,
diff --git a/drivers/message/i2o/i2o_proc.c b/drivers/message/i2o/i2o_proc.c
index 8001aa6bfb48..b7d87cd227a9 100644
--- a/drivers/message/i2o/i2o_proc.c
+++ b/drivers/message/i2o/i2o_proc.c
@@ -1599,98 +1599,98 @@ static int i2o_seq_show_sensors(struct seq_file *seq, void *v)
1599 1599
1600static int i2o_seq_open_hrt(struct inode *inode, struct file *file) 1600static int i2o_seq_open_hrt(struct inode *inode, struct file *file)
1601{ 1601{
1602 return single_open(file, i2o_seq_show_hrt, PDE(inode)->data); 1602 return single_open(file, i2o_seq_show_hrt, PDE_DATA(inode));
1603}; 1603};
1604 1604
1605static int i2o_seq_open_lct(struct inode *inode, struct file *file) 1605static int i2o_seq_open_lct(struct inode *inode, struct file *file)
1606{ 1606{
1607 return single_open(file, i2o_seq_show_lct, PDE(inode)->data); 1607 return single_open(file, i2o_seq_show_lct, PDE_DATA(inode));
1608}; 1608};
1609 1609
1610static int i2o_seq_open_status(struct inode *inode, struct file *file) 1610static int i2o_seq_open_status(struct inode *inode, struct file *file)
1611{ 1611{
1612 return single_open(file, i2o_seq_show_status, PDE(inode)->data); 1612 return single_open(file, i2o_seq_show_status, PDE_DATA(inode));
1613}; 1613};
1614 1614
1615static int i2o_seq_open_hw(struct inode *inode, struct file *file) 1615static int i2o_seq_open_hw(struct inode *inode, struct file *file)
1616{ 1616{
1617 return single_open(file, i2o_seq_show_hw, PDE(inode)->data); 1617 return single_open(file, i2o_seq_show_hw, PDE_DATA(inode));
1618}; 1618};
1619 1619
1620static int i2o_seq_open_ddm_table(struct inode *inode, struct file *file) 1620static int i2o_seq_open_ddm_table(struct inode *inode, struct file *file)
1621{ 1621{
1622 return single_open(file, i2o_seq_show_ddm_table, PDE(inode)->data); 1622 return single_open(file, i2o_seq_show_ddm_table, PDE_DATA(inode));
1623}; 1623};
1624 1624
1625static int i2o_seq_open_driver_store(struct inode *inode, struct file *file) 1625static int i2o_seq_open_driver_store(struct inode *inode, struct file *file)
1626{ 1626{
1627 return single_open(file, i2o_seq_show_driver_store, PDE(inode)->data); 1627 return single_open(file, i2o_seq_show_driver_store, PDE_DATA(inode));
1628}; 1628};
1629 1629
1630static int i2o_seq_open_drivers_stored(struct inode *inode, struct file *file) 1630static int i2o_seq_open_drivers_stored(struct inode *inode, struct file *file)
1631{ 1631{
1632 return single_open(file, i2o_seq_show_drivers_stored, PDE(inode)->data); 1632 return single_open(file, i2o_seq_show_drivers_stored, PDE_DATA(inode));
1633}; 1633};
1634 1634
1635static int i2o_seq_open_groups(struct inode *inode, struct file *file) 1635static int i2o_seq_open_groups(struct inode *inode, struct file *file)
1636{ 1636{
1637 return single_open(file, i2o_seq_show_groups, PDE(inode)->data); 1637 return single_open(file, i2o_seq_show_groups, PDE_DATA(inode));
1638}; 1638};
1639 1639
1640static int i2o_seq_open_phys_device(struct inode *inode, struct file *file) 1640static int i2o_seq_open_phys_device(struct inode *inode, struct file *file)
1641{ 1641{
1642 return single_open(file, i2o_seq_show_phys_device, PDE(inode)->data); 1642 return single_open(file, i2o_seq_show_phys_device, PDE_DATA(inode));
1643}; 1643};
1644 1644
1645static int i2o_seq_open_claimed(struct inode *inode, struct file *file) 1645static int i2o_seq_open_claimed(struct inode *inode, struct file *file)
1646{ 1646{
1647 return single_open(file, i2o_seq_show_claimed, PDE(inode)->data); 1647 return single_open(file, i2o_seq_show_claimed, PDE_DATA(inode));
1648}; 1648};
1649 1649
1650static int i2o_seq_open_users(struct inode *inode, struct file *file) 1650static int i2o_seq_open_users(struct inode *inode, struct file *file)
1651{ 1651{
1652 return single_open(file, i2o_seq_show_users, PDE(inode)->data); 1652 return single_open(file, i2o_seq_show_users, PDE_DATA(inode));
1653}; 1653};
1654 1654
1655static int i2o_seq_open_priv_msgs(struct inode *inode, struct file *file) 1655static int i2o_seq_open_priv_msgs(struct inode *inode, struct file *file)
1656{ 1656{
1657 return single_open(file, i2o_seq_show_priv_msgs, PDE(inode)->data); 1657 return single_open(file, i2o_seq_show_priv_msgs, PDE_DATA(inode));
1658}; 1658};
1659 1659
1660static int i2o_seq_open_authorized_users(struct inode *inode, struct file *file) 1660static int i2o_seq_open_authorized_users(struct inode *inode, struct file *file)
1661{ 1661{
1662 return single_open(file, i2o_seq_show_authorized_users, 1662 return single_open(file, i2o_seq_show_authorized_users,
1663 PDE(inode)->data); 1663 PDE_DATA(inode));
1664}; 1664};
1665 1665
1666static int i2o_seq_open_dev_identity(struct inode *inode, struct file *file) 1666static int i2o_seq_open_dev_identity(struct inode *inode, struct file *file)
1667{ 1667{
1668 return single_open(file, i2o_seq_show_dev_identity, PDE(inode)->data); 1668 return single_open(file, i2o_seq_show_dev_identity, PDE_DATA(inode));
1669}; 1669};
1670 1670
1671static int i2o_seq_open_ddm_identity(struct inode *inode, struct file *file) 1671static int i2o_seq_open_ddm_identity(struct inode *inode, struct file *file)
1672{ 1672{
1673 return single_open(file, i2o_seq_show_ddm_identity, PDE(inode)->data); 1673 return single_open(file, i2o_seq_show_ddm_identity, PDE_DATA(inode));
1674}; 1674};
1675 1675
1676static int i2o_seq_open_uinfo(struct inode *inode, struct file *file) 1676static int i2o_seq_open_uinfo(struct inode *inode, struct file *file)
1677{ 1677{
1678 return single_open(file, i2o_seq_show_uinfo, PDE(inode)->data); 1678 return single_open(file, i2o_seq_show_uinfo, PDE_DATA(inode));
1679}; 1679};
1680 1680
1681static int i2o_seq_open_sgl_limits(struct inode *inode, struct file *file) 1681static int i2o_seq_open_sgl_limits(struct inode *inode, struct file *file)
1682{ 1682{
1683 return single_open(file, i2o_seq_show_sgl_limits, PDE(inode)->data); 1683 return single_open(file, i2o_seq_show_sgl_limits, PDE_DATA(inode));
1684}; 1684};
1685 1685
1686static int i2o_seq_open_sensors(struct inode *inode, struct file *file) 1686static int i2o_seq_open_sensors(struct inode *inode, struct file *file)
1687{ 1687{
1688 return single_open(file, i2o_seq_show_sensors, PDE(inode)->data); 1688 return single_open(file, i2o_seq_show_sensors, PDE_DATA(inode));
1689}; 1689};
1690 1690
1691static int i2o_seq_open_dev_name(struct inode *inode, struct file *file) 1691static int i2o_seq_open_dev_name(struct inode *inode, struct file *file)
1692{ 1692{
1693 return single_open(file, i2o_seq_show_dev_name, PDE(inode)->data); 1693 return single_open(file, i2o_seq_show_dev_name, PDE_DATA(inode));
1694}; 1694};
1695 1695
1696static const struct file_operations i2o_seq_fops_lct = { 1696static const struct file_operations i2o_seq_fops_lct = {
@@ -1895,25 +1895,6 @@ static int i2o_proc_create_entries(struct proc_dir_entry *dir,
1895} 1895}
1896 1896
1897/** 1897/**
1898 * i2o_proc_subdir_remove - Remove child entries from a proc entry
1899 * @dir: proc dir entry from which the childs should be removed
1900 *
1901 * Iterate over each i2o proc entry under dir and remove it. If the child
1902 * also has entries, remove them too.
1903 */
1904static void i2o_proc_subdir_remove(struct proc_dir_entry *dir)
1905{
1906 struct proc_dir_entry *pe, *tmp;
1907 pe = dir->subdir;
1908 while (pe) {
1909 tmp = pe->next;
1910 i2o_proc_subdir_remove(pe);
1911 remove_proc_entry(pe->name, dir);
1912 pe = tmp;
1913 }
1914};
1915
1916/**
1917 * i2o_proc_device_add - Add an I2O device to the proc dir 1898 * i2o_proc_device_add - Add an I2O device to the proc dir
1918 * @dir: proc dir entry to which the device should be added 1899 * @dir: proc dir entry to which the device should be added
1919 * @dev: I2O device which should be added 1900 * @dev: I2O device which should be added
@@ -1932,14 +1913,12 @@ static void i2o_proc_device_add(struct proc_dir_entry *dir,
1932 1913
1933 osm_debug("adding device /proc/i2o/%s/%s\n", dev->iop->name, buff); 1914 osm_debug("adding device /proc/i2o/%s/%s\n", dev->iop->name, buff);
1934 1915
1935 devdir = proc_mkdir(buff, dir); 1916 devdir = proc_mkdir_data(buff, 0, dir, dev);
1936 if (!devdir) { 1917 if (!devdir) {
1937 osm_warn("Could not allocate procdir!\n"); 1918 osm_warn("Could not allocate procdir!\n");
1938 return; 1919 return;
1939 } 1920 }
1940 1921
1941 devdir->data = dev;
1942
1943 i2o_proc_create_entries(devdir, generic_dev_entries, dev); 1922 i2o_proc_create_entries(devdir, generic_dev_entries, dev);
1944 1923
1945 /* Inform core that we want updates about this device's status */ 1924 /* Inform core that we want updates about this device's status */
@@ -1973,12 +1952,10 @@ static int i2o_proc_iop_add(struct proc_dir_entry *dir,
1973 1952
1974 osm_debug("adding IOP /proc/i2o/%s\n", c->name); 1953 osm_debug("adding IOP /proc/i2o/%s\n", c->name);
1975 1954
1976 iopdir = proc_mkdir(c->name, dir); 1955 iopdir = proc_mkdir_data(c->name, 0, dir, c);
1977 if (!iopdir) 1956 if (!iopdir)
1978 return -1; 1957 return -1;
1979 1958
1980 iopdir->data = c;
1981
1982 i2o_proc_create_entries(iopdir, i2o_proc_generic_iop_entries, c); 1959 i2o_proc_create_entries(iopdir, i2o_proc_generic_iop_entries, c);
1983 1960
1984 list_for_each_entry(dev, &c->devices, list) 1961 list_for_each_entry(dev, &c->devices, list)
@@ -1988,31 +1965,6 @@ static int i2o_proc_iop_add(struct proc_dir_entry *dir,
1988} 1965}
1989 1966
1990/** 1967/**
1991 * i2o_proc_iop_remove - Removes an I2O controller from the i2o proc tree
1992 * @dir: parent proc dir entry
1993 * @c: I2O controller which should be removed
1994 *
1995 * Iterate over each i2o proc entry and search controller c. If it is found
1996 * remove it from the tree.
1997 */
1998static void i2o_proc_iop_remove(struct proc_dir_entry *dir,
1999 struct i2o_controller *c)
2000{
2001 struct proc_dir_entry *pe, *tmp;
2002
2003 pe = dir->subdir;
2004 while (pe) {
2005 tmp = pe->next;
2006 if (pe->data == c) {
2007 i2o_proc_subdir_remove(pe);
2008 remove_proc_entry(pe->name, dir);
2009 }
2010 osm_debug("removing IOP /proc/i2o/%s\n", c->name);
2011 pe = tmp;
2012 }
2013}
2014
2015/**
2016 * i2o_proc_fs_create - Create the i2o proc fs. 1968 * i2o_proc_fs_create - Create the i2o proc fs.
2017 * 1969 *
2018 * Iterate over each I2O controller and create the entries for it. 1970 * Iterate over each I2O controller and create the entries for it.
@@ -2042,12 +1994,7 @@ static int __init i2o_proc_fs_create(void)
2042 */ 1994 */
2043static int __exit i2o_proc_fs_destroy(void) 1995static int __exit i2o_proc_fs_destroy(void)
2044{ 1996{
2045 struct i2o_controller *c; 1997 remove_proc_subtree("i2o", NULL);
2046
2047 list_for_each_entry(c, &i2o_controllers, list)
2048 i2o_proc_iop_remove(i2o_proc_dir_root, c);
2049
2050 remove_proc_entry("i2o", NULL);
2051 1998
2052 return 0; 1999 return 0;
2053}; 2000};
diff --git a/drivers/misc/lis3lv02d/lis3lv02d.c b/drivers/misc/lis3lv02d/lis3lv02d.c
index 4a87e5c0a320..4cd4a3d2a76a 100644
--- a/drivers/misc/lis3lv02d/lis3lv02d.c
+++ b/drivers/misc/lis3lv02d/lis3lv02d.c
@@ -593,7 +593,6 @@ static int lis3lv02d_misc_release(struct inode *inode, struct file *file)
593 struct lis3lv02d *lis3 = container_of(file->private_data, 593 struct lis3lv02d *lis3 = container_of(file->private_data,
594 struct lis3lv02d, miscdev); 594 struct lis3lv02d, miscdev);
595 595
596 fasync_helper(-1, file, 0, &lis3->async_queue);
597 clear_bit(0, &lis3->misc_opened); /* release the device */ 596 clear_bit(0, &lis3->misc_opened); /* release the device */
598 if (lis3->pm_dev) 597 if (lis3->pm_dev)
599 pm_runtime_put(lis3->pm_dev); 598 pm_runtime_put(lis3->pm_dev);
diff --git a/drivers/misc/sgi-gru/gruprocfs.c b/drivers/misc/sgi-gru/gruprocfs.c
index 950dbe9ecb36..797d7962cc88 100644
--- a/drivers/misc/sgi-gru/gruprocfs.c
+++ b/drivers/misc/sgi-gru/gruprocfs.c
@@ -355,7 +355,7 @@ static void delete_proc_files(void)
355 for (p = proc_files; p->name; p++) 355 for (p = proc_files; p->name; p++)
356 if (p->entry) 356 if (p->entry)
357 remove_proc_entry(p->name, proc_gru); 357 remove_proc_entry(p->name, proc_gru);
358 remove_proc_entry("gru", proc_gru->parent); 358 proc_remove(proc_gru);
359 } 359 }
360} 360}
361 361
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index 61d5f56473e1..322ca65b0cc5 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -36,6 +36,7 @@
36#include <linux/idr.h> 36#include <linux/idr.h>
37#include <linux/backing-dev.h> 37#include <linux/backing-dev.h>
38#include <linux/gfp.h> 38#include <linux/gfp.h>
39#include <linux/slab.h>
39 40
40#include <linux/mtd/mtd.h> 41#include <linux/mtd/mtd.h>
41#include <linux/mtd/partitions.h> 42#include <linux/mtd/partitions.h>
diff --git a/drivers/net/bonding/bond_procfs.c b/drivers/net/bonding/bond_procfs.c
index 3cea38d37344..94d06f1307b8 100644
--- a/drivers/net/bonding/bond_procfs.c
+++ b/drivers/net/bonding/bond_procfs.c
@@ -218,15 +218,13 @@ static const struct seq_operations bond_info_seq_ops = {
218static int bond_info_open(struct inode *inode, struct file *file) 218static int bond_info_open(struct inode *inode, struct file *file)
219{ 219{
220 struct seq_file *seq; 220 struct seq_file *seq;
221 struct proc_dir_entry *proc;
222 int res; 221 int res;
223 222
224 res = seq_open(file, &bond_info_seq_ops); 223 res = seq_open(file, &bond_info_seq_ops);
225 if (!res) { 224 if (!res) {
226 /* recover the pointer buried in proc_dir_entry data */ 225 /* recover the pointer buried in proc_dir_entry data */
227 seq = file->private_data; 226 seq = file->private_data;
228 proc = PDE(inode); 227 seq->private = PDE_DATA(inode);
229 seq->private = proc->data;
230 } 228 }
231 229
232 return res; 230 return res;
diff --git a/drivers/net/irda/vlsi_ir.c b/drivers/net/irda/vlsi_ir.c
index 2f99f8881dfc..5f4758492e4c 100644
--- a/drivers/net/irda/vlsi_ir.c
+++ b/drivers/net/irda/vlsi_ir.c
@@ -383,7 +383,7 @@ static int vlsi_seq_show(struct seq_file *seq, void *v)
383 383
384static int vlsi_seq_open(struct inode *inode, struct file *file) 384static int vlsi_seq_open(struct inode *inode, struct file *file)
385{ 385{
386 return single_open(file, vlsi_seq_show, PDE(inode)->data); 386 return single_open(file, vlsi_seq_show, PDE_DATA(inode));
387} 387}
388 388
389static const struct file_operations vlsi_proc_fops = { 389static const struct file_operations vlsi_proc_fops = {
@@ -1678,7 +1678,7 @@ vlsi_irda_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1678 IRDA_WARNING("%s: failed to create proc entry\n", 1678 IRDA_WARNING("%s: failed to create proc entry\n",
1679 __func__); 1679 __func__);
1680 } else { 1680 } else {
1681 ent->size = 0; 1681 proc_set_size(ent, 0);
1682 } 1682 }
1683 idev->proc_entry = ent; 1683 idev->proc_entry = ent;
1684 } 1684 }
diff --git a/drivers/net/wireless/airo.c b/drivers/net/wireless/airo.c
index 53295418f576..6125adb520a3 100644
--- a/drivers/net/wireless/airo.c
+++ b/drivers/net/wireless/airo.c
@@ -4506,108 +4506,75 @@ static int setup_proc_entry( struct net_device *dev,
4506 apriv->proc_entry = proc_mkdir_mode(apriv->proc_name, airo_perm, 4506 apriv->proc_entry = proc_mkdir_mode(apriv->proc_name, airo_perm,
4507 airo_entry); 4507 airo_entry);
4508 if (!apriv->proc_entry) 4508 if (!apriv->proc_entry)
4509 goto fail; 4509 return -ENOMEM;
4510 apriv->proc_entry->uid = proc_kuid; 4510 proc_set_user(apriv->proc_entry, proc_kuid, proc_kgid);
4511 apriv->proc_entry->gid = proc_kgid;
4512 4511
4513 /* Setup the StatsDelta */ 4512 /* Setup the StatsDelta */
4514 entry = proc_create_data("StatsDelta", S_IRUGO & proc_perm, 4513 entry = proc_create_data("StatsDelta", S_IRUGO & proc_perm,
4515 apriv->proc_entry, &proc_statsdelta_ops, dev); 4514 apriv->proc_entry, &proc_statsdelta_ops, dev);
4516 if (!entry) 4515 if (!entry)
4517 goto fail_stats_delta; 4516 goto fail;
4518 entry->uid = proc_kuid; 4517 proc_set_user(entry, proc_kuid, proc_kgid);
4519 entry->gid = proc_kgid;
4520 4518
4521 /* Setup the Stats */ 4519 /* Setup the Stats */
4522 entry = proc_create_data("Stats", S_IRUGO & proc_perm, 4520 entry = proc_create_data("Stats", S_IRUGO & proc_perm,
4523 apriv->proc_entry, &proc_stats_ops, dev); 4521 apriv->proc_entry, &proc_stats_ops, dev);
4524 if (!entry) 4522 if (!entry)
4525 goto fail_stats; 4523 goto fail;
4526 entry->uid = proc_kuid; 4524 proc_set_user(entry, proc_kuid, proc_kgid);
4527 entry->gid = proc_kgid;
4528 4525
4529 /* Setup the Status */ 4526 /* Setup the Status */
4530 entry = proc_create_data("Status", S_IRUGO & proc_perm, 4527 entry = proc_create_data("Status", S_IRUGO & proc_perm,
4531 apriv->proc_entry, &proc_status_ops, dev); 4528 apriv->proc_entry, &proc_status_ops, dev);
4532 if (!entry) 4529 if (!entry)
4533 goto fail_status; 4530 goto fail;
4534 entry->uid = proc_kuid; 4531 proc_set_user(entry, proc_kuid, proc_kgid);
4535 entry->gid = proc_kgid;
4536 4532
4537 /* Setup the Config */ 4533 /* Setup the Config */
4538 entry = proc_create_data("Config", proc_perm, 4534 entry = proc_create_data("Config", proc_perm,
4539 apriv->proc_entry, &proc_config_ops, dev); 4535 apriv->proc_entry, &proc_config_ops, dev);
4540 if (!entry) 4536 if (!entry)
4541 goto fail_config; 4537 goto fail;
4542 entry->uid = proc_kuid; 4538 proc_set_user(entry, proc_kuid, proc_kgid);
4543 entry->gid = proc_kgid;
4544 4539
4545 /* Setup the SSID */ 4540 /* Setup the SSID */
4546 entry = proc_create_data("SSID", proc_perm, 4541 entry = proc_create_data("SSID", proc_perm,
4547 apriv->proc_entry, &proc_SSID_ops, dev); 4542 apriv->proc_entry, &proc_SSID_ops, dev);
4548 if (!entry) 4543 if (!entry)
4549 goto fail_ssid; 4544 goto fail;
4550 entry->uid = proc_kuid; 4545 proc_set_user(entry, proc_kuid, proc_kgid);
4551 entry->gid = proc_kgid;
4552 4546
4553 /* Setup the APList */ 4547 /* Setup the APList */
4554 entry = proc_create_data("APList", proc_perm, 4548 entry = proc_create_data("APList", proc_perm,
4555 apriv->proc_entry, &proc_APList_ops, dev); 4549 apriv->proc_entry, &proc_APList_ops, dev);
4556 if (!entry) 4550 if (!entry)
4557 goto fail_aplist; 4551 goto fail;
4558 entry->uid = proc_kuid; 4552 proc_set_user(entry, proc_kuid, proc_kgid);
4559 entry->gid = proc_kgid;
4560 4553
4561 /* Setup the BSSList */ 4554 /* Setup the BSSList */
4562 entry = proc_create_data("BSSList", proc_perm, 4555 entry = proc_create_data("BSSList", proc_perm,
4563 apriv->proc_entry, &proc_BSSList_ops, dev); 4556 apriv->proc_entry, &proc_BSSList_ops, dev);
4564 if (!entry) 4557 if (!entry)
4565 goto fail_bsslist; 4558 goto fail;
4566 entry->uid = proc_kuid; 4559 proc_set_user(entry, proc_kuid, proc_kgid);
4567 entry->gid = proc_kgid;
4568 4560
4569 /* Setup the WepKey */ 4561 /* Setup the WepKey */
4570 entry = proc_create_data("WepKey", proc_perm, 4562 entry = proc_create_data("WepKey", proc_perm,
4571 apriv->proc_entry, &proc_wepkey_ops, dev); 4563 apriv->proc_entry, &proc_wepkey_ops, dev);
4572 if (!entry) 4564 if (!entry)
4573 goto fail_wepkey; 4565 goto fail;
4574 entry->uid = proc_kuid; 4566 proc_set_user(entry, proc_kuid, proc_kgid);
4575 entry->gid = proc_kgid;
4576
4577 return 0; 4567 return 0;
4578 4568
4579fail_wepkey:
4580 remove_proc_entry("BSSList", apriv->proc_entry);
4581fail_bsslist:
4582 remove_proc_entry("APList", apriv->proc_entry);
4583fail_aplist:
4584 remove_proc_entry("SSID", apriv->proc_entry);
4585fail_ssid:
4586 remove_proc_entry("Config", apriv->proc_entry);
4587fail_config:
4588 remove_proc_entry("Status", apriv->proc_entry);
4589fail_status:
4590 remove_proc_entry("Stats", apriv->proc_entry);
4591fail_stats:
4592 remove_proc_entry("StatsDelta", apriv->proc_entry);
4593fail_stats_delta:
4594 remove_proc_entry(apriv->proc_name, airo_entry);
4595fail: 4569fail:
4570 remove_proc_subtree(apriv->proc_name, airo_entry);
4596 return -ENOMEM; 4571 return -ENOMEM;
4597} 4572}
4598 4573
4599static int takedown_proc_entry( struct net_device *dev, 4574static int takedown_proc_entry( struct net_device *dev,
4600 struct airo_info *apriv ) { 4575 struct airo_info *apriv )
4601 if ( !apriv->proc_entry->namelen ) return 0; 4576{
4602 remove_proc_entry("Stats",apriv->proc_entry); 4577 remove_proc_subtree(apriv->proc_name, airo_entry);
4603 remove_proc_entry("StatsDelta",apriv->proc_entry);
4604 remove_proc_entry("Status",apriv->proc_entry);
4605 remove_proc_entry("Config",apriv->proc_entry);
4606 remove_proc_entry("SSID",apriv->proc_entry);
4607 remove_proc_entry("APList",apriv->proc_entry);
4608 remove_proc_entry("BSSList",apriv->proc_entry);
4609 remove_proc_entry("WepKey",apriv->proc_entry);
4610 remove_proc_entry(apriv->proc_name,airo_entry);
4611 return 0; 4578 return 0;
4612} 4579}
4613 4580
@@ -4663,8 +4630,7 @@ static ssize_t proc_write( struct file *file,
4663static int proc_status_open(struct inode *inode, struct file *file) 4630static int proc_status_open(struct inode *inode, struct file *file)
4664{ 4631{
4665 struct proc_data *data; 4632 struct proc_data *data;
4666 struct proc_dir_entry *dp = PDE(inode); 4633 struct net_device *dev = PDE_DATA(inode);
4667 struct net_device *dev = dp->data;
4668 struct airo_info *apriv = dev->ml_priv; 4634 struct airo_info *apriv = dev->ml_priv;
4669 CapabilityRid cap_rid; 4635 CapabilityRid cap_rid;
4670 StatusRid status_rid; 4636 StatusRid status_rid;
@@ -4746,8 +4712,7 @@ static int proc_stats_rid_open( struct inode *inode,
4746 u16 rid ) 4712 u16 rid )
4747{ 4713{
4748 struct proc_data *data; 4714 struct proc_data *data;
4749 struct proc_dir_entry *dp = PDE(inode); 4715 struct net_device *dev = PDE_DATA(inode);
4750 struct net_device *dev = dp->data;
4751 struct airo_info *apriv = dev->ml_priv; 4716 struct airo_info *apriv = dev->ml_priv;
4752 StatsRid stats; 4717 StatsRid stats;
4753 int i, j; 4718 int i, j;
@@ -4809,8 +4774,7 @@ static inline int sniffing_mode(struct airo_info *ai)
4809static void proc_config_on_close(struct inode *inode, struct file *file) 4774static void proc_config_on_close(struct inode *inode, struct file *file)
4810{ 4775{
4811 struct proc_data *data = file->private_data; 4776 struct proc_data *data = file->private_data;
4812 struct proc_dir_entry *dp = PDE(inode); 4777 struct net_device *dev = PDE_DATA(inode);
4813 struct net_device *dev = dp->data;
4814 struct airo_info *ai = dev->ml_priv; 4778 struct airo_info *ai = dev->ml_priv;
4815 char *line; 4779 char *line;
4816 4780
@@ -5021,8 +4985,7 @@ static const char *get_rmode(__le16 mode)
5021static int proc_config_open(struct inode *inode, struct file *file) 4985static int proc_config_open(struct inode *inode, struct file *file)
5022{ 4986{
5023 struct proc_data *data; 4987 struct proc_data *data;
5024 struct proc_dir_entry *dp = PDE(inode); 4988 struct net_device *dev = PDE_DATA(inode);
5025 struct net_device *dev = dp->data;
5026 struct airo_info *ai = dev->ml_priv; 4989 struct airo_info *ai = dev->ml_priv;
5027 int i; 4990 int i;
5028 __le16 mode; 4991 __le16 mode;
@@ -5112,8 +5075,7 @@ static int proc_config_open(struct inode *inode, struct file *file)
5112static void proc_SSID_on_close(struct inode *inode, struct file *file) 5075static void proc_SSID_on_close(struct inode *inode, struct file *file)
5113{ 5076{
5114 struct proc_data *data = file->private_data; 5077 struct proc_data *data = file->private_data;
5115 struct proc_dir_entry *dp = PDE(inode); 5078 struct net_device *dev = PDE_DATA(inode);
5116 struct net_device *dev = dp->data;
5117 struct airo_info *ai = dev->ml_priv; 5079 struct airo_info *ai = dev->ml_priv;
5118 SsidRid SSID_rid; 5080 SsidRid SSID_rid;
5119 int i; 5081 int i;
@@ -5148,8 +5110,7 @@ static void proc_SSID_on_close(struct inode *inode, struct file *file)
5148 5110
5149static void proc_APList_on_close( struct inode *inode, struct file *file ) { 5111static void proc_APList_on_close( struct inode *inode, struct file *file ) {
5150 struct proc_data *data = file->private_data; 5112 struct proc_data *data = file->private_data;
5151 struct proc_dir_entry *dp = PDE(inode); 5113 struct net_device *dev = PDE_DATA(inode);
5152 struct net_device *dev = dp->data;
5153 struct airo_info *ai = dev->ml_priv; 5114 struct airo_info *ai = dev->ml_priv;
5154 APListRid APList_rid; 5115 APListRid APList_rid;
5155 int i; 5116 int i;
@@ -5283,8 +5244,7 @@ static int set_wep_tx_idx(struct airo_info *ai, u16 index, int perm, int lock)
5283 5244
5284static void proc_wepkey_on_close( struct inode *inode, struct file *file ) { 5245static void proc_wepkey_on_close( struct inode *inode, struct file *file ) {
5285 struct proc_data *data; 5246 struct proc_data *data;
5286 struct proc_dir_entry *dp = PDE(inode); 5247 struct net_device *dev = PDE_DATA(inode);
5287 struct net_device *dev = dp->data;
5288 struct airo_info *ai = dev->ml_priv; 5248 struct airo_info *ai = dev->ml_priv;
5289 int i, rc; 5249 int i, rc;
5290 char key[16]; 5250 char key[16];
@@ -5335,8 +5295,7 @@ static void proc_wepkey_on_close( struct inode *inode, struct file *file ) {
5335static int proc_wepkey_open( struct inode *inode, struct file *file ) 5295static int proc_wepkey_open( struct inode *inode, struct file *file )
5336{ 5296{
5337 struct proc_data *data; 5297 struct proc_data *data;
5338 struct proc_dir_entry *dp = PDE(inode); 5298 struct net_device *dev = PDE_DATA(inode);
5339 struct net_device *dev = dp->data;
5340 struct airo_info *ai = dev->ml_priv; 5299 struct airo_info *ai = dev->ml_priv;
5341 char *ptr; 5300 char *ptr;
5342 WepKeyRid wkr; 5301 WepKeyRid wkr;
@@ -5384,8 +5343,7 @@ static int proc_wepkey_open( struct inode *inode, struct file *file )
5384static int proc_SSID_open(struct inode *inode, struct file *file) 5343static int proc_SSID_open(struct inode *inode, struct file *file)
5385{ 5344{
5386 struct proc_data *data; 5345 struct proc_data *data;
5387 struct proc_dir_entry *dp = PDE(inode); 5346 struct net_device *dev = PDE_DATA(inode);
5388 struct net_device *dev = dp->data;
5389 struct airo_info *ai = dev->ml_priv; 5347 struct airo_info *ai = dev->ml_priv;
5390 int i; 5348 int i;
5391 char *ptr; 5349 char *ptr;
@@ -5428,8 +5386,7 @@ static int proc_SSID_open(struct inode *inode, struct file *file)
5428 5386
5429static int proc_APList_open( struct inode *inode, struct file *file ) { 5387static int proc_APList_open( struct inode *inode, struct file *file ) {
5430 struct proc_data *data; 5388 struct proc_data *data;
5431 struct proc_dir_entry *dp = PDE(inode); 5389 struct net_device *dev = PDE_DATA(inode);
5432 struct net_device *dev = dp->data;
5433 struct airo_info *ai = dev->ml_priv; 5390 struct airo_info *ai = dev->ml_priv;
5434 int i; 5391 int i;
5435 char *ptr; 5392 char *ptr;
@@ -5468,8 +5425,7 @@ static int proc_APList_open( struct inode *inode, struct file *file ) {
5468 5425
5469static int proc_BSSList_open( struct inode *inode, struct file *file ) { 5426static int proc_BSSList_open( struct inode *inode, struct file *file ) {
5470 struct proc_data *data; 5427 struct proc_data *data;
5471 struct proc_dir_entry *dp = PDE(inode); 5428 struct net_device *dev = PDE_DATA(inode);
5472 struct net_device *dev = dp->data;
5473 struct airo_info *ai = dev->ml_priv; 5429 struct airo_info *ai = dev->ml_priv;
5474 char *ptr; 5430 char *ptr;
5475 BSSListRid BSSList_rid; 5431 BSSListRid BSSList_rid;
@@ -5706,10 +5662,8 @@ static int __init airo_init_module( void )
5706 5662
5707 airo_entry = proc_mkdir_mode("driver/aironet", airo_perm, NULL); 5663 airo_entry = proc_mkdir_mode("driver/aironet", airo_perm, NULL);
5708 5664
5709 if (airo_entry) { 5665 if (airo_entry)
5710 airo_entry->uid = proc_kuid; 5666 proc_set_user(airo_entry, proc_kuid, proc_kgid);
5711 airo_entry->gid = proc_kgid;
5712 }
5713 5667
5714 for (i = 0; i < 4 && io[i] && irq[i]; i++) { 5668 for (i = 0; i < 4 && io[i] && irq[i]; i++) {
5715 airo_print_info("", "Trying to configure ISA adapter at irq=%d " 5669 airo_print_info("", "Trying to configure ISA adapter at irq=%d "
diff --git a/drivers/net/wireless/ath/wil6210/debugfs.c b/drivers/net/wireless/ath/wil6210/debugfs.c
index 4be07f5e22b9..727b1f53e6ad 100644
--- a/drivers/net/wireless/ath/wil6210/debugfs.c
+++ b/drivers/net/wireless/ath/wil6210/debugfs.c
@@ -216,7 +216,7 @@ DEFINE_SIMPLE_ATTRIBUTE(fops_iomem_x32, wil_debugfs_iomem_x32_get,
216 wil_debugfs_iomem_x32_set, "0x%08llx\n"); 216 wil_debugfs_iomem_x32_set, "0x%08llx\n");
217 217
218static struct dentry *wil_debugfs_create_iomem_x32(const char *name, 218static struct dentry *wil_debugfs_create_iomem_x32(const char *name,
219 mode_t mode, 219 umode_t mode,
220 struct dentry *parent, 220 struct dentry *parent,
221 void __iomem *value) 221 void __iomem *value)
222{ 222{
@@ -359,7 +359,7 @@ static const struct file_operations fops_ioblob = {
359 359
360static 360static
361struct dentry *wil_debugfs_create_ioblob(const char *name, 361struct dentry *wil_debugfs_create_ioblob(const char *name,
362 mode_t mode, 362 umode_t mode,
363 struct dentry *parent, 363 struct dentry *parent,
364 struct debugfs_blob_wrapper *blob) 364 struct debugfs_blob_wrapper *blob)
365{ 365{
diff --git a/drivers/net/wireless/atmel.c b/drivers/net/wireless/atmel.c
index 4374079dfc2a..23a3498f14d4 100644
--- a/drivers/net/wireless/atmel.c
+++ b/drivers/net/wireless/atmel.c
@@ -63,6 +63,7 @@
63#include <net/iw_handler.h> 63#include <net/iw_handler.h>
64#include <linux/crc32.h> 64#include <linux/crc32.h>
65#include <linux/proc_fs.h> 65#include <linux/proc_fs.h>
66#include <linux/seq_file.h>
66#include <linux/device.h> 67#include <linux/device.h>
67#include <linux/moduleparam.h> 68#include <linux/moduleparam.h>
68#include <linux/firmware.h> 69#include <linux/firmware.h>
@@ -1409,30 +1410,28 @@ static int atmel_validate_channel(struct atmel_private *priv, int channel)
1409 return 0; 1410 return 0;
1410} 1411}
1411 1412
1412static int atmel_proc_output (char *buf, struct atmel_private *priv) 1413static int atmel_proc_show(struct seq_file *m, void *v)
1413{ 1414{
1415 struct atmel_private *priv = m->private;
1414 int i; 1416 int i;
1415 char *p = buf;
1416 char *s, *r, *c; 1417 char *s, *r, *c;
1417 1418
1418 p += sprintf(p, "Driver version:\t\t%d.%d\n", 1419 seq_printf(m, "Driver version:\t\t%d.%d\n", DRIVER_MAJOR, DRIVER_MINOR);
1419 DRIVER_MAJOR, DRIVER_MINOR);
1420 1420
1421 if (priv->station_state != STATION_STATE_DOWN) { 1421 if (priv->station_state != STATION_STATE_DOWN) {
1422 p += sprintf(p, "Firmware version:\t%d.%d build %d\n" 1422 seq_printf(m,
1423 "Firmware location:\t", 1423 "Firmware version:\t%d.%d build %d\n"
1424 priv->host_info.major_version, 1424 "Firmware location:\t",
1425 priv->host_info.minor_version, 1425 priv->host_info.major_version,
1426 priv->host_info.build_version); 1426 priv->host_info.minor_version,
1427 priv->host_info.build_version);
1427 1428
1428 if (priv->card_type != CARD_TYPE_EEPROM) 1429 if (priv->card_type != CARD_TYPE_EEPROM)
1429 p += sprintf(p, "on card\n"); 1430 seq_puts(m, "on card\n");
1430 else if (priv->firmware) 1431 else if (priv->firmware)
1431 p += sprintf(p, "%s loaded by host\n", 1432 seq_printf(m, "%s loaded by host\n", priv->firmware_id);
1432 priv->firmware_id);
1433 else 1433 else
1434 p += sprintf(p, "%s loaded by hotplug\n", 1434 seq_printf(m, "%s loaded by hotplug\n", priv->firmware_id);
1435 priv->firmware_id);
1436 1435
1437 switch (priv->card_type) { 1436 switch (priv->card_type) {
1438 case CARD_TYPE_PARALLEL_FLASH: 1437 case CARD_TYPE_PARALLEL_FLASH:
@@ -1453,12 +1452,12 @@ static int atmel_proc_output (char *buf, struct atmel_private *priv)
1453 if (priv->reg_domain == channel_table[i].reg_domain) 1452 if (priv->reg_domain == channel_table[i].reg_domain)
1454 r = channel_table[i].name; 1453 r = channel_table[i].name;
1455 1454
1456 p += sprintf(p, "MAC memory type:\t%s\n", c); 1455 seq_printf(m, "MAC memory type:\t%s\n", c);
1457 p += sprintf(p, "Regulatory domain:\t%s\n", r); 1456 seq_printf(m, "Regulatory domain:\t%s\n", r);
1458 p += sprintf(p, "Host CRC checking:\t%s\n", 1457 seq_printf(m, "Host CRC checking:\t%s\n",
1459 priv->do_rx_crc ? "On" : "Off"); 1458 priv->do_rx_crc ? "On" : "Off");
1460 p += sprintf(p, "WPA-capable firmware:\t%s\n", 1459 seq_printf(m, "WPA-capable firmware:\t%s\n",
1461 priv->use_wpa ? "Yes" : "No"); 1460 priv->use_wpa ? "Yes" : "No");
1462 } 1461 }
1463 1462
1464 switch (priv->station_state) { 1463 switch (priv->station_state) {
@@ -1490,26 +1489,22 @@ static int atmel_proc_output (char *buf, struct atmel_private *priv)
1490 s = "<unknown>"; 1489 s = "<unknown>";
1491 } 1490 }
1492 1491
1493 p += sprintf(p, "Current state:\t\t%s\n", s); 1492 seq_printf(m, "Current state:\t\t%s\n", s);
1494 return p - buf; 1493 return 0;
1495} 1494}
1496 1495
1497static int atmel_read_proc(char *page, char **start, off_t off, 1496static int atmel_proc_open(struct inode *inode, struct file *file)
1498 int count, int *eof, void *data)
1499{ 1497{
1500 struct atmel_private *priv = data; 1498 return single_open(file, atmel_proc_show, PDE_DATA(inode));
1501 int len = atmel_proc_output (page, priv);
1502 if (len <= off+count)
1503 *eof = 1;
1504 *start = page + off;
1505 len -= off;
1506 if (len > count)
1507 len = count;
1508 if (len < 0)
1509 len = 0;
1510 return len;
1511} 1499}
1512 1500
1501static const struct file_operations atmel_proc_fops = {
1502 .open = atmel_proc_open,
1503 .read = seq_read,
1504 .llseek = seq_lseek,
1505 .release = seq_release,
1506};
1507
1513static const struct net_device_ops atmel_netdev_ops = { 1508static const struct net_device_ops atmel_netdev_ops = {
1514 .ndo_open = atmel_open, 1509 .ndo_open = atmel_open,
1515 .ndo_stop = atmel_close, 1510 .ndo_stop = atmel_close,
@@ -1525,7 +1520,6 @@ struct net_device *init_atmel_card(unsigned short irq, unsigned long port,
1525 struct device *sys_dev, 1520 struct device *sys_dev,
1526 int (*card_present)(void *), void *card) 1521 int (*card_present)(void *), void *card)
1527{ 1522{
1528 struct proc_dir_entry *ent;
1529 struct net_device *dev; 1523 struct net_device *dev;
1530 struct atmel_private *priv; 1524 struct atmel_private *priv;
1531 int rc; 1525 int rc;
@@ -1630,8 +1624,7 @@ struct net_device *init_atmel_card(unsigned short irq, unsigned long port,
1630 1624
1631 netif_carrier_off(dev); 1625 netif_carrier_off(dev);
1632 1626
1633 ent = create_proc_read_entry ("driver/atmel", 0, NULL, atmel_read_proc, priv); 1627 if (!proc_create_data("driver/atmel", 0, NULL, &atmel_proc_fops, priv));
1634 if (!ent)
1635 printk(KERN_WARNING "atmel: unable to create /proc entry.\n"); 1628 printk(KERN_WARNING "atmel: unable to create /proc entry.\n");
1636 1629
1637 printk(KERN_INFO "%s: Atmel at76c50x. Version %d.%d. MAC %pM\n", 1630 printk(KERN_INFO "%s: Atmel at76c50x. Version %d.%d. MAC %pM\n",
diff --git a/drivers/net/wireless/hostap/hostap_ap.c b/drivers/net/wireless/hostap/hostap_ap.c
index dd9a18f8dbca..19c45e363aa7 100644
--- a/drivers/net/wireless/hostap/hostap_ap.c
+++ b/drivers/net/wireless/hostap/hostap_ap.c
@@ -17,6 +17,7 @@
17 */ 17 */
18 18
19#include <linux/proc_fs.h> 19#include <linux/proc_fs.h>
20#include <linux/seq_file.h>
20#include <linux/delay.h> 21#include <linux/delay.h>
21#include <linux/random.h> 22#include <linux/random.h>
22#include <linux/if_arp.h> 23#include <linux/if_arp.h>
@@ -64,28 +65,32 @@ static void prism2_send_mgmt(struct net_device *dev,
64 65
65 66
66#ifndef PRISM2_NO_PROCFS_DEBUG 67#ifndef PRISM2_NO_PROCFS_DEBUG
67static int ap_debug_proc_read(char *page, char **start, off_t off, 68static int ap_debug_proc_show(struct seq_file *m, void *v)
68 int count, int *eof, void *data) 69{
69{ 70 struct ap_data *ap = m->private;
70 char *p = page; 71
71 struct ap_data *ap = (struct ap_data *) data; 72 seq_printf(m, "BridgedUnicastFrames=%u\n", ap->bridged_unicast);
72 73 seq_printf(m, "BridgedMulticastFrames=%u\n", ap->bridged_multicast);
73 if (off != 0) { 74 seq_printf(m, "max_inactivity=%u\n", ap->max_inactivity / HZ);
74 *eof = 1; 75 seq_printf(m, "bridge_packets=%u\n", ap->bridge_packets);
75 return 0; 76 seq_printf(m, "nullfunc_ack=%u\n", ap->nullfunc_ack);
76 } 77 seq_printf(m, "autom_ap_wds=%u\n", ap->autom_ap_wds);
77 78 seq_printf(m, "auth_algs=%u\n", ap->local->auth_algs);
78 p += sprintf(p, "BridgedUnicastFrames=%u\n", ap->bridged_unicast); 79 seq_printf(m, "tx_drop_nonassoc=%u\n", ap->tx_drop_nonassoc);
79 p += sprintf(p, "BridgedMulticastFrames=%u\n", ap->bridged_multicast); 80 return 0;
80 p += sprintf(p, "max_inactivity=%u\n", ap->max_inactivity / HZ); 81}
81 p += sprintf(p, "bridge_packets=%u\n", ap->bridge_packets);
82 p += sprintf(p, "nullfunc_ack=%u\n", ap->nullfunc_ack);
83 p += sprintf(p, "autom_ap_wds=%u\n", ap->autom_ap_wds);
84 p += sprintf(p, "auth_algs=%u\n", ap->local->auth_algs);
85 p += sprintf(p, "tx_drop_nonassoc=%u\n", ap->tx_drop_nonassoc);
86 82
87 return (p - page); 83static int ap_debug_proc_open(struct inode *inode, struct file *file)
84{
85 return single_open(file, ap_debug_proc_show, PDE_DATA(inode));
88} 86}
87
88static const struct file_operations ap_debug_proc_fops = {
89 .open = ap_debug_proc_open,
90 .read = seq_read,
91 .llseek = seq_lseek,
92 .release = seq_release,
93};
89#endif /* PRISM2_NO_PROCFS_DEBUG */ 94#endif /* PRISM2_NO_PROCFS_DEBUG */
90 95
91 96
@@ -325,50 +330,81 @@ void hostap_deauth_all_stas(struct net_device *dev, struct ap_data *ap,
325} 330}
326 331
327 332
328static int ap_control_proc_read(char *page, char **start, off_t off, 333static int ap_control_proc_show(struct seq_file *m, void *v)
329 int count, int *eof, void *data)
330{ 334{
331 char *p = page; 335 struct ap_data *ap = m->private;
332 struct ap_data *ap = (struct ap_data *) data;
333 char *policy_txt; 336 char *policy_txt;
334 struct mac_entry *entry; 337 struct mac_entry *entry;
335 338
336 if (off != 0) { 339 if (v == SEQ_START_TOKEN) {
337 *eof = 1; 340 switch (ap->mac_restrictions.policy) {
341 case MAC_POLICY_OPEN:
342 policy_txt = "open";
343 break;
344 case MAC_POLICY_ALLOW:
345 policy_txt = "allow";
346 break;
347 case MAC_POLICY_DENY:
348 policy_txt = "deny";
349 break;
350 default:
351 policy_txt = "unknown";
352 break;
353 }
354 seq_printf(m, "MAC policy: %s\n", policy_txt);
355 seq_printf(m, "MAC entries: %u\n", ap->mac_restrictions.entries);
356 seq_puts(m, "MAC list:\n");
338 return 0; 357 return 0;
339 } 358 }
340 359
341 switch (ap->mac_restrictions.policy) { 360 entry = v;
342 case MAC_POLICY_OPEN: 361 seq_printf(m, "%pM\n", entry->addr);
343 policy_txt = "open"; 362 return 0;
344 break; 363}
345 case MAC_POLICY_ALLOW: 364
346 policy_txt = "allow"; 365static void *ap_control_proc_start(struct seq_file *m, loff_t *_pos)
347 break; 366{
348 case MAC_POLICY_DENY: 367 struct ap_data *ap = m->private;
349 policy_txt = "deny";
350 break;
351 default:
352 policy_txt = "unknown";
353 break;
354 }
355 p += sprintf(p, "MAC policy: %s\n", policy_txt);
356 p += sprintf(p, "MAC entries: %u\n", ap->mac_restrictions.entries);
357 p += sprintf(p, "MAC list:\n");
358 spin_lock_bh(&ap->mac_restrictions.lock); 368 spin_lock_bh(&ap->mac_restrictions.lock);
359 list_for_each_entry(entry, &ap->mac_restrictions.mac_list, list) { 369 return seq_list_start_head(&ap->mac_restrictions.mac_list, *_pos);
360 if (p - page > PAGE_SIZE - 80) { 370}
361 p += sprintf(p, "All entries did not fit one page.\n");
362 break;
363 }
364 371
365 p += sprintf(p, "%pM\n", entry->addr); 372static void *ap_control_proc_next(struct seq_file *m, void *v, loff_t *_pos)
366 } 373{
374 struct ap_data *ap = m->private;
375 return seq_list_next(v, &ap->mac_restrictions.mac_list, _pos);
376}
377
378static void ap_control_proc_stop(struct seq_file *m, void *v)
379{
380 struct ap_data *ap = m->private;
367 spin_unlock_bh(&ap->mac_restrictions.lock); 381 spin_unlock_bh(&ap->mac_restrictions.lock);
382}
368 383
369 return (p - page); 384static const struct seq_operations ap_control_proc_seqops = {
385 .start = ap_control_proc_start,
386 .next = ap_control_proc_next,
387 .stop = ap_control_proc_stop,
388 .show = ap_control_proc_show,
389};
390
391static int ap_control_proc_open(struct inode *inode, struct file *file)
392{
393 int ret = seq_open(file, &ap_control_proc_seqops);
394 if (ret == 0) {
395 struct seq_file *m = file->private_data;
396 m->private = PDE_DATA(inode);
397 }
398 return ret;
370} 399}
371 400
401static const struct file_operations ap_control_proc_fops = {
402 .open = ap_control_proc_open,
403 .read = seq_read,
404 .llseek = seq_lseek,
405 .release = seq_release,
406};
407
372 408
373int ap_control_add_mac(struct mac_restrictions *mac_restrictions, u8 *mac) 409int ap_control_add_mac(struct mac_restrictions *mac_restrictions, u8 *mac)
374{ 410{
@@ -510,61 +546,84 @@ void ap_control_kickall(struct ap_data *ap)
510 546
511#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT 547#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
512 548
513#define PROC_LIMIT (PAGE_SIZE - 80) 549static int prism2_ap_proc_show(struct seq_file *m, void *v)
514
515static int prism2_ap_proc_read(char *page, char **start, off_t off,
516 int count, int *eof, void *data)
517{ 550{
518 char *p = page; 551 struct sta_info *sta = v;
519 struct ap_data *ap = (struct ap_data *) data;
520 struct sta_info *sta;
521 int i; 552 int i;
522 553
523 if (off > PROC_LIMIT) { 554 if (v == SEQ_START_TOKEN) {
524 *eof = 1; 555 seq_printf(m, "# BSSID CHAN SIGNAL NOISE RATE SSID FLAGS\n");
525 return 0; 556 return 0;
526 } 557 }
527 558
528 p += sprintf(p, "# BSSID CHAN SIGNAL NOISE RATE SSID FLAGS\n"); 559 if (!sta->ap)
529 spin_lock_bh(&ap->sta_table_lock); 560 return 0;
530 list_for_each_entry(sta, &ap->sta_list, list) {
531 if (!sta->ap)
532 continue;
533 561
534 p += sprintf(p, "%pM %d %d %d %d '", 562 seq_printf(m, "%pM %d %d %d %d '",
535 sta->addr, 563 sta->addr,
536 sta->u.ap.channel, sta->last_rx_signal, 564 sta->u.ap.channel, sta->last_rx_signal,
537 sta->last_rx_silence, sta->last_rx_rate); 565 sta->last_rx_silence, sta->last_rx_rate);
538 for (i = 0; i < sta->u.ap.ssid_len; i++)
539 p += sprintf(p, ((sta->u.ap.ssid[i] >= 32 &&
540 sta->u.ap.ssid[i] < 127) ?
541 "%c" : "<%02x>"),
542 sta->u.ap.ssid[i]);
543 p += sprintf(p, "'");
544 if (sta->capability & WLAN_CAPABILITY_ESS)
545 p += sprintf(p, " [ESS]");
546 if (sta->capability & WLAN_CAPABILITY_IBSS)
547 p += sprintf(p, " [IBSS]");
548 if (sta->capability & WLAN_CAPABILITY_PRIVACY)
549 p += sprintf(p, " [WEP]");
550 p += sprintf(p, "\n");
551
552 if ((p - page) > PROC_LIMIT) {
553 printk(KERN_DEBUG "hostap: ap proc did not fit\n");
554 break;
555 }
556 }
557 spin_unlock_bh(&ap->sta_table_lock);
558 566
559 if ((p - page) <= off) { 567 for (i = 0; i < sta->u.ap.ssid_len; i++) {
560 *eof = 1; 568 if (sta->u.ap.ssid[i] >= 32 && sta->u.ap.ssid[i] < 127)
561 return 0; 569 seq_putc(m, sta->u.ap.ssid[i]);
570 else
571 seq_printf(m, "<%02x>", sta->u.ap.ssid[i]);
562 } 572 }
563 573
564 *start = page + off; 574 seq_putc(m, '\'');
575 if (sta->capability & WLAN_CAPABILITY_ESS)
576 seq_puts(m, " [ESS]");
577 if (sta->capability & WLAN_CAPABILITY_IBSS)
578 seq_puts(m, " [IBSS]");
579 if (sta->capability & WLAN_CAPABILITY_PRIVACY)
580 seq_puts(m, " [WEP]");
581 seq_putc(m, '\n');
582 return 0;
583}
584
585static void *prism2_ap_proc_start(struct seq_file *m, loff_t *_pos)
586{
587 struct ap_data *ap = m->private;
588 spin_lock_bh(&ap->sta_table_lock);
589 return seq_list_start_head(&ap->sta_list, *_pos);
590}
565 591
566 return (p - page - off); 592static void *prism2_ap_proc_next(struct seq_file *m, void *v, loff_t *_pos)
593{
594 struct ap_data *ap = m->private;
595 return seq_list_next(v, &ap->sta_list, _pos);
567} 596}
597
598static void prism2_ap_proc_stop(struct seq_file *m, void *v)
599{
600 struct ap_data *ap = m->private;
601 spin_unlock_bh(&ap->sta_table_lock);
602}
603
604static const struct seq_operations prism2_ap_proc_seqops = {
605 .start = prism2_ap_proc_start,
606 .next = prism2_ap_proc_next,
607 .stop = prism2_ap_proc_stop,
608 .show = prism2_ap_proc_show,
609};
610
611static int prism2_ap_proc_open(struct inode *inode, struct file *file)
612{
613 int ret = seq_open(file, &prism2_ap_proc_seqops);
614 if (ret == 0) {
615 struct seq_file *m = file->private_data;
616 m->private = PDE_DATA(inode);
617 }
618 return ret;
619}
620
621static const struct file_operations prism2_ap_proc_fops = {
622 .open = prism2_ap_proc_open,
623 .read = seq_read,
624 .llseek = seq_lseek,
625 .release = seq_release,
626};
568#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ 627#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
569 628
570 629
@@ -836,15 +895,12 @@ void hostap_init_ap_proc(local_info_t *local)
836 return; 895 return;
837 896
838#ifndef PRISM2_NO_PROCFS_DEBUG 897#ifndef PRISM2_NO_PROCFS_DEBUG
839 create_proc_read_entry("ap_debug", 0, ap->proc, 898 proc_create_data("ap_debug", 0, ap->proc, &ap_debug_proc_fops, ap);
840 ap_debug_proc_read, ap);
841#endif /* PRISM2_NO_PROCFS_DEBUG */ 899#endif /* PRISM2_NO_PROCFS_DEBUG */
842 900
843#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT 901#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
844 create_proc_read_entry("ap_control", 0, ap->proc, 902 proc_create_data("ap_control", 0, ap->proc, &ap_control_proc_fops, ap);
845 ap_control_proc_read, ap); 903 proc_create_data("ap", 0, ap->proc, &prism2_ap_proc_fops, ap);
846 create_proc_read_entry("ap", 0, ap->proc,
847 prism2_ap_proc_read, ap);
848#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ 904#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
849 905
850} 906}
@@ -982,79 +1038,86 @@ static void prism2_send_mgmt(struct net_device *dev,
982#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ 1038#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
983 1039
984 1040
985static int prism2_sta_proc_read(char *page, char **start, off_t off, 1041static int prism2_sta_proc_show(struct seq_file *m, void *v)
986 int count, int *eof, void *data)
987{ 1042{
988 char *p = page; 1043 struct sta_info *sta = m->private;
989 struct sta_info *sta = (struct sta_info *) data;
990 int i; 1044 int i;
991 1045
992 /* FIX: possible race condition.. the STA data could have just expired, 1046 /* FIX: possible race condition.. the STA data could have just expired,
993 * but proc entry was still here so that the read could have started; 1047 * but proc entry was still here so that the read could have started;
994 * some locking should be done here.. */ 1048 * some locking should be done here.. */
995 1049
996 if (off != 0) { 1050 seq_printf(m,
997 *eof = 1; 1051 "%s=%pM\nusers=%d\naid=%d\n"
998 return 0; 1052 "flags=0x%04x%s%s%s%s%s%s%s\n"
999 } 1053 "capability=0x%02x\nlisten_interval=%d\nsupported_rates=",
1000 1054 sta->ap ? "AP" : "STA",
1001 p += sprintf(p, "%s=%pM\nusers=%d\naid=%d\n" 1055 sta->addr, atomic_read(&sta->users), sta->aid,
1002 "flags=0x%04x%s%s%s%s%s%s%s\n" 1056 sta->flags,
1003 "capability=0x%02x\nlisten_interval=%d\nsupported_rates=", 1057 sta->flags & WLAN_STA_AUTH ? " AUTH" : "",
1004 sta->ap ? "AP" : "STA", 1058 sta->flags & WLAN_STA_ASSOC ? " ASSOC" : "",
1005 sta->addr, atomic_read(&sta->users), sta->aid, 1059 sta->flags & WLAN_STA_PS ? " PS" : "",
1006 sta->flags, 1060 sta->flags & WLAN_STA_TIM ? " TIM" : "",
1007 sta->flags & WLAN_STA_AUTH ? " AUTH" : "", 1061 sta->flags & WLAN_STA_PERM ? " PERM" : "",
1008 sta->flags & WLAN_STA_ASSOC ? " ASSOC" : "", 1062 sta->flags & WLAN_STA_AUTHORIZED ? " AUTHORIZED" : "",
1009 sta->flags & WLAN_STA_PS ? " PS" : "", 1063 sta->flags & WLAN_STA_PENDING_POLL ? " POLL" : "",
1010 sta->flags & WLAN_STA_TIM ? " TIM" : "", 1064 sta->capability, sta->listen_interval);
1011 sta->flags & WLAN_STA_PERM ? " PERM" : "",
1012 sta->flags & WLAN_STA_AUTHORIZED ? " AUTHORIZED" : "",
1013 sta->flags & WLAN_STA_PENDING_POLL ? " POLL" : "",
1014 sta->capability, sta->listen_interval);
1015 /* supported_rates: 500 kbit/s units with msb ignored */ 1065 /* supported_rates: 500 kbit/s units with msb ignored */
1016 for (i = 0; i < sizeof(sta->supported_rates); i++) 1066 for (i = 0; i < sizeof(sta->supported_rates); i++)
1017 if (sta->supported_rates[i] != 0) 1067 if (sta->supported_rates[i] != 0)
1018 p += sprintf(p, "%d%sMbps ", 1068 seq_printf(m, "%d%sMbps ",
1019 (sta->supported_rates[i] & 0x7f) / 2, 1069 (sta->supported_rates[i] & 0x7f) / 2,
1020 sta->supported_rates[i] & 1 ? ".5" : ""); 1070 sta->supported_rates[i] & 1 ? ".5" : "");
1021 p += sprintf(p, "\njiffies=%lu\nlast_auth=%lu\nlast_assoc=%lu\n" 1071 seq_printf(m,
1022 "last_rx=%lu\nlast_tx=%lu\nrx_packets=%lu\n" 1072 "\njiffies=%lu\nlast_auth=%lu\nlast_assoc=%lu\n"
1023 "tx_packets=%lu\n" 1073 "last_rx=%lu\nlast_tx=%lu\nrx_packets=%lu\n"
1024 "rx_bytes=%lu\ntx_bytes=%lu\nbuffer_count=%d\n" 1074 "tx_packets=%lu\n"
1025 "last_rx: silence=%d dBm signal=%d dBm rate=%d%s Mbps\n" 1075 "rx_bytes=%lu\ntx_bytes=%lu\nbuffer_count=%d\n"
1026 "tx_rate=%d\ntx[1M]=%d\ntx[2M]=%d\ntx[5.5M]=%d\n" 1076 "last_rx: silence=%d dBm signal=%d dBm rate=%d%s Mbps\n"
1027 "tx[11M]=%d\n" 1077 "tx_rate=%d\ntx[1M]=%d\ntx[2M]=%d\ntx[5.5M]=%d\n"
1028 "rx[1M]=%d\nrx[2M]=%d\nrx[5.5M]=%d\nrx[11M]=%d\n", 1078 "tx[11M]=%d\n"
1029 jiffies, sta->last_auth, sta->last_assoc, sta->last_rx, 1079 "rx[1M]=%d\nrx[2M]=%d\nrx[5.5M]=%d\nrx[11M]=%d\n",
1030 sta->last_tx, 1080 jiffies, sta->last_auth, sta->last_assoc, sta->last_rx,
1031 sta->rx_packets, sta->tx_packets, sta->rx_bytes, 1081 sta->last_tx,
1032 sta->tx_bytes, skb_queue_len(&sta->tx_buf), 1082 sta->rx_packets, sta->tx_packets, sta->rx_bytes,
1033 sta->last_rx_silence, 1083 sta->tx_bytes, skb_queue_len(&sta->tx_buf),
1034 sta->last_rx_signal, sta->last_rx_rate / 10, 1084 sta->last_rx_silence,
1035 sta->last_rx_rate % 10 ? ".5" : "", 1085 sta->last_rx_signal, sta->last_rx_rate / 10,
1036 sta->tx_rate, sta->tx_count[0], sta->tx_count[1], 1086 sta->last_rx_rate % 10 ? ".5" : "",
1037 sta->tx_count[2], sta->tx_count[3], sta->rx_count[0], 1087 sta->tx_rate, sta->tx_count[0], sta->tx_count[1],
1038 sta->rx_count[1], sta->rx_count[2], sta->rx_count[3]); 1088 sta->tx_count[2], sta->tx_count[3], sta->rx_count[0],
1089 sta->rx_count[1], sta->rx_count[2], sta->rx_count[3]);
1039 if (sta->crypt && sta->crypt->ops && sta->crypt->ops->print_stats) 1090 if (sta->crypt && sta->crypt->ops && sta->crypt->ops->print_stats)
1040 p = sta->crypt->ops->print_stats(p, sta->crypt->priv); 1091 sta->crypt->ops->print_stats(m, sta->crypt->priv);
1041#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT 1092#ifndef PRISM2_NO_KERNEL_IEEE80211_MGMT
1042 if (sta->ap) { 1093 if (sta->ap) {
1043 if (sta->u.ap.channel >= 0) 1094 if (sta->u.ap.channel >= 0)
1044 p += sprintf(p, "channel=%d\n", sta->u.ap.channel); 1095 seq_printf(m, "channel=%d\n", sta->u.ap.channel);
1045 p += sprintf(p, "ssid="); 1096 seq_puts(m, "ssid=");
1046 for (i = 0; i < sta->u.ap.ssid_len; i++) 1097 for (i = 0; i < sta->u.ap.ssid_len; i++) {
1047 p += sprintf(p, ((sta->u.ap.ssid[i] >= 32 && 1098 if (sta->u.ap.ssid[i] >= 32 && sta->u.ap.ssid[i] < 127)
1048 sta->u.ap.ssid[i] < 127) ? 1099 seq_putc(m, sta->u.ap.ssid[i]);
1049 "%c" : "<%02x>"), 1100 else
1050 sta->u.ap.ssid[i]); 1101 seq_printf(m, "<%02x>", sta->u.ap.ssid[i]);
1051 p += sprintf(p, "\n"); 1102 }
1103 seq_putc(m, '\n');
1052 } 1104 }
1053#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */ 1105#endif /* PRISM2_NO_KERNEL_IEEE80211_MGMT */
1054 1106
1055 return (p - page); 1107 return 0;
1108}
1109
1110static int prism2_sta_proc_open(struct inode *inode, struct file *file)
1111{
1112 return single_open(file, prism2_sta_proc_show, PDE_DATA(inode));
1056} 1113}
1057 1114
1115static const struct file_operations prism2_sta_proc_fops = {
1116 .open = prism2_sta_proc_open,
1117 .read = seq_read,
1118 .llseek = seq_lseek,
1119 .release = seq_release,
1120};
1058 1121
1059static void handle_add_proc_queue(struct work_struct *work) 1122static void handle_add_proc_queue(struct work_struct *work)
1060{ 1123{
@@ -1076,9 +1139,9 @@ static void handle_add_proc_queue(struct work_struct *work)
1076 1139
1077 if (sta) { 1140 if (sta) {
1078 sprintf(name, "%pM", sta->addr); 1141 sprintf(name, "%pM", sta->addr);
1079 sta->proc = create_proc_read_entry( 1142 sta->proc = proc_create_data(
1080 name, 0, ap->proc, 1143 name, 0, ap->proc,
1081 prism2_sta_proc_read, sta); 1144 &prism2_sta_proc_fops, sta);
1082 1145
1083 atomic_dec(&sta->users); 1146 atomic_dec(&sta->users);
1084 } 1147 }
diff --git a/drivers/net/wireless/hostap/hostap_download.c b/drivers/net/wireless/hostap/hostap_download.c
index e73bf739fd9b..705fe668b969 100644
--- a/drivers/net/wireless/hostap/hostap_download.c
+++ b/drivers/net/wireless/hostap/hostap_download.c
@@ -174,20 +174,70 @@ static int prism2_pda_ok(u8 *buf)
174} 174}
175 175
176 176
177static int prism2_download_aux_dump(struct net_device *dev, 177#define prism2_download_aux_dump_npages 65536
178 unsigned int addr, int len, u8 *buf)
179{
180 int res;
181 178
182 prism2_enable_aux_port(dev, 1); 179struct prism2_download_aux_dump {
183 res = hfa384x_from_aux(dev, addr, len, buf); 180 local_info_t *local;
184 prism2_enable_aux_port(dev, 0); 181 u16 page[0x80];
185 if (res) 182};
186 return -1; 183
184static int prism2_download_aux_dump_proc_show(struct seq_file *m, void *v)
185{
186 struct prism2_download_aux_dump *ctx = m->private;
187 187
188 hfa384x_from_aux(ctx->local->dev, (unsigned long)v - 1, 0x80, ctx->page);
189 seq_write(m, ctx->page, 0x80);
188 return 0; 190 return 0;
189} 191}
190 192
193static void *prism2_download_aux_dump_proc_start(struct seq_file *m, loff_t *_pos)
194{
195 struct prism2_download_aux_dump *ctx = m->private;
196 prism2_enable_aux_port(ctx->local->dev, 1);
197 if (*_pos >= prism2_download_aux_dump_npages)
198 return NULL;
199 return (void *)((unsigned long)*_pos + 1);
200}
201
202static void *prism2_download_aux_dump_proc_next(struct seq_file *m, void *v, loff_t *_pos)
203{
204 ++*_pos;
205 if (*_pos >= prism2_download_aux_dump_npages)
206 return NULL;
207 return (void *)((unsigned long)*_pos + 1);
208}
209
210static void prism2_download_aux_dump_proc_stop(struct seq_file *m, void *v)
211{
212 struct prism2_download_aux_dump *ctx = m->private;
213 prism2_enable_aux_port(ctx->local->dev, 0);
214}
215
216static const struct seq_operations prism2_download_aux_dump_proc_seqops = {
217 .start = prism2_download_aux_dump_proc_start,
218 .next = prism2_download_aux_dump_proc_next,
219 .stop = prism2_download_aux_dump_proc_stop,
220 .show = prism2_download_aux_dump_proc_show,
221};
222
223static int prism2_download_aux_dump_proc_open(struct inode *inode, struct file *file)
224{
225 int ret = seq_open_private(file, &prism2_download_aux_dump_proc_seqops,
226 sizeof(struct prism2_download_aux_dump));
227 if (ret == 0) {
228 struct seq_file *m = file->private_data;
229 m->private = PDE_DATA(inode);
230 }
231 return ret;
232}
233
234static const struct file_operations prism2_download_aux_dump_proc_fops = {
235 .open = prism2_download_aux_dump_proc_open,
236 .read = seq_read,
237 .llseek = seq_lseek,
238 .release = seq_release_private,
239};
240
191 241
192static u8 * prism2_read_pda(struct net_device *dev) 242static u8 * prism2_read_pda(struct net_device *dev)
193{ 243{
diff --git a/drivers/net/wireless/hostap/hostap_hw.c b/drivers/net/wireless/hostap/hostap_hw.c
index 8e7000fd4414..507ab99eef4e 100644
--- a/drivers/net/wireless/hostap/hostap_hw.c
+++ b/drivers/net/wireless/hostap/hostap_hw.c
@@ -38,6 +38,7 @@
38#include <linux/netdevice.h> 38#include <linux/netdevice.h>
39#include <linux/etherdevice.h> 39#include <linux/etherdevice.h>
40#include <linux/proc_fs.h> 40#include <linux/proc_fs.h>
41#include <linux/seq_file.h>
41#include <linux/if_arp.h> 42#include <linux/if_arp.h>
42#include <linux/delay.h> 43#include <linux/delay.h>
43#include <linux/random.h> 44#include <linux/random.h>
@@ -129,8 +130,7 @@ static void prism2_check_sta_fw_version(local_info_t *local);
129 130
130#ifdef PRISM2_DOWNLOAD_SUPPORT 131#ifdef PRISM2_DOWNLOAD_SUPPORT
131/* hostap_download.c */ 132/* hostap_download.c */
132static int prism2_download_aux_dump(struct net_device *dev, 133static const struct file_operations prism2_download_aux_dump_proc_fops;
133 unsigned int addr, int len, u8 *buf);
134static u8 * prism2_read_pda(struct net_device *dev); 134static u8 * prism2_read_pda(struct net_device *dev);
135static int prism2_download(local_info_t *local, 135static int prism2_download(local_info_t *local,
136 struct prism2_download_param *param); 136 struct prism2_download_param *param);
@@ -2894,19 +2894,12 @@ static void hostap_tick_timer(unsigned long data)
2894 2894
2895 2895
2896#ifndef PRISM2_NO_PROCFS_DEBUG 2896#ifndef PRISM2_NO_PROCFS_DEBUG
2897static int prism2_registers_proc_read(char *page, char **start, off_t off, 2897static int prism2_registers_proc_show(struct seq_file *m, void *v)
2898 int count, int *eof, void *data)
2899{ 2898{
2900 char *p = page; 2899 local_info_t *local = m->private;
2901 local_info_t *local = (local_info_t *) data;
2902
2903 if (off != 0) {
2904 *eof = 1;
2905 return 0;
2906 }
2907 2900
2908#define SHOW_REG(n) \ 2901#define SHOW_REG(n) \
2909p += sprintf(p, #n "=%04x\n", hfa384x_read_reg(local->dev, HFA384X_##n##_OFF)) 2902 seq_printf(m, #n "=%04x\n", hfa384x_read_reg(local->dev, HFA384X_##n##_OFF))
2910 2903
2911 SHOW_REG(CMD); 2904 SHOW_REG(CMD);
2912 SHOW_REG(PARAM0); 2905 SHOW_REG(PARAM0);
@@ -2952,8 +2945,21 @@ p += sprintf(p, #n "=%04x\n", hfa384x_read_reg(local->dev, HFA384X_##n##_OFF))
2952 SHOW_REG(PCI_M1_CTL); 2945 SHOW_REG(PCI_M1_CTL);
2953#endif /* PRISM2_PCI */ 2946#endif /* PRISM2_PCI */
2954 2947
2955 return (p - page); 2948 return 0;
2956} 2949}
2950
2951static int prism2_registers_proc_open(struct inode *inode, struct file *file)
2952{
2953 return single_open(file, prism2_registers_proc_show, PDE_DATA(inode));
2954}
2955
2956static const struct file_operations prism2_registers_proc_fops = {
2957 .open = prism2_registers_proc_open,
2958 .read = seq_read,
2959 .llseek = seq_lseek,
2960 .release = seq_release,
2961};
2962
2957#endif /* PRISM2_NO_PROCFS_DEBUG */ 2963#endif /* PRISM2_NO_PROCFS_DEBUG */
2958 2964
2959 2965
@@ -3128,7 +3134,7 @@ prism2_init_local_data(struct prism2_helper_functions *funcs, int card_idx,
3128 local->func->reset_port = prism2_reset_port; 3134 local->func->reset_port = prism2_reset_port;
3129 local->func->schedule_reset = prism2_schedule_reset; 3135 local->func->schedule_reset = prism2_schedule_reset;
3130#ifdef PRISM2_DOWNLOAD_SUPPORT 3136#ifdef PRISM2_DOWNLOAD_SUPPORT
3131 local->func->read_aux = prism2_download_aux_dump; 3137 local->func->read_aux_fops = &prism2_download_aux_dump_proc_fops;
3132 local->func->download = prism2_download; 3138 local->func->download = prism2_download;
3133#endif /* PRISM2_DOWNLOAD_SUPPORT */ 3139#endif /* PRISM2_DOWNLOAD_SUPPORT */
3134 local->func->tx = prism2_tx_80211; 3140 local->func->tx = prism2_tx_80211;
@@ -3274,8 +3280,8 @@ static int hostap_hw_ready(struct net_device *dev)
3274 } 3280 }
3275 hostap_init_proc(local); 3281 hostap_init_proc(local);
3276#ifndef PRISM2_NO_PROCFS_DEBUG 3282#ifndef PRISM2_NO_PROCFS_DEBUG
3277 create_proc_read_entry("registers", 0, local->proc, 3283 proc_create_data("registers", 0, local->proc,
3278 prism2_registers_proc_read, local); 3284 &prism2_registers_proc_fops, local);
3279#endif /* PRISM2_NO_PROCFS_DEBUG */ 3285#endif /* PRISM2_NO_PROCFS_DEBUG */
3280 hostap_init_ap_proc(local); 3286 hostap_init_ap_proc(local);
3281 return 0; 3287 return 0;
diff --git a/drivers/net/wireless/hostap/hostap_proc.c b/drivers/net/wireless/hostap/hostap_proc.c
index dc447c1b5abe..7491dab2c105 100644
--- a/drivers/net/wireless/hostap/hostap_proc.c
+++ b/drivers/net/wireless/hostap/hostap_proc.c
@@ -12,259 +12,297 @@
12 12
13 13
14#ifndef PRISM2_NO_PROCFS_DEBUG 14#ifndef PRISM2_NO_PROCFS_DEBUG
15static int prism2_debug_proc_read(char *page, char **start, off_t off, 15static int prism2_debug_proc_show(struct seq_file *m, void *v)
16 int count, int *eof, void *data)
17{ 16{
18 char *p = page; 17 local_info_t *local = m->private;
19 local_info_t *local = (local_info_t *) data;
20 int i; 18 int i;
21 19
22 if (off != 0) { 20 seq_printf(m, "next_txfid=%d next_alloc=%d\n",
23 *eof = 1; 21 local->next_txfid, local->next_alloc);
24 return 0;
25 }
26
27 p += sprintf(p, "next_txfid=%d next_alloc=%d\n",
28 local->next_txfid, local->next_alloc);
29 for (i = 0; i < PRISM2_TXFID_COUNT; i++) 22 for (i = 0; i < PRISM2_TXFID_COUNT; i++)
30 p += sprintf(p, "FID: tx=%04X intransmit=%04X\n", 23 seq_printf(m, "FID: tx=%04X intransmit=%04X\n",
31 local->txfid[i], local->intransmitfid[i]); 24 local->txfid[i], local->intransmitfid[i]);
32 p += sprintf(p, "FW TX rate control: %d\n", local->fw_tx_rate_control); 25 seq_printf(m, "FW TX rate control: %d\n", local->fw_tx_rate_control);
33 p += sprintf(p, "beacon_int=%d\n", local->beacon_int); 26 seq_printf(m, "beacon_int=%d\n", local->beacon_int);
34 p += sprintf(p, "dtim_period=%d\n", local->dtim_period); 27 seq_printf(m, "dtim_period=%d\n", local->dtim_period);
35 p += sprintf(p, "wds_max_connections=%d\n", 28 seq_printf(m, "wds_max_connections=%d\n", local->wds_max_connections);
36 local->wds_max_connections); 29 seq_printf(m, "dev_enabled=%d\n", local->dev_enabled);
37 p += sprintf(p, "dev_enabled=%d\n", local->dev_enabled); 30 seq_printf(m, "sw_tick_stuck=%d\n", local->sw_tick_stuck);
38 p += sprintf(p, "sw_tick_stuck=%d\n", local->sw_tick_stuck);
39 for (i = 0; i < WEP_KEYS; i++) { 31 for (i = 0; i < WEP_KEYS; i++) {
40 if (local->crypt_info.crypt[i] && 32 if (local->crypt_info.crypt[i] &&
41 local->crypt_info.crypt[i]->ops) { 33 local->crypt_info.crypt[i]->ops) {
42 p += sprintf(p, "crypt[%d]=%s\n", i, 34 seq_printf(m, "crypt[%d]=%s\n", i,
43 local->crypt_info.crypt[i]->ops->name); 35 local->crypt_info.crypt[i]->ops->name);
44 } 36 }
45 } 37 }
46 p += sprintf(p, "pri_only=%d\n", local->pri_only); 38 seq_printf(m, "pri_only=%d\n", local->pri_only);
47 p += sprintf(p, "pci=%d\n", local->func->hw_type == HOSTAP_HW_PCI); 39 seq_printf(m, "pci=%d\n", local->func->hw_type == HOSTAP_HW_PCI);
48 p += sprintf(p, "sram_type=%d\n", local->sram_type); 40 seq_printf(m, "sram_type=%d\n", local->sram_type);
49 p += sprintf(p, "no_pri=%d\n", local->no_pri); 41 seq_printf(m, "no_pri=%d\n", local->no_pri);
50 42
51 return (p - page); 43 return 0;
52} 44}
45
46static int prism2_debug_proc_open(struct inode *inode, struct file *file)
47{
48 return single_open(file, prism2_debug_proc_show, PDE_DATA(inode));
49}
50
51static const struct file_operations prism2_debug_proc_fops = {
52 .open = prism2_debug_proc_open,
53 .read = seq_read,
54 .llseek = seq_lseek,
55 .release = seq_release,
56};
53#endif /* PRISM2_NO_PROCFS_DEBUG */ 57#endif /* PRISM2_NO_PROCFS_DEBUG */
54 58
55 59
56static int prism2_stats_proc_read(char *page, char **start, off_t off, 60static int prism2_stats_proc_show(struct seq_file *m, void *v)
57 int count, int *eof, void *data)
58{ 61{
59 char *p = page; 62 local_info_t *local = m->private;
60 local_info_t *local = (local_info_t *) data;
61 struct comm_tallies_sums *sums = &local->comm_tallies; 63 struct comm_tallies_sums *sums = &local->comm_tallies;
62 64
63 if (off != 0) { 65 seq_printf(m, "TxUnicastFrames=%u\n", sums->tx_unicast_frames);
64 *eof = 1; 66 seq_printf(m, "TxMulticastframes=%u\n", sums->tx_multicast_frames);
65 return 0; 67 seq_printf(m, "TxFragments=%u\n", sums->tx_fragments);
66 } 68 seq_printf(m, "TxUnicastOctets=%u\n", sums->tx_unicast_octets);
67 69 seq_printf(m, "TxMulticastOctets=%u\n", sums->tx_multicast_octets);
68 p += sprintf(p, "TxUnicastFrames=%u\n", sums->tx_unicast_frames); 70 seq_printf(m, "TxDeferredTransmissions=%u\n",
69 p += sprintf(p, "TxMulticastframes=%u\n", sums->tx_multicast_frames); 71 sums->tx_deferred_transmissions);
70 p += sprintf(p, "TxFragments=%u\n", sums->tx_fragments); 72 seq_printf(m, "TxSingleRetryFrames=%u\n", sums->tx_single_retry_frames);
71 p += sprintf(p, "TxUnicastOctets=%u\n", sums->tx_unicast_octets); 73 seq_printf(m, "TxMultipleRetryFrames=%u\n",
72 p += sprintf(p, "TxMulticastOctets=%u\n", sums->tx_multicast_octets); 74 sums->tx_multiple_retry_frames);
73 p += sprintf(p, "TxDeferredTransmissions=%u\n", 75 seq_printf(m, "TxRetryLimitExceeded=%u\n",
74 sums->tx_deferred_transmissions); 76 sums->tx_retry_limit_exceeded);
75 p += sprintf(p, "TxSingleRetryFrames=%u\n", 77 seq_printf(m, "TxDiscards=%u\n", sums->tx_discards);
76 sums->tx_single_retry_frames); 78 seq_printf(m, "RxUnicastFrames=%u\n", sums->rx_unicast_frames);
77 p += sprintf(p, "TxMultipleRetryFrames=%u\n", 79 seq_printf(m, "RxMulticastFrames=%u\n", sums->rx_multicast_frames);
78 sums->tx_multiple_retry_frames); 80 seq_printf(m, "RxFragments=%u\n", sums->rx_fragments);
79 p += sprintf(p, "TxRetryLimitExceeded=%u\n", 81 seq_printf(m, "RxUnicastOctets=%u\n", sums->rx_unicast_octets);
80 sums->tx_retry_limit_exceeded); 82 seq_printf(m, "RxMulticastOctets=%u\n", sums->rx_multicast_octets);
81 p += sprintf(p, "TxDiscards=%u\n", sums->tx_discards); 83 seq_printf(m, "RxFCSErrors=%u\n", sums->rx_fcs_errors);
82 p += sprintf(p, "RxUnicastFrames=%u\n", sums->rx_unicast_frames); 84 seq_printf(m, "RxDiscardsNoBuffer=%u\n", sums->rx_discards_no_buffer);
83 p += sprintf(p, "RxMulticastFrames=%u\n", sums->rx_multicast_frames); 85 seq_printf(m, "TxDiscardsWrongSA=%u\n", sums->tx_discards_wrong_sa);
84 p += sprintf(p, "RxFragments=%u\n", sums->rx_fragments); 86 seq_printf(m, "RxDiscardsWEPUndecryptable=%u\n",
85 p += sprintf(p, "RxUnicastOctets=%u\n", sums->rx_unicast_octets); 87 sums->rx_discards_wep_undecryptable);
86 p += sprintf(p, "RxMulticastOctets=%u\n", sums->rx_multicast_octets); 88 seq_printf(m, "RxMessageInMsgFragments=%u\n",
87 p += sprintf(p, "RxFCSErrors=%u\n", sums->rx_fcs_errors); 89 sums->rx_message_in_msg_fragments);
88 p += sprintf(p, "RxDiscardsNoBuffer=%u\n", 90 seq_printf(m, "RxMessageInBadMsgFragments=%u\n",
89 sums->rx_discards_no_buffer); 91 sums->rx_message_in_bad_msg_fragments);
90 p += sprintf(p, "TxDiscardsWrongSA=%u\n", sums->tx_discards_wrong_sa);
91 p += sprintf(p, "RxDiscardsWEPUndecryptable=%u\n",
92 sums->rx_discards_wep_undecryptable);
93 p += sprintf(p, "RxMessageInMsgFragments=%u\n",
94 sums->rx_message_in_msg_fragments);
95 p += sprintf(p, "RxMessageInBadMsgFragments=%u\n",
96 sums->rx_message_in_bad_msg_fragments);
97 /* FIX: this may grow too long for one page(?) */ 92 /* FIX: this may grow too long for one page(?) */
98 93
99 return (p - page); 94 return 0;
95}
96
97static int prism2_stats_proc_open(struct inode *inode, struct file *file)
98{
99 return single_open(file, prism2_stats_proc_show, PDE_DATA(inode));
100} 100}
101 101
102static const struct file_operations prism2_stats_proc_fops = {
103 .open = prism2_stats_proc_open,
104 .read = seq_read,
105 .llseek = seq_lseek,
106 .release = seq_release,
107};
102 108
103static int prism2_wds_proc_read(char *page, char **start, off_t off, 109
104 int count, int *eof, void *data) 110static int prism2_wds_proc_show(struct seq_file *m, void *v)
105{ 111{
106 char *p = page; 112 struct list_head *ptr = v;
107 local_info_t *local = (local_info_t *) data;
108 struct list_head *ptr;
109 struct hostap_interface *iface; 113 struct hostap_interface *iface;
110 114
111 if (off > PROC_LIMIT) { 115 iface = list_entry(ptr, struct hostap_interface, list);
112 *eof = 1; 116 if (iface->type == HOSTAP_INTERFACE_WDS)
113 return 0; 117 seq_printf(m, "%s\t%pM\n",
114 } 118 iface->dev->name, iface->u.wds.remote_addr);
119 return 0;
120}
115 121
122static void *prism2_wds_proc_start(struct seq_file *m, loff_t *_pos)
123{
124 local_info_t *local = m->private;
116 read_lock_bh(&local->iface_lock); 125 read_lock_bh(&local->iface_lock);
117 list_for_each(ptr, &local->hostap_interfaces) { 126 return seq_list_start(&local->hostap_interfaces, *_pos);
118 iface = list_entry(ptr, struct hostap_interface, list); 127}
119 if (iface->type != HOSTAP_INTERFACE_WDS)
120 continue;
121 p += sprintf(p, "%s\t%pM\n",
122 iface->dev->name,
123 iface->u.wds.remote_addr);
124 if ((p - page) > PROC_LIMIT) {
125 printk(KERN_DEBUG "%s: wds proc did not fit\n",
126 local->dev->name);
127 break;
128 }
129 }
130 read_unlock_bh(&local->iface_lock);
131 128
132 if ((p - page) <= off) { 129static void *prism2_wds_proc_next(struct seq_file *m, void *v, loff_t *_pos)
133 *eof = 1; 130{
134 return 0; 131 local_info_t *local = m->private;
135 } 132 return seq_list_next(v, &local->hostap_interfaces, _pos);
133}
136 134
137 *start = page + off; 135static void prism2_wds_proc_stop(struct seq_file *m, void *v)
136{
137 local_info_t *local = m->private;
138 read_unlock_bh(&local->iface_lock);
139}
138 140
139 return (p - page - off); 141static const struct seq_operations prism2_wds_proc_seqops = {
142 .start = prism2_wds_proc_start,
143 .next = prism2_wds_proc_next,
144 .stop = prism2_wds_proc_stop,
145 .show = prism2_wds_proc_show,
146};
147
148static int prism2_wds_proc_open(struct inode *inode, struct file *file)
149{
150 int ret = seq_open(file, &prism2_wds_proc_seqops);
151 if (ret == 0) {
152 struct seq_file *m = file->private_data;
153 m->private = PDE_DATA(inode);
154 }
155 return ret;
140} 156}
141 157
158static const struct file_operations prism2_wds_proc_fops = {
159 .open = prism2_wds_proc_open,
160 .read = seq_read,
161 .llseek = seq_lseek,
162 .release = seq_release,
163};
142 164
143static int prism2_bss_list_proc_read(char *page, char **start, off_t off, 165
144 int count, int *eof, void *data) 166static int prism2_bss_list_proc_show(struct seq_file *m, void *v)
145{ 167{
146 char *p = page; 168 local_info_t *local = m->private;
147 local_info_t *local = (local_info_t *) data; 169 struct list_head *ptr = v;
148 struct list_head *ptr;
149 struct hostap_bss_info *bss; 170 struct hostap_bss_info *bss;
150 int i; 171 int i;
151 172
152 if (off > PROC_LIMIT) { 173 if (ptr == &local->bss_list) {
153 *eof = 1; 174 seq_printf(m, "#BSSID\tlast_update\tcount\tcapab_info\tSSID(txt)\t"
175 "SSID(hex)\tWPA IE\n");
154 return 0; 176 return 0;
155 } 177 }
156 178
157 p += sprintf(p, "#BSSID\tlast_update\tcount\tcapab_info\tSSID(txt)\t" 179 bss = list_entry(ptr, struct hostap_bss_info, list);
158 "SSID(hex)\tWPA IE\n"); 180 seq_printf(m, "%pM\t%lu\t%u\t0x%x\t",
181 bss->bssid, bss->last_update,
182 bss->count, bss->capab_info);
183
184 for (i = 0; i < bss->ssid_len; i++)
185 seq_putc(m,bss->ssid[i] >= 32 && bss->ssid[i] < 127 ?
186 bss->ssid[i] : '_');
187
188 seq_putc(m, '\t');
189 for (i = 0; i < bss->ssid_len; i++)
190 seq_printf(m, "%02x", bss->ssid[i]);
191 seq_putc(m, '\t');
192 for (i = 0; i < bss->wpa_ie_len; i++)
193 seq_printf(m, "%02x", bss->wpa_ie[i]);
194 seq_putc(m, '\n');
195 return 0;
196}
197
198static void *prism2_bss_list_proc_start(struct seq_file *m, loff_t *_pos)
199{
200 local_info_t *local = m->private;
159 spin_lock_bh(&local->lock); 201 spin_lock_bh(&local->lock);
160 list_for_each(ptr, &local->bss_list) { 202 return seq_list_start_head(&local->bss_list, *_pos);
161 bss = list_entry(ptr, struct hostap_bss_info, list); 203}
162 p += sprintf(p, "%pM\t%lu\t%u\t0x%x\t",
163 bss->bssid, bss->last_update,
164 bss->count, bss->capab_info);
165 for (i = 0; i < bss->ssid_len; i++) {
166 p += sprintf(p, "%c",
167 bss->ssid[i] >= 32 && bss->ssid[i] < 127 ?
168 bss->ssid[i] : '_');
169 }
170 p += sprintf(p, "\t");
171 for (i = 0; i < bss->ssid_len; i++) {
172 p += sprintf(p, "%02x", bss->ssid[i]);
173 }
174 p += sprintf(p, "\t");
175 for (i = 0; i < bss->wpa_ie_len; i++) {
176 p += sprintf(p, "%02x", bss->wpa_ie[i]);
177 }
178 p += sprintf(p, "\n");
179 if ((p - page) > PROC_LIMIT) {
180 printk(KERN_DEBUG "%s: BSS proc did not fit\n",
181 local->dev->name);
182 break;
183 }
184 }
185 spin_unlock_bh(&local->lock);
186 204
187 if ((p - page) <= off) { 205static void *prism2_bss_list_proc_next(struct seq_file *m, void *v, loff_t *_pos)
188 *eof = 1; 206{
189 return 0; 207 local_info_t *local = m->private;
190 } 208 return seq_list_next(v, &local->bss_list, _pos);
209}
191 210
192 *start = page + off; 211static void prism2_bss_list_proc_stop(struct seq_file *m, void *v)
212{
213 local_info_t *local = m->private;
214 spin_unlock_bh(&local->lock);
215}
216
217static const struct seq_operations prism2_bss_list_proc_seqops = {
218 .start = prism2_bss_list_proc_start,
219 .next = prism2_bss_list_proc_next,
220 .stop = prism2_bss_list_proc_stop,
221 .show = prism2_bss_list_proc_show,
222};
193 223
194 return (p - page - off); 224static int prism2_bss_list_proc_open(struct inode *inode, struct file *file)
225{
226 int ret = seq_open(file, &prism2_bss_list_proc_seqops);
227 if (ret == 0) {
228 struct seq_file *m = file->private_data;
229 m->private = PDE_DATA(inode);
230 }
231 return ret;
195} 232}
196 233
234static const struct file_operations prism2_bss_list_proc_fops = {
235 .open = prism2_bss_list_proc_open,
236 .read = seq_read,
237 .llseek = seq_lseek,
238 .release = seq_release,
239};
197 240
198static int prism2_crypt_proc_read(char *page, char **start, off_t off, 241
199 int count, int *eof, void *data) 242static int prism2_crypt_proc_show(struct seq_file *m, void *v)
200{ 243{
201 char *p = page; 244 local_info_t *local = m->private;
202 local_info_t *local = (local_info_t *) data;
203 int i; 245 int i;
204 246
205 if (off > PROC_LIMIT) { 247 seq_printf(m, "tx_keyidx=%d\n", local->crypt_info.tx_keyidx);
206 *eof = 1;
207 return 0;
208 }
209
210 p += sprintf(p, "tx_keyidx=%d\n", local->crypt_info.tx_keyidx);
211 for (i = 0; i < WEP_KEYS; i++) { 248 for (i = 0; i < WEP_KEYS; i++) {
212 if (local->crypt_info.crypt[i] && 249 if (local->crypt_info.crypt[i] &&
213 local->crypt_info.crypt[i]->ops && 250 local->crypt_info.crypt[i]->ops &&
214 local->crypt_info.crypt[i]->ops->print_stats) { 251 local->crypt_info.crypt[i]->ops->print_stats) {
215 p = local->crypt_info.crypt[i]->ops->print_stats( 252 local->crypt_info.crypt[i]->ops->print_stats(
216 p, local->crypt_info.crypt[i]->priv); 253 m, local->crypt_info.crypt[i]->priv);
217 } 254 }
218 } 255 }
256 return 0;
257}
219 258
220 if ((p - page) <= off) { 259static int prism2_crypt_proc_open(struct inode *inode, struct file *file)
221 *eof = 1; 260{
222 return 0; 261 return single_open(file, prism2_crypt_proc_show, PDE_DATA(inode));
223 }
224
225 *start = page + off;
226
227 return (p - page - off);
228} 262}
229 263
264static const struct file_operations prism2_crypt_proc_fops = {
265 .open = prism2_crypt_proc_open,
266 .read = seq_read,
267 .llseek = seq_lseek,
268 .release = seq_release,
269};
230 270
231static int prism2_pda_proc_read(char *page, char **start, off_t off, 271
232 int count, int *eof, void *data) 272static ssize_t prism2_pda_proc_read(struct file *file, char __user *buf,
273 size_t count, loff_t *_pos)
233{ 274{
234 local_info_t *local = (local_info_t *) data; 275 local_info_t *local = PDE_DATA(file_inode(file));
276 size_t off;
235 277
236 if (local->pda == NULL || off >= PRISM2_PDA_SIZE) { 278 if (local->pda == NULL || *_pos >= PRISM2_PDA_SIZE)
237 *eof = 1;
238 return 0; 279 return 0;
239 }
240 280
241 if (off + count > PRISM2_PDA_SIZE) 281 off = *_pos;
282 if (count > PRISM2_PDA_SIZE - off)
242 count = PRISM2_PDA_SIZE - off; 283 count = PRISM2_PDA_SIZE - off;
243 284 if (copy_to_user(buf, local->pda + off, count) != 0)
244 memcpy(page, local->pda + off, count); 285 return -EFAULT;
286 *_pos += count;
245 return count; 287 return count;
246} 288}
247 289
290static const struct file_operations prism2_pda_proc_fops = {
291 .read = prism2_pda_proc_read,
292 .llseek = generic_file_llseek,
293};
248 294
249static int prism2_aux_dump_proc_read(char *page, char **start, off_t off,
250 int count, int *eof, void *data)
251{
252 local_info_t *local = (local_info_t *) data;
253
254 if (local->func->read_aux == NULL) {
255 *eof = 1;
256 return 0;
257 }
258 295
259 if (local->func->read_aux(local->dev, off, count, page)) { 296static ssize_t prism2_aux_dump_proc_no_read(struct file *file, char __user *buf,
260 *eof = 1; 297 size_t bufsize, loff_t *_pos)
261 return 0; 298{
262 } 299 return 0;
263 *start = page;
264
265 return count;
266} 300}
267 301
302static const struct file_operations prism2_aux_dump_proc_fops = {
303 .read = prism2_aux_dump_proc_no_read,
304};
305
268 306
269#ifdef PRISM2_IO_DEBUG 307#ifdef PRISM2_IO_DEBUG
270static int prism2_io_debug_proc_read(char *page, char **start, off_t off, 308static int prism2_io_debug_proc_read(char *page, char **start, off_t off,
@@ -306,82 +344,108 @@ static int prism2_io_debug_proc_read(char *page, char **start, off_t off,
306 344
307 345
308#ifndef PRISM2_NO_STATION_MODES 346#ifndef PRISM2_NO_STATION_MODES
309static int prism2_scan_results_proc_read(char *page, char **start, off_t off, 347static int prism2_scan_results_proc_show(struct seq_file *m, void *v)
310 int count, int *eof, void *data)
311{ 348{
312 char *p = page; 349 local_info_t *local = m->private;
313 local_info_t *local = (local_info_t *) data; 350 unsigned long entry;
314 int entry, i, len, total = 0; 351 int i, len;
315 struct hfa384x_hostscan_result *scanres; 352 struct hfa384x_hostscan_result *scanres;
316 u8 *pos; 353 u8 *p;
317 354
318 p += sprintf(p, "CHID ANL SL BcnInt Capab Rate BSSID ATIM SupRates " 355 if (v == SEQ_START_TOKEN) {
319 "SSID\n"); 356 seq_printf(m,
357 "CHID ANL SL BcnInt Capab Rate BSSID ATIM SupRates SSID\n");
358 return 0;
359 }
320 360
361 entry = (unsigned long)v - 2;
362 scanres = &local->last_scan_results[entry];
363
364 seq_printf(m, "%d %d %d %d 0x%02x %d %pM %d ",
365 le16_to_cpu(scanres->chid),
366 (s16) le16_to_cpu(scanres->anl),
367 (s16) le16_to_cpu(scanres->sl),
368 le16_to_cpu(scanres->beacon_interval),
369 le16_to_cpu(scanres->capability),
370 le16_to_cpu(scanres->rate),
371 scanres->bssid,
372 le16_to_cpu(scanres->atim));
373
374 p = scanres->sup_rates;
375 for (i = 0; i < sizeof(scanres->sup_rates); i++) {
376 if (p[i] == 0)
377 break;
378 seq_printf(m, "<%02x>", p[i]);
379 }
380 seq_putc(m, ' ');
381
382 p = scanres->ssid;
383 len = le16_to_cpu(scanres->ssid_len);
384 if (len > 32)
385 len = 32;
386 for (i = 0; i < len; i++) {
387 unsigned char c = p[i];
388 if (c >= 32 && c < 127)
389 seq_putc(m, c);
390 else
391 seq_printf(m, "<%02x>", c);
392 }
393 seq_putc(m, '\n');
394 return 0;
395}
396
397static void *prism2_scan_results_proc_start(struct seq_file *m, loff_t *_pos)
398{
399 local_info_t *local = m->private;
321 spin_lock_bh(&local->lock); 400 spin_lock_bh(&local->lock);
322 for (entry = 0; entry < local->last_scan_results_count; entry++) {
323 scanres = &local->last_scan_results[entry];
324 401
325 if (total + (p - page) <= off) { 402 /* We have a header (pos 0) + N results to show (pos 1...N) */
326 total += p - page; 403 if (*_pos > local->last_scan_results_count)
327 p = page; 404 return NULL;
328 } 405 return (void *)(unsigned long)(*_pos + 1); /* 0 would be EOF */
329 if (total + (p - page) > off + count) 406}
330 break;
331 if ((p - page) > (PAGE_SIZE - 200))
332 break;
333 407
334 p += sprintf(p, "%d %d %d %d 0x%02x %d %pM %d ", 408static void *prism2_scan_results_proc_next(struct seq_file *m, void *v, loff_t *_pos)
335 le16_to_cpu(scanres->chid), 409{
336 (s16) le16_to_cpu(scanres->anl), 410 local_info_t *local = m->private;
337 (s16) le16_to_cpu(scanres->sl), 411
338 le16_to_cpu(scanres->beacon_interval), 412 ++*_pos;
339 le16_to_cpu(scanres->capability), 413 if (*_pos > local->last_scan_results_count)
340 le16_to_cpu(scanres->rate), 414 return NULL;
341 scanres->bssid, 415 return (void *)(unsigned long)(*_pos + 1); /* 0 would be EOF */
342 le16_to_cpu(scanres->atim)); 416}
343 417
344 pos = scanres->sup_rates; 418static void prism2_scan_results_proc_stop(struct seq_file *m, void *v)
345 for (i = 0; i < sizeof(scanres->sup_rates); i++) { 419{
346 if (pos[i] == 0) 420 local_info_t *local = m->private;
347 break;
348 p += sprintf(p, "<%02x>", pos[i]);
349 }
350 p += sprintf(p, " ");
351
352 pos = scanres->ssid;
353 len = le16_to_cpu(scanres->ssid_len);
354 if (len > 32)
355 len = 32;
356 for (i = 0; i < len; i++) {
357 unsigned char c = pos[i];
358 if (c >= 32 && c < 127)
359 p += sprintf(p, "%c", c);
360 else
361 p += sprintf(p, "<%02x>", c);
362 }
363 p += sprintf(p, "\n");
364 }
365 spin_unlock_bh(&local->lock); 421 spin_unlock_bh(&local->lock);
422}
366 423
367 total += (p - page); 424static const struct seq_operations prism2_scan_results_proc_seqops = {
368 if (total >= off + count) 425 .start = prism2_scan_results_proc_start,
369 *eof = 1; 426 .next = prism2_scan_results_proc_next,
427 .stop = prism2_scan_results_proc_stop,
428 .show = prism2_scan_results_proc_show,
429};
370 430
371 if (total < off) { 431static int prism2_scan_results_proc_open(struct inode *inode, struct file *file)
372 *eof = 1; 432{
373 return 0; 433 int ret = seq_open(file, &prism2_scan_results_proc_seqops);
434 if (ret == 0) {
435 struct seq_file *m = file->private_data;
436 m->private = PDE_DATA(inode);
374 } 437 }
438 return ret;
439}
440
441static const struct file_operations prism2_scan_results_proc_fops = {
442 .open = prism2_scan_results_proc_open,
443 .read = seq_read,
444 .llseek = seq_lseek,
445 .release = seq_release,
446};
375 447
376 len = total - off;
377 if (len > (p - page))
378 len = p - page;
379 *start = p - len;
380 if (len > count)
381 len = count;
382 448
383 return len;
384}
385#endif /* PRISM2_NO_STATION_MODES */ 449#endif /* PRISM2_NO_STATION_MODES */
386 450
387 451
@@ -403,53 +467,36 @@ void hostap_init_proc(local_info_t *local)
403 } 467 }
404 468
405#ifndef PRISM2_NO_PROCFS_DEBUG 469#ifndef PRISM2_NO_PROCFS_DEBUG
406 create_proc_read_entry("debug", 0, local->proc, 470 proc_create_data("debug", 0, local->proc,
407 prism2_debug_proc_read, local); 471 &prism2_debug_proc_fops, local);
408#endif /* PRISM2_NO_PROCFS_DEBUG */ 472#endif /* PRISM2_NO_PROCFS_DEBUG */
409 create_proc_read_entry("stats", 0, local->proc, 473 proc_create_data("stats", 0, local->proc,
410 prism2_stats_proc_read, local); 474 &prism2_stats_proc_fops, local);
411 create_proc_read_entry("wds", 0, local->proc, 475 proc_create_data("wds", 0, local->proc,
412 prism2_wds_proc_read, local); 476 &prism2_wds_proc_fops, local);
413 create_proc_read_entry("pda", 0, local->proc, 477 proc_create_data("pda", 0, local->proc,
414 prism2_pda_proc_read, local); 478 &prism2_pda_proc_fops, local);
415 create_proc_read_entry("aux_dump", 0, local->proc, 479 proc_create_data("aux_dump", 0, local->proc,
416 prism2_aux_dump_proc_read, local); 480 local->func->read_aux_fops ?: &prism2_aux_dump_proc_fops,
417 create_proc_read_entry("bss_list", 0, local->proc, 481 local);
418 prism2_bss_list_proc_read, local); 482 proc_create_data("bss_list", 0, local->proc,
419 create_proc_read_entry("crypt", 0, local->proc, 483 &prism2_bss_list_proc_fops, local);
420 prism2_crypt_proc_read, local); 484 proc_create_data("crypt", 0, local->proc,
485 &prism2_crypt_proc_fops, local);
421#ifdef PRISM2_IO_DEBUG 486#ifdef PRISM2_IO_DEBUG
422 create_proc_read_entry("io_debug", 0, local->proc, 487 proc_create_data("io_debug", 0, local->proc,
423 prism2_io_debug_proc_read, local); 488 &prism2_io_debug_proc_fops, local);
424#endif /* PRISM2_IO_DEBUG */ 489#endif /* PRISM2_IO_DEBUG */
425#ifndef PRISM2_NO_STATION_MODES 490#ifndef PRISM2_NO_STATION_MODES
426 create_proc_read_entry("scan_results", 0, local->proc, 491 proc_create_data("scan_results", 0, local->proc,
427 prism2_scan_results_proc_read, local); 492 &prism2_scan_results_proc_fops, local);
428#endif /* PRISM2_NO_STATION_MODES */ 493#endif /* PRISM2_NO_STATION_MODES */
429} 494}
430 495
431 496
432void hostap_remove_proc(local_info_t *local) 497void hostap_remove_proc(local_info_t *local)
433{ 498{
434 if (local->proc != NULL) { 499 remove_proc_subtree(local->ddev->name, hostap_proc);
435#ifndef PRISM2_NO_STATION_MODES
436 remove_proc_entry("scan_results", local->proc);
437#endif /* PRISM2_NO_STATION_MODES */
438#ifdef PRISM2_IO_DEBUG
439 remove_proc_entry("io_debug", local->proc);
440#endif /* PRISM2_IO_DEBUG */
441 remove_proc_entry("pda", local->proc);
442 remove_proc_entry("aux_dump", local->proc);
443 remove_proc_entry("wds", local->proc);
444 remove_proc_entry("stats", local->proc);
445 remove_proc_entry("bss_list", local->proc);
446 remove_proc_entry("crypt", local->proc);
447#ifndef PRISM2_NO_PROCFS_DEBUG
448 remove_proc_entry("debug", local->proc);
449#endif /* PRISM2_NO_PROCFS_DEBUG */
450 if (hostap_proc != NULL)
451 remove_proc_entry(local->proc->name, hostap_proc);
452 }
453} 500}
454 501
455 502
diff --git a/drivers/net/wireless/hostap/hostap_wlan.h b/drivers/net/wireless/hostap/hostap_wlan.h
index 7bb0b4b3f2cb..57904015380f 100644
--- a/drivers/net/wireless/hostap/hostap_wlan.h
+++ b/drivers/net/wireless/hostap/hostap_wlan.h
@@ -596,8 +596,7 @@ struct prism2_helper_functions {
596 struct prism2_download_param *param); 596 struct prism2_download_param *param);
597 int (*tx)(struct sk_buff *skb, struct net_device *dev); 597 int (*tx)(struct sk_buff *skb, struct net_device *dev);
598 int (*set_tim)(struct net_device *dev, int aid, int set); 598 int (*set_tim)(struct net_device *dev, int aid, int set);
599 int (*read_aux)(struct net_device *dev, unsigned addr, int len, 599 const struct file_operations *read_aux_fops;
600 u8 *buf);
601 600
602 int need_tx_headroom; /* number of bytes of headroom needed before 601 int need_tx_headroom; /* number of bytes of headroom needed before
603 * IEEE 802.11 header */ 602 * IEEE 802.11 header */
diff --git a/drivers/net/wireless/ray_cs.c b/drivers/net/wireless/ray_cs.c
index ebada812b3a5..9b557a1bb7f8 100644
--- a/drivers/net/wireless/ray_cs.c
+++ b/drivers/net/wireless/ray_cs.c
@@ -2778,7 +2778,7 @@ static ssize_t int_proc_write(struct file *file, const char __user *buffer,
2778 nr = nr * 10 + c; 2778 nr = nr * 10 + c;
2779 p++; 2779 p++;
2780 } while (--len); 2780 } while (--len);
2781 *(int *)PDE(file_inode(file))->data = nr; 2781 *(int *)PDE_DATA(file_inode(file)) = nr;
2782 return count; 2782 return count;
2783} 2783}
2784 2784
diff --git a/drivers/nubus/nubus.c b/drivers/nubus/nubus.c
index 44d01afafe9c..43926cd25ae8 100644
--- a/drivers/nubus/nubus.c
+++ b/drivers/nubus/nubus.c
@@ -19,7 +19,6 @@
19#include <asm/setup.h> 19#include <asm/setup.h>
20#include <asm/page.h> 20#include <asm/page.h>
21#include <asm/hwtest.h> 21#include <asm/hwtest.h>
22#include <linux/proc_fs.h>
23#include <asm/mac_via.h> 22#include <asm/mac_via.h>
24#include <asm/mac_oss.h> 23#include <asm/mac_oss.h>
25 24
@@ -954,56 +953,6 @@ void __init nubus_probe_slot(int slot)
954 } 953 }
955} 954}
956 955
957#if defined(CONFIG_PROC_FS)
958
959/* /proc/nubus stuff */
960
961static int sprint_nubus_board(struct nubus_board* board, char* ptr, int len)
962{
963 if(len < 100)
964 return -1;
965
966 sprintf(ptr, "Slot %X: %s\n",
967 board->slot, board->name);
968
969 return strlen(ptr);
970}
971
972static int nubus_read_proc(char *page, char **start, off_t off,
973 int count, int *eof, void *data)
974{
975 int nprinted, len, begin = 0;
976 int size = PAGE_SIZE;
977 struct nubus_board* board;
978
979 len = sprintf(page, "Nubus devices found:\n");
980 /* Walk the list of NuBus boards */
981 for (board = nubus_boards; board != NULL; board = board->next)
982 {
983 nprinted = sprint_nubus_board(board, page + len, size - len);
984 if (nprinted < 0)
985 break;
986 len += nprinted;
987 if (len+begin < off) {
988 begin += len;
989 len = 0;
990 }
991 if (len+begin >= off+count)
992 break;
993 }
994 if (len+begin < off)
995 *eof = 1;
996 off -= begin;
997 *start = page + off;
998 len -= off;
999 if (len>count)
1000 len = count;
1001 if (len<0)
1002 len = 0;
1003 return len;
1004}
1005#endif
1006
1007void __init nubus_scan_bus(void) 956void __init nubus_scan_bus(void)
1008{ 957{
1009 int slot; 958 int slot;
@@ -1041,11 +990,7 @@ static int __init nubus_init(void)
1041 nubus_devices = NULL; 990 nubus_devices = NULL;
1042 nubus_boards = NULL; 991 nubus_boards = NULL;
1043 nubus_scan_bus(); 992 nubus_scan_bus();
1044
1045#ifdef CONFIG_PROC_FS
1046 create_proc_read_entry("nubus", 0, NULL, nubus_read_proc, NULL);
1047 nubus_proc_init(); 993 nubus_proc_init();
1048#endif
1049 return 0; 994 return 0;
1050} 995}
1051 996
diff --git a/drivers/nubus/proc.c b/drivers/nubus/proc.c
index 208dd12825bc..b8286ed65919 100644
--- a/drivers/nubus/proc.c
+++ b/drivers/nubus/proc.c
@@ -52,7 +52,6 @@ static int nubus_devices_proc_open(struct inode *inode, struct file *file)
52} 52}
53 53
54static const struct file_operations nubus_devices_proc_fops = { 54static const struct file_operations nubus_devices_proc_fops = {
55 .owner = THIS_MODULE,
56 .open = nubus_devices_proc_open, 55 .open = nubus_devices_proc_open,
57 .read = seq_read, 56 .read = seq_read,
58 .llseek = seq_lseek, 57 .llseek = seq_lseek,
@@ -61,6 +60,10 @@ static const struct file_operations nubus_devices_proc_fops = {
61 60
62static struct proc_dir_entry *proc_bus_nubus_dir; 61static struct proc_dir_entry *proc_bus_nubus_dir;
63 62
63static const struct file_operations nubus_proc_subdir_fops = {
64#warning Need to set some I/O handlers here
65};
66
64static void nubus_proc_subdir(struct nubus_dev* dev, 67static void nubus_proc_subdir(struct nubus_dev* dev,
65 struct proc_dir_entry* parent, 68 struct proc_dir_entry* parent,
66 struct nubus_dir* dir) 69 struct nubus_dir* dir)
@@ -73,9 +76,10 @@ static void nubus_proc_subdir(struct nubus_dev* dev,
73 struct proc_dir_entry* e; 76 struct proc_dir_entry* e;
74 77
75 sprintf(name, "%x", ent.type); 78 sprintf(name, "%x", ent.type);
76 e = create_proc_entry(name, S_IFREG | S_IRUGO | 79 e = proc_create(name, S_IFREG | S_IRUGO | S_IWUSR, parent,
77 S_IWUSR, parent); 80 &nubus_proc_subdir_fops);
78 if (!e) return; 81 if (!e)
82 return;
79 } 83 }
80} 84}
81 85
@@ -158,6 +162,73 @@ int nubus_proc_detach_device(struct nubus_dev *dev)
158} 162}
159EXPORT_SYMBOL(nubus_proc_detach_device); 163EXPORT_SYMBOL(nubus_proc_detach_device);
160 164
165/*
166 * /proc/nubus stuff
167 */
168static int nubus_proc_show(struct seq_file *m, void *v)
169{
170 const struct nubus_board *board = v;
171
172 /* Display header on line 1 */
173 if (v == SEQ_START_TOKEN)
174 seq_puts(m, "Nubus devices found:\n");
175 else
176 seq_printf(m, "Slot %X: %s\n", board->slot, board->name);
177 return 0;
178}
179
180static void *nubus_proc_start(struct seq_file *m, loff_t *_pos)
181{
182 struct nubus_board *board;
183 unsigned pos;
184
185 if (*_pos > LONG_MAX)
186 return NULL;
187 pos = *_pos;
188 if (pos == 0)
189 return SEQ_START_TOKEN;
190 for (board = nubus_boards; board; board = board->next)
191 if (--pos == 0)
192 break;
193 return board;
194}
195
196static void *nubus_proc_next(struct seq_file *p, void *v, loff_t *_pos)
197{
198 /* Walk the list of NuBus boards */
199 struct nubus_board *board = v;
200
201 ++*_pos;
202 if (v == SEQ_START_TOKEN)
203 board = nubus_boards;
204 else if (board)
205 board = board->next;
206 return board;
207}
208
209static void nubus_proc_stop(struct seq_file *p, void *v)
210{
211}
212
213static const struct seq_operations nubus_proc_seqops = {
214 .start = nubus_proc_start,
215 .next = nubus_proc_next,
216 .stop = nubus_proc_stop,
217 .show = nubus_proc_show,
218};
219
220static int nubus_proc_open(struct inode *inode, struct file *file)
221{
222 return seq_open(file, &nubus_proc_seqops);
223}
224
225static const struct file_operations nubus_proc_fops = {
226 .open = nubus_proc_open,
227 .read = seq_read,
228 .llseek = seq_lseek,
229 .release = seq_release,
230};
231
161void __init proc_bus_nubus_add_devices(void) 232void __init proc_bus_nubus_add_devices(void)
162{ 233{
163 struct nubus_dev *dev; 234 struct nubus_dev *dev;
@@ -168,6 +239,7 @@ void __init proc_bus_nubus_add_devices(void)
168 239
169void __init nubus_proc_init(void) 240void __init nubus_proc_init(void)
170{ 241{
242 proc_create("nubus", 0, NULL, &nubus_proc_fops);
171 if (!MACH_IS_MAC) 243 if (!MACH_IS_MAC)
172 return; 244 return;
173 proc_bus_nubus_dir = proc_mkdir("bus/nubus", NULL); 245 proc_bus_nubus_dir = proc_mkdir("bus/nubus", NULL);
diff --git a/drivers/of/base.c b/drivers/of/base.c
index 1733081eb873..0a2bdd106b23 100644
--- a/drivers/of/base.c
+++ b/drivers/of/base.c
@@ -1453,16 +1453,7 @@ int of_attach_node(struct device_node *np)
1453#ifdef CONFIG_PROC_DEVICETREE 1453#ifdef CONFIG_PROC_DEVICETREE
1454static void of_remove_proc_dt_entry(struct device_node *dn) 1454static void of_remove_proc_dt_entry(struct device_node *dn)
1455{ 1455{
1456 struct device_node *parent = dn->parent; 1456 proc_remove(dn->pde);
1457 struct property *prop = dn->properties;
1458
1459 while (prop) {
1460 remove_proc_entry(prop->name, dn->pde);
1461 prop = prop->next;
1462 }
1463
1464 if (dn->pde)
1465 remove_proc_entry(dn->pde->name, parent->pde);
1466} 1457}
1467#else 1458#else
1468static void of_remove_proc_dt_entry(struct device_node *dn) 1459static void of_remove_proc_dt_entry(struct device_node *dn)
diff --git a/drivers/parisc/led.c b/drivers/parisc/led.c
index d4d800c54d86..b48243131993 100644
--- a/drivers/parisc/led.c
+++ b/drivers/parisc/led.c
@@ -172,14 +172,14 @@ static int led_proc_show(struct seq_file *m, void *v)
172 172
173static int led_proc_open(struct inode *inode, struct file *file) 173static int led_proc_open(struct inode *inode, struct file *file)
174{ 174{
175 return single_open(file, led_proc_show, PDE(inode)->data); 175 return single_open(file, led_proc_show, PDE_DATA(inode));
176} 176}
177 177
178 178
179static ssize_t led_proc_write(struct file *file, const char *buf, 179static ssize_t led_proc_write(struct file *file, const char *buf,
180 size_t count, loff_t *pos) 180 size_t count, loff_t *pos)
181{ 181{
182 void *data = PDE(file_inode(file))->data; 182 void *data = PDE_DATA(file_inode(file));
183 char *cur, lbuf[32]; 183 char *cur, lbuf[32];
184 int d; 184 int d;
185 185
diff --git a/drivers/pci/proc.c b/drivers/pci/proc.c
index 0b009470e6db..08126087ec31 100644
--- a/drivers/pci/proc.c
+++ b/drivers/pci/proc.c
@@ -46,9 +46,7 @@ proc_bus_pci_lseek(struct file *file, loff_t off, int whence)
46static ssize_t 46static ssize_t
47proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) 47proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
48{ 48{
49 const struct inode *ino = file_inode(file); 49 struct pci_dev *dev = PDE_DATA(file_inode(file));
50 const struct proc_dir_entry *dp = PDE(ino);
51 struct pci_dev *dev = dp->data;
52 unsigned int pos = *ppos; 50 unsigned int pos = *ppos;
53 unsigned int cnt, size; 51 unsigned int cnt, size;
54 52
@@ -59,7 +57,7 @@ proc_bus_pci_read(struct file *file, char __user *buf, size_t nbytes, loff_t *pp
59 */ 57 */
60 58
61 if (capable(CAP_SYS_ADMIN)) 59 if (capable(CAP_SYS_ADMIN))
62 size = dp->size; 60 size = dev->cfg_size;
63 else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS) 61 else if (dev->hdr_type == PCI_HEADER_TYPE_CARDBUS)
64 size = 128; 62 size = 128;
65 else 63 else
@@ -133,10 +131,9 @@ static ssize_t
133proc_bus_pci_write(struct file *file, const char __user *buf, size_t nbytes, loff_t *ppos) 131proc_bus_pci_write(struct file *file, const char __user *buf, size_t nbytes, loff_t *ppos)
134{ 132{
135 struct inode *ino = file_inode(file); 133 struct inode *ino = file_inode(file);
136 const struct proc_dir_entry *dp = PDE(ino); 134 struct pci_dev *dev = PDE_DATA(ino);
137 struct pci_dev *dev = dp->data;
138 int pos = *ppos; 135 int pos = *ppos;
139 int size = dp->size; 136 int size = dev->cfg_size;
140 int cnt; 137 int cnt;
141 138
142 if (pos >= size) 139 if (pos >= size)
@@ -200,7 +197,7 @@ proc_bus_pci_write(struct file *file, const char __user *buf, size_t nbytes, lof
200 pci_config_pm_runtime_put(dev); 197 pci_config_pm_runtime_put(dev);
201 198
202 *ppos = pos; 199 *ppos = pos;
203 i_size_write(ino, dp->size); 200 i_size_write(ino, dev->cfg_size);
204 return nbytes; 201 return nbytes;
205} 202}
206 203
@@ -212,8 +209,7 @@ struct pci_filp_private {
212static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd, 209static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,
213 unsigned long arg) 210 unsigned long arg)
214{ 211{
215 const struct proc_dir_entry *dp = PDE(file_inode(file)); 212 struct pci_dev *dev = PDE_DATA(file_inode(file));
216 struct pci_dev *dev = dp->data;
217#ifdef HAVE_PCI_MMAP 213#ifdef HAVE_PCI_MMAP
218 struct pci_filp_private *fpriv = file->private_data; 214 struct pci_filp_private *fpriv = file->private_data;
219#endif /* HAVE_PCI_MMAP */ 215#endif /* HAVE_PCI_MMAP */
@@ -253,9 +249,7 @@ static long proc_bus_pci_ioctl(struct file *file, unsigned int cmd,
253#ifdef HAVE_PCI_MMAP 249#ifdef HAVE_PCI_MMAP
254static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma) 250static int proc_bus_pci_mmap(struct file *file, struct vm_area_struct *vma)
255{ 251{
256 struct inode *inode = file_inode(file); 252 struct pci_dev *dev = PDE_DATA(file_inode(file));
257 const struct proc_dir_entry *dp = PDE(inode);
258 struct pci_dev *dev = dp->data;
259 struct pci_filp_private *fpriv = file->private_data; 253 struct pci_filp_private *fpriv = file->private_data;
260 int i, ret; 254 int i, ret;
261 255
@@ -425,7 +419,7 @@ int pci_proc_attach_device(struct pci_dev *dev)
425 &proc_bus_pci_operations, dev); 419 &proc_bus_pci_operations, dev);
426 if (!e) 420 if (!e)
427 return -ENOMEM; 421 return -ENOMEM;
428 e->size = dev->cfg_size; 422 proc_set_size(e, dev->cfg_size);
429 dev->procent = e; 423 dev->procent = e;
430 424
431 return 0; 425 return 0;
@@ -433,20 +427,14 @@ int pci_proc_attach_device(struct pci_dev *dev)
433 427
434int pci_proc_detach_device(struct pci_dev *dev) 428int pci_proc_detach_device(struct pci_dev *dev)
435{ 429{
436 struct proc_dir_entry *e; 430 proc_remove(dev->procent);
437 431 dev->procent = NULL;
438 if ((e = dev->procent)) {
439 remove_proc_entry(e->name, dev->bus->procdir);
440 dev->procent = NULL;
441 }
442 return 0; 432 return 0;
443} 433}
444 434
445int pci_proc_detach_bus(struct pci_bus* bus) 435int pci_proc_detach_bus(struct pci_bus* bus)
446{ 436{
447 struct proc_dir_entry *de = bus->procdir; 437 proc_remove(bus->procdir);
448 if (de)
449 remove_proc_entry(de->name, proc_bus_pci_dir);
450 return 0; 438 return 0;
451} 439}
452 440
diff --git a/drivers/platform/x86/thinkpad_acpi.c b/drivers/platform/x86/thinkpad_acpi.c
index edec135b1685..54d31c0a9840 100644
--- a/drivers/platform/x86/thinkpad_acpi.c
+++ b/drivers/platform/x86/thinkpad_acpi.c
@@ -844,14 +844,14 @@ static int dispatch_proc_show(struct seq_file *m, void *v)
844 844
845static int dispatch_proc_open(struct inode *inode, struct file *file) 845static int dispatch_proc_open(struct inode *inode, struct file *file)
846{ 846{
847 return single_open(file, dispatch_proc_show, PDE(inode)->data); 847 return single_open(file, dispatch_proc_show, PDE_DATA(inode));
848} 848}
849 849
850static ssize_t dispatch_proc_write(struct file *file, 850static ssize_t dispatch_proc_write(struct file *file,
851 const char __user *userbuf, 851 const char __user *userbuf,
852 size_t count, loff_t *pos) 852 size_t count, loff_t *pos)
853{ 853{
854 struct ibm_struct *ibm = PDE(file_inode(file))->data; 854 struct ibm_struct *ibm = PDE_DATA(file_inode(file));
855 char *kernbuf; 855 char *kernbuf;
856 int ret; 856 int ret;
857 857
diff --git a/drivers/platform/x86/toshiba_acpi.c b/drivers/platform/x86/toshiba_acpi.c
index 242abac62d8b..eb3467ea6d86 100644
--- a/drivers/platform/x86/toshiba_acpi.c
+++ b/drivers/platform/x86/toshiba_acpi.c
@@ -553,7 +553,7 @@ static int lcd_proc_show(struct seq_file *m, void *v)
553 553
554static int lcd_proc_open(struct inode *inode, struct file *file) 554static int lcd_proc_open(struct inode *inode, struct file *file)
555{ 555{
556 return single_open(file, lcd_proc_show, PDE(inode)->data); 556 return single_open(file, lcd_proc_show, PDE_DATA(inode));
557} 557}
558 558
559static int set_lcd_brightness(struct toshiba_acpi_dev *dev, int value) 559static int set_lcd_brightness(struct toshiba_acpi_dev *dev, int value)
@@ -583,7 +583,7 @@ static int set_lcd_status(struct backlight_device *bd)
583static ssize_t lcd_proc_write(struct file *file, const char __user *buf, 583static ssize_t lcd_proc_write(struct file *file, const char __user *buf,
584 size_t count, loff_t *pos) 584 size_t count, loff_t *pos)
585{ 585{
586 struct toshiba_acpi_dev *dev = PDE(file_inode(file))->data; 586 struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
587 char cmd[42]; 587 char cmd[42];
588 size_t len; 588 size_t len;
589 int value; 589 int value;
@@ -644,13 +644,13 @@ static int video_proc_show(struct seq_file *m, void *v)
644 644
645static int video_proc_open(struct inode *inode, struct file *file) 645static int video_proc_open(struct inode *inode, struct file *file)
646{ 646{
647 return single_open(file, video_proc_show, PDE(inode)->data); 647 return single_open(file, video_proc_show, PDE_DATA(inode));
648} 648}
649 649
650static ssize_t video_proc_write(struct file *file, const char __user *buf, 650static ssize_t video_proc_write(struct file *file, const char __user *buf,
651 size_t count, loff_t *pos) 651 size_t count, loff_t *pos)
652{ 652{
653 struct toshiba_acpi_dev *dev = PDE(file_inode(file))->data; 653 struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
654 char *cmd, *buffer; 654 char *cmd, *buffer;
655 int ret; 655 int ret;
656 int value; 656 int value;
@@ -744,13 +744,13 @@ static int fan_proc_show(struct seq_file *m, void *v)
744 744
745static int fan_proc_open(struct inode *inode, struct file *file) 745static int fan_proc_open(struct inode *inode, struct file *file)
746{ 746{
747 return single_open(file, fan_proc_show, PDE(inode)->data); 747 return single_open(file, fan_proc_show, PDE_DATA(inode));
748} 748}
749 749
750static ssize_t fan_proc_write(struct file *file, const char __user *buf, 750static ssize_t fan_proc_write(struct file *file, const char __user *buf,
751 size_t count, loff_t *pos) 751 size_t count, loff_t *pos)
752{ 752{
753 struct toshiba_acpi_dev *dev = PDE(file_inode(file))->data; 753 struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
754 char cmd[42]; 754 char cmd[42];
755 size_t len; 755 size_t len;
756 int value; 756 int value;
@@ -816,13 +816,13 @@ static int keys_proc_show(struct seq_file *m, void *v)
816 816
817static int keys_proc_open(struct inode *inode, struct file *file) 817static int keys_proc_open(struct inode *inode, struct file *file)
818{ 818{
819 return single_open(file, keys_proc_show, PDE(inode)->data); 819 return single_open(file, keys_proc_show, PDE_DATA(inode));
820} 820}
821 821
822static ssize_t keys_proc_write(struct file *file, const char __user *buf, 822static ssize_t keys_proc_write(struct file *file, const char __user *buf,
823 size_t count, loff_t *pos) 823 size_t count, loff_t *pos)
824{ 824{
825 struct toshiba_acpi_dev *dev = PDE(file_inode(file))->data; 825 struct toshiba_acpi_dev *dev = PDE_DATA(file_inode(file));
826 char cmd[42]; 826 char cmd[42];
827 size_t len; 827 size_t len;
828 int value; 828 int value;
@@ -859,7 +859,7 @@ static int version_proc_show(struct seq_file *m, void *v)
859 859
860static int version_proc_open(struct inode *inode, struct file *file) 860static int version_proc_open(struct inode *inode, struct file *file)
861{ 861{
862 return single_open(file, version_proc_show, PDE(inode)->data); 862 return single_open(file, version_proc_show, PDE_DATA(inode));
863} 863}
864 864
865static const struct file_operations version_proc_fops = { 865static const struct file_operations version_proc_fops = {
diff --git a/drivers/pnp/isapnp/proc.c b/drivers/pnp/isapnp/proc.c
index 65f735ac6b3b..2365ef37ae24 100644
--- a/drivers/pnp/isapnp/proc.c
+++ b/drivers/pnp/isapnp/proc.c
@@ -55,9 +55,7 @@ static loff_t isapnp_proc_bus_lseek(struct file *file, loff_t off, int whence)
55static ssize_t isapnp_proc_bus_read(struct file *file, char __user * buf, 55static ssize_t isapnp_proc_bus_read(struct file *file, char __user * buf,
56 size_t nbytes, loff_t * ppos) 56 size_t nbytes, loff_t * ppos)
57{ 57{
58 struct inode *ino = file_inode(file); 58 struct pnp_dev *dev = PDE_DATA(file_inode(file));
59 struct proc_dir_entry *dp = PDE(ino);
60 struct pnp_dev *dev = dp->data;
61 int pos = *ppos; 59 int pos = *ppos;
62 int cnt, size = 256; 60 int cnt, size = 256;
63 61
@@ -107,7 +105,7 @@ static int isapnp_proc_attach_device(struct pnp_dev *dev)
107 &isapnp_proc_bus_file_operations, dev); 105 &isapnp_proc_bus_file_operations, dev);
108 if (!e) 106 if (!e)
109 return -ENOMEM; 107 return -ENOMEM;
110 e->size = 256; 108 proc_set_size(e, 256);
111 return 0; 109 return 0;
112} 110}
113 111
diff --git a/drivers/pnp/pnpbios/proc.c b/drivers/pnp/pnpbios/proc.c
index 1c03ee822e50..c212db0fc65d 100644
--- a/drivers/pnp/pnpbios/proc.c
+++ b/drivers/pnp/pnpbios/proc.c
@@ -237,13 +237,13 @@ static int pnpbios_proc_show(struct seq_file *m, void *v)
237 237
238static int pnpbios_proc_open(struct inode *inode, struct file *file) 238static int pnpbios_proc_open(struct inode *inode, struct file *file)
239{ 239{
240 return single_open(file, pnpbios_proc_show, PDE(inode)->data); 240 return single_open(file, pnpbios_proc_show, PDE_DATA(inode));
241} 241}
242 242
243static ssize_t pnpbios_proc_write(struct file *file, const char __user *buf, 243static ssize_t pnpbios_proc_write(struct file *file, const char __user *buf,
244 size_t count, loff_t *pos) 244 size_t count, loff_t *pos)
245{ 245{
246 void *data = PDE(file_inode(file))->data; 246 void *data = PDE_DATA(file_inode(file));
247 struct pnp_bios_node *node; 247 struct pnp_bios_node *node;
248 int boot = (long)data >> 8; 248 int boot = (long)data >> 8;
249 u8 nodenum = (long)data; 249 u8 nodenum = (long)data;
diff --git a/drivers/pps/clients/pps_parport.c b/drivers/pps/clients/pps_parport.c
index e1b4705ae3ec..38a8bbe74810 100644
--- a/drivers/pps/clients/pps_parport.c
+++ b/drivers/pps/clients/pps_parport.c
@@ -32,6 +32,7 @@
32#include <linux/init.h> 32#include <linux/init.h>
33#include <linux/irqnr.h> 33#include <linux/irqnr.h>
34#include <linux/time.h> 34#include <linux/time.h>
35#include <linux/slab.h>
35#include <linux/parport.h> 36#include <linux/parport.h>
36#include <linux/pps_kernel.h> 37#include <linux/pps_kernel.h>
37 38
diff --git a/drivers/rtc/rtc-proc.c b/drivers/rtc/rtc-proc.c
index e96236ac2e78..ffa69e1c9245 100644
--- a/drivers/rtc/rtc-proc.c
+++ b/drivers/rtc/rtc-proc.c
@@ -110,7 +110,7 @@ static int rtc_proc_show(struct seq_file *seq, void *offset)
110static int rtc_proc_open(struct inode *inode, struct file *file) 110static int rtc_proc_open(struct inode *inode, struct file *file)
111{ 111{
112 int ret; 112 int ret;
113 struct rtc_device *rtc = PDE(inode)->data; 113 struct rtc_device *rtc = PDE_DATA(inode);
114 114
115 if (!try_module_get(THIS_MODULE)) 115 if (!try_module_get(THIS_MODULE))
116 return -ENODEV; 116 return -ENODEV;
diff --git a/drivers/s390/cio/qdio_debug.c b/drivers/s390/cio/qdio_debug.c
index ccaae9d63d27..4221b02085ad 100644
--- a/drivers/s390/cio/qdio_debug.c
+++ b/drivers/s390/cio/qdio_debug.c
@@ -224,7 +224,7 @@ static int qperf_seq_open(struct inode *inode, struct file *filp)
224 file_inode(filp)->i_private); 224 file_inode(filp)->i_private);
225} 225}
226 226
227static struct file_operations debugfs_perf_fops = { 227static const struct file_operations debugfs_perf_fops = {
228 .owner = THIS_MODULE, 228 .owner = THIS_MODULE,
229 .open = qperf_seq_open, 229 .open = qperf_seq_open,
230 .read = seq_read, 230 .read = seq_read,
diff --git a/drivers/scsi/BusLogic.c b/drivers/scsi/BusLogic.c
index d7ca247efa35..344d87599cd2 100644
--- a/drivers/scsi/BusLogic.c
+++ b/drivers/scsi/BusLogic.c
@@ -3201,26 +3201,30 @@ static int BusLogic_BIOSDiskParameters(struct scsi_device *sdev, struct block_de
3201 BugLogic_ProcDirectoryInfo implements /proc/scsi/BusLogic/<N>. 3201 BugLogic_ProcDirectoryInfo implements /proc/scsi/BusLogic/<N>.
3202*/ 3202*/
3203 3203
3204static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *shost, char *ProcBuffer, char **StartPointer, off_t Offset, int BytesAvailable, int WriteFlag) 3204static int BusLogic_write_info(struct Scsi_Host *shost, char *ProcBuffer, int BytesAvailable)
3205{ 3205{
3206 struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) shost->hostdata; 3206 struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) shost->hostdata;
3207 struct BusLogic_TargetStatistics *TargetStatistics; 3207 struct BusLogic_TargetStatistics *TargetStatistics;
3208 int TargetID, Length;
3209 char *Buffer;
3210 3208
3211 TargetStatistics = HostAdapter->TargetStatistics; 3209 TargetStatistics = HostAdapter->TargetStatistics;
3212 if (WriteFlag) { 3210 HostAdapter->ExternalHostAdapterResets = 0;
3213 HostAdapter->ExternalHostAdapterResets = 0; 3211 HostAdapter->HostAdapterInternalErrors = 0;
3214 HostAdapter->HostAdapterInternalErrors = 0; 3212 memset(TargetStatistics, 0, BusLogic_MaxTargetDevices * sizeof(struct BusLogic_TargetStatistics));
3215 memset(TargetStatistics, 0, BusLogic_MaxTargetDevices * sizeof(struct BusLogic_TargetStatistics)); 3213 return 0;
3216 return 0; 3214}
3217 } 3215
3218 Buffer = HostAdapter->MessageBuffer; 3216static int BusLogic_show_info(struct seq_file *m, struct Scsi_Host *shost)
3219 Length = HostAdapter->MessageBufferLength; 3217{
3220 Length += sprintf(&Buffer[Length], "\n\ 3218 struct BusLogic_HostAdapter *HostAdapter = (struct BusLogic_HostAdapter *) shost->hostdata;
3219 struct BusLogic_TargetStatistics *TargetStatistics;
3220 int TargetID;
3221
3222 TargetStatistics = HostAdapter->TargetStatistics;
3223 seq_write(m, HostAdapter->MessageBuffer, HostAdapter->MessageBufferLength);
3224 seq_printf(m, "\n\
3221Current Driver Queue Depth: %d\n\ 3225Current Driver Queue Depth: %d\n\
3222Currently Allocated CCBs: %d\n", HostAdapter->DriverQueueDepth, HostAdapter->AllocatedCCBs); 3226Currently Allocated CCBs: %d\n", HostAdapter->DriverQueueDepth, HostAdapter->AllocatedCCBs);
3223 Length += sprintf(&Buffer[Length], "\n\n\ 3227 seq_printf(m, "\n\n\
3224 DATA TRANSFER STATISTICS\n\ 3228 DATA TRANSFER STATISTICS\n\
3225\n\ 3229\n\
3226Target Tagged Queuing Queue Depth Active Attempted Completed\n\ 3230Target Tagged Queuing Queue Depth Active Attempted Completed\n\
@@ -3229,66 +3233,62 @@ Target Tagged Queuing Queue Depth Active Attempted Completed\n\
3229 struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID]; 3233 struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];
3230 if (!TargetFlags->TargetExists) 3234 if (!TargetFlags->TargetExists)
3231 continue; 3235 continue;
3232 Length += sprintf(&Buffer[Length], " %2d %s", TargetID, (TargetFlags->TaggedQueuingSupported ? (TargetFlags->TaggedQueuingActive ? " Active" : (HostAdapter->TaggedQueuingPermitted & (1 << TargetID) 3236 seq_printf(m, " %2d %s", TargetID, (TargetFlags->TaggedQueuingSupported ? (TargetFlags->TaggedQueuingActive ? " Active" : (HostAdapter->TaggedQueuingPermitted & (1 << TargetID)
3233 ? " Permitted" : " Disabled")) 3237 ? " Permitted" : " Disabled"))
3234 : "Not Supported")); 3238 : "Not Supported"));
3235 Length += sprintf(&Buffer[Length], 3239 seq_printf(m,
3236 " %3d %3u %9u %9u\n", HostAdapter->QueueDepth[TargetID], HostAdapter->ActiveCommands[TargetID], TargetStatistics[TargetID].CommandsAttempted, TargetStatistics[TargetID].CommandsCompleted); 3240 " %3d %3u %9u %9u\n", HostAdapter->QueueDepth[TargetID], HostAdapter->ActiveCommands[TargetID], TargetStatistics[TargetID].CommandsAttempted, TargetStatistics[TargetID].CommandsCompleted);
3237 } 3241 }
3238 Length += sprintf(&Buffer[Length], "\n\ 3242 seq_printf(m, "\n\
3239Target Read Commands Write Commands Total Bytes Read Total Bytes Written\n\ 3243Target Read Commands Write Commands Total Bytes Read Total Bytes Written\n\
3240====== ============= ============== =================== ===================\n"); 3244====== ============= ============== =================== ===================\n");
3241 for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) { 3245 for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {
3242 struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID]; 3246 struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];
3243 if (!TargetFlags->TargetExists) 3247 if (!TargetFlags->TargetExists)
3244 continue; 3248 continue;
3245 Length += sprintf(&Buffer[Length], " %2d %9u %9u", TargetID, TargetStatistics[TargetID].ReadCommands, TargetStatistics[TargetID].WriteCommands); 3249 seq_printf(m, " %2d %9u %9u", TargetID, TargetStatistics[TargetID].ReadCommands, TargetStatistics[TargetID].WriteCommands);
3246 if (TargetStatistics[TargetID].TotalBytesRead.Billions > 0) 3250 if (TargetStatistics[TargetID].TotalBytesRead.Billions > 0)
3247 Length += sprintf(&Buffer[Length], " %9u%09u", TargetStatistics[TargetID].TotalBytesRead.Billions, TargetStatistics[TargetID].TotalBytesRead.Units); 3251 seq_printf(m, " %9u%09u", TargetStatistics[TargetID].TotalBytesRead.Billions, TargetStatistics[TargetID].TotalBytesRead.Units);
3248 else 3252 else
3249 Length += sprintf(&Buffer[Length], " %9u", TargetStatistics[TargetID].TotalBytesRead.Units); 3253 seq_printf(m, " %9u", TargetStatistics[TargetID].TotalBytesRead.Units);
3250 if (TargetStatistics[TargetID].TotalBytesWritten.Billions > 0) 3254 if (TargetStatistics[TargetID].TotalBytesWritten.Billions > 0)
3251 Length += sprintf(&Buffer[Length], " %9u%09u\n", TargetStatistics[TargetID].TotalBytesWritten.Billions, TargetStatistics[TargetID].TotalBytesWritten.Units); 3255 seq_printf(m, " %9u%09u\n", TargetStatistics[TargetID].TotalBytesWritten.Billions, TargetStatistics[TargetID].TotalBytesWritten.Units);
3252 else 3256 else
3253 Length += sprintf(&Buffer[Length], " %9u\n", TargetStatistics[TargetID].TotalBytesWritten.Units); 3257 seq_printf(m, " %9u\n", TargetStatistics[TargetID].TotalBytesWritten.Units);
3254 } 3258 }
3255 Length += sprintf(&Buffer[Length], "\n\ 3259 seq_printf(m, "\n\
3256Target Command 0-1KB 1-2KB 2-4KB 4-8KB 8-16KB\n\ 3260Target Command 0-1KB 1-2KB 2-4KB 4-8KB 8-16KB\n\
3257====== ======= ========= ========= ========= ========= =========\n"); 3261====== ======= ========= ========= ========= ========= =========\n");
3258 for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) { 3262 for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {
3259 struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID]; 3263 struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];
3260 if (!TargetFlags->TargetExists) 3264 if (!TargetFlags->TargetExists)
3261 continue; 3265 continue;
3262 Length += 3266 seq_printf(m,
3263 sprintf(&Buffer[Length],
3264 " %2d Read %9u %9u %9u %9u %9u\n", TargetID, 3267 " %2d Read %9u %9u %9u %9u %9u\n", TargetID,
3265 TargetStatistics[TargetID].ReadCommandSizeBuckets[0], 3268 TargetStatistics[TargetID].ReadCommandSizeBuckets[0],
3266 TargetStatistics[TargetID].ReadCommandSizeBuckets[1], TargetStatistics[TargetID].ReadCommandSizeBuckets[2], TargetStatistics[TargetID].ReadCommandSizeBuckets[3], TargetStatistics[TargetID].ReadCommandSizeBuckets[4]); 3269 TargetStatistics[TargetID].ReadCommandSizeBuckets[1], TargetStatistics[TargetID].ReadCommandSizeBuckets[2], TargetStatistics[TargetID].ReadCommandSizeBuckets[3], TargetStatistics[TargetID].ReadCommandSizeBuckets[4]);
3267 Length += 3270 seq_printf(m,
3268 sprintf(&Buffer[Length],
3269 " %2d Write %9u %9u %9u %9u %9u\n", TargetID, 3271 " %2d Write %9u %9u %9u %9u %9u\n", TargetID,
3270 TargetStatistics[TargetID].WriteCommandSizeBuckets[0], 3272 TargetStatistics[TargetID].WriteCommandSizeBuckets[0],
3271 TargetStatistics[TargetID].WriteCommandSizeBuckets[1], TargetStatistics[TargetID].WriteCommandSizeBuckets[2], TargetStatistics[TargetID].WriteCommandSizeBuckets[3], TargetStatistics[TargetID].WriteCommandSizeBuckets[4]); 3273 TargetStatistics[TargetID].WriteCommandSizeBuckets[1], TargetStatistics[TargetID].WriteCommandSizeBuckets[2], TargetStatistics[TargetID].WriteCommandSizeBuckets[3], TargetStatistics[TargetID].WriteCommandSizeBuckets[4]);
3272 } 3274 }
3273 Length += sprintf(&Buffer[Length], "\n\ 3275 seq_printf(m, "\n\
3274Target Command 16-32KB 32-64KB 64-128KB 128-256KB 256KB+\n\ 3276Target Command 16-32KB 32-64KB 64-128KB 128-256KB 256KB+\n\
3275====== ======= ========= ========= ========= ========= =========\n"); 3277====== ======= ========= ========= ========= ========= =========\n");
3276 for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) { 3278 for (TargetID = 0; TargetID < HostAdapter->MaxTargetDevices; TargetID++) {
3277 struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID]; 3279 struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];
3278 if (!TargetFlags->TargetExists) 3280 if (!TargetFlags->TargetExists)
3279 continue; 3281 continue;
3280 Length += 3282 seq_printf(m,
3281 sprintf(&Buffer[Length],
3282 " %2d Read %9u %9u %9u %9u %9u\n", TargetID, 3283 " %2d Read %9u %9u %9u %9u %9u\n", TargetID,
3283 TargetStatistics[TargetID].ReadCommandSizeBuckets[5], 3284 TargetStatistics[TargetID].ReadCommandSizeBuckets[5],
3284 TargetStatistics[TargetID].ReadCommandSizeBuckets[6], TargetStatistics[TargetID].ReadCommandSizeBuckets[7], TargetStatistics[TargetID].ReadCommandSizeBuckets[8], TargetStatistics[TargetID].ReadCommandSizeBuckets[9]); 3285 TargetStatistics[TargetID].ReadCommandSizeBuckets[6], TargetStatistics[TargetID].ReadCommandSizeBuckets[7], TargetStatistics[TargetID].ReadCommandSizeBuckets[8], TargetStatistics[TargetID].ReadCommandSizeBuckets[9]);
3285 Length += 3286 seq_printf(m,
3286 sprintf(&Buffer[Length],
3287 " %2d Write %9u %9u %9u %9u %9u\n", TargetID, 3287 " %2d Write %9u %9u %9u %9u %9u\n", TargetID,
3288 TargetStatistics[TargetID].WriteCommandSizeBuckets[5], 3288 TargetStatistics[TargetID].WriteCommandSizeBuckets[5],
3289 TargetStatistics[TargetID].WriteCommandSizeBuckets[6], TargetStatistics[TargetID].WriteCommandSizeBuckets[7], TargetStatistics[TargetID].WriteCommandSizeBuckets[8], TargetStatistics[TargetID].WriteCommandSizeBuckets[9]); 3289 TargetStatistics[TargetID].WriteCommandSizeBuckets[6], TargetStatistics[TargetID].WriteCommandSizeBuckets[7], TargetStatistics[TargetID].WriteCommandSizeBuckets[8], TargetStatistics[TargetID].WriteCommandSizeBuckets[9]);
3290 } 3290 }
3291 Length += sprintf(&Buffer[Length], "\n\n\ 3291 seq_printf(m, "\n\n\
3292 ERROR RECOVERY STATISTICS\n\ 3292 ERROR RECOVERY STATISTICS\n\
3293\n\ 3293\n\
3294 Command Aborts Bus Device Resets Host Adapter Resets\n\ 3294 Command Aborts Bus Device Resets Host Adapter Resets\n\
@@ -3299,20 +3299,12 @@ Target Requested Completed Requested Completed Requested Completed\n\
3299 struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID]; 3299 struct BusLogic_TargetFlags *TargetFlags = &HostAdapter->TargetFlags[TargetID];
3300 if (!TargetFlags->TargetExists) 3300 if (!TargetFlags->TargetExists)
3301 continue; 3301 continue;
3302 Length += sprintf(&Buffer[Length], "\ 3302 seq_printf(m, "\
3303 %2d %5d %5d %5d %5d %5d %5d %5d %5d %5d\n", TargetID, TargetStatistics[TargetID].CommandAbortsRequested, TargetStatistics[TargetID].CommandAbortsAttempted, TargetStatistics[TargetID].CommandAbortsCompleted, TargetStatistics[TargetID].BusDeviceResetsRequested, TargetStatistics[TargetID].BusDeviceResetsAttempted, TargetStatistics[TargetID].BusDeviceResetsCompleted, TargetStatistics[TargetID].HostAdapterResetsRequested, TargetStatistics[TargetID].HostAdapterResetsAttempted, TargetStatistics[TargetID].HostAdapterResetsCompleted); 3303 %2d %5d %5d %5d %5d %5d %5d %5d %5d %5d\n", TargetID, TargetStatistics[TargetID].CommandAbortsRequested, TargetStatistics[TargetID].CommandAbortsAttempted, TargetStatistics[TargetID].CommandAbortsCompleted, TargetStatistics[TargetID].BusDeviceResetsRequested, TargetStatistics[TargetID].BusDeviceResetsAttempted, TargetStatistics[TargetID].BusDeviceResetsCompleted, TargetStatistics[TargetID].HostAdapterResetsRequested, TargetStatistics[TargetID].HostAdapterResetsAttempted, TargetStatistics[TargetID].HostAdapterResetsCompleted);
3304 } 3304 }
3305 Length += sprintf(&Buffer[Length], "\nExternal Host Adapter Resets: %d\n", HostAdapter->ExternalHostAdapterResets); 3305 seq_printf(m, "\nExternal Host Adapter Resets: %d\n", HostAdapter->ExternalHostAdapterResets);
3306 Length += sprintf(&Buffer[Length], "Host Adapter Internal Errors: %d\n", HostAdapter->HostAdapterInternalErrors); 3306 seq_printf(m, "Host Adapter Internal Errors: %d\n", HostAdapter->HostAdapterInternalErrors);
3307 if (Length >= BusLogic_MessageBufferSize) 3307 return 0;
3308 BusLogic_Error("Message Buffer length %d exceeds size %d\n", HostAdapter, Length, BusLogic_MessageBufferSize);
3309 if ((Length -= Offset) <= 0)
3310 return 0;
3311 if (Length >= BytesAvailable)
3312 Length = BytesAvailable;
3313 memcpy(ProcBuffer, HostAdapter->MessageBuffer + Offset, Length);
3314 *StartPointer = ProcBuffer;
3315 return Length;
3316} 3308}
3317 3309
3318 3310
@@ -3566,7 +3558,8 @@ static int __init BusLogic_ParseDriverOptions(char *OptionsString)
3566static struct scsi_host_template Bus_Logic_template = { 3558static struct scsi_host_template Bus_Logic_template = {
3567 .module = THIS_MODULE, 3559 .module = THIS_MODULE,
3568 .proc_name = "BusLogic", 3560 .proc_name = "BusLogic",
3569 .proc_info = BusLogic_ProcDirectoryInfo, 3561 .write_info = BusLogic_write_info,
3562 .show_info = BusLogic_show_info,
3570 .name = "BusLogic", 3563 .name = "BusLogic",
3571 .info = BusLogic_DriverInfo, 3564 .info = BusLogic_DriverInfo,
3572 .queuecommand = BusLogic_QueueCommand, 3565 .queuecommand = BusLogic_QueueCommand,
diff --git a/drivers/scsi/BusLogic.h b/drivers/scsi/BusLogic.h
index 649fcb31f26d..6c6c13c3be1b 100644
--- a/drivers/scsi/BusLogic.h
+++ b/drivers/scsi/BusLogic.h
@@ -1321,7 +1321,6 @@ static inline void BusLogic_IncrementSizeBucket(BusLogic_CommandSizeBuckets_T Co
1321static const char *BusLogic_DriverInfo(struct Scsi_Host *); 1321static const char *BusLogic_DriverInfo(struct Scsi_Host *);
1322static int BusLogic_QueueCommand(struct Scsi_Host *h, struct scsi_cmnd *); 1322static int BusLogic_QueueCommand(struct Scsi_Host *h, struct scsi_cmnd *);
1323static int BusLogic_BIOSDiskParameters(struct scsi_device *, struct block_device *, sector_t, int *); 1323static int BusLogic_BIOSDiskParameters(struct scsi_device *, struct block_device *, sector_t, int *);
1324static int BusLogic_ProcDirectoryInfo(struct Scsi_Host *, char *, char **, off_t, int, int);
1325static int BusLogic_SlaveConfigure(struct scsi_device *); 1324static int BusLogic_SlaveConfigure(struct scsi_device *);
1326static void BusLogic_QueueCompletedCCB(struct BusLogic_CCB *); 1325static void BusLogic_QueueCompletedCCB(struct BusLogic_CCB *);
1327static irqreturn_t BusLogic_InterruptHandler(int, void *); 1326static irqreturn_t BusLogic_InterruptHandler(int, void *);
diff --git a/drivers/scsi/NCR5380.c b/drivers/scsi/NCR5380.c
index 450353e04dde..1e9d6ad9302b 100644
--- a/drivers/scsi/NCR5380.c
+++ b/drivers/scsi/NCR5380.c
@@ -695,33 +695,35 @@ static void NCR5380_print_status(struct Scsi_Host *instance)
695 * Return the number of bytes read from or written 695 * Return the number of bytes read from or written
696 */ 696 */
697 697
698static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance,
699 char *buffer, int length)
700{
701#ifdef DTC_PUBLIC_RELEASE
702 dtc_wmaxi = dtc_maxi = 0;
703#endif
704#ifdef PAS16_PUBLIC_RELEASE
705 pas_wmaxi = pas_maxi = 0;
706#endif
707 return (-ENOSYS); /* Currently this is a no-op */
708}
709
698#undef SPRINTF 710#undef SPRINTF
699#define SPRINTF(args...) do { if(pos < buffer + length-80) pos += sprintf(pos, ## args); } while(0) 711#define SPRINTF(args...) seq_printf(m, ## args)
700static 712static
701char *lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, char *pos, char *buffer, int length); 713void lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, struct seq_file *m);
702static 714static
703char *lprint_command(unsigned char *cmd, char *pos, char *buffer, int len); 715void lprint_command(unsigned char *cmd, struct seq_file *m);
704static 716static
705char *lprint_opcode(int opcode, char *pos, char *buffer, int length); 717void lprint_opcode(int opcode, struct seq_file *m);
706 718
707static int __maybe_unused NCR5380_proc_info(struct Scsi_Host *instance, 719static int __maybe_unused NCR5380_show_info(struct seq_file *m,
708 char *buffer, char **start, off_t offset, int length, int inout) 720 struct Scsi_Host *instance)
709{ 721{
710 char *pos = buffer;
711 struct NCR5380_hostdata *hostdata; 722 struct NCR5380_hostdata *hostdata;
712 Scsi_Cmnd *ptr; 723 Scsi_Cmnd *ptr;
713 724
714 hostdata = (struct NCR5380_hostdata *) instance->hostdata; 725 hostdata = (struct NCR5380_hostdata *) instance->hostdata;
715 726
716 if (inout) { /* Has data been written to the file ? */
717#ifdef DTC_PUBLIC_RELEASE
718 dtc_wmaxi = dtc_maxi = 0;
719#endif
720#ifdef PAS16_PUBLIC_RELEASE
721 pas_wmaxi = pas_maxi = 0;
722#endif
723 return (-ENOSYS); /* Currently this is a no-op */
724 }
725 SPRINTF("NCR5380 core release=%d. ", NCR5380_PUBLIC_RELEASE); 727 SPRINTF("NCR5380 core release=%d. ", NCR5380_PUBLIC_RELEASE);
726 if (((struct NCR5380_hostdata *) instance->hostdata)->flags & FLAG_NCR53C400) 728 if (((struct NCR5380_hostdata *) instance->hostdata)->flags & FLAG_NCR53C400)
727 SPRINTF("ncr53c400 release=%d. ", NCR53C400_PUBLIC_RELEASE); 729 SPRINTF("ncr53c400 release=%d. ", NCR53C400_PUBLIC_RELEASE);
@@ -755,46 +757,37 @@ static int __maybe_unused NCR5380_proc_info(struct Scsi_Host *instance,
755 if (!hostdata->connected) 757 if (!hostdata->connected)
756 SPRINTF("scsi%d: no currently connected command\n", instance->host_no); 758 SPRINTF("scsi%d: no currently connected command\n", instance->host_no);
757 else 759 else
758 pos = lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, pos, buffer, length); 760 lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, m);
759 SPRINTF("scsi%d: issue_queue\n", instance->host_no); 761 SPRINTF("scsi%d: issue_queue\n", instance->host_no);
760 for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble) 762 for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
761 pos = lprint_Scsi_Cmnd(ptr, pos, buffer, length); 763 lprint_Scsi_Cmnd(ptr, m);
762 764
763 SPRINTF("scsi%d: disconnected_queue\n", instance->host_no); 765 SPRINTF("scsi%d: disconnected_queue\n", instance->host_no);
764 for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble) 766 for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
765 pos = lprint_Scsi_Cmnd(ptr, pos, buffer, length); 767 lprint_Scsi_Cmnd(ptr, m);
766 spin_unlock_irq(instance->host_lock); 768 spin_unlock_irq(instance->host_lock);
767 769 return 0;
768 *start = buffer;
769 if (pos - buffer < offset)
770 return 0;
771 else if (pos - buffer - offset < length)
772 return pos - buffer - offset;
773 return length;
774} 770}
775 771
776static char *lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, char *pos, char *buffer, int length) 772static void lprint_Scsi_Cmnd(Scsi_Cmnd * cmd, struct seq_file *m)
777{ 773{
778 SPRINTF("scsi%d : destination target %d, lun %d\n", cmd->device->host->host_no, cmd->device->id, cmd->device->lun); 774 SPRINTF("scsi%d : destination target %d, lun %d\n", cmd->device->host->host_no, cmd->device->id, cmd->device->lun);
779 SPRINTF(" command = "); 775 SPRINTF(" command = ");
780 pos = lprint_command(cmd->cmnd, pos, buffer, length); 776 lprint_command(cmd->cmnd, m);
781 return (pos);
782} 777}
783 778
784static char *lprint_command(unsigned char *command, char *pos, char *buffer, int length) 779static void lprint_command(unsigned char *command, struct seq_file *m)
785{ 780{
786 int i, s; 781 int i, s;
787 pos = lprint_opcode(command[0], pos, buffer, length); 782 lprint_opcode(command[0], m);
788 for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) 783 for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i)
789 SPRINTF("%02x ", command[i]); 784 SPRINTF("%02x ", command[i]);
790 SPRINTF("\n"); 785 SPRINTF("\n");
791 return (pos);
792} 786}
793 787
794static char *lprint_opcode(int opcode, char *pos, char *buffer, int length) 788static void lprint_opcode(int opcode, struct seq_file *m)
795{ 789{
796 SPRINTF("%2d (0x%02x)", opcode, opcode); 790 SPRINTF("%2d (0x%02x)", opcode, opcode);
797 return (pos);
798} 791}
799 792
800 793
diff --git a/drivers/scsi/NCR5380.h b/drivers/scsi/NCR5380.h
index fd40a32b1f6f..14964d0a0e9d 100644
--- a/drivers/scsi/NCR5380.h
+++ b/drivers/scsi/NCR5380.h
@@ -314,8 +314,10 @@ static void NCR5380_print(struct Scsi_Host *instance);
314static int NCR5380_abort(Scsi_Cmnd * cmd); 314static int NCR5380_abort(Scsi_Cmnd * cmd);
315static int NCR5380_bus_reset(Scsi_Cmnd * cmd); 315static int NCR5380_bus_reset(Scsi_Cmnd * cmd);
316static int NCR5380_queue_command(struct Scsi_Host *, struct scsi_cmnd *); 316static int NCR5380_queue_command(struct Scsi_Host *, struct scsi_cmnd *);
317static int __maybe_unused NCR5380_proc_info(struct Scsi_Host *instance, 317static int __maybe_unused NCR5380_show_info(struct seq_file *,
318 char *buffer, char **start, off_t offset, int length, int inout); 318 struct Scsi_Host *);
319static int __maybe_unused NCR5380_write_info(struct Scsi_Host *instance,
320 char *buffer, int length);
319 321
320static void NCR5380_reselect(struct Scsi_Host *instance); 322static void NCR5380_reselect(struct Scsi_Host *instance);
321static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd * cmd, int tag); 323static int NCR5380_select(struct Scsi_Host *instance, Scsi_Cmnd * cmd, int tag);
diff --git a/drivers/scsi/a2091.c b/drivers/scsi/a2091.c
index 3e09aa21c1ca..30fa38a0ad39 100644
--- a/drivers/scsi/a2091.c
+++ b/drivers/scsi/a2091.c
@@ -166,7 +166,8 @@ static int a2091_bus_reset(struct scsi_cmnd *cmd)
166static struct scsi_host_template a2091_scsi_template = { 166static struct scsi_host_template a2091_scsi_template = {
167 .module = THIS_MODULE, 167 .module = THIS_MODULE,
168 .name = "Commodore A2091/A590 SCSI", 168 .name = "Commodore A2091/A590 SCSI",
169 .proc_info = wd33c93_proc_info, 169 .show_info = wd33c93_show_info,
170 .write_info = wd33c93_write_info,
170 .proc_name = "A2901", 171 .proc_name = "A2901",
171 .queuecommand = wd33c93_queuecommand, 172 .queuecommand = wd33c93_queuecommand,
172 .eh_abort_handler = wd33c93_abort, 173 .eh_abort_handler = wd33c93_abort,
diff --git a/drivers/scsi/a3000.c b/drivers/scsi/a3000.c
index e29fe0e708f8..c487916a9d45 100644
--- a/drivers/scsi/a3000.c
+++ b/drivers/scsi/a3000.c
@@ -181,7 +181,8 @@ static int a3000_bus_reset(struct scsi_cmnd *cmd)
181static struct scsi_host_template amiga_a3000_scsi_template = { 181static struct scsi_host_template amiga_a3000_scsi_template = {
182 .module = THIS_MODULE, 182 .module = THIS_MODULE,
183 .name = "Amiga 3000 built-in SCSI", 183 .name = "Amiga 3000 built-in SCSI",
184 .proc_info = wd33c93_proc_info, 184 .show_info = wd33c93_show_info,
185 .write_info = wd33c93_write_info,
185 .proc_name = "A3000", 186 .proc_name = "A3000",
186 .queuecommand = wd33c93_queuecommand, 187 .queuecommand = wd33c93_queuecommand,
187 .eh_abort_handler = wd33c93_abort, 188 .eh_abort_handler = wd33c93_abort,
diff --git a/drivers/scsi/advansys.c b/drivers/scsi/advansys.c
index dcfaee66a8b9..c67e401954c5 100644
--- a/drivers/scsi/advansys.c
+++ b/drivers/scsi/advansys.c
@@ -2178,22 +2178,6 @@ do { \
2178 2178
2179#define ASC_INFO_SIZE 128 /* advansys_info() line size */ 2179#define ASC_INFO_SIZE 128 /* advansys_info() line size */
2180 2180
2181#ifdef CONFIG_PROC_FS
2182/* /proc/scsi/advansys/[0...] related definitions */
2183#define ASC_PRTBUF_SIZE 2048
2184#define ASC_PRTLINE_SIZE 160
2185
2186#define ASC_PRT_NEXT() \
2187 if (cp) { \
2188 totlen += len; \
2189 leftlen -= len; \
2190 if (leftlen == 0) { \
2191 return totlen; \
2192 } \
2193 cp += len; \
2194 }
2195#endif /* CONFIG_PROC_FS */
2196
2197/* Asc Library return codes */ 2181/* Asc Library return codes */
2198#define ASC_TRUE 1 2182#define ASC_TRUE 1
2199#define ASC_FALSE 0 2183#define ASC_FALSE 0
@@ -2384,7 +2368,6 @@ struct asc_board {
2384 } eep_config; 2368 } eep_config;
2385 ulong last_reset; /* Saved last reset time */ 2369 ulong last_reset; /* Saved last reset time */
2386 /* /proc/scsi/advansys/[0...] */ 2370 /* /proc/scsi/advansys/[0...] */
2387 char *prtbuf; /* /proc print buffer */
2388#ifdef ADVANSYS_STATS 2371#ifdef ADVANSYS_STATS
2389 struct asc_stats asc_stats; /* Board statistics */ 2372 struct asc_stats asc_stats; /* Board statistics */
2390#endif /* ADVANSYS_STATS */ 2373#endif /* ADVANSYS_STATS */
@@ -2875,64 +2858,21 @@ static const char *advansys_info(struct Scsi_Host *shost)
2875} 2858}
2876 2859
2877#ifdef CONFIG_PROC_FS 2860#ifdef CONFIG_PROC_FS
2878/*
2879 * asc_prt_line()
2880 *
2881 * If 'cp' is NULL print to the console, otherwise print to a buffer.
2882 *
2883 * Return 0 if printing to the console, otherwise return the number of
2884 * bytes written to the buffer.
2885 *
2886 * Note: If any single line is greater than ASC_PRTLINE_SIZE bytes the stack
2887 * will be corrupted. 's[]' is defined to be ASC_PRTLINE_SIZE bytes.
2888 */
2889static int asc_prt_line(char *buf, int buflen, char *fmt, ...)
2890{
2891 va_list args;
2892 int ret;
2893 char s[ASC_PRTLINE_SIZE];
2894
2895 va_start(args, fmt);
2896 ret = vsprintf(s, fmt, args);
2897 BUG_ON(ret >= ASC_PRTLINE_SIZE);
2898 if (buf == NULL) {
2899 (void)printk(s);
2900 ret = 0;
2901 } else {
2902 ret = min(buflen, ret);
2903 memcpy(buf, s, ret);
2904 }
2905 va_end(args);
2906 return ret;
2907}
2908 2861
2909/* 2862/*
2910 * asc_prt_board_devices() 2863 * asc_prt_board_devices()
2911 * 2864 *
2912 * Print driver information for devices attached to the board. 2865 * Print driver information for devices attached to the board.
2913 *
2914 * Note: no single line should be greater than ASC_PRTLINE_SIZE,
2915 * cf. asc_prt_line().
2916 *
2917 * Return the number of characters copied into 'cp'. No more than
2918 * 'cplen' characters will be copied to 'cp'.
2919 */ 2866 */
2920static int asc_prt_board_devices(struct Scsi_Host *shost, char *cp, int cplen) 2867static void asc_prt_board_devices(struct seq_file *m, struct Scsi_Host *shost)
2921{ 2868{
2922 struct asc_board *boardp = shost_priv(shost); 2869 struct asc_board *boardp = shost_priv(shost);
2923 int leftlen;
2924 int totlen;
2925 int len;
2926 int chip_scsi_id; 2870 int chip_scsi_id;
2927 int i; 2871 int i;
2928 2872
2929 leftlen = cplen; 2873 seq_printf(m,
2930 totlen = len = 0; 2874 "\nDevice Information for AdvanSys SCSI Host %d:\n",
2931 2875 shost->host_no);
2932 len = asc_prt_line(cp, leftlen,
2933 "\nDevice Information for AdvanSys SCSI Host %d:\n",
2934 shost->host_no);
2935 ASC_PRT_NEXT();
2936 2876
2937 if (ASC_NARROW_BOARD(boardp)) { 2877 if (ASC_NARROW_BOARD(boardp)) {
2938 chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id; 2878 chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
@@ -2940,60 +2880,42 @@ static int asc_prt_board_devices(struct Scsi_Host *shost, char *cp, int cplen)
2940 chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id; 2880 chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
2941 } 2881 }
2942 2882
2943 len = asc_prt_line(cp, leftlen, "Target IDs Detected:"); 2883 seq_printf(m, "Target IDs Detected:");
2944 ASC_PRT_NEXT();
2945 for (i = 0; i <= ADV_MAX_TID; i++) { 2884 for (i = 0; i <= ADV_MAX_TID; i++) {
2946 if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) { 2885 if (boardp->init_tidmask & ADV_TID_TO_TIDMASK(i))
2947 len = asc_prt_line(cp, leftlen, " %X,", i); 2886 seq_printf(m, " %X,", i);
2948 ASC_PRT_NEXT();
2949 }
2950 } 2887 }
2951 len = asc_prt_line(cp, leftlen, " (%X=Host Adapter)\n", chip_scsi_id); 2888 seq_printf(m, " (%X=Host Adapter)\n", chip_scsi_id);
2952 ASC_PRT_NEXT();
2953
2954 return totlen;
2955} 2889}
2956 2890
2957/* 2891/*
2958 * Display Wide Board BIOS Information. 2892 * Display Wide Board BIOS Information.
2959 */ 2893 */
2960static int asc_prt_adv_bios(struct Scsi_Host *shost, char *cp, int cplen) 2894static void asc_prt_adv_bios(struct seq_file *m, struct Scsi_Host *shost)
2961{ 2895{
2962 struct asc_board *boardp = shost_priv(shost); 2896 struct asc_board *boardp = shost_priv(shost);
2963 int leftlen;
2964 int totlen;
2965 int len;
2966 ushort major, minor, letter; 2897 ushort major, minor, letter;
2967 2898
2968 leftlen = cplen; 2899 seq_printf(m, "\nROM BIOS Version: ");
2969 totlen = len = 0;
2970
2971 len = asc_prt_line(cp, leftlen, "\nROM BIOS Version: ");
2972 ASC_PRT_NEXT();
2973 2900
2974 /* 2901 /*
2975 * If the BIOS saved a valid signature, then fill in 2902 * If the BIOS saved a valid signature, then fill in
2976 * the BIOS code segment base address. 2903 * the BIOS code segment base address.
2977 */ 2904 */
2978 if (boardp->bios_signature != 0x55AA) { 2905 if (boardp->bios_signature != 0x55AA) {
2979 len = asc_prt_line(cp, leftlen, "Disabled or Pre-3.1\n"); 2906 seq_printf(m, "Disabled or Pre-3.1\n");
2980 ASC_PRT_NEXT(); 2907 seq_printf(m,
2981 len = asc_prt_line(cp, leftlen, 2908 "BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer version\n");
2982 "BIOS either disabled or Pre-3.1. If it is pre-3.1, then a newer version\n"); 2909 seq_printf(m,
2983 ASC_PRT_NEXT(); 2910 "can be found at the ConnectCom FTP site: ftp://ftp.connectcom.net/pub\n");
2984 len = asc_prt_line(cp, leftlen,
2985 "can be found at the ConnectCom FTP site: ftp://ftp.connectcom.net/pub\n");
2986 ASC_PRT_NEXT();
2987 } else { 2911 } else {
2988 major = (boardp->bios_version >> 12) & 0xF; 2912 major = (boardp->bios_version >> 12) & 0xF;
2989 minor = (boardp->bios_version >> 8) & 0xF; 2913 minor = (boardp->bios_version >> 8) & 0xF;
2990 letter = (boardp->bios_version & 0xFF); 2914 letter = (boardp->bios_version & 0xFF);
2991 2915
2992 len = asc_prt_line(cp, leftlen, "%d.%d%c\n", 2916 seq_printf(m, "%d.%d%c\n",
2993 major, minor, 2917 major, minor,
2994 letter >= 26 ? '?' : letter + 'A'); 2918 letter >= 26 ? '?' : letter + 'A');
2995 ASC_PRT_NEXT();
2996
2997 /* 2919 /*
2998 * Current available ROM BIOS release is 3.1I for UW 2920 * Current available ROM BIOS release is 3.1I for UW
2999 * and 3.2I for U2W. This code doesn't differentiate 2921 * and 3.2I for U2W. This code doesn't differentiate
@@ -3001,16 +2923,12 @@ static int asc_prt_adv_bios(struct Scsi_Host *shost, char *cp, int cplen)
3001 */ 2923 */
3002 if (major < 3 || (major <= 3 && minor < 1) || 2924 if (major < 3 || (major <= 3 && minor < 1) ||
3003 (major <= 3 && minor <= 1 && letter < ('I' - 'A'))) { 2925 (major <= 3 && minor <= 1 && letter < ('I' - 'A'))) {
3004 len = asc_prt_line(cp, leftlen, 2926 seq_printf(m,
3005 "Newer version of ROM BIOS is available at the ConnectCom FTP site:\n"); 2927 "Newer version of ROM BIOS is available at the ConnectCom FTP site:\n");
3006 ASC_PRT_NEXT(); 2928 seq_printf(m,
3007 len = asc_prt_line(cp, leftlen, 2929 "ftp://ftp.connectcom.net/pub\n");
3008 "ftp://ftp.connectcom.net/pub\n");
3009 ASC_PRT_NEXT();
3010 } 2930 }
3011 } 2931 }
3012
3013 return totlen;
3014} 2932}
3015 2933
3016/* 2934/*
@@ -3115,20 +3033,11 @@ static int asc_get_eeprom_string(ushort *serialnum, uchar *cp)
3115 * asc_prt_asc_board_eeprom() 3033 * asc_prt_asc_board_eeprom()
3116 * 3034 *
3117 * Print board EEPROM configuration. 3035 * Print board EEPROM configuration.
3118 *
3119 * Note: no single line should be greater than ASC_PRTLINE_SIZE,
3120 * cf. asc_prt_line().
3121 *
3122 * Return the number of characters copied into 'cp'. No more than
3123 * 'cplen' characters will be copied to 'cp'.
3124 */ 3036 */
3125static int asc_prt_asc_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen) 3037static void asc_prt_asc_board_eeprom(struct seq_file *m, struct Scsi_Host *shost)
3126{ 3038{
3127 struct asc_board *boardp = shost_priv(shost); 3039 struct asc_board *boardp = shost_priv(shost);
3128 ASC_DVC_VAR *asc_dvc_varp; 3040 ASC_DVC_VAR *asc_dvc_varp;
3129 int leftlen;
3130 int totlen;
3131 int len;
3132 ASCEEP_CONFIG *ep; 3041 ASCEEP_CONFIG *ep;
3133 int i; 3042 int i;
3134#ifdef CONFIG_ISA 3043#ifdef CONFIG_ISA
@@ -3139,129 +3048,75 @@ static int asc_prt_asc_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
3139 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var; 3048 asc_dvc_varp = &boardp->dvc_var.asc_dvc_var;
3140 ep = &boardp->eep_config.asc_eep; 3049 ep = &boardp->eep_config.asc_eep;
3141 3050
3142 leftlen = cplen; 3051 seq_printf(m,
3143 totlen = len = 0; 3052 "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
3144 3053 shost->host_no);
3145 len = asc_prt_line(cp, leftlen,
3146 "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
3147 shost->host_no);
3148 ASC_PRT_NEXT();
3149 3054
3150 if (asc_get_eeprom_string((ushort *)&ep->adapter_info[0], serialstr) 3055 if (asc_get_eeprom_string((ushort *)&ep->adapter_info[0], serialstr)
3151 == ASC_TRUE) { 3056 == ASC_TRUE)
3152 len = 3057 seq_printf(m, " Serial Number: %s\n", serialstr);
3153 asc_prt_line(cp, leftlen, " Serial Number: %s\n", 3058 else if (ep->adapter_info[5] == 0xBB)
3154 serialstr); 3059 seq_printf(m,
3155 ASC_PRT_NEXT(); 3060 " Default Settings Used for EEPROM-less Adapter.\n");
3156 } else { 3061 else
3157 if (ep->adapter_info[5] == 0xBB) { 3062 seq_printf(m,
3158 len = asc_prt_line(cp, leftlen, 3063 " Serial Number Signature Not Present.\n");
3159 " Default Settings Used for EEPROM-less Adapter.\n"); 3064
3160 ASC_PRT_NEXT(); 3065 seq_printf(m,
3161 } else { 3066 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3162 len = asc_prt_line(cp, leftlen, 3067 ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng,
3163 " Serial Number Signature Not Present.\n"); 3068 ep->max_tag_qng);
3164 ASC_PRT_NEXT(); 3069
3165 } 3070 seq_printf(m,
3166 } 3071 " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam);
3167 3072
3168 len = asc_prt_line(cp, leftlen, 3073 seq_printf(m, " Target ID: ");
3169 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n", 3074 for (i = 0; i <= ASC_MAX_TID; i++)
3170 ASC_EEP_GET_CHIP_ID(ep), ep->max_total_qng, 3075 seq_printf(m, " %d", i);
3171 ep->max_tag_qng); 3076 seq_printf(m, "\n");
3172 ASC_PRT_NEXT(); 3077
3173 3078 seq_printf(m, " Disconnects: ");
3174 len = asc_prt_line(cp, leftlen, 3079 for (i = 0; i <= ASC_MAX_TID; i++)
3175 " cntl 0x%x, no_scam 0x%x\n", ep->cntl, ep->no_scam); 3080 seq_printf(m, " %c",
3176 ASC_PRT_NEXT(); 3081 (ep->disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3177 3082 seq_printf(m, "\n");
3178 len = asc_prt_line(cp, leftlen, " Target ID: "); 3083
3179 ASC_PRT_NEXT(); 3084 seq_printf(m, " Command Queuing: ");
3180 for (i = 0; i <= ASC_MAX_TID; i++) { 3085 for (i = 0; i <= ASC_MAX_TID; i++)
3181 len = asc_prt_line(cp, leftlen, " %d", i); 3086 seq_printf(m, " %c",
3182 ASC_PRT_NEXT(); 3087 (ep->use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3183 } 3088 seq_printf(m, "\n");
3184 len = asc_prt_line(cp, leftlen, "\n"); 3089
3185 ASC_PRT_NEXT(); 3090 seq_printf(m, " Start Motor: ");
3186 3091 for (i = 0; i <= ASC_MAX_TID; i++)
3187 len = asc_prt_line(cp, leftlen, " Disconnects: "); 3092 seq_printf(m, " %c",
3188 ASC_PRT_NEXT(); 3093 (ep->start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3189 for (i = 0; i <= ASC_MAX_TID; i++) { 3094 seq_printf(m, "\n");
3190 len = asc_prt_line(cp, leftlen, " %c", 3095
3191 (ep-> 3096 seq_printf(m, " Synchronous Transfer:");
3192 disc_enable & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 3097 for (i = 0; i <= ASC_MAX_TID; i++)
3193 'N'); 3098 seq_printf(m, " %c",
3194 ASC_PRT_NEXT(); 3099 (ep->init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3195 } 3100 seq_printf(m, "\n");
3196 len = asc_prt_line(cp, leftlen, "\n");
3197 ASC_PRT_NEXT();
3198
3199 len = asc_prt_line(cp, leftlen, " Command Queuing: ");
3200 ASC_PRT_NEXT();
3201 for (i = 0; i <= ASC_MAX_TID; i++) {
3202 len = asc_prt_line(cp, leftlen, " %c",
3203 (ep->
3204 use_cmd_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3205 'N');
3206 ASC_PRT_NEXT();
3207 }
3208 len = asc_prt_line(cp, leftlen, "\n");
3209 ASC_PRT_NEXT();
3210
3211 len = asc_prt_line(cp, leftlen, " Start Motor: ");
3212 ASC_PRT_NEXT();
3213 for (i = 0; i <= ASC_MAX_TID; i++) {
3214 len = asc_prt_line(cp, leftlen, " %c",
3215 (ep->
3216 start_motor & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3217 'N');
3218 ASC_PRT_NEXT();
3219 }
3220 len = asc_prt_line(cp, leftlen, "\n");
3221 ASC_PRT_NEXT();
3222
3223 len = asc_prt_line(cp, leftlen, " Synchronous Transfer:");
3224 ASC_PRT_NEXT();
3225 for (i = 0; i <= ASC_MAX_TID; i++) {
3226 len = asc_prt_line(cp, leftlen, " %c",
3227 (ep->
3228 init_sdtr & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3229 'N');
3230 ASC_PRT_NEXT();
3231 }
3232 len = asc_prt_line(cp, leftlen, "\n");
3233 ASC_PRT_NEXT();
3234 3101
3235#ifdef CONFIG_ISA 3102#ifdef CONFIG_ISA
3236 if (asc_dvc_varp->bus_type & ASC_IS_ISA) { 3103 if (asc_dvc_varp->bus_type & ASC_IS_ISA) {
3237 len = asc_prt_line(cp, leftlen, 3104 seq_printf(m,
3238 " Host ISA DMA speed: %d MB/S\n", 3105 " Host ISA DMA speed: %d MB/S\n",
3239 isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]); 3106 isa_dma_speed[ASC_EEP_GET_DMA_SPD(ep)]);
3240 ASC_PRT_NEXT();
3241 } 3107 }
3242#endif /* CONFIG_ISA */ 3108#endif /* CONFIG_ISA */
3243
3244 return totlen;
3245} 3109}
3246 3110
3247/* 3111/*
3248 * asc_prt_adv_board_eeprom() 3112 * asc_prt_adv_board_eeprom()
3249 * 3113 *
3250 * Print board EEPROM configuration. 3114 * Print board EEPROM configuration.
3251 *
3252 * Note: no single line should be greater than ASC_PRTLINE_SIZE,
3253 * cf. asc_prt_line().
3254 *
3255 * Return the number of characters copied into 'cp'. No more than
3256 * 'cplen' characters will be copied to 'cp'.
3257 */ 3115 */
3258static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen) 3116static void asc_prt_adv_board_eeprom(struct seq_file *m, struct Scsi_Host *shost)
3259{ 3117{
3260 struct asc_board *boardp = shost_priv(shost); 3118 struct asc_board *boardp = shost_priv(shost);
3261 ADV_DVC_VAR *adv_dvc_varp; 3119 ADV_DVC_VAR *adv_dvc_varp;
3262 int leftlen;
3263 int totlen;
3264 int len;
3265 int i; 3120 int i;
3266 char *termstr; 3121 char *termstr;
3267 uchar serialstr[13]; 3122 uchar serialstr[13];
@@ -3281,13 +3136,9 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
3281 ep_38C1600 = &boardp->eep_config.adv_38C1600_eep; 3136 ep_38C1600 = &boardp->eep_config.adv_38C1600_eep;
3282 } 3137 }
3283 3138
3284 leftlen = cplen; 3139 seq_printf(m,
3285 totlen = len = 0; 3140 "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
3286 3141 shost->host_no);
3287 len = asc_prt_line(cp, leftlen,
3288 "\nEEPROM Settings for AdvanSys SCSI Host %d:\n",
3289 shost->host_no);
3290 ASC_PRT_NEXT();
3291 3142
3292 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 3143 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3293 wordp = &ep_3550->serial_number_word1; 3144 wordp = &ep_3550->serial_number_word1;
@@ -3297,38 +3148,28 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
3297 wordp = &ep_38C1600->serial_number_word1; 3148 wordp = &ep_38C1600->serial_number_word1;
3298 } 3149 }
3299 3150
3300 if (asc_get_eeprom_string(wordp, serialstr) == ASC_TRUE) { 3151 if (asc_get_eeprom_string(wordp, serialstr) == ASC_TRUE)
3301 len = 3152 seq_printf(m, " Serial Number: %s\n", serialstr);
3302 asc_prt_line(cp, leftlen, " Serial Number: %s\n", 3153 else
3303 serialstr); 3154 seq_printf(m, " Serial Number Signature Not Present.\n");
3304 ASC_PRT_NEXT();
3305 } else {
3306 len = asc_prt_line(cp, leftlen,
3307 " Serial Number Signature Not Present.\n");
3308 ASC_PRT_NEXT();
3309 }
3310 3155
3311 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 3156 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
3312 len = asc_prt_line(cp, leftlen, 3157 seq_printf(m,
3313 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n", 3158 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3314 ep_3550->adapter_scsi_id, 3159 ep_3550->adapter_scsi_id,
3315 ep_3550->max_host_qng, ep_3550->max_dvc_qng); 3160 ep_3550->max_host_qng, ep_3550->max_dvc_qng);
3316 ASC_PRT_NEXT(); 3161 else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
3317 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { 3162 seq_printf(m,
3318 len = asc_prt_line(cp, leftlen, 3163 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3319 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n", 3164 ep_38C0800->adapter_scsi_id,
3320 ep_38C0800->adapter_scsi_id, 3165 ep_38C0800->max_host_qng,
3321 ep_38C0800->max_host_qng, 3166 ep_38C0800->max_dvc_qng);
3322 ep_38C0800->max_dvc_qng); 3167 else
3323 ASC_PRT_NEXT(); 3168 seq_printf(m,
3324 } else { 3169 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n",
3325 len = asc_prt_line(cp, leftlen, 3170 ep_38C1600->adapter_scsi_id,
3326 " Host SCSI ID: %u, Host Queue Size: %u, Device Queue Size: %u\n", 3171 ep_38C1600->max_host_qng,
3327 ep_38C1600->adapter_scsi_id, 3172 ep_38C1600->max_dvc_qng);
3328 ep_38C1600->max_host_qng,
3329 ep_38C1600->max_dvc_qng);
3330 ASC_PRT_NEXT();
3331 }
3332 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 3173 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3333 word = ep_3550->termination; 3174 word = ep_3550->termination;
3334 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { 3175 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) {
@@ -3352,34 +3193,26 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
3352 break; 3193 break;
3353 } 3194 }
3354 3195
3355 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 3196 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550)
3356 len = asc_prt_line(cp, leftlen, 3197 seq_printf(m,
3357 " termination: %u (%s), bios_ctrl: 0x%x\n", 3198 " termination: %u (%s), bios_ctrl: 0x%x\n",
3358 ep_3550->termination, termstr, 3199 ep_3550->termination, termstr,
3359 ep_3550->bios_ctrl); 3200 ep_3550->bios_ctrl);
3360 ASC_PRT_NEXT(); 3201 else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800)
3361 } else if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800) { 3202 seq_printf(m,
3362 len = asc_prt_line(cp, leftlen, 3203 " termination: %u (%s), bios_ctrl: 0x%x\n",
3363 " termination: %u (%s), bios_ctrl: 0x%x\n", 3204 ep_38C0800->termination_lvd, termstr,
3364 ep_38C0800->termination_lvd, termstr, 3205 ep_38C0800->bios_ctrl);
3365 ep_38C0800->bios_ctrl); 3206 else
3366 ASC_PRT_NEXT(); 3207 seq_printf(m,
3367 } else { 3208 " termination: %u (%s), bios_ctrl: 0x%x\n",
3368 len = asc_prt_line(cp, leftlen, 3209 ep_38C1600->termination_lvd, termstr,
3369 " termination: %u (%s), bios_ctrl: 0x%x\n", 3210 ep_38C1600->bios_ctrl);
3370 ep_38C1600->termination_lvd, termstr,
3371 ep_38C1600->bios_ctrl);
3372 ASC_PRT_NEXT();
3373 }
3374 3211
3375 len = asc_prt_line(cp, leftlen, " Target ID: "); 3212 seq_printf(m, " Target ID: ");
3376 ASC_PRT_NEXT(); 3213 for (i = 0; i <= ADV_MAX_TID; i++)
3377 for (i = 0; i <= ADV_MAX_TID; i++) { 3214 seq_printf(m, " %X", i);
3378 len = asc_prt_line(cp, leftlen, " %X", i); 3215 seq_printf(m, "\n");
3379 ASC_PRT_NEXT();
3380 }
3381 len = asc_prt_line(cp, leftlen, "\n");
3382 ASC_PRT_NEXT();
3383 3216
3384 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 3217 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3385 word = ep_3550->disc_enable; 3218 word = ep_3550->disc_enable;
@@ -3388,15 +3221,11 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
3388 } else { 3221 } else {
3389 word = ep_38C1600->disc_enable; 3222 word = ep_38C1600->disc_enable;
3390 } 3223 }
3391 len = asc_prt_line(cp, leftlen, " Disconnects: "); 3224 seq_printf(m, " Disconnects: ");
3392 ASC_PRT_NEXT(); 3225 for (i = 0; i <= ADV_MAX_TID; i++)
3393 for (i = 0; i <= ADV_MAX_TID; i++) { 3226 seq_printf(m, " %c",
3394 len = asc_prt_line(cp, leftlen, " %c", 3227 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3395 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); 3228 seq_printf(m, "\n");
3396 ASC_PRT_NEXT();
3397 }
3398 len = asc_prt_line(cp, leftlen, "\n");
3399 ASC_PRT_NEXT();
3400 3229
3401 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 3230 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3402 word = ep_3550->tagqng_able; 3231 word = ep_3550->tagqng_able;
@@ -3405,15 +3234,11 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
3405 } else { 3234 } else {
3406 word = ep_38C1600->tagqng_able; 3235 word = ep_38C1600->tagqng_able;
3407 } 3236 }
3408 len = asc_prt_line(cp, leftlen, " Command Queuing: "); 3237 seq_printf(m, " Command Queuing: ");
3409 ASC_PRT_NEXT(); 3238 for (i = 0; i <= ADV_MAX_TID; i++)
3410 for (i = 0; i <= ADV_MAX_TID; i++) { 3239 seq_printf(m, " %c",
3411 len = asc_prt_line(cp, leftlen, " %c", 3240 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3412 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); 3241 seq_printf(m, "\n");
3413 ASC_PRT_NEXT();
3414 }
3415 len = asc_prt_line(cp, leftlen, "\n");
3416 ASC_PRT_NEXT();
3417 3242
3418 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 3243 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3419 word = ep_3550->start_motor; 3244 word = ep_3550->start_motor;
@@ -3422,42 +3247,28 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
3422 } else { 3247 } else {
3423 word = ep_38C1600->start_motor; 3248 word = ep_38C1600->start_motor;
3424 } 3249 }
3425 len = asc_prt_line(cp, leftlen, " Start Motor: "); 3250 seq_printf(m, " Start Motor: ");
3426 ASC_PRT_NEXT(); 3251 for (i = 0; i <= ADV_MAX_TID; i++)
3427 for (i = 0; i <= ADV_MAX_TID; i++) { 3252 seq_printf(m, " %c",
3428 len = asc_prt_line(cp, leftlen, " %c", 3253 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3429 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); 3254 seq_printf(m, "\n");
3430 ASC_PRT_NEXT();
3431 }
3432 len = asc_prt_line(cp, leftlen, "\n");
3433 ASC_PRT_NEXT();
3434 3255
3435 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 3256 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3436 len = asc_prt_line(cp, leftlen, " Synchronous Transfer:"); 3257 seq_printf(m, " Synchronous Transfer:");
3437 ASC_PRT_NEXT(); 3258 for (i = 0; i <= ADV_MAX_TID; i++)
3438 for (i = 0; i <= ADV_MAX_TID; i++) { 3259 seq_printf(m, " %c",
3439 len = asc_prt_line(cp, leftlen, " %c", 3260 (ep_3550->sdtr_able & ADV_TID_TO_TIDMASK(i)) ?
3440 (ep_3550-> 3261 'Y' : 'N');
3441 sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 3262 seq_printf(m, "\n");
3442 'Y' : 'N');
3443 ASC_PRT_NEXT();
3444 }
3445 len = asc_prt_line(cp, leftlen, "\n");
3446 ASC_PRT_NEXT();
3447 } 3263 }
3448 3264
3449 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 3265 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
3450 len = asc_prt_line(cp, leftlen, " Ultra Transfer: "); 3266 seq_printf(m, " Ultra Transfer: ");
3451 ASC_PRT_NEXT(); 3267 for (i = 0; i <= ADV_MAX_TID; i++)
3452 for (i = 0; i <= ADV_MAX_TID; i++) { 3268 seq_printf(m, " %c",
3453 len = asc_prt_line(cp, leftlen, " %c", 3269 (ep_3550->ultra_able & ADV_TID_TO_TIDMASK(i))
3454 (ep_3550-> 3270 ? 'Y' : 'N');
3455 ultra_able & ADV_TID_TO_TIDMASK(i)) 3271 seq_printf(m, "\n");
3456 ? 'Y' : 'N');
3457 ASC_PRT_NEXT();
3458 }
3459 len = asc_prt_line(cp, leftlen, "\n");
3460 ASC_PRT_NEXT();
3461 } 3272 }
3462 3273
3463 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) { 3274 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC3550) {
@@ -3467,21 +3278,16 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
3467 } else { 3278 } else {
3468 word = ep_38C1600->wdtr_able; 3279 word = ep_38C1600->wdtr_able;
3469 } 3280 }
3470 len = asc_prt_line(cp, leftlen, " Wide Transfer: "); 3281 seq_printf(m, " Wide Transfer: ");
3471 ASC_PRT_NEXT(); 3282 for (i = 0; i <= ADV_MAX_TID; i++)
3472 for (i = 0; i <= ADV_MAX_TID; i++) { 3283 seq_printf(m, " %c",
3473 len = asc_prt_line(cp, leftlen, " %c", 3284 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3474 (word & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N'); 3285 seq_printf(m, "\n");
3475 ASC_PRT_NEXT();
3476 }
3477 len = asc_prt_line(cp, leftlen, "\n");
3478 ASC_PRT_NEXT();
3479 3286
3480 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800 || 3287 if (adv_dvc_varp->chip_type == ADV_CHIP_ASC38C0800 ||
3481 adv_dvc_varp->chip_type == ADV_CHIP_ASC38C1600) { 3288 adv_dvc_varp->chip_type == ADV_CHIP_ASC38C1600) {
3482 len = asc_prt_line(cp, leftlen, 3289 seq_printf(m,
3483 " Synchronous Transfer Speed (Mhz):\n "); 3290 " Synchronous Transfer Speed (Mhz):\n ");
3484 ASC_PRT_NEXT();
3485 for (i = 0; i <= ADV_MAX_TID; i++) { 3291 for (i = 0; i <= ADV_MAX_TID; i++) {
3486 char *speed_str; 3292 char *speed_str;
3487 3293
@@ -3517,99 +3323,64 @@ static int asc_prt_adv_board_eeprom(struct Scsi_Host *shost, char *cp, int cplen
3517 speed_str = "Unk"; 3323 speed_str = "Unk";
3518 break; 3324 break;
3519 } 3325 }
3520 len = asc_prt_line(cp, leftlen, "%X:%s ", i, speed_str); 3326 seq_printf(m, "%X:%s ", i, speed_str);
3521 ASC_PRT_NEXT(); 3327 if (i == 7)
3522 if (i == 7) { 3328 seq_printf(m, "\n ");
3523 len = asc_prt_line(cp, leftlen, "\n ");
3524 ASC_PRT_NEXT();
3525 }
3526 sdtr_speed >>= 4; 3329 sdtr_speed >>= 4;
3527 } 3330 }
3528 len = asc_prt_line(cp, leftlen, "\n"); 3331 seq_printf(m, "\n");
3529 ASC_PRT_NEXT();
3530 } 3332 }
3531
3532 return totlen;
3533} 3333}
3534 3334
3535/* 3335/*
3536 * asc_prt_driver_conf() 3336 * asc_prt_driver_conf()
3537 *
3538 * Note: no single line should be greater than ASC_PRTLINE_SIZE,
3539 * cf. asc_prt_line().
3540 *
3541 * Return the number of characters copied into 'cp'. No more than
3542 * 'cplen' characters will be copied to 'cp'.
3543 */ 3337 */
3544static int asc_prt_driver_conf(struct Scsi_Host *shost, char *cp, int cplen) 3338static void asc_prt_driver_conf(struct seq_file *m, struct Scsi_Host *shost)
3545{ 3339{
3546 struct asc_board *boardp = shost_priv(shost); 3340 struct asc_board *boardp = shost_priv(shost);
3547 int leftlen;
3548 int totlen;
3549 int len;
3550 int chip_scsi_id; 3341 int chip_scsi_id;
3551 3342
3552 leftlen = cplen; 3343 seq_printf(m,
3553 totlen = len = 0; 3344 "\nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:\n",
3345 shost->host_no);
3554 3346
3555 len = asc_prt_line(cp, leftlen, 3347 seq_printf(m,
3556 "\nLinux Driver Configuration and Information for AdvanSys SCSI Host %d:\n", 3348 " host_busy %u, last_reset %lu, max_id %u, max_lun %u, max_channel %u\n",
3557 shost->host_no); 3349 shost->host_busy, shost->last_reset, shost->max_id,
3558 ASC_PRT_NEXT(); 3350 shost->max_lun, shost->max_channel);
3559 3351
3560 len = asc_prt_line(cp, leftlen, 3352 seq_printf(m,
3561 " host_busy %u, last_reset %u, max_id %u, max_lun %u, max_channel %u\n", 3353 " unique_id %d, can_queue %d, this_id %d, sg_tablesize %u, cmd_per_lun %u\n",
3562 shost->host_busy, shost->last_reset, shost->max_id, 3354 shost->unique_id, shost->can_queue, shost->this_id,
3563 shost->max_lun, shost->max_channel); 3355 shost->sg_tablesize, shost->cmd_per_lun);
3564 ASC_PRT_NEXT();
3565 3356
3566 len = asc_prt_line(cp, leftlen, 3357 seq_printf(m,
3567 " unique_id %d, can_queue %d, this_id %d, sg_tablesize %u, cmd_per_lun %u\n", 3358 " unchecked_isa_dma %d, use_clustering %d\n",
3568 shost->unique_id, shost->can_queue, shost->this_id, 3359 shost->unchecked_isa_dma, shost->use_clustering);
3569 shost->sg_tablesize, shost->cmd_per_lun);
3570 ASC_PRT_NEXT();
3571 3360
3572 len = asc_prt_line(cp, leftlen, 3361 seq_printf(m,
3573 " unchecked_isa_dma %d, use_clustering %d\n", 3362 " flags 0x%x, last_reset 0x%lx, jiffies 0x%lx, asc_n_io_port 0x%x\n",
3574 shost->unchecked_isa_dma, shost->use_clustering); 3363 boardp->flags, boardp->last_reset, jiffies,
3575 ASC_PRT_NEXT(); 3364 boardp->asc_n_io_port);
3576 3365
3577 len = asc_prt_line(cp, leftlen, 3366 seq_printf(m, " io_port 0x%lx\n", shost->io_port);
3578 " flags 0x%x, last_reset 0x%x, jiffies 0x%x, asc_n_io_port 0x%x\n",
3579 boardp->flags, boardp->last_reset, jiffies,
3580 boardp->asc_n_io_port);
3581 ASC_PRT_NEXT();
3582
3583 len = asc_prt_line(cp, leftlen, " io_port 0x%x\n", shost->io_port);
3584 ASC_PRT_NEXT();
3585 3367
3586 if (ASC_NARROW_BOARD(boardp)) { 3368 if (ASC_NARROW_BOARD(boardp)) {
3587 chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id; 3369 chip_scsi_id = boardp->dvc_cfg.asc_dvc_cfg.chip_scsi_id;
3588 } else { 3370 } else {
3589 chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id; 3371 chip_scsi_id = boardp->dvc_var.adv_dvc_var.chip_scsi_id;
3590 } 3372 }
3591
3592 return totlen;
3593} 3373}
3594 3374
3595/* 3375/*
3596 * asc_prt_asc_board_info() 3376 * asc_prt_asc_board_info()
3597 * 3377 *
3598 * Print dynamic board configuration information. 3378 * Print dynamic board configuration information.
3599 *
3600 * Note: no single line should be greater than ASC_PRTLINE_SIZE,
3601 * cf. asc_prt_line().
3602 *
3603 * Return the number of characters copied into 'cp'. No more than
3604 * 'cplen' characters will be copied to 'cp'.
3605 */ 3379 */
3606static int asc_prt_asc_board_info(struct Scsi_Host *shost, char *cp, int cplen) 3380static void asc_prt_asc_board_info(struct seq_file *m, struct Scsi_Host *shost)
3607{ 3381{
3608 struct asc_board *boardp = shost_priv(shost); 3382 struct asc_board *boardp = shost_priv(shost);
3609 int chip_scsi_id; 3383 int chip_scsi_id;
3610 int leftlen;
3611 int totlen;
3612 int len;
3613 ASC_DVC_VAR *v; 3384 ASC_DVC_VAR *v;
3614 ASC_DVC_CFG *c; 3385 ASC_DVC_CFG *c;
3615 int i; 3386 int i;
@@ -3619,105 +3390,79 @@ static int asc_prt_asc_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3619 c = &boardp->dvc_cfg.asc_dvc_cfg; 3390 c = &boardp->dvc_cfg.asc_dvc_cfg;
3620 chip_scsi_id = c->chip_scsi_id; 3391 chip_scsi_id = c->chip_scsi_id;
3621 3392
3622 leftlen = cplen; 3393 seq_printf(m,
3623 totlen = len = 0; 3394 "\nAsc Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
3395 shost->host_no);
3624 3396
3625 len = asc_prt_line(cp, leftlen, 3397 seq_printf(m, " chip_version %u, mcode_date 0x%x, "
3626 "\nAsc Library Configuration and Statistics for AdvanSys SCSI Host %d:\n", 3398 "mcode_version 0x%x, err_code %u\n",
3627 shost->host_no); 3399 c->chip_version, c->mcode_date, c->mcode_version,
3628 ASC_PRT_NEXT(); 3400 v->err_code);
3629
3630 len = asc_prt_line(cp, leftlen, " chip_version %u, mcode_date 0x%x, "
3631 "mcode_version 0x%x, err_code %u\n",
3632 c->chip_version, c->mcode_date, c->mcode_version,
3633 v->err_code);
3634 ASC_PRT_NEXT();
3635 3401
3636 /* Current number of commands waiting for the host. */ 3402 /* Current number of commands waiting for the host. */
3637 len = asc_prt_line(cp, leftlen, 3403 seq_printf(m,
3638 " Total Command Pending: %d\n", v->cur_total_qng); 3404 " Total Command Pending: %d\n", v->cur_total_qng);
3639 ASC_PRT_NEXT();
3640 3405
3641 len = asc_prt_line(cp, leftlen, " Command Queuing:"); 3406 seq_printf(m, " Command Queuing:");
3642 ASC_PRT_NEXT();
3643 for (i = 0; i <= ASC_MAX_TID; i++) { 3407 for (i = 0; i <= ASC_MAX_TID; i++) {
3644 if ((chip_scsi_id == i) || 3408 if ((chip_scsi_id == i) ||
3645 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3409 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3646 continue; 3410 continue;
3647 } 3411 }
3648 len = asc_prt_line(cp, leftlen, " %X:%c", 3412 seq_printf(m, " %X:%c",
3649 i, 3413 i,
3650 (v-> 3414 (v->use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3651 use_tagged_qng & ADV_TID_TO_TIDMASK(i)) ?
3652 'Y' : 'N');
3653 ASC_PRT_NEXT();
3654 } 3415 }
3655 len = asc_prt_line(cp, leftlen, "\n"); 3416 seq_printf(m, "\n");
3656 ASC_PRT_NEXT();
3657 3417
3658 /* Current number of commands waiting for a device. */ 3418 /* Current number of commands waiting for a device. */
3659 len = asc_prt_line(cp, leftlen, " Command Queue Pending:"); 3419 seq_printf(m, " Command Queue Pending:");
3660 ASC_PRT_NEXT();
3661 for (i = 0; i <= ASC_MAX_TID; i++) { 3420 for (i = 0; i <= ASC_MAX_TID; i++) {
3662 if ((chip_scsi_id == i) || 3421 if ((chip_scsi_id == i) ||
3663 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3422 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3664 continue; 3423 continue;
3665 } 3424 }
3666 len = asc_prt_line(cp, leftlen, " %X:%u", i, v->cur_dvc_qng[i]); 3425 seq_printf(m, " %X:%u", i, v->cur_dvc_qng[i]);
3667 ASC_PRT_NEXT();
3668 } 3426 }
3669 len = asc_prt_line(cp, leftlen, "\n"); 3427 seq_printf(m, "\n");
3670 ASC_PRT_NEXT();
3671 3428
3672 /* Current limit on number of commands that can be sent to a device. */ 3429 /* Current limit on number of commands that can be sent to a device. */
3673 len = asc_prt_line(cp, leftlen, " Command Queue Limit:"); 3430 seq_printf(m, " Command Queue Limit:");
3674 ASC_PRT_NEXT();
3675 for (i = 0; i <= ASC_MAX_TID; i++) { 3431 for (i = 0; i <= ASC_MAX_TID; i++) {
3676 if ((chip_scsi_id == i) || 3432 if ((chip_scsi_id == i) ||
3677 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3433 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3678 continue; 3434 continue;
3679 } 3435 }
3680 len = asc_prt_line(cp, leftlen, " %X:%u", i, v->max_dvc_qng[i]); 3436 seq_printf(m, " %X:%u", i, v->max_dvc_qng[i]);
3681 ASC_PRT_NEXT();
3682 } 3437 }
3683 len = asc_prt_line(cp, leftlen, "\n"); 3438 seq_printf(m, "\n");
3684 ASC_PRT_NEXT();
3685 3439
3686 /* Indicate whether the device has returned queue full status. */ 3440 /* Indicate whether the device has returned queue full status. */
3687 len = asc_prt_line(cp, leftlen, " Command Queue Full:"); 3441 seq_printf(m, " Command Queue Full:");
3688 ASC_PRT_NEXT();
3689 for (i = 0; i <= ASC_MAX_TID; i++) { 3442 for (i = 0; i <= ASC_MAX_TID; i++) {
3690 if ((chip_scsi_id == i) || 3443 if ((chip_scsi_id == i) ||
3691 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3444 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3692 continue; 3445 continue;
3693 } 3446 }
3694 if (boardp->queue_full & ADV_TID_TO_TIDMASK(i)) { 3447 if (boardp->queue_full & ADV_TID_TO_TIDMASK(i))
3695 len = asc_prt_line(cp, leftlen, " %X:Y-%d", 3448 seq_printf(m, " %X:Y-%d",
3696 i, boardp->queue_full_cnt[i]); 3449 i, boardp->queue_full_cnt[i]);
3697 } else { 3450 else
3698 len = asc_prt_line(cp, leftlen, " %X:N", i); 3451 seq_printf(m, " %X:N", i);
3699 }
3700 ASC_PRT_NEXT();
3701 } 3452 }
3702 len = asc_prt_line(cp, leftlen, "\n"); 3453 seq_printf(m, "\n");
3703 ASC_PRT_NEXT();
3704 3454
3705 len = asc_prt_line(cp, leftlen, " Synchronous Transfer:"); 3455 seq_printf(m, " Synchronous Transfer:");
3706 ASC_PRT_NEXT();
3707 for (i = 0; i <= ASC_MAX_TID; i++) { 3456 for (i = 0; i <= ASC_MAX_TID; i++) {
3708 if ((chip_scsi_id == i) || 3457 if ((chip_scsi_id == i) ||
3709 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3458 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3710 continue; 3459 continue;
3711 } 3460 }
3712 len = asc_prt_line(cp, leftlen, " %X:%c", 3461 seq_printf(m, " %X:%c",
3713 i, 3462 i,
3714 (v-> 3463 (v->sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3715 sdtr_done & ADV_TID_TO_TIDMASK(i)) ? 'Y' :
3716 'N');
3717 ASC_PRT_NEXT();
3718 } 3464 }
3719 len = asc_prt_line(cp, leftlen, "\n"); 3465 seq_printf(m, "\n");
3720 ASC_PRT_NEXT();
3721 3466
3722 for (i = 0; i <= ASC_MAX_TID; i++) { 3467 for (i = 0; i <= ASC_MAX_TID; i++) {
3723 uchar syn_period_ix; 3468 uchar syn_period_ix;
@@ -3728,69 +3473,48 @@ static int asc_prt_asc_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3728 continue; 3473 continue;
3729 } 3474 }
3730 3475
3731 len = asc_prt_line(cp, leftlen, " %X:", i); 3476 seq_printf(m, " %X:", i);
3732 ASC_PRT_NEXT();
3733 3477
3734 if ((boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET) == 0) { 3478 if ((boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET) == 0) {
3735 len = asc_prt_line(cp, leftlen, " Asynchronous"); 3479 seq_printf(m, " Asynchronous");
3736 ASC_PRT_NEXT();
3737 } else { 3480 } else {
3738 syn_period_ix = 3481 syn_period_ix =
3739 (boardp->sdtr_data[i] >> 4) & (v->max_sdtr_index - 3482 (boardp->sdtr_data[i] >> 4) & (v->max_sdtr_index -
3740 1); 3483 1);
3741 3484
3742 len = asc_prt_line(cp, leftlen, 3485 seq_printf(m,
3743 " Transfer Period Factor: %d (%d.%d Mhz),", 3486 " Transfer Period Factor: %d (%d.%d Mhz),",
3744 v->sdtr_period_tbl[syn_period_ix], 3487 v->sdtr_period_tbl[syn_period_ix],
3745 250 / 3488 250 / v->sdtr_period_tbl[syn_period_ix],
3746 v->sdtr_period_tbl[syn_period_ix], 3489 ASC_TENTHS(250,
3747 ASC_TENTHS(250, 3490 v->sdtr_period_tbl[syn_period_ix]));
3748 v->
3749 sdtr_period_tbl
3750 [syn_period_ix]));
3751 ASC_PRT_NEXT();
3752 3491
3753 len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d", 3492 seq_printf(m, " REQ/ACK Offset: %d",
3754 boardp-> 3493 boardp->sdtr_data[i] & ASC_SYN_MAX_OFFSET);
3755 sdtr_data[i] & ASC_SYN_MAX_OFFSET);
3756 ASC_PRT_NEXT();
3757 } 3494 }
3758 3495
3759 if ((v->sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) { 3496 if ((v->sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
3760 len = asc_prt_line(cp, leftlen, "*\n"); 3497 seq_printf(m, "*\n");
3761 renegotiate = 1; 3498 renegotiate = 1;
3762 } else { 3499 } else {
3763 len = asc_prt_line(cp, leftlen, "\n"); 3500 seq_printf(m, "\n");
3764 } 3501 }
3765 ASC_PRT_NEXT();
3766 } 3502 }
3767 3503
3768 if (renegotiate) { 3504 if (renegotiate) {
3769 len = asc_prt_line(cp, leftlen, 3505 seq_printf(m,
3770 " * = Re-negotiation pending before next command.\n"); 3506 " * = Re-negotiation pending before next command.\n");
3771 ASC_PRT_NEXT();
3772 } 3507 }
3773
3774 return totlen;
3775} 3508}
3776 3509
3777/* 3510/*
3778 * asc_prt_adv_board_info() 3511 * asc_prt_adv_board_info()
3779 * 3512 *
3780 * Print dynamic board configuration information. 3513 * Print dynamic board configuration information.
3781 *
3782 * Note: no single line should be greater than ASC_PRTLINE_SIZE,
3783 * cf. asc_prt_line().
3784 *
3785 * Return the number of characters copied into 'cp'. No more than
3786 * 'cplen' characters will be copied to 'cp'.
3787 */ 3514 */
3788static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen) 3515static void asc_prt_adv_board_info(struct seq_file *m, struct Scsi_Host *shost)
3789{ 3516{
3790 struct asc_board *boardp = shost_priv(shost); 3517 struct asc_board *boardp = shost_priv(shost);
3791 int leftlen;
3792 int totlen;
3793 int len;
3794 int i; 3518 int i;
3795 ADV_DVC_VAR *v; 3519 ADV_DVC_VAR *v;
3796 ADV_DVC_CFG *c; 3520 ADV_DVC_CFG *c;
@@ -3809,47 +3533,35 @@ static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3809 iop_base = v->iop_base; 3533 iop_base = v->iop_base;
3810 chip_scsi_id = v->chip_scsi_id; 3534 chip_scsi_id = v->chip_scsi_id;
3811 3535
3812 leftlen = cplen; 3536 seq_printf(m,
3813 totlen = len = 0; 3537 "\nAdv Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
3814 3538 shost->host_no);
3815 len = asc_prt_line(cp, leftlen,
3816 "\nAdv Library Configuration and Statistics for AdvanSys SCSI Host %d:\n",
3817 shost->host_no);
3818 ASC_PRT_NEXT();
3819 3539
3820 len = asc_prt_line(cp, leftlen, 3540 seq_printf(m,
3821 " iop_base 0x%lx, cable_detect: %X, err_code %u\n", 3541 " iop_base 0x%lx, cable_detect: %X, err_code %u\n",
3822 v->iop_base, 3542 (unsigned long)v->iop_base,
3823 AdvReadWordRegister(iop_base, 3543 AdvReadWordRegister(iop_base,IOPW_SCSI_CFG1) & CABLE_DETECT,
3824 IOPW_SCSI_CFG1) & CABLE_DETECT, 3544 v->err_code);
3825 v->err_code);
3826 ASC_PRT_NEXT();
3827 3545
3828 len = asc_prt_line(cp, leftlen, " chip_version %u, mcode_date 0x%x, " 3546 seq_printf(m, " chip_version %u, mcode_date 0x%x, "
3829 "mcode_version 0x%x\n", c->chip_version, 3547 "mcode_version 0x%x\n", c->chip_version,
3830 c->mcode_date, c->mcode_version); 3548 c->mcode_date, c->mcode_version);
3831 ASC_PRT_NEXT();
3832 3549
3833 AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able); 3550 AdvReadWordLram(iop_base, ASC_MC_TAGQNG_ABLE, tagqng_able);
3834 len = asc_prt_line(cp, leftlen, " Queuing Enabled:"); 3551 seq_printf(m, " Queuing Enabled:");
3835 ASC_PRT_NEXT();
3836 for (i = 0; i <= ADV_MAX_TID; i++) { 3552 for (i = 0; i <= ADV_MAX_TID; i++) {
3837 if ((chip_scsi_id == i) || 3553 if ((chip_scsi_id == i) ||
3838 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3554 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3839 continue; 3555 continue;
3840 } 3556 }
3841 3557
3842 len = asc_prt_line(cp, leftlen, " %X:%c", 3558 seq_printf(m, " %X:%c",
3843 i, 3559 i,
3844 (tagqng_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 3560 (tagqng_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3845 'N');
3846 ASC_PRT_NEXT();
3847 } 3561 }
3848 len = asc_prt_line(cp, leftlen, "\n"); 3562 seq_printf(m, "\n");
3849 ASC_PRT_NEXT();
3850 3563
3851 len = asc_prt_line(cp, leftlen, " Queue Limit:"); 3564 seq_printf(m, " Queue Limit:");
3852 ASC_PRT_NEXT();
3853 for (i = 0; i <= ADV_MAX_TID; i++) { 3565 for (i = 0; i <= ADV_MAX_TID; i++) {
3854 if ((chip_scsi_id == i) || 3566 if ((chip_scsi_id == i) ||
3855 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3567 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
@@ -3859,14 +3571,11 @@ static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3859 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + i, 3571 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_MAX_CMD + i,
3860 lrambyte); 3572 lrambyte);
3861 3573
3862 len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte); 3574 seq_printf(m, " %X:%d", i, lrambyte);
3863 ASC_PRT_NEXT();
3864 } 3575 }
3865 len = asc_prt_line(cp, leftlen, "\n"); 3576 seq_printf(m, "\n");
3866 ASC_PRT_NEXT();
3867 3577
3868 len = asc_prt_line(cp, leftlen, " Command Pending:"); 3578 seq_printf(m, " Command Pending:");
3869 ASC_PRT_NEXT();
3870 for (i = 0; i <= ADV_MAX_TID; i++) { 3579 for (i = 0; i <= ADV_MAX_TID; i++) {
3871 if ((chip_scsi_id == i) || 3580 if ((chip_scsi_id == i) ||
3872 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3581 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
@@ -3876,33 +3585,26 @@ static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3876 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_QUEUED_CMD + i, 3585 AdvReadByteLram(iop_base, ASC_MC_NUMBER_OF_QUEUED_CMD + i,
3877 lrambyte); 3586 lrambyte);
3878 3587
3879 len = asc_prt_line(cp, leftlen, " %X:%d", i, lrambyte); 3588 seq_printf(m, " %X:%d", i, lrambyte);
3880 ASC_PRT_NEXT();
3881 } 3589 }
3882 len = asc_prt_line(cp, leftlen, "\n"); 3590 seq_printf(m, "\n");
3883 ASC_PRT_NEXT();
3884 3591
3885 AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able); 3592 AdvReadWordLram(iop_base, ASC_MC_WDTR_ABLE, wdtr_able);
3886 len = asc_prt_line(cp, leftlen, " Wide Enabled:"); 3593 seq_printf(m, " Wide Enabled:");
3887 ASC_PRT_NEXT();
3888 for (i = 0; i <= ADV_MAX_TID; i++) { 3594 for (i = 0; i <= ADV_MAX_TID; i++) {
3889 if ((chip_scsi_id == i) || 3595 if ((chip_scsi_id == i) ||
3890 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3596 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3891 continue; 3597 continue;
3892 } 3598 }
3893 3599
3894 len = asc_prt_line(cp, leftlen, " %X:%c", 3600 seq_printf(m, " %X:%c",
3895 i, 3601 i,
3896 (wdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 3602 (wdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3897 'N');
3898 ASC_PRT_NEXT();
3899 } 3603 }
3900 len = asc_prt_line(cp, leftlen, "\n"); 3604 seq_printf(m, "\n");
3901 ASC_PRT_NEXT();
3902 3605
3903 AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, wdtr_done); 3606 AdvReadWordLram(iop_base, ASC_MC_WDTR_DONE, wdtr_done);
3904 len = asc_prt_line(cp, leftlen, " Transfer Bit Width:"); 3607 seq_printf(m, " Transfer Bit Width:");
3905 ASC_PRT_NEXT();
3906 for (i = 0; i <= ADV_MAX_TID; i++) { 3608 for (i = 0; i <= ADV_MAX_TID; i++) {
3907 if ((chip_scsi_id == i) || 3609 if ((chip_scsi_id == i) ||
3908 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3610 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
@@ -3913,37 +3615,30 @@ static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3913 ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i), 3615 ASC_MC_DEVICE_HSHK_CFG_TABLE + (2 * i),
3914 lramword); 3616 lramword);
3915 3617
3916 len = asc_prt_line(cp, leftlen, " %X:%d", 3618 seq_printf(m, " %X:%d",
3917 i, (lramword & 0x8000) ? 16 : 8); 3619 i, (lramword & 0x8000) ? 16 : 8);
3918 ASC_PRT_NEXT();
3919 3620
3920 if ((wdtr_able & ADV_TID_TO_TIDMASK(i)) && 3621 if ((wdtr_able & ADV_TID_TO_TIDMASK(i)) &&
3921 (wdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) { 3622 (wdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
3922 len = asc_prt_line(cp, leftlen, "*"); 3623 seq_printf(m, "*");
3923 ASC_PRT_NEXT();
3924 renegotiate = 1; 3624 renegotiate = 1;
3925 } 3625 }
3926 } 3626 }
3927 len = asc_prt_line(cp, leftlen, "\n"); 3627 seq_printf(m, "\n");
3928 ASC_PRT_NEXT();
3929 3628
3930 AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able); 3629 AdvReadWordLram(iop_base, ASC_MC_SDTR_ABLE, sdtr_able);
3931 len = asc_prt_line(cp, leftlen, " Synchronous Enabled:"); 3630 seq_printf(m, " Synchronous Enabled:");
3932 ASC_PRT_NEXT();
3933 for (i = 0; i <= ADV_MAX_TID; i++) { 3631 for (i = 0; i <= ADV_MAX_TID; i++) {
3934 if ((chip_scsi_id == i) || 3632 if ((chip_scsi_id == i) ||
3935 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) { 3633 ((boardp->init_tidmask & ADV_TID_TO_TIDMASK(i)) == 0)) {
3936 continue; 3634 continue;
3937 } 3635 }
3938 3636
3939 len = asc_prt_line(cp, leftlen, " %X:%c", 3637 seq_printf(m, " %X:%c",
3940 i, 3638 i,
3941 (sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 3639 (sdtr_able & ADV_TID_TO_TIDMASK(i)) ? 'Y' : 'N');
3942 'N');
3943 ASC_PRT_NEXT();
3944 } 3640 }
3945 len = asc_prt_line(cp, leftlen, "\n"); 3641 seq_printf(m, "\n");
3946 ASC_PRT_NEXT();
3947 3642
3948 AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, sdtr_done); 3643 AdvReadWordLram(iop_base, ASC_MC_SDTR_DONE, sdtr_done);
3949 for (i = 0; i <= ADV_MAX_TID; i++) { 3644 for (i = 0; i <= ADV_MAX_TID; i++) {
@@ -3959,358 +3654,170 @@ static int asc_prt_adv_board_info(struct Scsi_Host *shost, char *cp, int cplen)
3959 continue; 3654 continue;
3960 } 3655 }
3961 3656
3962 len = asc_prt_line(cp, leftlen, " %X:", i); 3657 seq_printf(m, " %X:", i);
3963 ASC_PRT_NEXT();
3964 3658
3965 if ((lramword & 0x1F) == 0) { /* Check for REQ/ACK Offset 0. */ 3659 if ((lramword & 0x1F) == 0) { /* Check for REQ/ACK Offset 0. */
3966 len = asc_prt_line(cp, leftlen, " Asynchronous"); 3660 seq_printf(m, " Asynchronous");
3967 ASC_PRT_NEXT();
3968 } else { 3661 } else {
3969 len = 3662 seq_printf(m, " Transfer Period Factor: ");
3970 asc_prt_line(cp, leftlen,
3971 " Transfer Period Factor: ");
3972 ASC_PRT_NEXT();
3973 3663
3974 if ((lramword & 0x1F00) == 0x1100) { /* 80 Mhz */ 3664 if ((lramword & 0x1F00) == 0x1100) { /* 80 Mhz */
3975 len = 3665 seq_printf(m, "9 (80.0 Mhz),");
3976 asc_prt_line(cp, leftlen, "9 (80.0 Mhz),");
3977 ASC_PRT_NEXT();
3978 } else if ((lramword & 0x1F00) == 0x1000) { /* 40 Mhz */ 3666 } else if ((lramword & 0x1F00) == 0x1000) { /* 40 Mhz */
3979 len = 3667 seq_printf(m, "10 (40.0 Mhz),");
3980 asc_prt_line(cp, leftlen, "10 (40.0 Mhz),");
3981 ASC_PRT_NEXT();
3982 } else { /* 20 Mhz or below. */ 3668 } else { /* 20 Mhz or below. */
3983 3669
3984 period = (((lramword >> 8) * 25) + 50) / 4; 3670 period = (((lramword >> 8) * 25) + 50) / 4;
3985 3671
3986 if (period == 0) { /* Should never happen. */ 3672 if (period == 0) { /* Should never happen. */
3987 len = 3673 seq_printf(m, "%d (? Mhz), ", period);
3988 asc_prt_line(cp, leftlen,
3989 "%d (? Mhz), ");
3990 ASC_PRT_NEXT();
3991 } else { 3674 } else {
3992 len = asc_prt_line(cp, leftlen, 3675 seq_printf(m,
3993 "%d (%d.%d Mhz),", 3676 "%d (%d.%d Mhz),",
3994 period, 250 / period, 3677 period, 250 / period,
3995 ASC_TENTHS(250, 3678 ASC_TENTHS(250, period));
3996 period));
3997 ASC_PRT_NEXT();
3998 } 3679 }
3999 } 3680 }
4000 3681
4001 len = asc_prt_line(cp, leftlen, " REQ/ACK Offset: %d", 3682 seq_printf(m, " REQ/ACK Offset: %d",
4002 lramword & 0x1F); 3683 lramword & 0x1F);
4003 ASC_PRT_NEXT();
4004 } 3684 }
4005 3685
4006 if ((sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) { 3686 if ((sdtr_done & ADV_TID_TO_TIDMASK(i)) == 0) {
4007 len = asc_prt_line(cp, leftlen, "*\n"); 3687 seq_printf(m, "*\n");
4008 renegotiate = 1; 3688 renegotiate = 1;
4009 } else { 3689 } else {
4010 len = asc_prt_line(cp, leftlen, "\n"); 3690 seq_printf(m, "\n");
4011 } 3691 }
4012 ASC_PRT_NEXT();
4013 } 3692 }
4014 3693
4015 if (renegotiate) { 3694 if (renegotiate) {
4016 len = asc_prt_line(cp, leftlen, 3695 seq_printf(m,
4017 " * = Re-negotiation pending before next command.\n"); 3696 " * = Re-negotiation pending before next command.\n");
4018 ASC_PRT_NEXT();
4019 } 3697 }
4020
4021 return totlen;
4022}
4023
4024/*
4025 * asc_proc_copy()
4026 *
4027 * Copy proc information to a read buffer taking into account the current
4028 * read offset in the file and the remaining space in the read buffer.
4029 */
4030static int
4031asc_proc_copy(off_t advoffset, off_t offset, char *curbuf, int leftlen,
4032 char *cp, int cplen)
4033{
4034 int cnt = 0;
4035
4036 ASC_DBG(2, "offset %d, advoffset %d, cplen %d\n",
4037 (unsigned)offset, (unsigned)advoffset, cplen);
4038 if (offset <= advoffset) {
4039 /* Read offset below current offset, copy everything. */
4040 cnt = min(cplen, leftlen);
4041 ASC_DBG(2, "curbuf 0x%lx, cp 0x%lx, cnt %d\n",
4042 (ulong)curbuf, (ulong)cp, cnt);
4043 memcpy(curbuf, cp, cnt);
4044 } else if (offset < advoffset + cplen) {
4045 /* Read offset within current range, partial copy. */
4046 cnt = (advoffset + cplen) - offset;
4047 cp = (cp + cplen) - cnt;
4048 cnt = min(cnt, leftlen);
4049 ASC_DBG(2, "curbuf 0x%lx, cp 0x%lx, cnt %d\n",
4050 (ulong)curbuf, (ulong)cp, cnt);
4051 memcpy(curbuf, cp, cnt);
4052 }
4053 return cnt;
4054} 3698}
4055 3699
4056#ifdef ADVANSYS_STATS 3700#ifdef ADVANSYS_STATS
4057/* 3701/*
4058 * asc_prt_board_stats() 3702 * asc_prt_board_stats()
4059 *
4060 * Note: no single line should be greater than ASC_PRTLINE_SIZE,
4061 * cf. asc_prt_line().
4062 *
4063 * Return the number of characters copied into 'cp'. No more than
4064 * 'cplen' characters will be copied to 'cp'.
4065 */ 3703 */
4066static int asc_prt_board_stats(struct Scsi_Host *shost, char *cp, int cplen) 3704static void asc_prt_board_stats(struct seq_file *m, struct Scsi_Host *shost)
4067{ 3705{
4068 struct asc_board *boardp = shost_priv(shost); 3706 struct asc_board *boardp = shost_priv(shost);
4069 struct asc_stats *s = &boardp->asc_stats; 3707 struct asc_stats *s = &boardp->asc_stats;
4070 3708
4071 int leftlen = cplen; 3709 seq_printf(m,
4072 int len, totlen = 0; 3710 "\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n",
3711 shost->host_no);
4073 3712
4074 len = asc_prt_line(cp, leftlen, 3713 seq_printf(m,
4075 "\nLinux Driver Statistics for AdvanSys SCSI Host %d:\n", 3714 " queuecommand %u, reset %u, biosparam %u, interrupt %u\n",
4076 shost->host_no); 3715 s->queuecommand, s->reset, s->biosparam,
4077 ASC_PRT_NEXT(); 3716 s->interrupt);
4078 3717
4079 len = asc_prt_line(cp, leftlen, 3718 seq_printf(m,
4080 " queuecommand %lu, reset %lu, biosparam %lu, interrupt %lu\n", 3719 " callback %u, done %u, build_error %u, build_noreq %u, build_nosg %u\n",
4081 s->queuecommand, s->reset, s->biosparam, 3720 s->callback, s->done, s->build_error,
4082 s->interrupt); 3721 s->adv_build_noreq, s->adv_build_nosg);
4083 ASC_PRT_NEXT();
4084 3722
4085 len = asc_prt_line(cp, leftlen, 3723 seq_printf(m,
4086 " callback %lu, done %lu, build_error %lu, build_noreq %lu, build_nosg %lu\n", 3724 " exe_noerror %u, exe_busy %u, exe_error %u, exe_unknown %u\n",
4087 s->callback, s->done, s->build_error, 3725 s->exe_noerror, s->exe_busy, s->exe_error,
4088 s->adv_build_noreq, s->adv_build_nosg); 3726 s->exe_unknown);
4089 ASC_PRT_NEXT();
4090
4091 len = asc_prt_line(cp, leftlen,
4092 " exe_noerror %lu, exe_busy %lu, exe_error %lu, exe_unknown %lu\n",
4093 s->exe_noerror, s->exe_busy, s->exe_error,
4094 s->exe_unknown);
4095 ASC_PRT_NEXT();
4096 3727
4097 /* 3728 /*
4098 * Display data transfer statistics. 3729 * Display data transfer statistics.
4099 */ 3730 */
4100 if (s->xfer_cnt > 0) { 3731 if (s->xfer_cnt > 0) {
4101 len = asc_prt_line(cp, leftlen, " xfer_cnt %lu, xfer_elem %lu, ", 3732 seq_printf(m, " xfer_cnt %u, xfer_elem %u, ",
4102 s->xfer_cnt, s->xfer_elem); 3733 s->xfer_cnt, s->xfer_elem);
4103 ASC_PRT_NEXT();
4104 3734
4105 len = asc_prt_line(cp, leftlen, "xfer_bytes %lu.%01lu kb\n", 3735 seq_printf(m, "xfer_bytes %u.%01u kb\n",
4106 s->xfer_sect / 2, ASC_TENTHS(s->xfer_sect, 2)); 3736 s->xfer_sect / 2, ASC_TENTHS(s->xfer_sect, 2));
4107 ASC_PRT_NEXT();
4108 3737
4109 /* Scatter gather transfer statistics */ 3738 /* Scatter gather transfer statistics */
4110 len = asc_prt_line(cp, leftlen, " avg_num_elem %lu.%01lu, ", 3739 seq_printf(m, " avg_num_elem %u.%01u, ",
4111 s->xfer_elem / s->xfer_cnt, 3740 s->xfer_elem / s->xfer_cnt,
4112 ASC_TENTHS(s->xfer_elem, s->xfer_cnt)); 3741 ASC_TENTHS(s->xfer_elem, s->xfer_cnt));
4113 ASC_PRT_NEXT();
4114 3742
4115 len = asc_prt_line(cp, leftlen, "avg_elem_size %lu.%01lu kb, ", 3743 seq_printf(m, "avg_elem_size %u.%01u kb, ",
4116 (s->xfer_sect / 2) / s->xfer_elem, 3744 (s->xfer_sect / 2) / s->xfer_elem,
4117 ASC_TENTHS((s->xfer_sect / 2), s->xfer_elem)); 3745 ASC_TENTHS((s->xfer_sect / 2), s->xfer_elem));
4118 ASC_PRT_NEXT();
4119 3746
4120 len = asc_prt_line(cp, leftlen, "avg_xfer_size %lu.%01lu kb\n", 3747 seq_printf(m, "avg_xfer_size %u.%01u kb\n",
4121 (s->xfer_sect / 2) / s->xfer_cnt, 3748 (s->xfer_sect / 2) / s->xfer_cnt,
4122 ASC_TENTHS((s->xfer_sect / 2), s->xfer_cnt)); 3749 ASC_TENTHS((s->xfer_sect / 2), s->xfer_cnt));
4123 ASC_PRT_NEXT();
4124 } 3750 }
4125
4126 return totlen;
4127} 3751}
4128#endif /* ADVANSYS_STATS */ 3752#endif /* ADVANSYS_STATS */
4129 3753
4130/* 3754/*
4131 * advansys_proc_info() - /proc/scsi/advansys/{0,1,2,3,...} 3755 * advansys_show_info() - /proc/scsi/advansys/{0,1,2,3,...}
4132 * 3756 *
4133 * *buffer: I/O buffer 3757 * m: seq_file to print into
4134 * **start: if inout == FALSE pointer into buffer where user read should start 3758 * shost: Scsi_Host
4135 * offset: current offset into a /proc/scsi/advansys/[0...] file
4136 * length: length of buffer
4137 * hostno: Scsi_Host host_no
4138 * inout: TRUE - user is writing; FALSE - user is reading
4139 * 3759 *
4140 * Return the number of bytes read from or written to a 3760 * Return the number of bytes read from or written to a
4141 * /proc/scsi/advansys/[0...] file. 3761 * /proc/scsi/advansys/[0...] file.
4142 *
4143 * Note: This function uses the per board buffer 'prtbuf' which is
4144 * allocated when the board is initialized in advansys_detect(). The
4145 * buffer is ASC_PRTBUF_SIZE bytes. The function asc_proc_copy() is
4146 * used to write to the buffer. The way asc_proc_copy() is written
4147 * if 'prtbuf' is too small it will not be overwritten. Instead the
4148 * user just won't get all the available statistics.
4149 */ 3762 */
4150static int 3763static int
4151advansys_proc_info(struct Scsi_Host *shost, char *buffer, char **start, 3764advansys_show_info(struct seq_file *m, struct Scsi_Host *shost)
4152 off_t offset, int length, int inout)
4153{ 3765{
4154 struct asc_board *boardp = shost_priv(shost); 3766 struct asc_board *boardp = shost_priv(shost);
4155 char *cp;
4156 int cplen;
4157 int cnt;
4158 int totcnt;
4159 int leftlen;
4160 char *curbuf;
4161 off_t advoffset;
4162 3767
4163 ASC_DBG(1, "begin\n"); 3768 ASC_DBG(1, "begin\n");
4164 3769
4165 /* 3770 /*
4166 * User write not supported.
4167 */
4168 if (inout == TRUE)
4169 return -ENOSYS;
4170
4171 /*
4172 * User read of /proc/scsi/advansys/[0...] file. 3771 * User read of /proc/scsi/advansys/[0...] file.
4173 */ 3772 */
4174 3773
4175 /* Copy read data starting at the beginning of the buffer. */
4176 *start = buffer;
4177 curbuf = buffer;
4178 advoffset = 0;
4179 totcnt = 0;
4180 leftlen = length;
4181
4182 /* 3774 /*
4183 * Get board configuration information. 3775 * Get board configuration information.
4184 * 3776 *
4185 * advansys_info() returns the board string from its own static buffer. 3777 * advansys_info() returns the board string from its own static buffer.
4186 */ 3778 */
4187 cp = (char *)advansys_info(shost);
4188 strcat(cp, "\n");
4189 cplen = strlen(cp);
4190 /* Copy board information. */ 3779 /* Copy board information. */
4191 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen); 3780 seq_printf(m, "%s\n", (char *)advansys_info(shost));
4192 totcnt += cnt;
4193 leftlen -= cnt;
4194 if (leftlen == 0) {
4195 ASC_DBG(1, "totcnt %d\n", totcnt);
4196 return totcnt;
4197 }
4198 advoffset += cplen;
4199 curbuf += cnt;
4200
4201 /* 3781 /*
4202 * Display Wide Board BIOS Information. 3782 * Display Wide Board BIOS Information.
4203 */ 3783 */
4204 if (!ASC_NARROW_BOARD(boardp)) { 3784 if (!ASC_NARROW_BOARD(boardp))
4205 cp = boardp->prtbuf; 3785 asc_prt_adv_bios(m, shost);
4206 cplen = asc_prt_adv_bios(shost, cp, ASC_PRTBUF_SIZE);
4207 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4208 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp,
4209 cplen);
4210 totcnt += cnt;
4211 leftlen -= cnt;
4212 if (leftlen == 0) {
4213 ASC_DBG(1, "totcnt %d\n", totcnt);
4214 return totcnt;
4215 }
4216 advoffset += cplen;
4217 curbuf += cnt;
4218 }
4219 3786
4220 /* 3787 /*
4221 * Display driver information for each device attached to the board. 3788 * Display driver information for each device attached to the board.
4222 */ 3789 */
4223 cp = boardp->prtbuf; 3790 asc_prt_board_devices(m, shost);
4224 cplen = asc_prt_board_devices(shost, cp, ASC_PRTBUF_SIZE);
4225 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4226 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4227 totcnt += cnt;
4228 leftlen -= cnt;
4229 if (leftlen == 0) {
4230 ASC_DBG(1, "totcnt %d\n", totcnt);
4231 return totcnt;
4232 }
4233 advoffset += cplen;
4234 curbuf += cnt;
4235 3791
4236 /* 3792 /*
4237 * Display EEPROM configuration for the board. 3793 * Display EEPROM configuration for the board.
4238 */ 3794 */
4239 cp = boardp->prtbuf; 3795 if (ASC_NARROW_BOARD(boardp))
4240 if (ASC_NARROW_BOARD(boardp)) { 3796 asc_prt_asc_board_eeprom(m, shost);
4241 cplen = asc_prt_asc_board_eeprom(shost, cp, ASC_PRTBUF_SIZE); 3797 else
4242 } else { 3798 asc_prt_adv_board_eeprom(m, shost);
4243 cplen = asc_prt_adv_board_eeprom(shost, cp, ASC_PRTBUF_SIZE);
4244 }
4245 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4246 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4247 totcnt += cnt;
4248 leftlen -= cnt;
4249 if (leftlen == 0) {
4250 ASC_DBG(1, "totcnt %d\n", totcnt);
4251 return totcnt;
4252 }
4253 advoffset += cplen;
4254 curbuf += cnt;
4255 3799
4256 /* 3800 /*
4257 * Display driver configuration and information for the board. 3801 * Display driver configuration and information for the board.
4258 */ 3802 */
4259 cp = boardp->prtbuf; 3803 asc_prt_driver_conf(m, shost);
4260 cplen = asc_prt_driver_conf(shost, cp, ASC_PRTBUF_SIZE);
4261 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4262 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4263 totcnt += cnt;
4264 leftlen -= cnt;
4265 if (leftlen == 0) {
4266 ASC_DBG(1, "totcnt %d\n", totcnt);
4267 return totcnt;
4268 }
4269 advoffset += cplen;
4270 curbuf += cnt;
4271 3804
4272#ifdef ADVANSYS_STATS 3805#ifdef ADVANSYS_STATS
4273 /* 3806 /*
4274 * Display driver statistics for the board. 3807 * Display driver statistics for the board.
4275 */ 3808 */
4276 cp = boardp->prtbuf; 3809 asc_prt_board_stats(m, shost);
4277 cplen = asc_prt_board_stats(shost, cp, ASC_PRTBUF_SIZE);
4278 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4279 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4280 totcnt += cnt;
4281 leftlen -= cnt;
4282 if (leftlen == 0) {
4283 ASC_DBG(1, "totcnt %d\n", totcnt);
4284 return totcnt;
4285 }
4286 advoffset += cplen;
4287 curbuf += cnt;
4288#endif /* ADVANSYS_STATS */ 3810#endif /* ADVANSYS_STATS */
4289 3811
4290 /* 3812 /*
4291 * Display Asc Library dynamic configuration information 3813 * Display Asc Library dynamic configuration information
4292 * for the board. 3814 * for the board.
4293 */ 3815 */
4294 cp = boardp->prtbuf; 3816 if (ASC_NARROW_BOARD(boardp))
4295 if (ASC_NARROW_BOARD(boardp)) { 3817 asc_prt_asc_board_info(m, shost);
4296 cplen = asc_prt_asc_board_info(shost, cp, ASC_PRTBUF_SIZE); 3818 else
4297 } else { 3819 asc_prt_adv_board_info(m, shost);
4298 cplen = asc_prt_adv_board_info(shost, cp, ASC_PRTBUF_SIZE); 3820 return 0;
4299 }
4300 BUG_ON(cplen >= ASC_PRTBUF_SIZE);
4301 cnt = asc_proc_copy(advoffset, offset, curbuf, leftlen, cp, cplen);
4302 totcnt += cnt;
4303 leftlen -= cnt;
4304 if (leftlen == 0) {
4305 ASC_DBG(1, "totcnt %d\n", totcnt);
4306 return totcnt;
4307 }
4308 advoffset += cplen;
4309 curbuf += cnt;
4310
4311 ASC_DBG(1, "totcnt %d\n", totcnt);
4312
4313 return totcnt;
4314} 3821}
4315#endif /* CONFIG_PROC_FS */ 3822#endif /* CONFIG_PROC_FS */
4316 3823
@@ -11743,7 +11250,7 @@ static int AdvInitGetConfig(struct pci_dev *pdev, struct Scsi_Host *shost)
11743static struct scsi_host_template advansys_template = { 11250static struct scsi_host_template advansys_template = {
11744 .proc_name = DRV_NAME, 11251 .proc_name = DRV_NAME,
11745#ifdef CONFIG_PROC_FS 11252#ifdef CONFIG_PROC_FS
11746 .proc_info = advansys_proc_info, 11253 .show_info = advansys_show_info,
11747#endif 11254#endif
11748 .name = DRV_NAME, 11255 .name = DRV_NAME,
11749 .info = advansys_info, 11256 .info = advansys_info,
@@ -11939,20 +11446,6 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
11939#endif /* CONFIG_PCI */ 11446#endif /* CONFIG_PCI */
11940 } 11447 }
11941 11448
11942#ifdef CONFIG_PROC_FS
11943 /*
11944 * Allocate buffer for printing information from
11945 * /proc/scsi/advansys/[0...].
11946 */
11947 boardp->prtbuf = kmalloc(ASC_PRTBUF_SIZE, GFP_KERNEL);
11948 if (!boardp->prtbuf) {
11949 shost_printk(KERN_ERR, shost, "kmalloc(%d) returned NULL\n",
11950 ASC_PRTBUF_SIZE);
11951 ret = -ENOMEM;
11952 goto err_unmap;
11953 }
11954#endif /* CONFIG_PROC_FS */
11955
11956 if (ASC_NARROW_BOARD(boardp)) { 11449 if (ASC_NARROW_BOARD(boardp)) {
11957 /* 11450 /*
11958 * Set the board bus type and PCI IRQ before 11451 * Set the board bus type and PCI IRQ before
@@ -12010,7 +11503,7 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
12010 } 11503 }
12011 11504
12012 if (ret) 11505 if (ret)
12013 goto err_free_proc; 11506 goto err_unmap;
12014 11507
12015 /* 11508 /*
12016 * Save the EEPROM configuration so that it can be displayed 11509 * Save the EEPROM configuration so that it can be displayed
@@ -12055,7 +11548,7 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
12055 ASC_DBG(2, "AscInitSetConfig()\n"); 11548 ASC_DBG(2, "AscInitSetConfig()\n");
12056 ret = AscInitSetConfig(pdev, shost) ? -ENODEV : 0; 11549 ret = AscInitSetConfig(pdev, shost) ? -ENODEV : 0;
12057 if (ret) 11550 if (ret)
12058 goto err_free_proc; 11551 goto err_unmap;
12059 } else { 11552 } else {
12060 ADVEEP_3550_CONFIG *ep_3550; 11553 ADVEEP_3550_CONFIG *ep_3550;
12061 ADVEEP_38C0800_CONFIG *ep_38C0800; 11554 ADVEEP_38C0800_CONFIG *ep_38C0800;
@@ -12290,7 +11783,7 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
12290 shost_printk(KERN_ERR, shost, "request_dma() " 11783 shost_printk(KERN_ERR, shost, "request_dma() "
12291 "%d failed %d\n", 11784 "%d failed %d\n",
12292 shost->dma_channel, ret); 11785 shost->dma_channel, ret);
12293 goto err_free_proc; 11786 goto err_unmap;
12294 } 11787 }
12295 AscEnableIsaDma(shost->dma_channel); 11788 AscEnableIsaDma(shost->dma_channel);
12296 } 11789 }
@@ -12371,8 +11864,6 @@ static int advansys_board_found(struct Scsi_Host *shost, unsigned int iop,
12371 if (shost->dma_channel != NO_ISA_DMA) 11864 if (shost->dma_channel != NO_ISA_DMA)
12372 free_dma(shost->dma_channel); 11865 free_dma(shost->dma_channel);
12373#endif 11866#endif
12374 err_free_proc:
12375 kfree(boardp->prtbuf);
12376 err_unmap: 11867 err_unmap:
12377 if (boardp->ioremap_addr) 11868 if (boardp->ioremap_addr)
12378 iounmap(boardp->ioremap_addr); 11869 iounmap(boardp->ioremap_addr);
@@ -12406,7 +11897,6 @@ static int advansys_release(struct Scsi_Host *shost)
12406 iounmap(board->ioremap_addr); 11897 iounmap(board->ioremap_addr);
12407 advansys_wide_free_mem(board); 11898 advansys_wide_free_mem(board);
12408 } 11899 }
12409 kfree(board->prtbuf);
12410 scsi_host_put(shost); 11900 scsi_host_put(shost);
12411 ASC_DBG(1, "end\n"); 11901 ASC_DBG(1, "end\n");
12412 return 0; 11902 return 0;
diff --git a/drivers/scsi/aha152x.c b/drivers/scsi/aha152x.c
index a284be17699f..3f7b6fee0a74 100644
--- a/drivers/scsi/aha152x.c
+++ b/drivers/scsi/aha152x.c
@@ -2977,11 +2977,10 @@ static void show_queues(struct Scsi_Host *shpnt)
2977} 2977}
2978 2978
2979#undef SPRINTF 2979#undef SPRINTF
2980#define SPRINTF(args...) pos += sprintf(pos, ## args) 2980#define SPRINTF(args...) seq_printf(m, ##args)
2981 2981
2982static int get_command(char *pos, Scsi_Cmnd * ptr) 2982static void get_command(struct seq_file *m, Scsi_Cmnd * ptr)
2983{ 2983{
2984 char *start = pos;
2985 int i; 2984 int i;
2986 2985
2987 SPRINTF("%p: target=%d; lun=%d; cmnd=( ", 2986 SPRINTF("%p: target=%d; lun=%d; cmnd=( ",
@@ -3011,13 +3010,10 @@ static int get_command(char *pos, Scsi_Cmnd * ptr)
3011 if (ptr->SCp.phase & syncneg) 3010 if (ptr->SCp.phase & syncneg)
3012 SPRINTF("syncneg|"); 3011 SPRINTF("syncneg|");
3013 SPRINTF("; next=0x%p\n", SCNEXT(ptr)); 3012 SPRINTF("; next=0x%p\n", SCNEXT(ptr));
3014
3015 return (pos - start);
3016} 3013}
3017 3014
3018static int get_ports(struct Scsi_Host *shpnt, char *pos) 3015static void get_ports(struct seq_file *m, struct Scsi_Host *shpnt)
3019{ 3016{
3020 char *start = pos;
3021 int s; 3017 int s;
3022 3018
3023 SPRINTF("\n%s: %s(%s) ", CURRENT_SC ? "on bus" : "waiting", states[STATE].name, states[PREVSTATE].name); 3019 SPRINTF("\n%s: %s(%s) ", CURRENT_SC ? "on bus" : "waiting", states[STATE].name, states[PREVSTATE].name);
@@ -3273,11 +3269,9 @@ static int get_ports(struct Scsi_Host *shpnt, char *pos)
3273 if (s & ENREQINIT) 3269 if (s & ENREQINIT)
3274 SPRINTF("ENREQINIT "); 3270 SPRINTF("ENREQINIT ");
3275 SPRINTF(")\n"); 3271 SPRINTF(")\n");
3276
3277 return (pos - start);
3278} 3272}
3279 3273
3280static int aha152x_set_info(char *buffer, int length, struct Scsi_Host *shpnt) 3274static int aha152x_set_info(struct Scsi_Host *shpnt, char *buffer, int length)
3281{ 3275{
3282 if(!shpnt || !buffer || length<8 || strncmp("aha152x ", buffer, 8)!=0) 3276 if(!shpnt || !buffer || length<8 || strncmp("aha152x ", buffer, 8)!=0)
3283 return -EINVAL; 3277 return -EINVAL;
@@ -3320,26 +3314,11 @@ static int aha152x_set_info(char *buffer, int length, struct Scsi_Host *shpnt)
3320 return length; 3314 return length;
3321} 3315}
3322 3316
3323#undef SPRINTF 3317static int aha152x_show_info(struct seq_file *m, struct Scsi_Host *shpnt)
3324#define SPRINTF(args...) \
3325 do { if(pos < buffer + length) pos += sprintf(pos, ## args); } while(0)
3326
3327static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start,
3328 off_t offset, int length, int inout)
3329{ 3318{
3330 int i; 3319 int i;
3331 char *pos = buffer;
3332 Scsi_Cmnd *ptr; 3320 Scsi_Cmnd *ptr;
3333 unsigned long flags; 3321 unsigned long flags;
3334 int thislength;
3335
3336 DPRINTK(debug_procinfo,
3337 KERN_DEBUG "aha152x_proc_info: buffer=%p offset=%ld length=%d hostno=%d inout=%d\n",
3338 buffer, offset, length, shpnt->host_no, inout);
3339
3340
3341 if (inout)
3342 return aha152x_set_info(buffer, length, shpnt);
3343 3322
3344 SPRINTF(AHA152X_REVID "\n"); 3323 SPRINTF(AHA152X_REVID "\n");
3345 3324
@@ -3392,25 +3371,25 @@ static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start
3392 if (ISSUE_SC) { 3371 if (ISSUE_SC) {
3393 SPRINTF("not yet issued commands:\n"); 3372 SPRINTF("not yet issued commands:\n");
3394 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr)) 3373 for (ptr = ISSUE_SC; ptr; ptr = SCNEXT(ptr))
3395 pos += get_command(pos, ptr); 3374 get_command(m, ptr);
3396 } else 3375 } else
3397 SPRINTF("no not yet issued commands\n"); 3376 SPRINTF("no not yet issued commands\n");
3398 DO_UNLOCK(flags); 3377 DO_UNLOCK(flags);
3399 3378
3400 if (CURRENT_SC) { 3379 if (CURRENT_SC) {
3401 SPRINTF("current command:\n"); 3380 SPRINTF("current command:\n");
3402 pos += get_command(pos, CURRENT_SC); 3381 get_command(m, CURRENT_SC);
3403 } else 3382 } else
3404 SPRINTF("no current command\n"); 3383 SPRINTF("no current command\n");
3405 3384
3406 if (DISCONNECTED_SC) { 3385 if (DISCONNECTED_SC) {
3407 SPRINTF("disconnected commands:\n"); 3386 SPRINTF("disconnected commands:\n");
3408 for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr)) 3387 for (ptr = DISCONNECTED_SC; ptr; ptr = SCNEXT(ptr))
3409 pos += get_command(pos, ptr); 3388 get_command(m, ptr);
3410 } else 3389 } else
3411 SPRINTF("no disconnected commands\n"); 3390 SPRINTF("no disconnected commands\n");
3412 3391
3413 pos += get_ports(shpnt, pos); 3392 get_ports(m, shpnt);
3414 3393
3415#if defined(AHA152X_STAT) 3394#if defined(AHA152X_STAT)
3416 SPRINTF("statistics:\n" 3395 SPRINTF("statistics:\n"
@@ -3440,24 +3419,7 @@ static int aha152x_proc_info(struct Scsi_Host *shpnt, char *buffer, char **start
3440 HOSTDATA(shpnt)->time[i]); 3419 HOSTDATA(shpnt)->time[i]);
3441 } 3420 }
3442#endif 3421#endif
3443 3422 return 0;
3444 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: pos=%p\n", pos);
3445
3446 thislength = pos - (buffer + offset);
3447 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: length=%d thislength=%d\n", length, thislength);
3448
3449 if(thislength<0) {
3450 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: output too short\n");
3451 *start = NULL;
3452 return 0;
3453 }
3454
3455 thislength = thislength<length ? thislength : length;
3456
3457 DPRINTK(debug_procinfo, KERN_DEBUG "aha152x_proc_info: return %d\n", thislength);
3458
3459 *start = buffer + offset;
3460 return thislength < length ? thislength : length;
3461} 3423}
3462 3424
3463static int aha152x_adjust_queue(struct scsi_device *device) 3425static int aha152x_adjust_queue(struct scsi_device *device)
@@ -3470,7 +3432,8 @@ static struct scsi_host_template aha152x_driver_template = {
3470 .module = THIS_MODULE, 3432 .module = THIS_MODULE,
3471 .name = AHA152X_REVID, 3433 .name = AHA152X_REVID,
3472 .proc_name = "aha152x", 3434 .proc_name = "aha152x",
3473 .proc_info = aha152x_proc_info, 3435 .show_info = aha152x_show_info,
3436 .write_info = aha152x_set_info,
3474 .queuecommand = aha152x_queue, 3437 .queuecommand = aha152x_queue,
3475 .eh_abort_handler = aha152x_abort, 3438 .eh_abort_handler = aha152x_abort,
3476 .eh_device_reset_handler = aha152x_device_reset, 3439 .eh_device_reset_handler = aha152x_device_reset,
diff --git a/drivers/scsi/aha1740.c b/drivers/scsi/aha1740.c
index df775e6ba579..5f3101797c93 100644
--- a/drivers/scsi/aha1740.c
+++ b/drivers/scsi/aha1740.c
@@ -106,33 +106,14 @@ static inline dma_addr_t ecb_cpu_to_dma (struct Scsi_Host *host, void *cpu)
106 return hdata->ecb_dma_addr + offset; 106 return hdata->ecb_dma_addr + offset;
107} 107}
108 108
109static int aha1740_proc_info(struct Scsi_Host *shpnt, char *buffer, 109static int aha1740_show_info(struct seq_file *m, struct Scsi_Host *shpnt)
110 char **start, off_t offset,
111 int length, int inout)
112{ 110{
113 int len; 111 struct aha1740_hostdata *host = HOSTDATA(shpnt);
114 struct aha1740_hostdata *host; 112 seq_printf(m, "aha174x at IO:%lx, IRQ %d, SLOT %d.\n"
115
116 if (inout)
117 return-ENOSYS;
118
119 host = HOSTDATA(shpnt);
120
121 len = sprintf(buffer, "aha174x at IO:%lx, IRQ %d, SLOT %d.\n"
122 "Extended translation %sabled.\n", 113 "Extended translation %sabled.\n",
123 shpnt->io_port, shpnt->irq, host->edev->slot, 114 shpnt->io_port, shpnt->irq, host->edev->slot,
124 host->translation ? "en" : "dis"); 115 host->translation ? "en" : "dis");
125 116 return 0;
126 if (offset > len) {
127 *start = buffer;
128 return 0;
129 }
130
131 *start = buffer + offset;
132 len -= offset;
133 if (len > length)
134 len = length;
135 return len;
136} 117}
137 118
138static int aha1740_makecode(unchar *sense, unchar *status) 119static int aha1740_makecode(unchar *sense, unchar *status)
@@ -556,7 +537,7 @@ static int aha1740_eh_abort_handler (Scsi_Cmnd *dummy)
556static struct scsi_host_template aha1740_template = { 537static struct scsi_host_template aha1740_template = {
557 .module = THIS_MODULE, 538 .module = THIS_MODULE,
558 .proc_name = "aha1740", 539 .proc_name = "aha1740",
559 .proc_info = aha1740_proc_info, 540 .show_info = aha1740_show_info,
560 .name = "Adaptec 174x (EISA)", 541 .name = "Adaptec 174x (EISA)",
561 .queuecommand = aha1740_queuecommand, 542 .queuecommand = aha1740_queuecommand,
562 .bios_param = aha1740_biosparam, 543 .bios_param = aha1740_biosparam,
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.c b/drivers/scsi/aic7xxx/aic79xx_osm.c
index 9328121804bb..69d5c43a65e5 100644
--- a/drivers/scsi/aic7xxx/aic79xx_osm.c
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.c
@@ -906,7 +906,8 @@ struct scsi_host_template aic79xx_driver_template = {
906 .module = THIS_MODULE, 906 .module = THIS_MODULE,
907 .name = "aic79xx", 907 .name = "aic79xx",
908 .proc_name = "aic79xx", 908 .proc_name = "aic79xx",
909 .proc_info = ahd_linux_proc_info, 909 .show_info = ahd_linux_show_info,
910 .write_info = ahd_proc_write_seeprom,
910 .info = ahd_linux_info, 911 .info = ahd_linux_info,
911 .queuecommand = ahd_linux_queue, 912 .queuecommand = ahd_linux_queue,
912 .eh_abort_handler = ahd_linux_abort, 913 .eh_abort_handler = ahd_linux_abort,
@@ -1702,19 +1703,13 @@ ahd_send_async(struct ahd_softc *ahd, char channel,
1702 switch (code) { 1703 switch (code) {
1703 case AC_TRANSFER_NEG: 1704 case AC_TRANSFER_NEG:
1704 { 1705 {
1705 char buf[80];
1706 struct scsi_target *starget; 1706 struct scsi_target *starget;
1707 struct info_str info;
1708 struct ahd_initiator_tinfo *tinfo; 1707 struct ahd_initiator_tinfo *tinfo;
1709 struct ahd_tmode_tstate *tstate; 1708 struct ahd_tmode_tstate *tstate;
1710 unsigned int target_ppr_options; 1709 unsigned int target_ppr_options;
1711 1710
1712 BUG_ON(target == CAM_TARGET_WILDCARD); 1711 BUG_ON(target == CAM_TARGET_WILDCARD);
1713 1712
1714 info.buffer = buf;
1715 info.length = sizeof(buf);
1716 info.offset = 0;
1717 info.pos = 0;
1718 tinfo = ahd_fetch_transinfo(ahd, channel, ahd->our_id, 1713 tinfo = ahd_fetch_transinfo(ahd, channel, ahd->our_id,
1719 target, &tstate); 1714 target, &tstate);
1720 1715
diff --git a/drivers/scsi/aic7xxx/aic79xx_osm.h b/drivers/scsi/aic7xxx/aic79xx_osm.h
index 28e43498cdff..c58fa33c6592 100644
--- a/drivers/scsi/aic7xxx/aic79xx_osm.h
+++ b/drivers/scsi/aic7xxx/aic79xx_osm.h
@@ -379,14 +379,6 @@ void ahd_insb(struct ahd_softc * ahd, long port,
379int ahd_linux_register_host(struct ahd_softc *, 379int ahd_linux_register_host(struct ahd_softc *,
380 struct scsi_host_template *); 380 struct scsi_host_template *);
381 381
382/*************************** Pretty Printing **********************************/
383struct info_str {
384 char *buffer;
385 int length;
386 off_t offset;
387 int pos;
388};
389
390/******************************** Locking *************************************/ 382/******************************** Locking *************************************/
391static inline void 383static inline void
392ahd_lockinit(struct ahd_softc *ahd) 384ahd_lockinit(struct ahd_softc *ahd)
@@ -513,8 +505,8 @@ ahd_flush_device_writes(struct ahd_softc *ahd)
513} 505}
514 506
515/**************************** Proc FS Support *********************************/ 507/**************************** Proc FS Support *********************************/
516int ahd_linux_proc_info(struct Scsi_Host *, char *, char **, 508int ahd_proc_write_seeprom(struct Scsi_Host *, char *, int);
517 off_t, int, int); 509int ahd_linux_show_info(struct seq_file *,struct Scsi_Host *);
518 510
519/*********************** Transaction Access Wrappers **************************/ 511/*********************** Transaction Access Wrappers **************************/
520static inline void ahd_cmd_set_transaction_status(struct scsi_cmnd *, uint32_t); 512static inline void ahd_cmd_set_transaction_status(struct scsi_cmnd *, uint32_t);
diff --git a/drivers/scsi/aic7xxx/aic79xx_proc.c b/drivers/scsi/aic7xxx/aic79xx_proc.c
index 59c85d5a153a..e9778b4f7e32 100644
--- a/drivers/scsi/aic7xxx/aic79xx_proc.c
+++ b/drivers/scsi/aic7xxx/aic79xx_proc.c
@@ -42,16 +42,12 @@
42#include "aic79xx_osm.h" 42#include "aic79xx_osm.h"
43#include "aic79xx_inline.h" 43#include "aic79xx_inline.h"
44 44
45static void copy_mem_info(struct info_str *info, char *data, int len);
46static int copy_info(struct info_str *info, char *fmt, ...);
47static void ahd_dump_target_state(struct ahd_softc *ahd, 45static void ahd_dump_target_state(struct ahd_softc *ahd,
48 struct info_str *info, 46 struct seq_file *m,
49 u_int our_id, char channel, 47 u_int our_id, char channel,
50 u_int target_id); 48 u_int target_id);
51static void ahd_dump_device_state(struct info_str *info, 49static void ahd_dump_device_state(struct seq_file *m,
52 struct scsi_device *sdev); 50 struct scsi_device *sdev);
53static int ahd_proc_write_seeprom(struct ahd_softc *ahd,
54 char *buffer, int length);
55 51
56/* 52/*
57 * Table of syncrates that don't follow the "divisible by 4" 53 * Table of syncrates that don't follow the "divisible by 4"
@@ -93,58 +89,15 @@ ahd_calc_syncsrate(u_int period_factor)
93 return (10000000 / (period_factor * 4 * 10)); 89 return (10000000 / (period_factor * 4 * 10));
94} 90}
95 91
96
97static void
98copy_mem_info(struct info_str *info, char *data, int len)
99{
100 if (info->pos + len > info->offset + info->length)
101 len = info->offset + info->length - info->pos;
102
103 if (info->pos + len < info->offset) {
104 info->pos += len;
105 return;
106 }
107
108 if (info->pos < info->offset) {
109 off_t partial;
110
111 partial = info->offset - info->pos;
112 data += partial;
113 info->pos += partial;
114 len -= partial;
115 }
116
117 if (len > 0) {
118 memcpy(info->buffer, data, len);
119 info->pos += len;
120 info->buffer += len;
121 }
122}
123
124static int
125copy_info(struct info_str *info, char *fmt, ...)
126{
127 va_list args;
128 char buf[256];
129 int len;
130
131 va_start(args, fmt);
132 len = vsprintf(buf, fmt, args);
133 va_end(args);
134
135 copy_mem_info(info, buf, len);
136 return (len);
137}
138
139static void 92static void
140ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo) 93ahd_format_transinfo(struct seq_file *m, struct ahd_transinfo *tinfo)
141{ 94{
142 u_int speed; 95 u_int speed;
143 u_int freq; 96 u_int freq;
144 u_int mb; 97 u_int mb;
145 98
146 if (tinfo->period == AHD_PERIOD_UNKNOWN) { 99 if (tinfo->period == AHD_PERIOD_UNKNOWN) {
147 copy_info(info, "Renegotiation Pending\n"); 100 seq_printf(m, "Renegotiation Pending\n");
148 return; 101 return;
149 } 102 }
150 speed = 3300; 103 speed = 3300;
@@ -156,34 +109,34 @@ ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo)
156 speed *= (0x01 << tinfo->width); 109 speed *= (0x01 << tinfo->width);
157 mb = speed / 1000; 110 mb = speed / 1000;
158 if (mb > 0) 111 if (mb > 0)
159 copy_info(info, "%d.%03dMB/s transfers", mb, speed % 1000); 112 seq_printf(m, "%d.%03dMB/s transfers", mb, speed % 1000);
160 else 113 else
161 copy_info(info, "%dKB/s transfers", speed); 114 seq_printf(m, "%dKB/s transfers", speed);
162 115
163 if (freq != 0) { 116 if (freq != 0) {
164 int printed_options; 117 int printed_options;
165 118
166 printed_options = 0; 119 printed_options = 0;
167 copy_info(info, " (%d.%03dMHz", freq / 1000, freq % 1000); 120 seq_printf(m, " (%d.%03dMHz", freq / 1000, freq % 1000);
168 if ((tinfo->ppr_options & MSG_EXT_PPR_RD_STRM) != 0) { 121 if ((tinfo->ppr_options & MSG_EXT_PPR_RD_STRM) != 0) {
169 copy_info(info, " RDSTRM"); 122 seq_printf(m, " RDSTRM");
170 printed_options++; 123 printed_options++;
171 } 124 }
172 if ((tinfo->ppr_options & MSG_EXT_PPR_DT_REQ) != 0) { 125 if ((tinfo->ppr_options & MSG_EXT_PPR_DT_REQ) != 0) {
173 copy_info(info, "%s", printed_options ? "|DT" : " DT"); 126 seq_printf(m, "%s", printed_options ? "|DT" : " DT");
174 printed_options++; 127 printed_options++;
175 } 128 }
176 if ((tinfo->ppr_options & MSG_EXT_PPR_IU_REQ) != 0) { 129 if ((tinfo->ppr_options & MSG_EXT_PPR_IU_REQ) != 0) {
177 copy_info(info, "%s", printed_options ? "|IU" : " IU"); 130 seq_printf(m, "%s", printed_options ? "|IU" : " IU");
178 printed_options++; 131 printed_options++;
179 } 132 }
180 if ((tinfo->ppr_options & MSG_EXT_PPR_RTI) != 0) { 133 if ((tinfo->ppr_options & MSG_EXT_PPR_RTI) != 0) {
181 copy_info(info, "%s", 134 seq_printf(m, "%s",
182 printed_options ? "|RTI" : " RTI"); 135 printed_options ? "|RTI" : " RTI");
183 printed_options++; 136 printed_options++;
184 } 137 }
185 if ((tinfo->ppr_options & MSG_EXT_PPR_QAS_REQ) != 0) { 138 if ((tinfo->ppr_options & MSG_EXT_PPR_QAS_REQ) != 0) {
186 copy_info(info, "%s", 139 seq_printf(m, "%s",
187 printed_options ? "|QAS" : " QAS"); 140 printed_options ? "|QAS" : " QAS");
188 printed_options++; 141 printed_options++;
189 } 142 }
@@ -191,19 +144,19 @@ ahd_format_transinfo(struct info_str *info, struct ahd_transinfo *tinfo)
191 144
192 if (tinfo->width > 0) { 145 if (tinfo->width > 0) {
193 if (freq != 0) { 146 if (freq != 0) {
194 copy_info(info, ", "); 147 seq_printf(m, ", ");
195 } else { 148 } else {
196 copy_info(info, " ("); 149 seq_printf(m, " (");
197 } 150 }
198 copy_info(info, "%dbit)", 8 * (0x01 << tinfo->width)); 151 seq_printf(m, "%dbit)", 8 * (0x01 << tinfo->width));
199 } else if (freq != 0) { 152 } else if (freq != 0) {
200 copy_info(info, ")"); 153 seq_printf(m, ")");
201 } 154 }
202 copy_info(info, "\n"); 155 seq_printf(m, "\n");
203} 156}
204 157
205static void 158static void
206ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info, 159ahd_dump_target_state(struct ahd_softc *ahd, struct seq_file *m,
207 u_int our_id, char channel, u_int target_id) 160 u_int our_id, char channel, u_int target_id)
208{ 161{
209 struct scsi_target *starget; 162 struct scsi_target *starget;
@@ -213,17 +166,17 @@ ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info,
213 166
214 tinfo = ahd_fetch_transinfo(ahd, channel, our_id, 167 tinfo = ahd_fetch_transinfo(ahd, channel, our_id,
215 target_id, &tstate); 168 target_id, &tstate);
216 copy_info(info, "Target %d Negotiation Settings\n", target_id); 169 seq_printf(m, "Target %d Negotiation Settings\n", target_id);
217 copy_info(info, "\tUser: "); 170 seq_printf(m, "\tUser: ");
218 ahd_format_transinfo(info, &tinfo->user); 171 ahd_format_transinfo(m, &tinfo->user);
219 starget = ahd->platform_data->starget[target_id]; 172 starget = ahd->platform_data->starget[target_id];
220 if (starget == NULL) 173 if (starget == NULL)
221 return; 174 return;
222 175
223 copy_info(info, "\tGoal: "); 176 seq_printf(m, "\tGoal: ");
224 ahd_format_transinfo(info, &tinfo->goal); 177 ahd_format_transinfo(m, &tinfo->goal);
225 copy_info(info, "\tCurr: "); 178 seq_printf(m, "\tCurr: ");
226 ahd_format_transinfo(info, &tinfo->curr); 179 ahd_format_transinfo(m, &tinfo->curr);
227 180
228 for (lun = 0; lun < AHD_NUM_LUNS; lun++) { 181 for (lun = 0; lun < AHD_NUM_LUNS; lun++) {
229 struct scsi_device *dev; 182 struct scsi_device *dev;
@@ -233,29 +186,30 @@ ahd_dump_target_state(struct ahd_softc *ahd, struct info_str *info,
233 if (dev == NULL) 186 if (dev == NULL)
234 continue; 187 continue;
235 188
236 ahd_dump_device_state(info, dev); 189 ahd_dump_device_state(m, dev);
237 } 190 }
238} 191}
239 192
240static void 193static void
241ahd_dump_device_state(struct info_str *info, struct scsi_device *sdev) 194ahd_dump_device_state(struct seq_file *m, struct scsi_device *sdev)
242{ 195{
243 struct ahd_linux_device *dev = scsi_transport_device_data(sdev); 196 struct ahd_linux_device *dev = scsi_transport_device_data(sdev);
244 197
245 copy_info(info, "\tChannel %c Target %d Lun %d Settings\n", 198 seq_printf(m, "\tChannel %c Target %d Lun %d Settings\n",
246 sdev->sdev_target->channel + 'A', 199 sdev->sdev_target->channel + 'A',
247 sdev->sdev_target->id, sdev->lun); 200 sdev->sdev_target->id, sdev->lun);
248 201
249 copy_info(info, "\t\tCommands Queued %ld\n", dev->commands_issued); 202 seq_printf(m, "\t\tCommands Queued %ld\n", dev->commands_issued);
250 copy_info(info, "\t\tCommands Active %d\n", dev->active); 203 seq_printf(m, "\t\tCommands Active %d\n", dev->active);
251 copy_info(info, "\t\tCommand Openings %d\n", dev->openings); 204 seq_printf(m, "\t\tCommand Openings %d\n", dev->openings);
252 copy_info(info, "\t\tMax Tagged Openings %d\n", dev->maxtags); 205 seq_printf(m, "\t\tMax Tagged Openings %d\n", dev->maxtags);
253 copy_info(info, "\t\tDevice Queue Frozen Count %d\n", dev->qfrozen); 206 seq_printf(m, "\t\tDevice Queue Frozen Count %d\n", dev->qfrozen);
254} 207}
255 208
256static int 209int
257ahd_proc_write_seeprom(struct ahd_softc *ahd, char *buffer, int length) 210ahd_proc_write_seeprom(struct Scsi_Host *shost, char *buffer, int length)
258{ 211{
212 struct ahd_softc *ahd = *(struct ahd_softc **)shost->hostdata;
259 ahd_mode_state saved_modes; 213 ahd_mode_state saved_modes;
260 int have_seeprom; 214 int have_seeprom;
261 u_long s; 215 u_long s;
@@ -319,64 +273,45 @@ done:
319 * Return information to handle /proc support for the driver. 273 * Return information to handle /proc support for the driver.
320 */ 274 */
321int 275int
322ahd_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, 276ahd_linux_show_info(struct seq_file *m, struct Scsi_Host *shost)
323 off_t offset, int length, int inout)
324{ 277{
325 struct ahd_softc *ahd = *(struct ahd_softc **)shost->hostdata; 278 struct ahd_softc *ahd = *(struct ahd_softc **)shost->hostdata;
326 struct info_str info;
327 char ahd_info[256]; 279 char ahd_info[256];
328 u_int max_targ; 280 u_int max_targ;
329 u_int i; 281 u_int i;
330 int retval;
331 282
332 /* Has data been written to the file? */ 283 seq_printf(m, "Adaptec AIC79xx driver version: %s\n",
333 if (inout == TRUE) {
334 retval = ahd_proc_write_seeprom(ahd, buffer, length);
335 goto done;
336 }
337
338 if (start)
339 *start = buffer;
340
341 info.buffer = buffer;
342 info.length = length;
343 info.offset = offset;
344 info.pos = 0;
345
346 copy_info(&info, "Adaptec AIC79xx driver version: %s\n",
347 AIC79XX_DRIVER_VERSION); 284 AIC79XX_DRIVER_VERSION);
348 copy_info(&info, "%s\n", ahd->description); 285 seq_printf(m, "%s\n", ahd->description);
349 ahd_controller_info(ahd, ahd_info); 286 ahd_controller_info(ahd, ahd_info);
350 copy_info(&info, "%s\n", ahd_info); 287 seq_printf(m, "%s\n", ahd_info);
351 copy_info(&info, "Allocated SCBs: %d, SG List Length: %d\n\n", 288 seq_printf(m, "Allocated SCBs: %d, SG List Length: %d\n\n",
352 ahd->scb_data.numscbs, AHD_NSEG); 289 ahd->scb_data.numscbs, AHD_NSEG);
353 290
354 max_targ = 16; 291 max_targ = 16;
355 292
356 if (ahd->seep_config == NULL) 293 if (ahd->seep_config == NULL)
357 copy_info(&info, "No Serial EEPROM\n"); 294 seq_printf(m, "No Serial EEPROM\n");
358 else { 295 else {
359 copy_info(&info, "Serial EEPROM:\n"); 296 seq_printf(m, "Serial EEPROM:\n");
360 for (i = 0; i < sizeof(*ahd->seep_config)/2; i++) { 297 for (i = 0; i < sizeof(*ahd->seep_config)/2; i++) {
361 if (((i % 8) == 0) && (i != 0)) { 298 if (((i % 8) == 0) && (i != 0)) {
362 copy_info(&info, "\n"); 299 seq_printf(m, "\n");
363 } 300 }
364 copy_info(&info, "0x%.4x ", 301 seq_printf(m, "0x%.4x ",
365 ((uint16_t*)ahd->seep_config)[i]); 302 ((uint16_t*)ahd->seep_config)[i]);
366 } 303 }
367 copy_info(&info, "\n"); 304 seq_printf(m, "\n");
368 } 305 }
369 copy_info(&info, "\n"); 306 seq_printf(m, "\n");
370 307
371 if ((ahd->features & AHD_WIDE) == 0) 308 if ((ahd->features & AHD_WIDE) == 0)
372 max_targ = 8; 309 max_targ = 8;
373 310
374 for (i = 0; i < max_targ; i++) { 311 for (i = 0; i < max_targ; i++) {
375 312
376 ahd_dump_target_state(ahd, &info, ahd->our_id, 'A', 313 ahd_dump_target_state(ahd, m, ahd->our_id, 'A',
377 /*target_id*/i); 314 /*target_id*/i);
378 } 315 }
379 retval = info.pos > info.offset ? info.pos - info.offset : 0; 316 return 0;
380done:
381 return (retval);
382} 317}
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.c b/drivers/scsi/aic7xxx/aic7xxx_osm.c
index 5a477cdc780d..c0c62583b542 100644
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.c
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.c
@@ -803,7 +803,8 @@ struct scsi_host_template aic7xxx_driver_template = {
803 .module = THIS_MODULE, 803 .module = THIS_MODULE,
804 .name = "aic7xxx", 804 .name = "aic7xxx",
805 .proc_name = "aic7xxx", 805 .proc_name = "aic7xxx",
806 .proc_info = ahc_linux_proc_info, 806 .show_info = ahc_linux_show_info,
807 .write_info = ahc_proc_write_seeprom,
807 .info = ahc_linux_info, 808 .info = ahc_linux_info,
808 .queuecommand = ahc_linux_queue, 809 .queuecommand = ahc_linux_queue,
809 .eh_abort_handler = ahc_linux_abort, 810 .eh_abort_handler = ahc_linux_abort,
@@ -1631,10 +1632,8 @@ ahc_send_async(struct ahc_softc *ahc, char channel,
1631 switch (code) { 1632 switch (code) {
1632 case AC_TRANSFER_NEG: 1633 case AC_TRANSFER_NEG:
1633 { 1634 {
1634 char buf[80];
1635 struct scsi_target *starget; 1635 struct scsi_target *starget;
1636 struct ahc_linux_target *targ; 1636 struct ahc_linux_target *targ;
1637 struct info_str info;
1638 struct ahc_initiator_tinfo *tinfo; 1637 struct ahc_initiator_tinfo *tinfo;
1639 struct ahc_tmode_tstate *tstate; 1638 struct ahc_tmode_tstate *tstate;
1640 int target_offset; 1639 int target_offset;
@@ -1642,10 +1641,6 @@ ahc_send_async(struct ahc_softc *ahc, char channel,
1642 1641
1643 BUG_ON(target == CAM_TARGET_WILDCARD); 1642 BUG_ON(target == CAM_TARGET_WILDCARD);
1644 1643
1645 info.buffer = buf;
1646 info.length = sizeof(buf);
1647 info.offset = 0;
1648 info.pos = 0;
1649 tinfo = ahc_fetch_transinfo(ahc, channel, 1644 tinfo = ahc_fetch_transinfo(ahc, channel,
1650 channel == 'A' ? ahc->our_id 1645 channel == 'A' ? ahc->our_id
1651 : ahc->our_id_b, 1646 : ahc->our_id_b,
diff --git a/drivers/scsi/aic7xxx/aic7xxx_osm.h b/drivers/scsi/aic7xxx/aic7xxx_osm.h
index bca0fb83f553..bc4cca92ff04 100644
--- a/drivers/scsi/aic7xxx/aic7xxx_osm.h
+++ b/drivers/scsi/aic7xxx/aic7xxx_osm.h
@@ -383,14 +383,6 @@ void ahc_insb(struct ahc_softc * ahc, long port,
383int ahc_linux_register_host(struct ahc_softc *, 383int ahc_linux_register_host(struct ahc_softc *,
384 struct scsi_host_template *); 384 struct scsi_host_template *);
385 385
386/*************************** Pretty Printing **********************************/
387struct info_str {
388 char *buffer;
389 int length;
390 off_t offset;
391 int pos;
392};
393
394/******************************** Locking *************************************/ 386/******************************** Locking *************************************/
395/* Lock protecting internal data structures */ 387/* Lock protecting internal data structures */
396 388
@@ -523,8 +515,8 @@ ahc_flush_device_writes(struct ahc_softc *ahc)
523} 515}
524 516
525/**************************** Proc FS Support *********************************/ 517/**************************** Proc FS Support *********************************/
526int ahc_linux_proc_info(struct Scsi_Host *, char *, char **, 518int ahc_proc_write_seeprom(struct Scsi_Host *, char *, int);
527 off_t, int, int); 519int ahc_linux_show_info(struct seq_file *, struct Scsi_Host *);
528 520
529/*************************** Domain Validation ********************************/ 521/*************************** Domain Validation ********************************/
530/*********************** Transaction Access Wrappers *************************/ 522/*********************** Transaction Access Wrappers *************************/
diff --git a/drivers/scsi/aic7xxx/aic7xxx_proc.c b/drivers/scsi/aic7xxx/aic7xxx_proc.c
index f2525f8ed1c7..383a3d11652d 100644
--- a/drivers/scsi/aic7xxx/aic7xxx_proc.c
+++ b/drivers/scsi/aic7xxx/aic7xxx_proc.c
@@ -43,16 +43,12 @@
43#include "aic7xxx_inline.h" 43#include "aic7xxx_inline.h"
44#include "aic7xxx_93cx6.h" 44#include "aic7xxx_93cx6.h"
45 45
46static void copy_mem_info(struct info_str *info, char *data, int len);
47static int copy_info(struct info_str *info, char *fmt, ...);
48static void ahc_dump_target_state(struct ahc_softc *ahc, 46static void ahc_dump_target_state(struct ahc_softc *ahc,
49 struct info_str *info, 47 struct seq_file *m,
50 u_int our_id, char channel, 48 u_int our_id, char channel,
51 u_int target_id, u_int target_offset); 49 u_int target_id, u_int target_offset);
52static void ahc_dump_device_state(struct info_str *info, 50static void ahc_dump_device_state(struct seq_file *m,
53 struct scsi_device *dev); 51 struct scsi_device *dev);
54static int ahc_proc_write_seeprom(struct ahc_softc *ahc,
55 char *buffer, int length);
56 52
57/* 53/*
58 * Table of syncrates that don't follow the "divisible by 4" 54 * Table of syncrates that don't follow the "divisible by 4"
@@ -94,51 +90,8 @@ ahc_calc_syncsrate(u_int period_factor)
94 return (10000000 / (period_factor * 4 * 10)); 90 return (10000000 / (period_factor * 4 * 10));
95} 91}
96 92
97
98static void
99copy_mem_info(struct info_str *info, char *data, int len)
100{
101 if (info->pos + len > info->offset + info->length)
102 len = info->offset + info->length - info->pos;
103
104 if (info->pos + len < info->offset) {
105 info->pos += len;
106 return;
107 }
108
109 if (info->pos < info->offset) {
110 off_t partial;
111
112 partial = info->offset - info->pos;
113 data += partial;
114 info->pos += partial;
115 len -= partial;
116 }
117
118 if (len > 0) {
119 memcpy(info->buffer, data, len);
120 info->pos += len;
121 info->buffer += len;
122 }
123}
124
125static int
126copy_info(struct info_str *info, char *fmt, ...)
127{
128 va_list args;
129 char buf[256];
130 int len;
131
132 va_start(args, fmt);
133 len = vsprintf(buf, fmt, args);
134 va_end(args);
135
136 copy_mem_info(info, buf, len);
137 return (len);
138}
139
140static void 93static void
141ahc_format_transinfo(struct info_str *info, struct ahc_transinfo *tinfo) 94ahc_format_transinfo(struct seq_file *m, struct ahc_transinfo *tinfo)
142{ 95{
143 u_int speed; 96 u_int speed;
144 u_int freq; 97 u_int freq;
@@ -153,12 +106,12 @@ ahc_format_transinfo(struct info_str *info, struct ahc_transinfo *tinfo)
153 speed *= (0x01 << tinfo->width); 106 speed *= (0x01 << tinfo->width);
154 mb = speed / 1000; 107 mb = speed / 1000;
155 if (mb > 0) 108 if (mb > 0)
156 copy_info(info, "%d.%03dMB/s transfers", mb, speed % 1000); 109 seq_printf(m, "%d.%03dMB/s transfers", mb, speed % 1000);
157 else 110 else
158 copy_info(info, "%dKB/s transfers", speed); 111 seq_printf(m, "%dKB/s transfers", speed);
159 112
160 if (freq != 0) { 113 if (freq != 0) {
161 copy_info(info, " (%d.%03dMHz%s, offset %d", 114 seq_printf(m, " (%d.%03dMHz%s, offset %d",
162 freq / 1000, freq % 1000, 115 freq / 1000, freq % 1000,
163 (tinfo->ppr_options & MSG_EXT_PPR_DT_REQ) != 0 116 (tinfo->ppr_options & MSG_EXT_PPR_DT_REQ) != 0
164 ? " DT" : "", tinfo->offset); 117 ? " DT" : "", tinfo->offset);
@@ -166,19 +119,19 @@ ahc_format_transinfo(struct info_str *info, struct ahc_transinfo *tinfo)
166 119
167 if (tinfo->width > 0) { 120 if (tinfo->width > 0) {
168 if (freq != 0) { 121 if (freq != 0) {
169 copy_info(info, ", "); 122 seq_printf(m, ", ");
170 } else { 123 } else {
171 copy_info(info, " ("); 124 seq_printf(m, " (");
172 } 125 }
173 copy_info(info, "%dbit)", 8 * (0x01 << tinfo->width)); 126 seq_printf(m, "%dbit)", 8 * (0x01 << tinfo->width));
174 } else if (freq != 0) { 127 } else if (freq != 0) {
175 copy_info(info, ")"); 128 seq_printf(m, ")");
176 } 129 }
177 copy_info(info, "\n"); 130 seq_printf(m, "\n");
178} 131}
179 132
180static void 133static void
181ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info, 134ahc_dump_target_state(struct ahc_softc *ahc, struct seq_file *m,
182 u_int our_id, char channel, u_int target_id, 135 u_int our_id, char channel, u_int target_id,
183 u_int target_offset) 136 u_int target_offset)
184{ 137{
@@ -190,18 +143,18 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
190 tinfo = ahc_fetch_transinfo(ahc, channel, our_id, 143 tinfo = ahc_fetch_transinfo(ahc, channel, our_id,
191 target_id, &tstate); 144 target_id, &tstate);
192 if ((ahc->features & AHC_TWIN) != 0) 145 if ((ahc->features & AHC_TWIN) != 0)
193 copy_info(info, "Channel %c ", channel); 146 seq_printf(m, "Channel %c ", channel);
194 copy_info(info, "Target %d Negotiation Settings\n", target_id); 147 seq_printf(m, "Target %d Negotiation Settings\n", target_id);
195 copy_info(info, "\tUser: "); 148 seq_printf(m, "\tUser: ");
196 ahc_format_transinfo(info, &tinfo->user); 149 ahc_format_transinfo(m, &tinfo->user);
197 starget = ahc->platform_data->starget[target_offset]; 150 starget = ahc->platform_data->starget[target_offset];
198 if (!starget) 151 if (!starget)
199 return; 152 return;
200 153
201 copy_info(info, "\tGoal: "); 154 seq_printf(m, "\tGoal: ");
202 ahc_format_transinfo(info, &tinfo->goal); 155 ahc_format_transinfo(m, &tinfo->goal);
203 copy_info(info, "\tCurr: "); 156 seq_printf(m, "\tCurr: ");
204 ahc_format_transinfo(info, &tinfo->curr); 157 ahc_format_transinfo(m, &tinfo->curr);
205 158
206 for (lun = 0; lun < AHC_NUM_LUNS; lun++) { 159 for (lun = 0; lun < AHC_NUM_LUNS; lun++) {
207 struct scsi_device *sdev; 160 struct scsi_device *sdev;
@@ -211,29 +164,30 @@ ahc_dump_target_state(struct ahc_softc *ahc, struct info_str *info,
211 if (sdev == NULL) 164 if (sdev == NULL)
212 continue; 165 continue;
213 166
214 ahc_dump_device_state(info, sdev); 167 ahc_dump_device_state(m, sdev);
215 } 168 }
216} 169}
217 170
218static void 171static void
219ahc_dump_device_state(struct info_str *info, struct scsi_device *sdev) 172ahc_dump_device_state(struct seq_file *m, struct scsi_device *sdev)
220{ 173{
221 struct ahc_linux_device *dev = scsi_transport_device_data(sdev); 174 struct ahc_linux_device *dev = scsi_transport_device_data(sdev);
222 175
223 copy_info(info, "\tChannel %c Target %d Lun %d Settings\n", 176 seq_printf(m, "\tChannel %c Target %d Lun %d Settings\n",
224 sdev->sdev_target->channel + 'A', 177 sdev->sdev_target->channel + 'A',
225 sdev->sdev_target->id, sdev->lun); 178 sdev->sdev_target->id, sdev->lun);
226 179
227 copy_info(info, "\t\tCommands Queued %ld\n", dev->commands_issued); 180 seq_printf(m, "\t\tCommands Queued %ld\n", dev->commands_issued);
228 copy_info(info, "\t\tCommands Active %d\n", dev->active); 181 seq_printf(m, "\t\tCommands Active %d\n", dev->active);
229 copy_info(info, "\t\tCommand Openings %d\n", dev->openings); 182 seq_printf(m, "\t\tCommand Openings %d\n", dev->openings);
230 copy_info(info, "\t\tMax Tagged Openings %d\n", dev->maxtags); 183 seq_printf(m, "\t\tMax Tagged Openings %d\n", dev->maxtags);
231 copy_info(info, "\t\tDevice Queue Frozen Count %d\n", dev->qfrozen); 184 seq_printf(m, "\t\tDevice Queue Frozen Count %d\n", dev->qfrozen);
232} 185}
233 186
234static int 187int
235ahc_proc_write_seeprom(struct ahc_softc *ahc, char *buffer, int length) 188ahc_proc_write_seeprom(struct Scsi_Host *shost, char *buffer, int length)
236{ 189{
190 struct ahc_softc *ahc = *(struct ahc_softc **)shost->hostdata;
237 struct seeprom_descriptor sd; 191 struct seeprom_descriptor sd;
238 int have_seeprom; 192 int have_seeprom;
239 u_long s; 193 u_long s;
@@ -332,53 +286,36 @@ done:
332 * Return information to handle /proc support for the driver. 286 * Return information to handle /proc support for the driver.
333 */ 287 */
334int 288int
335ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start, 289ahc_linux_show_info(struct seq_file *m, struct Scsi_Host *shost)
336 off_t offset, int length, int inout)
337{ 290{
338 struct ahc_softc *ahc = *(struct ahc_softc **)shost->hostdata; 291 struct ahc_softc *ahc = *(struct ahc_softc **)shost->hostdata;
339 struct info_str info;
340 char ahc_info[256]; 292 char ahc_info[256];
341 u_int max_targ; 293 u_int max_targ;
342 u_int i; 294 u_int i;
343 int retval;
344 295
345 /* Has data been written to the file? */ 296 seq_printf(m, "Adaptec AIC7xxx driver version: %s\n",
346 if (inout == TRUE) {
347 retval = ahc_proc_write_seeprom(ahc, buffer, length);
348 goto done;
349 }
350
351 if (start)
352 *start = buffer;
353
354 info.buffer = buffer;
355 info.length = length;
356 info.offset = offset;
357 info.pos = 0;
358
359 copy_info(&info, "Adaptec AIC7xxx driver version: %s\n",
360 AIC7XXX_DRIVER_VERSION); 297 AIC7XXX_DRIVER_VERSION);
361 copy_info(&info, "%s\n", ahc->description); 298 seq_printf(m, "%s\n", ahc->description);
362 ahc_controller_info(ahc, ahc_info); 299 ahc_controller_info(ahc, ahc_info);
363 copy_info(&info, "%s\n", ahc_info); 300 seq_printf(m, "%s\n", ahc_info);
364 copy_info(&info, "Allocated SCBs: %d, SG List Length: %d\n\n", 301 seq_printf(m, "Allocated SCBs: %d, SG List Length: %d\n\n",
365 ahc->scb_data->numscbs, AHC_NSEG); 302 ahc->scb_data->numscbs, AHC_NSEG);
366 303
367 304
368 if (ahc->seep_config == NULL) 305 if (ahc->seep_config == NULL)
369 copy_info(&info, "No Serial EEPROM\n"); 306 seq_printf(m, "No Serial EEPROM\n");
370 else { 307 else {
371 copy_info(&info, "Serial EEPROM:\n"); 308 seq_printf(m, "Serial EEPROM:\n");
372 for (i = 0; i < sizeof(*ahc->seep_config)/2; i++) { 309 for (i = 0; i < sizeof(*ahc->seep_config)/2; i++) {
373 if (((i % 8) == 0) && (i != 0)) { 310 if (((i % 8) == 0) && (i != 0)) {
374 copy_info(&info, "\n"); 311 seq_printf(m, "\n");
375 } 312 }
376 copy_info(&info, "0x%.4x ", 313 seq_printf(m, "0x%.4x ",
377 ((uint16_t*)ahc->seep_config)[i]); 314 ((uint16_t*)ahc->seep_config)[i]);
378 } 315 }
379 copy_info(&info, "\n"); 316 seq_printf(m, "\n");
380 } 317 }
381 copy_info(&info, "\n"); 318 seq_printf(m, "\n");
382 319
383 max_targ = 16; 320 max_targ = 16;
384 if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0) 321 if ((ahc->features & (AHC_WIDE|AHC_TWIN)) == 0)
@@ -398,10 +335,8 @@ ahc_linux_proc_info(struct Scsi_Host *shost, char *buffer, char **start,
398 target_id = i % 8; 335 target_id = i % 8;
399 } 336 }
400 337
401 ahc_dump_target_state(ahc, &info, our_id, 338 ahc_dump_target_state(ahc, m, our_id,
402 channel, target_id, i); 339 channel, target_id, i);
403 } 340 }
404 retval = info.pos > info.offset ? info.pos - info.offset : 0; 341 return 0;
405done:
406 return (retval);
407} 342}
diff --git a/drivers/scsi/aic7xxx_old.c b/drivers/scsi/aic7xxx_old.c
index 5b212f0df898..33ec9c643400 100644
--- a/drivers/scsi/aic7xxx_old.c
+++ b/drivers/scsi/aic7xxx_old.c
@@ -11108,7 +11108,7 @@ MODULE_VERSION(AIC7XXX_H_VERSION);
11108 11108
11109 11109
11110static struct scsi_host_template driver_template = { 11110static struct scsi_host_template driver_template = {
11111 .proc_info = aic7xxx_proc_info, 11111 .show_info = aic7xxx_show_info,
11112 .detect = aic7xxx_detect, 11112 .detect = aic7xxx_detect,
11113 .release = aic7xxx_release, 11113 .release = aic7xxx_release,
11114 .info = aic7xxx_info, 11114 .info = aic7xxx_info,
diff --git a/drivers/scsi/aic7xxx_old/aic7xxx_proc.c b/drivers/scsi/aic7xxx_old/aic7xxx_proc.c
index b07e4f04fd00..976f45ccf2cf 100644
--- a/drivers/scsi/aic7xxx_old/aic7xxx_proc.c
+++ b/drivers/scsi/aic7xxx_old/aic7xxx_proc.c
@@ -30,62 +30,23 @@
30 *-M*************************************************************************/ 30 *-M*************************************************************************/
31 31
32 32
33#define BLS (&aic7xxx_buffer[size])
34#define HDRB \ 33#define HDRB \
35" 0 - 4K 4 - 16K 16 - 64K 64 - 256K 256K - 1M 1M+" 34" 0 - 4K 4 - 16K 16 - 64K 64 - 256K 256K - 1M 1M+"
36 35
37#ifdef PROC_DEBUG
38extern int vsprintf(char *, const char *, va_list);
39
40static void
41proc_debug(const char *fmt, ...)
42{
43 va_list ap;
44 char buf[256];
45
46 va_start(ap, fmt);
47 vsprintf(buf, fmt, ap);
48 printk(buf);
49 va_end(ap);
50}
51#else /* PROC_DEBUG */
52# define proc_debug(fmt, args...)
53#endif /* PROC_DEBUG */
54
55static int aic7xxx_buffer_size = 0;
56static char *aic7xxx_buffer = NULL;
57
58 36
59/*+F************************************************************************* 37/*+F*************************************************************************
60 * Function: 38 * Function:
61 * aic7xxx_set_info 39 * aic7xxx_show_info
62 *
63 * Description:
64 * Set parameters for the driver from the /proc filesystem.
65 *-F*************************************************************************/
66static int
67aic7xxx_set_info(char *buffer, int length, struct Scsi_Host *HBAptr)
68{
69 proc_debug("aic7xxx_set_info(): %s\n", buffer);
70 return (-ENOSYS); /* Currently this is a no-op */
71}
72
73
74/*+F*************************************************************************
75 * Function:
76 * aic7xxx_proc_info
77 * 40 *
78 * Description: 41 * Description:
79 * Return information to handle /proc support for the driver. 42 * Return information to handle /proc support for the driver.
80 *-F*************************************************************************/ 43 *-F*************************************************************************/
81int 44int
82aic7xxx_proc_info ( struct Scsi_Host *HBAptr, char *buffer, char **start, off_t offset, int length, 45aic7xxx_show_info(struct seq_file *m, struct Scsi_Host *HBAptr)
83 int inout)
84{ 46{
85 struct aic7xxx_host *p; 47 struct aic7xxx_host *p;
86 struct aic_dev_data *aic_dev; 48 struct aic_dev_data *aic_dev;
87 struct scsi_device *sdptr; 49 struct scsi_device *sdptr;
88 int size = 0;
89 unsigned char i; 50 unsigned char i;
90 unsigned char tindex; 51 unsigned char tindex;
91 52
@@ -94,66 +55,21 @@ aic7xxx_proc_info ( struct Scsi_Host *HBAptr, char *buffer, char **start, off_t
94 55
95 if (!p) 56 if (!p)
96 { 57 {
97 size += sprintf(buffer, "Can't find adapter for host number %d\n", HBAptr->host_no); 58 seq_printf(m, "Can't find adapter for host number %d\n", HBAptr->host_no);
98 if (size > length) 59 return 0;
99 {
100 return (size);
101 }
102 else
103 {
104 return (length);
105 }
106 }
107
108 if (inout == TRUE) /* Has data been written to the file? */
109 {
110 return (aic7xxx_set_info(buffer, length, HBAptr));
111 } 60 }
112 61
113 p = (struct aic7xxx_host *) HBAptr->hostdata; 62 p = (struct aic7xxx_host *) HBAptr->hostdata;
114 63
115 /* 64 seq_printf(m, "Adaptec AIC7xxx driver version: ");
116 * It takes roughly 1K of space to hold all relevant card info, not 65 seq_printf(m, "%s/", AIC7XXX_C_VERSION);
117 * counting any proc stats, so we start out with a 1.5k buffer size and 66 seq_printf(m, "%s", AIC7XXX_H_VERSION);
118 * if proc_stats is defined, then we sweep the stats structure to see 67 seq_printf(m, "\n");
119 * how many drives we will be printing out for and add 384 bytes per 68 seq_printf(m, "Adapter Configuration:\n");
120 * device with active stats. 69 seq_printf(m, " SCSI Adapter: %s\n",
121 *
122 * Hmmmm...that 1.5k seems to keep growing as items get added so they
123 * can be easily viewed for debugging purposes. So, we bumped that
124 * 1.5k to 4k so we can quit having to bump it all the time.
125 */
126
127 size = 4096;
128 list_for_each_entry(aic_dev, &p->aic_devs, list)
129 size += 512;
130 if (aic7xxx_buffer_size != size)
131 {
132 if (aic7xxx_buffer != NULL)
133 {
134 kfree(aic7xxx_buffer);
135 aic7xxx_buffer_size = 0;
136 }
137 aic7xxx_buffer = kmalloc(size, GFP_KERNEL);
138 }
139 if (aic7xxx_buffer == NULL)
140 {
141 size = sprintf(buffer, "AIC7xxx - kmalloc error at line %d\n",
142 __LINE__);
143 return size;
144 }
145 aic7xxx_buffer_size = size;
146
147 size = 0;
148 size += sprintf(BLS, "Adaptec AIC7xxx driver version: ");
149 size += sprintf(BLS, "%s/", AIC7XXX_C_VERSION);
150 size += sprintf(BLS, "%s", AIC7XXX_H_VERSION);
151 size += sprintf(BLS, "\n");
152 size += sprintf(BLS, "Adapter Configuration:\n");
153 size += sprintf(BLS, " SCSI Adapter: %s\n",
154 board_names[p->board_name_index]); 70 board_names[p->board_name_index]);
155 if (p->flags & AHC_TWIN) 71 if (p->flags & AHC_TWIN)
156 size += sprintf(BLS, " Twin Channel Controller "); 72 seq_printf(m, " Twin Channel Controller ");
157 else 73 else
158 { 74 {
159 char *channel = ""; 75 char *channel = "";
@@ -184,86 +100,86 @@ aic7xxx_proc_info ( struct Scsi_Host *HBAptr, char *buffer, char **start, off_t
184 ultra = "Ultra-2 LVD/SE "; 100 ultra = "Ultra-2 LVD/SE ";
185 else if (p->features & AHC_ULTRA) 101 else if (p->features & AHC_ULTRA)
186 ultra = "Ultra "; 102 ultra = "Ultra ";
187 size += sprintf(BLS, " %s%sController%s ", 103 seq_printf(m, " %s%sController%s ",
188 ultra, wide, channel); 104 ultra, wide, channel);
189 } 105 }
190 switch(p->chip & ~AHC_CHIPID_MASK) 106 switch(p->chip & ~AHC_CHIPID_MASK)
191 { 107 {
192 case AHC_VL: 108 case AHC_VL:
193 size += sprintf(BLS, "at VLB slot %d\n", p->pci_device_fn); 109 seq_printf(m, "at VLB slot %d\n", p->pci_device_fn);
194 break; 110 break;
195 case AHC_EISA: 111 case AHC_EISA:
196 size += sprintf(BLS, "at EISA slot %d\n", p->pci_device_fn); 112 seq_printf(m, "at EISA slot %d\n", p->pci_device_fn);
197 break; 113 break;
198 default: 114 default:
199 size += sprintf(BLS, "at PCI %d/%d/%d\n", p->pci_bus, 115 seq_printf(m, "at PCI %d/%d/%d\n", p->pci_bus,
200 PCI_SLOT(p->pci_device_fn), PCI_FUNC(p->pci_device_fn)); 116 PCI_SLOT(p->pci_device_fn), PCI_FUNC(p->pci_device_fn));
201 break; 117 break;
202 } 118 }
203 if( !(p->maddr) ) 119 if( !(p->maddr) )
204 { 120 {
205 size += sprintf(BLS, " Programmed I/O Base: %lx\n", p->base); 121 seq_printf(m, " Programmed I/O Base: %lx\n", p->base);
206 } 122 }
207 else 123 else
208 { 124 {
209 size += sprintf(BLS, " PCI MMAPed I/O Base: 0x%lx\n", p->mbase); 125 seq_printf(m, " PCI MMAPed I/O Base: 0x%lx\n", p->mbase);
210 } 126 }
211 if( (p->chip & (AHC_VL | AHC_EISA)) ) 127 if( (p->chip & (AHC_VL | AHC_EISA)) )
212 { 128 {
213 size += sprintf(BLS, " BIOS Memory Address: 0x%08x\n", p->bios_address); 129 seq_printf(m, " BIOS Memory Address: 0x%08x\n", p->bios_address);
214 } 130 }
215 size += sprintf(BLS, " Adapter SEEPROM Config: %s\n", 131 seq_printf(m, " Adapter SEEPROM Config: %s\n",
216 (p->flags & AHC_SEEPROM_FOUND) ? "SEEPROM found and used." : 132 (p->flags & AHC_SEEPROM_FOUND) ? "SEEPROM found and used." :
217 ((p->flags & AHC_USEDEFAULTS) ? "SEEPROM not found, using defaults." : 133 ((p->flags & AHC_USEDEFAULTS) ? "SEEPROM not found, using defaults." :
218 "SEEPROM not found, using leftover BIOS values.") ); 134 "SEEPROM not found, using leftover BIOS values.") );
219 size += sprintf(BLS, " Adaptec SCSI BIOS: %s\n", 135 seq_printf(m, " Adaptec SCSI BIOS: %s\n",
220 (p->flags & AHC_BIOS_ENABLED) ? "Enabled" : "Disabled"); 136 (p->flags & AHC_BIOS_ENABLED) ? "Enabled" : "Disabled");
221 size += sprintf(BLS, " IRQ: %d\n", HBAptr->irq); 137 seq_printf(m, " IRQ: %d\n", HBAptr->irq);
222 size += sprintf(BLS, " SCBs: Active %d, Max Active %d,\n", 138 seq_printf(m, " SCBs: Active %d, Max Active %d,\n",
223 p->activescbs, p->max_activescbs); 139 p->activescbs, p->max_activescbs);
224 size += sprintf(BLS, " Allocated %d, HW %d, " 140 seq_printf(m, " Allocated %d, HW %d, "
225 "Page %d\n", p->scb_data->numscbs, p->scb_data->maxhscbs, 141 "Page %d\n", p->scb_data->numscbs, p->scb_data->maxhscbs,
226 p->scb_data->maxscbs); 142 p->scb_data->maxscbs);
227 if (p->flags & AHC_EXTERNAL_SRAM) 143 if (p->flags & AHC_EXTERNAL_SRAM)
228 size += sprintf(BLS, " Using External SCB SRAM\n"); 144 seq_printf(m, " Using External SCB SRAM\n");
229 size += sprintf(BLS, " Interrupts: %ld", p->isr_count); 145 seq_printf(m, " Interrupts: %ld", p->isr_count);
230 if (p->chip & AHC_EISA) 146 if (p->chip & AHC_EISA)
231 { 147 {
232 size += sprintf(BLS, " %s\n", 148 seq_printf(m, " %s\n",
233 (p->pause & IRQMS) ? "(Level Sensitive)" : "(Edge Triggered)"); 149 (p->pause & IRQMS) ? "(Level Sensitive)" : "(Edge Triggered)");
234 } 150 }
235 else 151 else
236 { 152 {
237 size += sprintf(BLS, "\n"); 153 seq_printf(m, "\n");
238 } 154 }
239 size += sprintf(BLS, " BIOS Control Word: 0x%04x\n", 155 seq_printf(m, " BIOS Control Word: 0x%04x\n",
240 p->bios_control); 156 p->bios_control);
241 size += sprintf(BLS, " Adapter Control Word: 0x%04x\n", 157 seq_printf(m, " Adapter Control Word: 0x%04x\n",
242 p->adapter_control); 158 p->adapter_control);
243 size += sprintf(BLS, " Extended Translation: %sabled\n", 159 seq_printf(m, " Extended Translation: %sabled\n",
244 (p->flags & AHC_EXTEND_TRANS_A) ? "En" : "Dis"); 160 (p->flags & AHC_EXTEND_TRANS_A) ? "En" : "Dis");
245 size += sprintf(BLS, "Disconnect Enable Flags: 0x%04x\n", p->discenable); 161 seq_printf(m, "Disconnect Enable Flags: 0x%04x\n", p->discenable);
246 if (p->features & (AHC_ULTRA | AHC_ULTRA2)) 162 if (p->features & (AHC_ULTRA | AHC_ULTRA2))
247 { 163 {
248 size += sprintf(BLS, " Ultra Enable Flags: 0x%04x\n", p->ultraenb); 164 seq_printf(m, " Ultra Enable Flags: 0x%04x\n", p->ultraenb);
249 } 165 }
250 size += sprintf(BLS, "Default Tag Queue Depth: %d\n", aic7xxx_default_queue_depth); 166 seq_printf(m, "Default Tag Queue Depth: %d\n", aic7xxx_default_queue_depth);
251 size += sprintf(BLS, " Tagged Queue By Device array for aic7xxx host " 167 seq_printf(m, " Tagged Queue By Device array for aic7xxx host "
252 "instance %d:\n", p->instance); 168 "instance %d:\n", p->instance);
253 size += sprintf(BLS, " {"); 169 seq_printf(m, " {");
254 for(i=0; i < (MAX_TARGETS - 1); i++) 170 for(i=0; i < (MAX_TARGETS - 1); i++)
255 size += sprintf(BLS, "%d,",aic7xxx_tag_info[p->instance].tag_commands[i]); 171 seq_printf(m, "%d,",aic7xxx_tag_info[p->instance].tag_commands[i]);
256 size += sprintf(BLS, "%d}\n",aic7xxx_tag_info[p->instance].tag_commands[i]); 172 seq_printf(m, "%d}\n",aic7xxx_tag_info[p->instance].tag_commands[i]);
257 173
258 size += sprintf(BLS, "\n"); 174 seq_printf(m, "\n");
259 size += sprintf(BLS, "Statistics:\n\n"); 175 seq_printf(m, "Statistics:\n\n");
260 list_for_each_entry(aic_dev, &p->aic_devs, list) 176 list_for_each_entry(aic_dev, &p->aic_devs, list)
261 { 177 {
262 sdptr = aic_dev->SDptr; 178 sdptr = aic_dev->SDptr;
263 tindex = sdptr->channel << 3 | sdptr->id; 179 tindex = sdptr->channel << 3 | sdptr->id;
264 size += sprintf(BLS, "(scsi%d:%d:%d:%d)\n", 180 seq_printf(m, "(scsi%d:%d:%d:%d)\n",
265 p->host_no, sdptr->channel, sdptr->id, sdptr->lun); 181 p->host_no, sdptr->channel, sdptr->id, sdptr->lun);
266 size += sprintf(BLS, " Device using %s/%s", 182 seq_printf(m, " Device using %s/%s",
267 (aic_dev->cur.width == MSG_EXT_WDTR_BUS_16_BIT) ? 183 (aic_dev->cur.width == MSG_EXT_WDTR_BUS_16_BIT) ?
268 "Wide" : "Narrow", 184 "Wide" : "Narrow",
269 (aic_dev->cur.offset != 0) ? 185 (aic_dev->cur.offset != 0) ?
@@ -279,78 +195,59 @@ aic7xxx_proc_info ( struct Scsi_Host *HBAptr, char *buffer, char **start, off_t
279 sync_rate = aic7xxx_find_syncrate(p, &period, 0, &options); 195 sync_rate = aic7xxx_find_syncrate(p, &period, 0, &options);
280 if (sync_rate != NULL) 196 if (sync_rate != NULL)
281 { 197 {
282 size += sprintf(BLS, "%s MByte/sec, offset %d\n", 198 seq_printf(m, "%s MByte/sec, offset %d\n",
283 sync_rate->rate[rate], 199 sync_rate->rate[rate],
284 aic_dev->cur.offset ); 200 aic_dev->cur.offset );
285 } 201 }
286 else 202 else
287 { 203 {
288 size += sprintf(BLS, "3.3 MByte/sec, offset %d\n", 204 seq_printf(m, "3.3 MByte/sec, offset %d\n",
289 aic_dev->cur.offset ); 205 aic_dev->cur.offset );
290 } 206 }
291 } 207 }
292 size += sprintf(BLS, " Transinfo settings: "); 208 seq_printf(m, " Transinfo settings: ");
293 size += sprintf(BLS, "current(%d/%d/%d/%d), ", 209 seq_printf(m, "current(%d/%d/%d/%d), ",
294 aic_dev->cur.period, 210 aic_dev->cur.period,
295 aic_dev->cur.offset, 211 aic_dev->cur.offset,
296 aic_dev->cur.width, 212 aic_dev->cur.width,
297 aic_dev->cur.options); 213 aic_dev->cur.options);
298 size += sprintf(BLS, "goal(%d/%d/%d/%d), ", 214 seq_printf(m, "goal(%d/%d/%d/%d), ",
299 aic_dev->goal.period, 215 aic_dev->goal.period,
300 aic_dev->goal.offset, 216 aic_dev->goal.offset,
301 aic_dev->goal.width, 217 aic_dev->goal.width,
302 aic_dev->goal.options); 218 aic_dev->goal.options);
303 size += sprintf(BLS, "user(%d/%d/%d/%d)\n", 219 seq_printf(m, "user(%d/%d/%d/%d)\n",
304 p->user[tindex].period, 220 p->user[tindex].period,
305 p->user[tindex].offset, 221 p->user[tindex].offset,
306 p->user[tindex].width, 222 p->user[tindex].width,
307 p->user[tindex].options); 223 p->user[tindex].options);
308 if(sdptr->simple_tags) 224 if(sdptr->simple_tags)
309 { 225 {
310 size += sprintf(BLS, " Tagged Command Queueing Enabled, Ordered Tags %s, Depth %d/%d\n", sdptr->ordered_tags ? "Enabled" : "Disabled", sdptr->queue_depth, aic_dev->max_q_depth); 226 seq_printf(m, " Tagged Command Queueing Enabled, Ordered Tags %s, Depth %d/%d\n", sdptr->ordered_tags ? "Enabled" : "Disabled", sdptr->queue_depth, aic_dev->max_q_depth);
311 } 227 }
312 if(aic_dev->barrier_total) 228 if(aic_dev->barrier_total)
313 size += sprintf(BLS, " Total transfers %ld:\n (%ld/%ld/%ld/%ld reads/writes/REQ_BARRIER/Ordered Tags)\n", 229 seq_printf(m, " Total transfers %ld:\n (%ld/%ld/%ld/%ld reads/writes/REQ_BARRIER/Ordered Tags)\n",
314 aic_dev->r_total+aic_dev->w_total, aic_dev->r_total, aic_dev->w_total, 230 aic_dev->r_total+aic_dev->w_total, aic_dev->r_total, aic_dev->w_total,
315 aic_dev->barrier_total, aic_dev->ordered_total); 231 aic_dev->barrier_total, aic_dev->ordered_total);
316 else 232 else
317 size += sprintf(BLS, " Total transfers %ld:\n (%ld/%ld reads/writes)\n", 233 seq_printf(m, " Total transfers %ld:\n (%ld/%ld reads/writes)\n",
318 aic_dev->r_total+aic_dev->w_total, aic_dev->r_total, aic_dev->w_total); 234 aic_dev->r_total+aic_dev->w_total, aic_dev->r_total, aic_dev->w_total);
319 size += sprintf(BLS, "%s\n", HDRB); 235 seq_printf(m, "%s\n", HDRB);
320 size += sprintf(BLS, " Reads:"); 236 seq_printf(m, " Reads:");
321 for (i = 0; i < ARRAY_SIZE(aic_dev->r_bins); i++) 237 for (i = 0; i < ARRAY_SIZE(aic_dev->r_bins); i++)
322 { 238 {
323 size += sprintf(BLS, " %10ld", aic_dev->r_bins[i]); 239 seq_printf(m, " %10ld", aic_dev->r_bins[i]);
324 } 240 }
325 size += sprintf(BLS, "\n"); 241 seq_printf(m, "\n");
326 size += sprintf(BLS, " Writes:"); 242 seq_printf(m, " Writes:");
327 for (i = 0; i < ARRAY_SIZE(aic_dev->w_bins); i++) 243 for (i = 0; i < ARRAY_SIZE(aic_dev->w_bins); i++)
328 { 244 {
329 size += sprintf(BLS, " %10ld", aic_dev->w_bins[i]); 245 seq_printf(m, " %10ld", aic_dev->w_bins[i]);
330 } 246 }
331 size += sprintf(BLS, "\n"); 247 seq_printf(m, "\n");
332 size += sprintf(BLS, "\n\n"); 248 seq_printf(m, "\n\n");
333 }
334 if (size >= aic7xxx_buffer_size)
335 {
336 printk(KERN_WARNING "aic7xxx: Overflow in aic7xxx_proc.c\n");
337 }
338
339 if (offset > size - 1)
340 {
341 kfree(aic7xxx_buffer);
342 aic7xxx_buffer = NULL;
343 aic7xxx_buffer_size = length = 0;
344 *start = NULL;
345 } 249 }
346 else 250 return 0;
347 {
348 *start = buffer;
349 length = min_t(int, length, size - offset);
350 memcpy(buffer, &aic7xxx_buffer[offset], length);
351 }
352
353 return (length);
354} 251}
355 252
356/* 253/*
diff --git a/drivers/scsi/arm/acornscsi.c b/drivers/scsi/arm/acornscsi.c
index 3e1172adb37b..09ba1869d366 100644
--- a/drivers/scsi/arm/acornscsi.c
+++ b/drivers/scsi/arm/acornscsi.c
@@ -2836,20 +2836,15 @@ char *acornscsi_info(struct Scsi_Host *host)
2836 return string; 2836 return string;
2837} 2837}
2838 2838
2839int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start, off_t offset, 2839static int acornscsi_show_info(struct seq_file *m, struct Scsi_Host *instance)
2840 int length, int inout)
2841{ 2840{
2842 int pos, begin = 0, devidx; 2841 int devidx;
2843 struct scsi_device *scd; 2842 struct scsi_device *scd;
2844 AS_Host *host; 2843 AS_Host *host;
2845 char *p = buffer;
2846
2847 if (inout == 1)
2848 return -EINVAL;
2849 2844
2850 host = (AS_Host *)instance->hostdata; 2845 host = (AS_Host *)instance->hostdata;
2851 2846
2852 p += sprintf(p, "AcornSCSI driver v%d.%d.%d" 2847 seq_printf(m, "AcornSCSI driver v%d.%d.%d"
2853#ifdef CONFIG_SCSI_ACORNSCSI_SYNC 2848#ifdef CONFIG_SCSI_ACORNSCSI_SYNC
2854 " SYNC" 2849 " SYNC"
2855#endif 2850#endif
@@ -2864,14 +2859,14 @@ int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start,
2864#endif 2859#endif
2865 "\n\n", VER_MAJOR, VER_MINOR, VER_PATCH); 2860 "\n\n", VER_MAJOR, VER_MINOR, VER_PATCH);
2866 2861
2867 p += sprintf(p, "SBIC: WD33C93A Address: %p IRQ : %d\n", 2862 seq_printf(m, "SBIC: WD33C93A Address: %p IRQ : %d\n",
2868 host->base + SBIC_REGIDX, host->scsi.irq); 2863 host->base + SBIC_REGIDX, host->scsi.irq);
2869#ifdef USE_DMAC 2864#ifdef USE_DMAC
2870 p += sprintf(p, "DMAC: uPC71071 Address: %p IRQ : %d\n\n", 2865 seq_printf(m, "DMAC: uPC71071 Address: %p IRQ : %d\n\n",
2871 host->base + DMAC_OFFSET, host->scsi.irq); 2866 host->base + DMAC_OFFSET, host->scsi.irq);
2872#endif 2867#endif
2873 2868
2874 p += sprintf(p, "Statistics:\n" 2869 seq_printf(m, "Statistics:\n"
2875 "Queued commands: %-10u Issued commands: %-10u\n" 2870 "Queued commands: %-10u Issued commands: %-10u\n"
2876 "Done commands : %-10u Reads : %-10u\n" 2871 "Done commands : %-10u Reads : %-10u\n"
2877 "Writes : %-10u Others : %-10u\n" 2872 "Writes : %-10u Others : %-10u\n"
@@ -2886,7 +2881,7 @@ int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start,
2886 for (devidx = 0; devidx < 9; devidx ++) { 2881 for (devidx = 0; devidx < 9; devidx ++) {
2887 unsigned int statptr, prev; 2882 unsigned int statptr, prev;
2888 2883
2889 p += sprintf(p, "\n%c:", devidx == 8 ? 'H' : ('0' + devidx)); 2884 seq_printf(m, "\n%c:", devidx == 8 ? 'H' : ('0' + devidx));
2890 statptr = host->status_ptr[devidx] - 10; 2885 statptr = host->status_ptr[devidx] - 10;
2891 2886
2892 if ((signed int)statptr < 0) 2887 if ((signed int)statptr < 0)
@@ -2896,7 +2891,7 @@ int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start,
2896 2891
2897 for (; statptr != host->status_ptr[devidx]; statptr = (statptr + 1) & (STATUS_BUFFER_SIZE - 1)) { 2892 for (; statptr != host->status_ptr[devidx]; statptr = (statptr + 1) & (STATUS_BUFFER_SIZE - 1)) {
2898 if (host->status[devidx][statptr].when) { 2893 if (host->status[devidx][statptr].when) {
2899 p += sprintf(p, "%c%02X:%02X+%2ld", 2894 seq_printf(m, "%c%02X:%02X+%2ld",
2900 host->status[devidx][statptr].irq ? '-' : ' ', 2895 host->status[devidx][statptr].irq ? '-' : ' ',
2901 host->status[devidx][statptr].ph, 2896 host->status[devidx][statptr].ph,
2902 host->status[devidx][statptr].ssr, 2897 host->status[devidx][statptr].ssr,
@@ -2907,51 +2902,32 @@ int acornscsi_proc_info(struct Scsi_Host *instance, char *buffer, char **start,
2907 } 2902 }
2908 } 2903 }
2909 2904
2910 p += sprintf(p, "\nAttached devices:\n"); 2905 seq_printf(m, "\nAttached devices:\n");
2911 2906
2912 shost_for_each_device(scd, instance) { 2907 shost_for_each_device(scd, instance) {
2913 p += sprintf(p, "Device/Lun TaggedQ Sync\n"); 2908 seq_printf(m, "Device/Lun TaggedQ Sync\n");
2914 p += sprintf(p, " %d/%d ", scd->id, scd->lun); 2909 seq_printf(m, " %d/%d ", scd->id, scd->lun);
2915 if (scd->tagged_supported) 2910 if (scd->tagged_supported)
2916 p += sprintf(p, "%3sabled(%3d) ", 2911 seq_printf(m, "%3sabled(%3d) ",
2917 scd->simple_tags ? "en" : "dis", 2912 scd->simple_tags ? "en" : "dis",
2918 scd->current_tag); 2913 scd->current_tag);
2919 else 2914 else
2920 p += sprintf(p, "unsupported "); 2915 seq_printf(m, "unsupported ");
2921 2916
2922 if (host->device[scd->id].sync_xfer & 15) 2917 if (host->device[scd->id].sync_xfer & 15)
2923 p += sprintf(p, "offset %d, %d ns\n", 2918 seq_printf(m, "offset %d, %d ns\n",
2924 host->device[scd->id].sync_xfer & 15, 2919 host->device[scd->id].sync_xfer & 15,
2925 acornscsi_getperiod(host->device[scd->id].sync_xfer)); 2920 acornscsi_getperiod(host->device[scd->id].sync_xfer));
2926 else 2921 else
2927 p += sprintf(p, "async\n"); 2922 seq_printf(m, "async\n");
2928 2923
2929 pos = p - buffer;
2930 if (pos + begin < offset) {
2931 begin += pos;
2932 p = buffer;
2933 }
2934 pos = p - buffer;
2935 if (pos + begin > offset + length) {
2936 scsi_device_put(scd);
2937 break;
2938 }
2939 } 2924 }
2940 2925 return 0;
2941 pos = p - buffer;
2942
2943 *start = buffer + (offset - begin);
2944 pos -= offset - begin;
2945
2946 if (pos > length)
2947 pos = length;
2948
2949 return pos;
2950} 2926}
2951 2927
2952static struct scsi_host_template acornscsi_template = { 2928static struct scsi_host_template acornscsi_template = {
2953 .module = THIS_MODULE, 2929 .module = THIS_MODULE,
2954 .proc_info = acornscsi_proc_info, 2930 .show_info = acornscsi_show_info,
2955 .name = "AcornSCSI", 2931 .name = "AcornSCSI",
2956 .info = acornscsi_info, 2932 .info = acornscsi_info,
2957 .queuecommand = acornscsi_queuecmd, 2933 .queuecommand = acornscsi_queuecmd,
diff --git a/drivers/scsi/arm/arxescsi.c b/drivers/scsi/arm/arxescsi.c
index 9274510294ac..32d23212de48 100644
--- a/drivers/scsi/arm/arxescsi.c
+++ b/drivers/scsi/arm/arxescsi.c
@@ -220,47 +220,21 @@ static const char *arxescsi_info(struct Scsi_Host *host)
220 return string; 220 return string;
221} 221}
222 222
223/*
224 * Function: int arxescsi_proc_info(char *buffer, char **start, off_t offset,
225 * int length, int host_no, int inout)
226 * Purpose : Return information about the driver to a user process accessing
227 * the /proc filesystem.
228 * Params : buffer - a buffer to write information to
229 * start - a pointer into this buffer set by this routine to the start
230 * of the required information.
231 * offset - offset into information that we have read up to.
232 * length - length of buffer
233 * host_no - host number to return information for
234 * inout - 0 for reading, 1 for writing.
235 * Returns : length of data written to buffer.
236 */
237static int 223static int
238arxescsi_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, 224arxescsi_show_info(struct seq_file *m, struct Scsi_Host *host)
239 int inout)
240{ 225{
241 struct arxescsi_info *info; 226 struct arxescsi_info *info;
242 char *p = buffer;
243 int pos;
244
245 info = (struct arxescsi_info *)host->hostdata; 227 info = (struct arxescsi_info *)host->hostdata;
246 if (inout == 1)
247 return -EINVAL;
248
249 p += sprintf(p, "ARXE 16-bit SCSI driver v%s\n", VERSION);
250 p += fas216_print_host(&info->info, p);
251 p += fas216_print_stats(&info->info, p);
252 p += fas216_print_devices(&info->info, p);
253
254 *start = buffer + offset;
255 pos = p - buffer - offset;
256 if (pos > length)
257 pos = length;
258 228
259 return pos; 229 seq_printf(m, "ARXE 16-bit SCSI driver v%s\n", VERSION);
230 fas216_print_host(&info->info, m);
231 fas216_print_stats(&info->info, m);
232 fas216_print_devices(&info->info, m);
233 return 0;
260} 234}
261 235
262static struct scsi_host_template arxescsi_template = { 236static struct scsi_host_template arxescsi_template = {
263 .proc_info = arxescsi_proc_info, 237 .show_info = arxescsi_show_info,
264 .name = "ARXE SCSI card", 238 .name = "ARXE SCSI card",
265 .info = arxescsi_info, 239 .info = arxescsi_info,
266 .queuecommand = fas216_noqueue_command, 240 .queuecommand = fas216_noqueue_command,
diff --git a/drivers/scsi/arm/cumana_1.c b/drivers/scsi/arm/cumana_1.c
index c93938b246d5..b679778376c5 100644
--- a/drivers/scsi/arm/cumana_1.c
+++ b/drivers/scsi/arm/cumana_1.c
@@ -30,7 +30,6 @@
30#define NCR5380_write(reg, value) cumanascsi_write(_instance, reg, value) 30#define NCR5380_write(reg, value) cumanascsi_write(_instance, reg, value)
31#define NCR5380_intr cumanascsi_intr 31#define NCR5380_intr cumanascsi_intr
32#define NCR5380_queue_command cumanascsi_queue_command 32#define NCR5380_queue_command cumanascsi_queue_command
33#define NCR5380_proc_info cumanascsi_proc_info
34 33
35#define NCR5380_implementation_fields \ 34#define NCR5380_implementation_fields \
36 unsigned ctrl; \ 35 unsigned ctrl; \
diff --git a/drivers/scsi/arm/cumana_2.c b/drivers/scsi/arm/cumana_2.c
index e3bae93c3c22..58915f29055b 100644
--- a/drivers/scsi/arm/cumana_2.c
+++ b/drivers/scsi/arm/cumana_2.c
@@ -337,50 +337,25 @@ cumanascsi_2_set_proc_info(struct Scsi_Host *host, char *buffer, int length)
337 return ret; 337 return ret;
338} 338}
339 339
340/* Prototype: int cumanascsi_2_proc_info(char *buffer, char **start, off_t offset, 340static int cumanascsi_2_show_info(struct seq_file *m, struct Scsi_Host *host)
341 * int length, int host_no, int inout)
342 * Purpose : Return information about the driver to a user process accessing
343 * the /proc filesystem.
344 * Params : buffer - a buffer to write information to
345 * start - a pointer into this buffer set by this routine to the start
346 * of the required information.
347 * offset - offset into information that we have read up to.
348 * length - length of buffer
349 * host_no - host number to return information for
350 * inout - 0 for reading, 1 for writing.
351 * Returns : length of data written to buffer.
352 */
353int cumanascsi_2_proc_info (struct Scsi_Host *host, char *buffer, char **start, off_t offset,
354 int length, int inout)
355{ 341{
356 struct cumanascsi2_info *info; 342 struct cumanascsi2_info *info;
357 char *p = buffer;
358 int pos;
359
360 if (inout == 1)
361 return cumanascsi_2_set_proc_info(host, buffer, length);
362
363 info = (struct cumanascsi2_info *)host->hostdata; 343 info = (struct cumanascsi2_info *)host->hostdata;
364 344
365 p += sprintf(p, "Cumana SCSI II driver v%s\n", VERSION); 345 seq_printf(m, "Cumana SCSI II driver v%s\n", VERSION);
366 p += fas216_print_host(&info->info, p); 346 fas216_print_host(&info->info, m);
367 p += sprintf(p, "Term : o%s\n", 347 seq_printf(m, "Term : o%s\n",
368 info->terms ? "n" : "ff"); 348 info->terms ? "n" : "ff");
369 349
370 p += fas216_print_stats(&info->info, p); 350 fas216_print_stats(&info->info, m);
371 p += fas216_print_devices(&info->info, p); 351 fas216_print_devices(&info->info, m);
372 352 return 0;
373 *start = buffer + offset;
374 pos = p - buffer - offset;
375 if (pos > length)
376 pos = length;
377
378 return pos;
379} 353}
380 354
381static struct scsi_host_template cumanascsi2_template = { 355static struct scsi_host_template cumanascsi2_template = {
382 .module = THIS_MODULE, 356 .module = THIS_MODULE,
383 .proc_info = cumanascsi_2_proc_info, 357 .show_info = cumanascsi_2_show_info,
358 .write_info = cumanascsi_2_set_proc_info,
384 .name = "Cumana SCSI II", 359 .name = "Cumana SCSI II",
385 .info = cumanascsi_2_info, 360 .info = cumanascsi_2_info,
386 .queuecommand = fas216_queue_command, 361 .queuecommand = fas216_queue_command,
diff --git a/drivers/scsi/arm/eesox.c b/drivers/scsi/arm/eesox.c
index 8e36908415ec..5bf3c0d134b4 100644
--- a/drivers/scsi/arm/eesox.c
+++ b/drivers/scsi/arm/eesox.c
@@ -422,45 +422,20 @@ eesoxscsi_set_proc_info(struct Scsi_Host *host, char *buffer, int length)
422 return ret; 422 return ret;
423} 423}
424 424
425/* Prototype: int eesoxscsi_proc_info(char *buffer, char **start, off_t offset, 425static int eesoxscsi_show_info(struct seq_file *m, struct Scsi_Host *host)
426 * int length, int host_no, int inout)
427 * Purpose : Return information about the driver to a user process accessing
428 * the /proc filesystem.
429 * Params : buffer - a buffer to write information to
430 * start - a pointer into this buffer set by this routine to the start
431 * of the required information.
432 * offset - offset into information that we have read up to.
433 * length - length of buffer
434 * host_no - host number to return information for
435 * inout - 0 for reading, 1 for writing.
436 * Returns : length of data written to buffer.
437 */
438int eesoxscsi_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
439 int length, int inout)
440{ 426{
441 struct eesoxscsi_info *info; 427 struct eesoxscsi_info *info;
442 char *p = buffer;
443 int pos;
444
445 if (inout == 1)
446 return eesoxscsi_set_proc_info(host, buffer, length);
447 428
448 info = (struct eesoxscsi_info *)host->hostdata; 429 info = (struct eesoxscsi_info *)host->hostdata;
449 430
450 p += sprintf(p, "EESOX SCSI driver v%s\n", VERSION); 431 seq_printf(m, "EESOX SCSI driver v%s\n", VERSION);
451 p += fas216_print_host(&info->info, p); 432 fas216_print_host(&info->info, m);
452 p += sprintf(p, "Term : o%s\n", 433 seq_printf(m, "Term : o%s\n",
453 info->control & EESOX_TERM_ENABLE ? "n" : "ff"); 434 info->control & EESOX_TERM_ENABLE ? "n" : "ff");
454 435
455 p += fas216_print_stats(&info->info, p); 436 fas216_print_stats(&info->info, m);
456 p += fas216_print_devices(&info->info, p); 437 fas216_print_devices(&info->info, m);
457 438 return 0;
458 *start = buffer + offset;
459 pos = p - buffer - offset;
460 if (pos > length)
461 pos = length;
462
463 return pos;
464} 439}
465 440
466static ssize_t eesoxscsi_show_term(struct device *dev, struct device_attribute *attr, char *buf) 441static ssize_t eesoxscsi_show_term(struct device *dev, struct device_attribute *attr, char *buf)
@@ -498,7 +473,8 @@ static DEVICE_ATTR(bus_term, S_IRUGO | S_IWUSR,
498 473
499static struct scsi_host_template eesox_template = { 474static struct scsi_host_template eesox_template = {
500 .module = THIS_MODULE, 475 .module = THIS_MODULE,
501 .proc_info = eesoxscsi_proc_info, 476 .show_info = eesoxscsi_show_info,
477 .write_info = eesoxscsi_set_proc_info,
502 .name = "EESOX SCSI", 478 .name = "EESOX SCSI",
503 .info = eesoxscsi_info, 479 .info = eesoxscsi_info,
504 .queuecommand = fas216_queue_command, 480 .queuecommand = fas216_queue_command,
diff --git a/drivers/scsi/arm/fas216.c b/drivers/scsi/arm/fas216.c
index 737554c37d9e..b46a6f6c0eb3 100644
--- a/drivers/scsi/arm/fas216.c
+++ b/drivers/scsi/arm/fas216.c
@@ -2958,9 +2958,9 @@ void fas216_release(struct Scsi_Host *host)
2958 queue_free(&info->queues.issue); 2958 queue_free(&info->queues.issue);
2959} 2959}
2960 2960
2961int fas216_print_host(FAS216_Info *info, char *buffer) 2961void fas216_print_host(FAS216_Info *info, struct seq_file *m)
2962{ 2962{
2963 return sprintf(buffer, 2963 seq_printf(m,
2964 "\n" 2964 "\n"
2965 "Chip : %s\n" 2965 "Chip : %s\n"
2966 " Address: 0x%p\n" 2966 " Address: 0x%p\n"
@@ -2970,11 +2970,9 @@ int fas216_print_host(FAS216_Info *info, char *buffer)
2970 info->scsi.irq, info->scsi.dma); 2970 info->scsi.irq, info->scsi.dma);
2971} 2971}
2972 2972
2973int fas216_print_stats(FAS216_Info *info, char *buffer) 2973void fas216_print_stats(FAS216_Info *info, struct seq_file *m)
2974{ 2974{
2975 char *p = buffer; 2975 seq_printf(m, "\n"
2976
2977 p += sprintf(p, "\n"
2978 "Command Statistics:\n" 2976 "Command Statistics:\n"
2979 " Queued : %u\n" 2977 " Queued : %u\n"
2980 " Issued : %u\n" 2978 " Issued : %u\n"
@@ -2991,38 +2989,33 @@ int fas216_print_stats(FAS216_Info *info, char *buffer)
2991 info->stats.writes, info->stats.miscs, 2989 info->stats.writes, info->stats.miscs,
2992 info->stats.disconnects, info->stats.aborts, 2990 info->stats.disconnects, info->stats.aborts,
2993 info->stats.bus_resets, info->stats.host_resets); 2991 info->stats.bus_resets, info->stats.host_resets);
2994
2995 return p - buffer;
2996} 2992}
2997 2993
2998int fas216_print_devices(FAS216_Info *info, char *buffer) 2994void fas216_print_devices(FAS216_Info *info, struct seq_file *m)
2999{ 2995{
3000 struct fas216_device *dev; 2996 struct fas216_device *dev;
3001 struct scsi_device *scd; 2997 struct scsi_device *scd;
3002 char *p = buffer;
3003 2998
3004 p += sprintf(p, "Device/Lun TaggedQ Parity Sync\n"); 2999 seq_printf(m, "Device/Lun TaggedQ Parity Sync\n");
3005 3000
3006 shost_for_each_device(scd, info->host) { 3001 shost_for_each_device(scd, info->host) {
3007 dev = &info->device[scd->id]; 3002 dev = &info->device[scd->id];
3008 p += sprintf(p, " %d/%d ", scd->id, scd->lun); 3003 seq_printf(m, " %d/%d ", scd->id, scd->lun);
3009 if (scd->tagged_supported) 3004 if (scd->tagged_supported)
3010 p += sprintf(p, "%3sabled(%3d) ", 3005 seq_printf(m, "%3sabled(%3d) ",
3011 scd->simple_tags ? "en" : "dis", 3006 scd->simple_tags ? "en" : "dis",
3012 scd->current_tag); 3007 scd->current_tag);
3013 else 3008 else
3014 p += sprintf(p, "unsupported "); 3009 seq_printf(m, "unsupported ");
3015 3010
3016 p += sprintf(p, "%3sabled ", dev->parity_enabled ? "en" : "dis"); 3011 seq_printf(m, "%3sabled ", dev->parity_enabled ? "en" : "dis");
3017 3012
3018 if (dev->sof) 3013 if (dev->sof)
3019 p += sprintf(p, "offset %d, %d ns\n", 3014 seq_printf(m, "offset %d, %d ns\n",
3020 dev->sof, dev->period * 4); 3015 dev->sof, dev->period * 4);
3021 else 3016 else
3022 p += sprintf(p, "async\n"); 3017 seq_printf(m, "async\n");
3023 } 3018 }
3024
3025 return p - buffer;
3026} 3019}
3027 3020
3028EXPORT_SYMBOL(fas216_init); 3021EXPORT_SYMBOL(fas216_init);
diff --git a/drivers/scsi/arm/fas216.h b/drivers/scsi/arm/fas216.h
index df2e1b3ddfe2..c57c16ef8193 100644
--- a/drivers/scsi/arm/fas216.h
+++ b/drivers/scsi/arm/fas216.h
@@ -358,9 +358,9 @@ extern void fas216_remove (struct Scsi_Host *instance);
358 */ 358 */
359extern void fas216_release (struct Scsi_Host *instance); 359extern void fas216_release (struct Scsi_Host *instance);
360 360
361extern int fas216_print_host(FAS216_Info *info, char *buffer); 361extern void fas216_print_host(FAS216_Info *info, struct seq_file *m);
362extern int fas216_print_stats(FAS216_Info *info, char *buffer); 362extern void fas216_print_stats(FAS216_Info *info, struct seq_file *m);
363extern int fas216_print_devices(FAS216_Info *info, char *buffer); 363extern void fas216_print_devices(FAS216_Info *info, struct seq_file *m);
364 364
365/* Function: int fas216_eh_abort(struct scsi_cmnd *SCpnt) 365/* Function: int fas216_eh_abort(struct scsi_cmnd *SCpnt)
366 * Purpose : abort this command 366 * Purpose : abort this command
diff --git a/drivers/scsi/arm/oak.c b/drivers/scsi/arm/oak.c
index 48facdc18002..4266eef8aca1 100644
--- a/drivers/scsi/arm/oak.c
+++ b/drivers/scsi/arm/oak.c
@@ -31,7 +31,8 @@
31#define NCR5380_write(reg, value) writeb(value, _base + ((reg) << 2)) 31#define NCR5380_write(reg, value) writeb(value, _base + ((reg) << 2))
32#define NCR5380_intr oakscsi_intr 32#define NCR5380_intr oakscsi_intr
33#define NCR5380_queue_command oakscsi_queue_command 33#define NCR5380_queue_command oakscsi_queue_command
34#define NCR5380_proc_info oakscsi_proc_info 34#define NCR5380_show_info oakscsi_show_info
35#define NCR5380_write_info oakscsi_write_info
35 36
36#define NCR5380_implementation_fields \ 37#define NCR5380_implementation_fields \
37 void __iomem *base 38 void __iomem *base
@@ -115,7 +116,8 @@ printk("reading %p len %d\n", addr, len);
115 116
116static struct scsi_host_template oakscsi_template = { 117static struct scsi_host_template oakscsi_template = {
117 .module = THIS_MODULE, 118 .module = THIS_MODULE,
118 .proc_info = oakscsi_proc_info, 119 .show_info = oakscsi_show_info,
120 .write_info = oakscsi_write_info,
119 .name = "Oak 16-bit SCSI", 121 .name = "Oak 16-bit SCSI",
120 .info = oakscsi_info, 122 .info = oakscsi_info,
121 .queuecommand = oakscsi_queue_command, 123 .queuecommand = oakscsi_queue_command,
diff --git a/drivers/scsi/arm/powertec.c b/drivers/scsi/arm/powertec.c
index 246600b93555..abc9593615e9 100644
--- a/drivers/scsi/arm/powertec.c
+++ b/drivers/scsi/arm/powertec.c
@@ -237,32 +237,20 @@ powertecscsi_set_proc_info(struct Scsi_Host *host, char *buffer, int length)
237 * inout - 0 for reading, 1 for writing. 237 * inout - 0 for reading, 1 for writing.
238 * Returns : length of data written to buffer. 238 * Returns : length of data written to buffer.
239 */ 239 */
240int powertecscsi_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, 240static int powertecscsi_show_info(struct seq_file *m, struct Scsi_Host *host)
241 int length, int inout)
242{ 241{
243 struct powertec_info *info; 242 struct powertec_info *info;
244 char *p = buffer;
245 int pos;
246
247 if (inout == 1)
248 return powertecscsi_set_proc_info(host, buffer, length);
249 243
250 info = (struct powertec_info *)host->hostdata; 244 info = (struct powertec_info *)host->hostdata;
251 245
252 p += sprintf(p, "PowerTec SCSI driver v%s\n", VERSION); 246 seq_printf(m, "PowerTec SCSI driver v%s\n", VERSION);
253 p += fas216_print_host(&info->info, p); 247 fas216_print_host(&info->info, m);
254 p += sprintf(p, "Term : o%s\n", 248 seq_printf(m, "Term : o%s\n",
255 info->term_ctl ? "n" : "ff"); 249 info->term_ctl ? "n" : "ff");
256 250
257 p += fas216_print_stats(&info->info, p); 251 fas216_print_stats(&info->info, m);
258 p += fas216_print_devices(&info->info, p); 252 fas216_print_devices(&info->info, m);
259 253 return 0;
260 *start = buffer + offset;
261 pos = p - buffer - offset;
262 if (pos > length)
263 pos = length;
264
265 return pos;
266} 254}
267 255
268static ssize_t powertecscsi_show_term(struct device *dev, struct device_attribute *attr, char *buf) 256static ssize_t powertecscsi_show_term(struct device *dev, struct device_attribute *attr, char *buf)
@@ -291,7 +279,8 @@ static DEVICE_ATTR(bus_term, S_IRUGO | S_IWUSR,
291 279
292static struct scsi_host_template powertecscsi_template = { 280static struct scsi_host_template powertecscsi_template = {
293 .module = THIS_MODULE, 281 .module = THIS_MODULE,
294 .proc_info = powertecscsi_proc_info, 282 .show_info = powertecscsi_show_info,
283 .write_info = powertecscsi_set_proc_info,
295 .name = "PowerTec SCSI", 284 .name = "PowerTec SCSI",
296 .info = powertecscsi_info, 285 .info = powertecscsi_info,
297 .queuecommand = fas216_queue_command, 286 .queuecommand = fas216_queue_command,
diff --git a/drivers/scsi/atari_NCR5380.c b/drivers/scsi/atari_NCR5380.c
index 2db79b469d9e..0f3cdbc80ba6 100644
--- a/drivers/scsi/atari_NCR5380.c
+++ b/drivers/scsi/atari_NCR5380.c
@@ -719,119 +719,94 @@ static void __init NCR5380_print_options(struct Scsi_Host *instance)
719 * Inputs : instance, pointer to this instance. 719 * Inputs : instance, pointer to this instance.
720 */ 720 */
721 721
722static void NCR5380_print_status(struct Scsi_Host *instance) 722static void lprint_Scsi_Cmnd(Scsi_Cmnd *cmd)
723{ 723{
724 char *pr_bfr; 724 int i, s;
725 char *start; 725 unsigned char *command;
726 int len; 726 printk("scsi%d: destination target %d, lun %d\n",
727 727 H_NO(cmd), cmd->device->id, cmd->device->lun);
728 NCR_PRINT(NDEBUG_ANY); 728 printk(KERN_CONT " command = ");
729 NCR_PRINT_PHASE(NDEBUG_ANY); 729 command = cmd->cmnd;
730 730 printk(KERN_CONT "%2d (0x%02x)", command[0], command[0]);
731 pr_bfr = (char *)__get_free_page(GFP_ATOMIC); 731 for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i)
732 if (!pr_bfr) { 732 printk(KERN_CONT " %02x", command[i]);
733 printk("NCR5380_print_status: no memory for print buffer\n"); 733 printk("\n");
734 return;
735 }
736 len = NCR5380_proc_info(instance, pr_bfr, &start, 0, PAGE_SIZE, 0);
737 pr_bfr[len] = 0;
738 printk("\n%s\n", pr_bfr);
739 free_page((unsigned long)pr_bfr);
740} 734}
741 735
742 736static void NCR5380_print_status(struct Scsi_Host *instance)
743/******************************************/
744/*
745 * /proc/scsi/[dtc pas16 t128 generic]/[0-ASC_NUM_BOARD_SUPPORTED]
746 *
747 * *buffer: I/O buffer
748 * **start: if inout == FALSE pointer into buffer where user read should start
749 * offset: current offset
750 * length: length of buffer
751 * hostno: Scsi_Host host_no
752 * inout: TRUE - user is writing; FALSE - user is reading
753 *
754 * Return the number of bytes read from or written
755*/
756
757#undef SPRINTF
758#define SPRINTF(fmt,args...) \
759 do { \
760 if (pos + strlen(fmt) + 20 /* slop */ < buffer + length) \
761 pos += sprintf(pos, fmt , ## args); \
762 } while(0)
763static char *lprint_Scsi_Cmnd(Scsi_Cmnd *cmd, char *pos, char *buffer, int length);
764
765static int NCR5380_proc_info(struct Scsi_Host *instance, char *buffer,
766 char **start, off_t offset, int length, int inout)
767{ 737{
768 char *pos = buffer;
769 struct NCR5380_hostdata *hostdata; 738 struct NCR5380_hostdata *hostdata;
770 Scsi_Cmnd *ptr; 739 Scsi_Cmnd *ptr;
771 unsigned long flags; 740 unsigned long flags;
772 off_t begin = 0; 741
773#define check_offset() \ 742 NCR_PRINT(NDEBUG_ANY);
774 do { \ 743 NCR_PRINT_PHASE(NDEBUG_ANY);
775 if (pos - buffer < offset - begin) { \
776 begin += pos - buffer; \
777 pos = buffer; \
778 } \
779 } while (0)
780 744
781 hostdata = (struct NCR5380_hostdata *)instance->hostdata; 745 hostdata = (struct NCR5380_hostdata *)instance->hostdata;
782 746
783 if (inout) /* Has data been written to the file ? */ 747 printk("\nNCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE);
784 return -ENOSYS; /* Currently this is a no-op */
785 SPRINTF("NCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE);
786 check_offset();
787 local_irq_save(flags); 748 local_irq_save(flags);
788 SPRINTF("NCR5380: coroutine is%s running.\n", 749 printk("NCR5380: coroutine is%s running.\n",
789 main_running ? "" : "n't"); 750 main_running ? "" : "n't");
790 check_offset();
791 if (!hostdata->connected) 751 if (!hostdata->connected)
792 SPRINTF("scsi%d: no currently connected command\n", HOSTNO); 752 printk("scsi%d: no currently connected command\n", HOSTNO);
793 else 753 else
794 pos = lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, 754 lprint_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected);
795 pos, buffer, length); 755 printk("scsi%d: issue_queue\n", HOSTNO);
796 SPRINTF("scsi%d: issue_queue\n", HOSTNO); 756 for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
797 check_offset(); 757 lprint_Scsi_Cmnd(ptr);
798 for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr)) {
799 pos = lprint_Scsi_Cmnd(ptr, pos, buffer, length);
800 check_offset();
801 }
802 758
803 SPRINTF("scsi%d: disconnected_queue\n", HOSTNO); 759 printk("scsi%d: disconnected_queue\n", HOSTNO);
804 check_offset();
805 for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; 760 for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr;
806 ptr = NEXT(ptr)) { 761 ptr = NEXT(ptr))
807 pos = lprint_Scsi_Cmnd(ptr, pos, buffer, length); 762 lprint_Scsi_Cmnd(ptr);
808 check_offset();
809 }
810 763
811 local_irq_restore(flags); 764 local_irq_restore(flags);
812 *start = buffer + (offset - begin); 765 printk("\n");
813 if (pos - buffer < offset - begin)
814 return 0;
815 else if (pos - buffer - (offset - begin) < length)
816 return pos - buffer - (offset - begin);
817 return length;
818} 766}
819 767
820static char *lprint_Scsi_Cmnd(Scsi_Cmnd *cmd, char *pos, char *buffer, int length) 768static void show_Scsi_Cmnd(Scsi_Cmnd *cmd, struct seq_file *m)
821{ 769{
822 int i, s; 770 int i, s;
823 unsigned char *command; 771 unsigned char *command;
824 SPRINTF("scsi%d: destination target %d, lun %d\n", 772 seq_printf(m, "scsi%d: destination target %d, lun %d\n",
825 H_NO(cmd), cmd->device->id, cmd->device->lun); 773 H_NO(cmd), cmd->device->id, cmd->device->lun);
826 SPRINTF(" command = "); 774 seq_printf(m, " command = ");
827 command = cmd->cmnd; 775 command = cmd->cmnd;
828 SPRINTF("%2d (0x%02x)", command[0], command[0]); 776 seq_printf(m, "%2d (0x%02x)", command[0], command[0]);
829 for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) 777 for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i)
830 SPRINTF(" %02x", command[i]); 778 seq_printf(m, " %02x", command[i]);
831 SPRINTF("\n"); 779 seq_printf(m, "\n");
832 return pos;
833} 780}
834 781
782static int NCR5380_show_info(struct seq_file *m, struct Scsi_Host *instance)
783{
784 struct NCR5380_hostdata *hostdata;
785 Scsi_Cmnd *ptr;
786 unsigned long flags;
787
788 hostdata = (struct NCR5380_hostdata *)instance->hostdata;
789
790 seq_printf(m, "NCR5380 core release=%d.\n", NCR5380_PUBLIC_RELEASE);
791 local_irq_save(flags);
792 seq_printf(m, "NCR5380: coroutine is%s running.\n",
793 main_running ? "" : "n't");
794 if (!hostdata->connected)
795 seq_printf(m, "scsi%d: no currently connected command\n", HOSTNO);
796 else
797 show_Scsi_Cmnd((Scsi_Cmnd *) hostdata->connected, m);
798 seq_printf(m, "scsi%d: issue_queue\n", HOSTNO);
799 for (ptr = (Scsi_Cmnd *)hostdata->issue_queue; ptr; ptr = NEXT(ptr))
800 show_Scsi_Cmnd(ptr, m);
801
802 seq_printf(m, "scsi%d: disconnected_queue\n", HOSTNO);
803 for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr;
804 ptr = NEXT(ptr))
805 show_Scsi_Cmnd(ptr, m);
806
807 local_irq_restore(flags);
808 return 0;
809}
835 810
836/* 811/*
837 * Function : void NCR5380_init (struct Scsi_Host *instance) 812 * Function : void NCR5380_init (struct Scsi_Host *instance)
diff --git a/drivers/scsi/atari_scsi.c b/drivers/scsi/atari_scsi.c
index df740cbbaef4..a3e6c8a3ff0f 100644
--- a/drivers/scsi/atari_scsi.c
+++ b/drivers/scsi/atari_scsi.c
@@ -1100,7 +1100,7 @@ static void atari_scsi_falcon_reg_write(unsigned char reg, unsigned char value)
1100#include "atari_NCR5380.c" 1100#include "atari_NCR5380.c"
1101 1101
1102static struct scsi_host_template driver_template = { 1102static struct scsi_host_template driver_template = {
1103 .proc_info = atari_scsi_proc_info, 1103 .show_info = atari_scsi_show_info,
1104 .name = "Atari native SCSI", 1104 .name = "Atari native SCSI",
1105 .detect = atari_scsi_detect, 1105 .detect = atari_scsi_detect,
1106 .release = atari_scsi_release, 1106 .release = atari_scsi_release,
diff --git a/drivers/scsi/atari_scsi.h b/drivers/scsi/atari_scsi.h
index bd52df78b209..11c624bb122d 100644
--- a/drivers/scsi/atari_scsi.h
+++ b/drivers/scsi/atari_scsi.h
@@ -47,7 +47,7 @@
47#define NCR5380_intr atari_scsi_intr 47#define NCR5380_intr atari_scsi_intr
48#define NCR5380_queue_command atari_scsi_queue_command 48#define NCR5380_queue_command atari_scsi_queue_command
49#define NCR5380_abort atari_scsi_abort 49#define NCR5380_abort atari_scsi_abort
50#define NCR5380_proc_info atari_scsi_proc_info 50#define NCR5380_show_info atari_scsi_show_info
51#define NCR5380_dma_read_setup(inst,d,c) atari_scsi_dma_setup (inst, d, c, 0) 51#define NCR5380_dma_read_setup(inst,d,c) atari_scsi_dma_setup (inst, d, c, 0)
52#define NCR5380_dma_write_setup(inst,d,c) atari_scsi_dma_setup (inst, d, c, 1) 52#define NCR5380_dma_write_setup(inst,d,c) atari_scsi_dma_setup (inst, d, c, 1)
53#define NCR5380_dma_residual(inst) atari_scsi_dma_residual( inst ) 53#define NCR5380_dma_residual(inst) atari_scsi_dma_residual( inst )
diff --git a/drivers/scsi/atp870u.c b/drivers/scsi/atp870u.c
index cfc73041f102..15a629d8ed08 100644
--- a/drivers/scsi/atp870u.c
+++ b/drivers/scsi/atp870u.c
@@ -3099,38 +3099,14 @@ static const char *atp870u_info(struct Scsi_Host *notused)
3099 return buffer; 3099 return buffer;
3100} 3100}
3101 3101
3102#define BLS buffer + len + size 3102static int atp870u_show_info(struct seq_file *m, struct Scsi_Host *HBAptr)
3103static int atp870u_proc_info(struct Scsi_Host *HBAptr, char *buffer,
3104 char **start, off_t offset, int length, int inout)
3105{ 3103{
3106 static u8 buff[512]; 3104 seq_printf(m, "ACARD AEC-671X Driver Version: 2.6+ac\n");
3107 int size = 0; 3105 seq_printf(m, "\n");
3108 int len = 0; 3106 seq_printf(m, "Adapter Configuration:\n");
3109 off_t begin = 0; 3107 seq_printf(m, " Base IO: %#.4lx\n", HBAptr->io_port);
3110 off_t pos = 0; 3108 seq_printf(m, " IRQ: %d\n", HBAptr->irq);
3111 3109 return 0;
3112 if (inout)
3113 return -EINVAL;
3114 if (offset == 0)
3115 memset(buff, 0, sizeof(buff));
3116 size += sprintf(BLS, "ACARD AEC-671X Driver Version: 2.6+ac\n");
3117 len += size;
3118 pos = begin + len;
3119 size = 0;
3120
3121 size += sprintf(BLS, "\n");
3122 size += sprintf(BLS, "Adapter Configuration:\n");
3123 size += sprintf(BLS, " Base IO: %#.4lx\n", HBAptr->io_port);
3124 size += sprintf(BLS, " IRQ: %d\n", HBAptr->irq);
3125 len += size;
3126 pos = begin + len;
3127
3128 *start = buffer + (offset - begin); /* Start of wanted data */
3129 len -= (offset - begin); /* Start slop */
3130 if (len > length) {
3131 len = length; /* Ending slop */
3132 }
3133 return (len);
3134} 3110}
3135 3111
3136 3112
@@ -3177,7 +3153,7 @@ static struct scsi_host_template atp870u_template = {
3177 .module = THIS_MODULE, 3153 .module = THIS_MODULE,
3178 .name = "atp870u" /* name */, 3154 .name = "atp870u" /* name */,
3179 .proc_name = "atp870u", 3155 .proc_name = "atp870u",
3180 .proc_info = atp870u_proc_info, 3156 .show_info = atp870u_show_info,
3181 .info = atp870u_info /* info */, 3157 .info = atp870u_info /* info */,
3182 .queuecommand = atp870u_queuecommand /* queuecommand */, 3158 .queuecommand = atp870u_queuecommand /* queuecommand */,
3183 .eh_abort_handler = atp870u_abort /* abort */, 3159 .eh_abort_handler = atp870u_abort /* abort */,
diff --git a/drivers/scsi/dc395x.c b/drivers/scsi/dc395x.c
index fed486bfd3f4..694e13c45dfd 100644
--- a/drivers/scsi/dc395x.c
+++ b/drivers/scsi/dc395x.c
@@ -4616,26 +4616,21 @@ static void adapter_uninit(struct AdapterCtlBlk *acb)
4616 4616
4617 4617
4618#undef SPRINTF 4618#undef SPRINTF
4619#define SPRINTF(args...) pos += sprintf(pos, args) 4619#define SPRINTF(args...) seq_printf(m,##args)
4620 4620
4621#undef YESNO 4621#undef YESNO
4622#define YESNO(YN) \ 4622#define YESNO(YN) \
4623 if (YN) SPRINTF(" Yes ");\ 4623 if (YN) SPRINTF(" Yes ");\
4624 else SPRINTF(" No ") 4624 else SPRINTF(" No ")
4625 4625
4626static int dc395x_proc_info(struct Scsi_Host *host, char *buffer, 4626static int dc395x_show_info(struct seq_file *m, struct Scsi_Host *host)
4627 char **start, off_t offset, int length, int inout)
4628{ 4627{
4629 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata; 4628 struct AdapterCtlBlk *acb = (struct AdapterCtlBlk *)host->hostdata;
4630 int spd, spd1; 4629 int spd, spd1;
4631 char *pos = buffer;
4632 struct DeviceCtlBlk *dcb; 4630 struct DeviceCtlBlk *dcb;
4633 unsigned long flags; 4631 unsigned long flags;
4634 int dev; 4632 int dev;
4635 4633
4636 if (inout) /* Has data been written to the file ? */
4637 return -EPERM;
4638
4639 SPRINTF(DC395X_BANNER " PCI SCSI Host Adapter\n"); 4634 SPRINTF(DC395X_BANNER " PCI SCSI Host Adapter\n");
4640 SPRINTF(" Driver Version " DC395X_VERSION "\n"); 4635 SPRINTF(" Driver Version " DC395X_VERSION "\n");
4641 4636
@@ -4735,22 +4730,15 @@ static int dc395x_proc_info(struct Scsi_Host *host, char *buffer,
4735 SPRINTF("END\n"); 4730 SPRINTF("END\n");
4736 } 4731 }
4737 4732
4738 *start = buffer + offset;
4739 DC395x_UNLOCK_IO(acb->scsi_host, flags); 4733 DC395x_UNLOCK_IO(acb->scsi_host, flags);
4740 4734 return 0;
4741 if (pos - buffer < offset)
4742 return 0;
4743 else if (pos - buffer - offset < length)
4744 return pos - buffer - offset;
4745 else
4746 return length;
4747} 4735}
4748 4736
4749 4737
4750static struct scsi_host_template dc395x_driver_template = { 4738static struct scsi_host_template dc395x_driver_template = {
4751 .module = THIS_MODULE, 4739 .module = THIS_MODULE,
4752 .proc_name = DC395X_NAME, 4740 .proc_name = DC395X_NAME,
4753 .proc_info = dc395x_proc_info, 4741 .show_info = dc395x_show_info,
4754 .name = DC395X_BANNER " " DC395X_VERSION, 4742 .name = DC395X_BANNER " " DC395X_VERSION,
4755 .queuecommand = dc395x_queue_command, 4743 .queuecommand = dc395x_queue_command,
4756 .bios_param = dc395x_bios_param, 4744 .bios_param = dc395x_bios_param,
diff --git a/drivers/scsi/dpt_i2o.c b/drivers/scsi/dpt_i2o.c
index b6e2700ec1c6..19e1b422260a 100644
--- a/drivers/scsi/dpt_i2o.c
+++ b/drivers/scsi/dpt_i2o.c
@@ -553,36 +553,14 @@ static const char *adpt_info(struct Scsi_Host *host)
553 return (char *) (pHba->detail); 553 return (char *) (pHba->detail);
554} 554}
555 555
556static int adpt_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, 556static int adpt_show_info(struct seq_file *m, struct Scsi_Host *host)
557 int length, int inout)
558{ 557{
559 struct adpt_device* d; 558 struct adpt_device* d;
560 int id; 559 int id;
561 int chan; 560 int chan;
562 int len = 0;
563 int begin = 0;
564 int pos = 0;
565 adpt_hba* pHba; 561 adpt_hba* pHba;
566 int unit; 562 int unit;
567 563
568 *start = buffer;
569 if (inout == TRUE) {
570 /*
571 * The user has done a write and wants us to take the
572 * data in the buffer and do something with it.
573 * proc_scsiwrite calls us with inout = 1
574 *
575 * Read data from buffer (writing to us) - NOT SUPPORTED
576 */
577 return -EINVAL;
578 }
579
580 /*
581 * inout = 0 means the user has done a read and wants information
582 * returned, so we write information about the cards into the buffer
583 * proc_scsiread() calls us with inout = 0
584 */
585
586 // Find HBA (host bus adapter) we are looking for 564 // Find HBA (host bus adapter) we are looking for
587 mutex_lock(&adpt_configuration_lock); 565 mutex_lock(&adpt_configuration_lock);
588 for (pHba = hba_chain; pHba; pHba = pHba->next) { 566 for (pHba = hba_chain; pHba; pHba = pHba->next) {
@@ -596,86 +574,30 @@ static int adpt_proc_info(struct Scsi_Host *host, char *buffer, char **start, of
596 } 574 }
597 host = pHba->host; 575 host = pHba->host;
598 576
599 len = sprintf(buffer , "Adaptec I2O RAID Driver Version: %s\n\n", DPT_I2O_VERSION); 577 seq_printf(m, "Adaptec I2O RAID Driver Version: %s\n\n", DPT_I2O_VERSION);
600 len += sprintf(buffer+len, "%s\n", pHba->detail); 578 seq_printf(m, "%s\n", pHba->detail);
601 len += sprintf(buffer+len, "SCSI Host=scsi%d Control Node=/dev/%s irq=%d\n", 579 seq_printf(m, "SCSI Host=scsi%d Control Node=/dev/%s irq=%d\n",
602 pHba->host->host_no, pHba->name, host->irq); 580 pHba->host->host_no, pHba->name, host->irq);
603 len += sprintf(buffer+len, "\tpost fifo size = %d\n\treply fifo size = %d\n\tsg table size = %d\n\n", 581 seq_printf(m, "\tpost fifo size = %d\n\treply fifo size = %d\n\tsg table size = %d\n\n",
604 host->can_queue, (int) pHba->reply_fifo_size , host->sg_tablesize); 582 host->can_queue, (int) pHba->reply_fifo_size , host->sg_tablesize);
605 583
606 pos = begin + len; 584 seq_printf(m, "Devices:\n");
607
608 /* CHECKPOINT */
609 if(pos > offset + length) {
610 goto stop_output;
611 }
612 if(pos <= offset) {
613 /*
614 * If we haven't even written to where we last left
615 * off (the last time we were called), reset the
616 * beginning pointer.
617 */
618 len = 0;
619 begin = pos;
620 }
621 len += sprintf(buffer+len, "Devices:\n");
622 for(chan = 0; chan < MAX_CHANNEL; chan++) { 585 for(chan = 0; chan < MAX_CHANNEL; chan++) {
623 for(id = 0; id < MAX_ID; id++) { 586 for(id = 0; id < MAX_ID; id++) {
624 d = pHba->channel[chan].device[id]; 587 d = pHba->channel[chan].device[id];
625 while(d){ 588 while(d) {
626 len += sprintf(buffer+len,"\t%-24.24s", d->pScsi_dev->vendor); 589 seq_printf(m,"\t%-24.24s", d->pScsi_dev->vendor);
627 len += sprintf(buffer+len," Rev: %-8.8s\n", d->pScsi_dev->rev); 590 seq_printf(m," Rev: %-8.8s\n", d->pScsi_dev->rev);
628 pos = begin + len;
629
630
631 /* CHECKPOINT */
632 if(pos > offset + length) {
633 goto stop_output;
634 }
635 if(pos <= offset) {
636 len = 0;
637 begin = pos;
638 }
639 591
640 unit = d->pI2o_dev->lct_data.tid; 592 unit = d->pI2o_dev->lct_data.tid;
641 len += sprintf(buffer+len, "\tTID=%d, (Channel=%d, Target=%d, Lun=%d) (%s)\n\n", 593 seq_printf(m, "\tTID=%d, (Channel=%d, Target=%d, Lun=%d) (%s)\n\n",
642 unit, (int)d->scsi_channel, (int)d->scsi_id, (int)d->scsi_lun, 594 unit, (int)d->scsi_channel, (int)d->scsi_id, (int)d->scsi_lun,
643 scsi_device_online(d->pScsi_dev)? "online":"offline"); 595 scsi_device_online(d->pScsi_dev)? "online":"offline");
644 pos = begin + len;
645
646 /* CHECKPOINT */
647 if(pos > offset + length) {
648 goto stop_output;
649 }
650 if(pos <= offset) {
651 len = 0;
652 begin = pos;
653 }
654
655 d = d->next_lun; 596 d = d->next_lun;
656 } 597 }
657 } 598 }
658 } 599 }
659 600 return 0;
660 /*
661 * begin is where we last checked our position with regards to offset
662 * begin is always less than offset. len is relative to begin. It
663 * is the number of bytes written past begin
664 *
665 */
666stop_output:
667 /* stop the output and calculate the correct length */
668 *(buffer + len) = '\0';
669
670 *start = buffer + (offset - begin); /* Start of wanted data */
671 len -= (offset - begin);
672 if(len > length) {
673 len = length;
674 } else if(len < 0){
675 len = 0;
676 **start = '\0';
677 }
678 return len;
679} 601}
680 602
681/* 603/*
@@ -3639,7 +3561,7 @@ static struct scsi_host_template driver_template = {
3639 .module = THIS_MODULE, 3561 .module = THIS_MODULE,
3640 .name = "dpt_i2o", 3562 .name = "dpt_i2o",
3641 .proc_name = "dpt_i2o", 3563 .proc_name = "dpt_i2o",
3642 .proc_info = adpt_proc_info, 3564 .show_info = adpt_show_info,
3643 .info = adpt_info, 3565 .info = adpt_info,
3644 .queuecommand = adpt_queue, 3566 .queuecommand = adpt_queue,
3645 .eh_abort_handler = adpt_abort, 3567 .eh_abort_handler = adpt_abort,
diff --git a/drivers/scsi/dtc.c b/drivers/scsi/dtc.c
index 4b11bb04f5c4..d01f01604140 100644
--- a/drivers/scsi/dtc.c
+++ b/drivers/scsi/dtc.c
@@ -216,7 +216,8 @@ static int __init dtc_detect(struct scsi_host_template * tpnt)
216 int sig, count; 216 int sig, count;
217 217
218 tpnt->proc_name = "dtc3x80"; 218 tpnt->proc_name = "dtc3x80";
219 tpnt->proc_info = &dtc_proc_info; 219 tpnt->show_info = dtc_show_info;
220 tpnt->write_info = dtc_write_info;
220 221
221 for (count = 0; current_override < NO_OVERRIDES; ++current_override) { 222 for (count = 0; current_override < NO_OVERRIDES; ++current_override) {
222 addr = 0; 223 addr = 0;
diff --git a/drivers/scsi/dtc.h b/drivers/scsi/dtc.h
index cdc621204b66..92d7cfc3f4fc 100644
--- a/drivers/scsi/dtc.h
+++ b/drivers/scsi/dtc.h
@@ -88,7 +88,8 @@ static int dtc_bus_reset(Scsi_Cmnd *);
88#define NCR5380_queue_command dtc_queue_command 88#define NCR5380_queue_command dtc_queue_command
89#define NCR5380_abort dtc_abort 89#define NCR5380_abort dtc_abort
90#define NCR5380_bus_reset dtc_bus_reset 90#define NCR5380_bus_reset dtc_bus_reset
91#define NCR5380_proc_info dtc_proc_info 91#define NCR5380_show_info dtc_show_info
92#define NCR5380_write_info dtc_write_info
92 93
93/* 15 12 11 10 94/* 15 12 11 10
94 1001 1100 0000 0000 */ 95 1001 1100 0000 0000 */
diff --git a/drivers/scsi/eata_pio.c b/drivers/scsi/eata_pio.c
index d5f8362335d3..356def44ce58 100644
--- a/drivers/scsi/eata_pio.c
+++ b/drivers/scsi/eata_pio.c
@@ -92,58 +92,22 @@ static unsigned long queue_counter;
92 92
93static struct scsi_host_template driver_template; 93static struct scsi_host_template driver_template;
94 94
95/* 95static int eata_pio_show_info(struct seq_file *m, struct Scsi_Host *shost)
96 * eata_proc_info
97 * inout : decides on the direction of the dataflow and the meaning of the
98 * variables
99 * buffer: If inout==FALSE data is being written to it else read from it
100 * *start: If inout==FALSE start of the valid data in the buffer
101 * offset: If inout==FALSE offset from the beginning of the imaginary file
102 * from which we start writing into the buffer
103 * length: If inout==FALSE max number of bytes to be written into the buffer
104 * else number of bytes in the buffer
105 */
106static int eata_pio_proc_info(struct Scsi_Host *shost, char *buffer, char **start, off_t offset,
107 int length, int rw)
108{ 96{
109 int len = 0; 97 seq_printf(m, "EATA (Extended Attachment) PIO driver version: "
110 off_t begin = 0, pos = 0;
111
112 if (rw)
113 return -ENOSYS;
114
115 len += sprintf(buffer+len, "EATA (Extended Attachment) PIO driver version: "
116 "%d.%d%s\n",VER_MAJOR, VER_MINOR, VER_SUB); 98 "%d.%d%s\n",VER_MAJOR, VER_MINOR, VER_SUB);
117 len += sprintf(buffer + len, "queued commands: %10ld\n" 99 seq_printf(m, "queued commands: %10ld\n"
118 "processed interrupts:%10ld\n", queue_counter, int_counter); 100 "processed interrupts:%10ld\n", queue_counter, int_counter);
119 len += sprintf(buffer + len, "\nscsi%-2d: HBA %.10s\n", 101 seq_printf(m, "\nscsi%-2d: HBA %.10s\n",
120 shost->host_no, SD(shost)->name); 102 shost->host_no, SD(shost)->name);
121 len += sprintf(buffer + len, "Firmware revision: v%s\n", 103 seq_printf(m, "Firmware revision: v%s\n",
122 SD(shost)->revision); 104 SD(shost)->revision);
123 len += sprintf(buffer + len, "IO: PIO\n"); 105 seq_printf(m, "IO: PIO\n");
124 len += sprintf(buffer + len, "Base IO : %#.4x\n", (u32) shost->base); 106 seq_printf(m, "Base IO : %#.4x\n", (u32) shost->base);
125 len += sprintf(buffer + len, "Host Bus: %s\n", 107 seq_printf(m, "Host Bus: %s\n",
126 (SD(shost)->bustype == 'P')?"PCI ": 108 (SD(shost)->bustype == 'P')?"PCI ":
127 (SD(shost)->bustype == 'E')?"EISA":"ISA "); 109 (SD(shost)->bustype == 'E')?"EISA":"ISA ");
128 110 return 0;
129 pos = begin + len;
130
131 if (pos < offset) {
132 len = 0;
133 begin = pos;
134 }
135 if (pos > offset + length)
136 goto stop_output;
137
138stop_output:
139 DBG(DBG_PROC, printk("2pos: %ld offset: %ld len: %d\n", pos, offset, len));
140 *start = buffer + (offset - begin); /* Start of wanted data */
141 len -= (offset - begin); /* Start slop */
142 if (len > length)
143 len = length; /* Ending slop */
144 DBG(DBG_PROC, printk("3pos: %ld offset: %ld len: %d\n", pos, offset, len));
145
146 return len;
147} 111}
148 112
149static int eata_pio_release(struct Scsi_Host *sh) 113static int eata_pio_release(struct Scsi_Host *sh)
@@ -985,7 +949,7 @@ static int eata_pio_detect(struct scsi_host_template *tpnt)
985static struct scsi_host_template driver_template = { 949static struct scsi_host_template driver_template = {
986 .proc_name = "eata_pio", 950 .proc_name = "eata_pio",
987 .name = "EATA (Extended Attachment) PIO driver", 951 .name = "EATA (Extended Attachment) PIO driver",
988 .proc_info = eata_pio_proc_info, 952 .show_info = eata_pio_show_info,
989 .detect = eata_pio_detect, 953 .detect = eata_pio_detect,
990 .release = eata_pio_release, 954 .release = eata_pio_release,
991 .queuecommand = eata_pio_queue, 955 .queuecommand = eata_pio_queue,
diff --git a/drivers/scsi/g_NCR5380.c b/drivers/scsi/g_NCR5380.c
index 5041f925c191..5cec6c60ca22 100644
--- a/drivers/scsi/g_NCR5380.c
+++ b/drivers/scsi/g_NCR5380.c
@@ -745,42 +745,36 @@ static inline int NCR5380_pwrite(struct Scsi_Host *instance, unsigned char *src,
745 745
746#include "NCR5380.c" 746#include "NCR5380.c"
747 747
748#define PRINTP(x) len += sprintf(buffer+len, x) 748#define PRINTP(x) seq_printf(m, x)
749#define ANDP , 749#define ANDP ,
750 750
751static int sprint_opcode(char *buffer, int len, int opcode) 751static void sprint_opcode(struct seq_file *m, int opcode)
752{ 752{
753 int start = len;
754 PRINTP("0x%02x " ANDP opcode); 753 PRINTP("0x%02x " ANDP opcode);
755 return len - start;
756} 754}
757 755
758static int sprint_command(char *buffer, int len, unsigned char *command) 756static void sprint_command(struct seq_file *m, unsigned char *command)
759{ 757{
760 int i, s, start = len; 758 int i, s;
761 len += sprint_opcode(buffer, len, command[0]); 759 sprint_opcode(m, command[0]);
762 for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i) 760 for (i = 1, s = COMMAND_SIZE(command[0]); i < s; ++i)
763 PRINTP("%02x " ANDP command[i]); 761 PRINTP("%02x " ANDP command[i]);
764 PRINTP("\n"); 762 PRINTP("\n");
765 return len - start;
766} 763}
767 764
768/** 765/**
769 * sprintf_Scsi_Cmnd - print a scsi command 766 * sprintf_Scsi_Cmnd - print a scsi command
770 * @buffer: buffr to print into 767 * @m: seq_fil to print into
771 * @len: buffer length
772 * @cmd: SCSI command block 768 * @cmd: SCSI command block
773 * 769 *
774 * Print out the target and command data in hex 770 * Print out the target and command data in hex
775 */ 771 */
776 772
777static int sprint_Scsi_Cmnd(char *buffer, int len, Scsi_Cmnd * cmd) 773static void sprint_Scsi_Cmnd(struct seq_file *m, Scsi_Cmnd * cmd)
778{ 774{
779 int start = len;
780 PRINTP("host number %d destination target %d, lun %d\n" ANDP cmd->device->host->host_no ANDP cmd->device->id ANDP cmd->device->lun); 775 PRINTP("host number %d destination target %d, lun %d\n" ANDP cmd->device->host->host_no ANDP cmd->device->id ANDP cmd->device->lun);
781 PRINTP(" command = "); 776 PRINTP(" command = ");
782 len += sprint_command(buffer, len, cmd->cmnd); 777 sprint_command(m, cmd->cmnd);
783 return len - start;
784} 778}
785 779
786/** 780/**
@@ -800,9 +794,8 @@ static int sprint_Scsi_Cmnd(char *buffer, int len, Scsi_Cmnd * cmd)
800 * Locks: global cli/lock for queue walk 794 * Locks: global cli/lock for queue walk
801 */ 795 */
802 796
803static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, char **start, off_t offset, int length, int inout) 797static int generic_NCR5380_show_info(struct seq_file *m, struct Scsi_Host *scsi_ptr)
804{ 798{
805 int len = 0;
806 NCR5380_local_declare(); 799 NCR5380_local_declare();
807 unsigned long flags; 800 unsigned long flags;
808 unsigned char status; 801 unsigned char status;
@@ -853,16 +846,16 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c
853 PRINTP(" T:%d %s " ANDP dev->id ANDP scsi_device_type(dev->type)); 846 PRINTP(" T:%d %s " ANDP dev->id ANDP scsi_device_type(dev->type));
854 for (i = 0; i < 8; i++) 847 for (i = 0; i < 8; i++)
855 if (dev->vendor[i] >= 0x20) 848 if (dev->vendor[i] >= 0x20)
856 *(buffer + (len++)) = dev->vendor[i]; 849 seq_putc(m, dev->vendor[i]);
857 *(buffer + (len++)) = ' '; 850 seq_putc(m, ' ');
858 for (i = 0; i < 16; i++) 851 for (i = 0; i < 16; i++)
859 if (dev->model[i] >= 0x20) 852 if (dev->model[i] >= 0x20)
860 *(buffer + (len++)) = dev->model[i]; 853 seq_putc(m, dev->model[i]);
861 *(buffer + (len++)) = ' '; 854 seq_putc(m, ' ');
862 for (i = 0; i < 4; i++) 855 for (i = 0; i < 4; i++)
863 if (dev->rev[i] >= 0x20) 856 if (dev->rev[i] >= 0x20)
864 *(buffer + (len++)) = dev->rev[i]; 857 seq_putc(m, dev->rev[i]);
865 *(buffer + (len++)) = ' '; 858 seq_putc(m, ' ');
866 859
867 PRINTP("\n%10ld kb read in %5ld secs" ANDP br / 1024 ANDP tr); 860 PRINTP("\n%10ld kb read in %5ld secs" ANDP br / 1024 ANDP tr);
868 if (tr) 861 if (tr)
@@ -886,32 +879,28 @@ static int generic_NCR5380_proc_info(struct Scsi_Host *scsi_ptr, char *buffer, c
886 if (!hostdata->connected) { 879 if (!hostdata->connected) {
887 PRINTP("No currently connected command\n"); 880 PRINTP("No currently connected command\n");
888 } else { 881 } else {
889 len += sprint_Scsi_Cmnd(buffer, len, (Scsi_Cmnd *) hostdata->connected); 882 sprint_Scsi_Cmnd(m, (Scsi_Cmnd *) hostdata->connected);
890 } 883 }
891 884
892 PRINTP("issue_queue\n"); 885 PRINTP("issue_queue\n");
893 886
894 for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble) 887 for (ptr = (Scsi_Cmnd *) hostdata->issue_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
895 len += sprint_Scsi_Cmnd(buffer, len, ptr); 888 sprint_Scsi_Cmnd(m, ptr);
896 889
897 PRINTP("disconnected_queue\n"); 890 PRINTP("disconnected_queue\n");
898 891
899 for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble) 892 for (ptr = (Scsi_Cmnd *) hostdata->disconnected_queue; ptr; ptr = (Scsi_Cmnd *) ptr->host_scribble)
900 len += sprint_Scsi_Cmnd(buffer, len, ptr); 893 sprint_Scsi_Cmnd(m, ptr);
901 894
902 *start = buffer + offset;
903 len -= offset;
904 if (len > length)
905 len = length;
906 spin_unlock_irqrestore(scsi_ptr->host_lock, flags); 895 spin_unlock_irqrestore(scsi_ptr->host_lock, flags);
907 return len; 896 return 0;
908} 897}
909 898
910#undef PRINTP 899#undef PRINTP
911#undef ANDP 900#undef ANDP
912 901
913static struct scsi_host_template driver_template = { 902static struct scsi_host_template driver_template = {
914 .proc_info = generic_NCR5380_proc_info, 903 .show_info = generic_NCR5380_show_info,
915 .name = "Generic NCR5380/NCR53C400 Scsi Driver", 904 .name = "Generic NCR5380/NCR53C400 Scsi Driver",
916 .detect = generic_NCR5380_detect, 905 .detect = generic_NCR5380_detect,
917 .release = generic_NCR5380_release_resources, 906 .release = generic_NCR5380_release_resources,
diff --git a/drivers/scsi/gdth.c b/drivers/scsi/gdth.c
index 59bceac51a4c..6d55b4e7e792 100644
--- a/drivers/scsi/gdth.c
+++ b/drivers/scsi/gdth.c
@@ -4676,7 +4676,8 @@ static struct scsi_host_template gdth_template = {
4676 .eh_bus_reset_handler = gdth_eh_bus_reset, 4676 .eh_bus_reset_handler = gdth_eh_bus_reset,
4677 .slave_configure = gdth_slave_configure, 4677 .slave_configure = gdth_slave_configure,
4678 .bios_param = gdth_bios_param, 4678 .bios_param = gdth_bios_param,
4679 .proc_info = gdth_proc_info, 4679 .show_info = gdth_show_info,
4680 .write_info = gdth_set_info,
4680 .eh_timed_out = gdth_timed_out, 4681 .eh_timed_out = gdth_timed_out,
4681 .proc_name = "gdth", 4682 .proc_name = "gdth",
4682 .can_queue = GDTH_MAXCMDS, 4683 .can_queue = GDTH_MAXCMDS,
diff --git a/drivers/scsi/gdth.h b/drivers/scsi/gdth.h
index fbf6f0f4b0dd..3fd8b83ffbf9 100644
--- a/drivers/scsi/gdth.h
+++ b/drivers/scsi/gdth.h
@@ -1007,6 +1007,7 @@ typedef struct {
1007 1007
1008/* function prototyping */ 1008/* function prototyping */
1009 1009
1010int gdth_proc_info(struct Scsi_Host *, char *,char **,off_t,int,int); 1010int gdth_show_info(struct seq_file *, struct Scsi_Host *);
1011int gdth_set_info(struct Scsi_Host *, char *, int);
1011 1012
1012#endif 1013#endif
diff --git a/drivers/scsi/gdth_proc.c b/drivers/scsi/gdth_proc.c
index 652754319a4b..9fb632684863 100644
--- a/drivers/scsi/gdth_proc.c
+++ b/drivers/scsi/gdth_proc.c
@@ -5,23 +5,9 @@
5#include <linux/completion.h> 5#include <linux/completion.h>
6#include <linux/slab.h> 6#include <linux/slab.h>
7 7
8int gdth_proc_info(struct Scsi_Host *host, char *buffer,char **start,off_t offset,int length, 8int gdth_set_info(struct Scsi_Host *host, char *buffer, int length)
9 int inout)
10{ 9{
11 gdth_ha_str *ha = shost_priv(host); 10 gdth_ha_str *ha = shost_priv(host);
12
13 TRACE2(("gdth_proc_info() length %d offs %d inout %d\n",
14 length,(int)offset,inout));
15
16 if (inout)
17 return(gdth_set_info(buffer,length,host,ha));
18 else
19 return(gdth_get_info(buffer,start,offset,length,host,ha));
20}
21
22static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host,
23 gdth_ha_str *ha)
24{
25 int ret_val = -EINVAL; 11 int ret_val = -EINVAL;
26 12
27 TRACE2(("gdth_set_info() ha %d\n",ha->hanum,)); 13 TRACE2(("gdth_set_info() ha %d\n",ha->hanum,));
@@ -149,12 +135,10 @@ static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer,
149 return(-EINVAL); 135 return(-EINVAL);
150} 136}
151 137
152static int gdth_get_info(char *buffer,char **start,off_t offset,int length, 138int gdth_show_info(struct seq_file *m, struct Scsi_Host *host)
153 struct Scsi_Host *host, gdth_ha_str *ha)
154{ 139{
155 int size = 0,len = 0; 140 gdth_ha_str *ha = shost_priv(host);
156 int hlen; 141 int hlen;
157 off_t begin = 0,pos = 0;
158 int id, i, j, k, sec, flag; 142 int id, i, j, k, sec, flag;
159 int no_mdrv = 0, drv_no, is_mirr; 143 int no_mdrv = 0, drv_no, is_mirr;
160 u32 cnt; 144 u32 cnt;
@@ -189,8 +173,7 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
189 /* request is i.e. "cat /proc/scsi/gdth/0" */ 173 /* request is i.e. "cat /proc/scsi/gdth/0" */
190 /* format: %-15s\t%-10s\t%-15s\t%s */ 174 /* format: %-15s\t%-10s\t%-15s\t%s */
191 /* driver parameters */ 175 /* driver parameters */
192 size = sprintf(buffer+len,"Driver Parameters:\n"); 176 seq_printf(m, "Driver Parameters:\n");
193 len += size; pos = begin + len;
194 if (reserve_list[0] == 0xff) 177 if (reserve_list[0] == 0xff)
195 strcpy(hrec, "--"); 178 strcpy(hrec, "--");
196 else { 179 else {
@@ -201,69 +184,50 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
201 hlen += snprintf(hrec + hlen , 161 - hlen, ",%d", reserve_list[i]); 184 hlen += snprintf(hrec + hlen , 161 - hlen, ",%d", reserve_list[i]);
202 } 185 }
203 } 186 }
204 size = sprintf(buffer+len, 187 seq_printf(m,
205 " reserve_mode: \t%d \treserve_list: \t%s\n", 188 " reserve_mode: \t%d \treserve_list: \t%s\n",
206 reserve_mode, hrec); 189 reserve_mode, hrec);
207 len += size; pos = begin + len; 190 seq_printf(m,
208 size = sprintf(buffer+len,
209 " max_ids: \t%-3d \thdr_channel: \t%d\n", 191 " max_ids: \t%-3d \thdr_channel: \t%d\n",
210 max_ids, hdr_channel); 192 max_ids, hdr_channel);
211 len += size; pos = begin + len;
212 193
213 /* controller information */ 194 /* controller information */
214 size = sprintf(buffer+len,"\nDisk Array Controller Information:\n"); 195 seq_printf(m,"\nDisk Array Controller Information:\n");
215 len += size; pos = begin + len; 196 seq_printf(m,
216 strcpy(hrec, ha->binfo.type_string);
217 size = sprintf(buffer+len,
218 " Number: \t%d \tName: \t%s\n", 197 " Number: \t%d \tName: \t%s\n",
219 ha->hanum, hrec); 198 ha->hanum, ha->binfo.type_string);
220 len += size; pos = begin + len;
221 199
200 seq_printf(m,
201 " Driver Ver.: \t%-10s\tFirmware Ver.: \t",
202 GDTH_VERSION_STR);
222 if (ha->more_proc) 203 if (ha->more_proc)
223 sprintf(hrec, "%d.%02d.%02d-%c%03X", 204 seq_printf(m, "%d.%02d.%02d-%c%03X\n",
224 (u8)(ha->binfo.upd_fw_ver>>24), 205 (u8)(ha->binfo.upd_fw_ver>>24),
225 (u8)(ha->binfo.upd_fw_ver>>16), 206 (u8)(ha->binfo.upd_fw_ver>>16),
226 (u8)(ha->binfo.upd_fw_ver), 207 (u8)(ha->binfo.upd_fw_ver),
227 ha->bfeat.raid ? 'R':'N', 208 ha->bfeat.raid ? 'R':'N',
228 ha->binfo.upd_revision); 209 ha->binfo.upd_revision);
229 else 210 else
230 sprintf(hrec, "%d.%02d", (u8)(ha->cpar.version>>8), 211 seq_printf(m, "%d.%02d\n", (u8)(ha->cpar.version>>8),
231 (u8)(ha->cpar.version)); 212 (u8)(ha->cpar.version));
232
233 size = sprintf(buffer+len,
234 " Driver Ver.: \t%-10s\tFirmware Ver.: \t%s\n",
235 GDTH_VERSION_STR, hrec);
236 len += size; pos = begin + len;
237 213
238 if (ha->more_proc) { 214 if (ha->more_proc)
239 /* more information: 1. about controller */ 215 /* more information: 1. about controller */
240 size = sprintf(buffer+len, 216 seq_printf(m,
241 " Serial No.: \t0x%8X\tCache RAM size:\t%d KB\n", 217 " Serial No.: \t0x%8X\tCache RAM size:\t%d KB\n",
242 ha->binfo.ser_no, ha->binfo.memsize / 1024); 218 ha->binfo.ser_no, ha->binfo.memsize / 1024);
243 len += size; pos = begin + len;
244 }
245 219
246#ifdef GDTH_DMA_STATISTICS 220#ifdef GDTH_DMA_STATISTICS
247 /* controller statistics */ 221 /* controller statistics */
248 size = sprintf(buffer+len,"\nController Statistics:\n"); 222 seq_printf(m,"\nController Statistics:\n");
249 len += size; pos = begin + len; 223 seq_printf(m,
250 size = sprintf(buffer+len,
251 " 32-bit DMA buffer:\t%lu\t64-bit DMA buffer:\t%lu\n", 224 " 32-bit DMA buffer:\t%lu\t64-bit DMA buffer:\t%lu\n",
252 ha->dma32_cnt, ha->dma64_cnt); 225 ha->dma32_cnt, ha->dma64_cnt);
253 len += size; pos = begin + len;
254#endif 226#endif
255 227
256 if (pos < offset) {
257 len = 0;
258 begin = pos;
259 }
260 if (pos > offset + length)
261 goto stop_output;
262
263 if (ha->more_proc) { 228 if (ha->more_proc) {
264 /* more information: 2. about physical devices */ 229 /* more information: 2. about physical devices */
265 size = sprintf(buffer+len,"\nPhysical Devices:"); 230 seq_printf(m, "\nPhysical Devices:");
266 len += size; pos = begin + len;
267 flag = FALSE; 231 flag = FALSE;
268 232
269 buf = gdth_ioctl_alloc(ha, GDTH_SCRATCH, FALSE, &paddr); 233 buf = gdth_ioctl_alloc(ha, GDTH_SCRATCH, FALSE, &paddr);
@@ -309,21 +273,19 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
309 strncpy(hrec+8,pdi->product,16); 273 strncpy(hrec+8,pdi->product,16);
310 strncpy(hrec+24,pdi->revision,4); 274 strncpy(hrec+24,pdi->revision,4);
311 hrec[28] = 0; 275 hrec[28] = 0;
312 size = sprintf(buffer+len, 276 seq_printf(m,
313 "\n Chn/ID/LUN: \t%c/%02d/%d \tName: \t%s\n", 277 "\n Chn/ID/LUN: \t%c/%02d/%d \tName: \t%s\n",
314 'A'+i,pdi->target_id,pdi->lun,hrec); 278 'A'+i,pdi->target_id,pdi->lun,hrec);
315 len += size; pos = begin + len;
316 flag = TRUE; 279 flag = TRUE;
317 pdi->no_ldrive &= 0xffff; 280 pdi->no_ldrive &= 0xffff;
318 if (pdi->no_ldrive == 0xffff) 281 if (pdi->no_ldrive == 0xffff)
319 strcpy(hrec,"--"); 282 strcpy(hrec,"--");
320 else 283 else
321 sprintf(hrec,"%d",pdi->no_ldrive); 284 sprintf(hrec,"%d",pdi->no_ldrive);
322 size = sprintf(buffer+len, 285 seq_printf(m,
323 " Capacity [MB]:\t%-6d \tTo Log. Drive: \t%s\n", 286 " Capacity [MB]:\t%-6d \tTo Log. Drive: \t%s\n",
324 pdi->blkcnt/(1024*1024/pdi->blksize), 287 pdi->blkcnt/(1024*1024/pdi->blksize),
325 hrec); 288 hrec);
326 len += size; pos = begin + len;
327 } else { 289 } else {
328 pdi->devtype = 0xff; 290 pdi->devtype = 0xff;
329 } 291 }
@@ -333,11 +295,10 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
333 for (k = 0; k < pds->count; ++k) { 295 for (k = 0; k < pds->count; ++k) {
334 if (pds->list[k].tid == pdi->target_id && 296 if (pds->list[k].tid == pdi->target_id &&
335 pds->list[k].lun == pdi->lun) { 297 pds->list[k].lun == pdi->lun) {
336 size = sprintf(buffer+len, 298 seq_printf(m,
337 " Retries: \t%-6d \tReassigns: \t%d\n", 299 " Retries: \t%-6d \tReassigns: \t%d\n",
338 pds->list[k].retries, 300 pds->list[k].retries,
339 pds->list[k].reassigns); 301 pds->list[k].reassigns);
340 len += size; pos = begin + len;
341 break; 302 break;
342 } 303 }
343 } 304 }
@@ -355,32 +316,20 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
355 pdef->sddc_type = 0x08; 316 pdef->sddc_type = 0x08;
356 317
357 if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) { 318 if (gdth_execute(host, gdtcmd, cmnd, 30, NULL) == S_OK) {
358 size = sprintf(buffer+len, 319 seq_printf(m,
359 " Grown Defects:\t%d\n", 320 " Grown Defects:\t%d\n",
360 pdef->sddc_cnt); 321 pdef->sddc_cnt);
361 len += size; pos = begin + len;
362 } 322 }
363 } 323 }
364 if (pos < offset) {
365 len = 0;
366 begin = pos;
367 }
368 if (pos > offset + length) {
369 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr);
370 goto stop_output;
371 }
372 } 324 }
373 } 325 }
374 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr); 326 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr);
375 327
376 if (!flag) { 328 if (!flag)
377 size = sprintf(buffer+len, "\n --\n"); 329 seq_printf(m, "\n --\n");
378 len += size; pos = begin + len;
379 }
380 330
381 /* 3. about logical drives */ 331 /* 3. about logical drives */
382 size = sprintf(buffer+len,"\nLogical Drives:"); 332 seq_printf(m,"\nLogical Drives:");
383 len += size; pos = begin + len;
384 flag = FALSE; 333 flag = FALSE;
385 334
386 buf = gdth_ioctl_alloc(ha, GDTH_SCRATCH, FALSE, &paddr); 335 buf = gdth_ioctl_alloc(ha, GDTH_SCRATCH, FALSE, &paddr);
@@ -418,10 +367,9 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
418 } 367 }
419 368
420 if (drv_no == i) { 369 if (drv_no == i) {
421 size = sprintf(buffer+len, 370 seq_printf(m,
422 "\n Number: \t%-2d \tStatus: \t%s\n", 371 "\n Number: \t%-2d \tStatus: \t%s\n",
423 drv_no, hrec); 372 drv_no, hrec);
424 len += size; pos = begin + len;
425 flag = TRUE; 373 flag = TRUE;
426 no_mdrv = pcdi->cd_ldcnt; 374 no_mdrv = pcdi->cd_ldcnt;
427 if (no_mdrv > 1 || pcdi->ld_slave != -1) { 375 if (no_mdrv > 1 || pcdi->ld_slave != -1) {
@@ -436,61 +384,37 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
436 } else { 384 } else {
437 strcpy(hrec, "???"); 385 strcpy(hrec, "???");
438 } 386 }
439 size = sprintf(buffer+len, 387 seq_printf(m,
440 " Capacity [MB]:\t%-6d \tType: \t%s\n", 388 " Capacity [MB]:\t%-6d \tType: \t%s\n",
441 pcdi->ld_blkcnt/(1024*1024/pcdi->ld_blksize), 389 pcdi->ld_blkcnt/(1024*1024/pcdi->ld_blksize),
442 hrec); 390 hrec);
443 len += size; pos = begin + len;
444 } else { 391 } else {
445 size = sprintf(buffer+len, 392 seq_printf(m,
446 " Slave Number: \t%-2d \tStatus: \t%s\n", 393 " Slave Number: \t%-2d \tStatus: \t%s\n",
447 drv_no & 0x7fff, hrec); 394 drv_no & 0x7fff, hrec);
448 len += size; pos = begin + len;
449 } 395 }
450 drv_no = pcdi->ld_slave; 396 drv_no = pcdi->ld_slave;
451 if (pos < offset) {
452 len = 0;
453 begin = pos;
454 }
455 if (pos > offset + length) {
456 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr);
457 goto stop_output;
458 }
459 } while (drv_no != -1); 397 } while (drv_no != -1);
460 398
461 if (is_mirr) { 399 if (is_mirr)
462 size = sprintf(buffer+len, 400 seq_printf(m,
463 " Missing Drv.: \t%-2d \tInvalid Drv.: \t%d\n", 401 " Missing Drv.: \t%-2d \tInvalid Drv.: \t%d\n",
464 no_mdrv - j - k, k); 402 no_mdrv - j - k, k);
465 len += size; pos = begin + len; 403
466 }
467
468 if (!ha->hdr[i].is_arraydrv) 404 if (!ha->hdr[i].is_arraydrv)
469 strcpy(hrec, "--"); 405 strcpy(hrec, "--");
470 else 406 else
471 sprintf(hrec, "%d", ha->hdr[i].master_no); 407 sprintf(hrec, "%d", ha->hdr[i].master_no);
472 size = sprintf(buffer+len, 408 seq_printf(m,
473 " To Array Drv.:\t%s\n", hrec); 409 " To Array Drv.:\t%s\n", hrec);
474 len += size; pos = begin + len;
475 if (pos < offset) {
476 len = 0;
477 begin = pos;
478 }
479 if (pos > offset + length) {
480 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr);
481 goto stop_output;
482 }
483 } 410 }
484 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr); 411 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr);
485 412
486 if (!flag) { 413 if (!flag)
487 size = sprintf(buffer+len, "\n --\n"); 414 seq_printf(m, "\n --\n");
488 len += size; pos = begin + len;
489 }
490 415
491 /* 4. about array drives */ 416 /* 4. about array drives */
492 size = sprintf(buffer+len,"\nArray Drives:"); 417 seq_printf(m,"\nArray Drives:");
493 len += size; pos = begin + len;
494 flag = FALSE; 418 flag = FALSE;
495 419
496 buf = gdth_ioctl_alloc(ha, GDTH_SCRATCH, FALSE, &paddr); 420 buf = gdth_ioctl_alloc(ha, GDTH_SCRATCH, FALSE, &paddr);
@@ -525,10 +449,9 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
525 strcat(hrec, "/expand"); 449 strcat(hrec, "/expand");
526 else if (pai->ai_ext_state & 0x1) 450 else if (pai->ai_ext_state & 0x1)
527 strcat(hrec, "/patch"); 451 strcat(hrec, "/patch");
528 size = sprintf(buffer+len, 452 seq_printf(m,
529 "\n Number: \t%-2d \tStatus: \t%s\n", 453 "\n Number: \t%-2d \tStatus: \t%s\n",
530 i,hrec); 454 i,hrec);
531 len += size; pos = begin + len;
532 flag = TRUE; 455 flag = TRUE;
533 456
534 if (pai->ai_type == 0) 457 if (pai->ai_type == 0)
@@ -539,31 +462,19 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
539 strcpy(hrec, "RAID-5"); 462 strcpy(hrec, "RAID-5");
540 else 463 else
541 strcpy(hrec, "RAID-10"); 464 strcpy(hrec, "RAID-10");
542 size = sprintf(buffer+len, 465 seq_printf(m,
543 " Capacity [MB]:\t%-6d \tType: \t%s\n", 466 " Capacity [MB]:\t%-6d \tType: \t%s\n",
544 pai->ai_size/(1024*1024/pai->ai_secsize), 467 pai->ai_size/(1024*1024/pai->ai_secsize),
545 hrec); 468 hrec);
546 len += size; pos = begin + len;
547 if (pos < offset) {
548 len = 0;
549 begin = pos;
550 }
551 if (pos > offset + length) {
552 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr);
553 goto stop_output;
554 }
555 } 469 }
556 } 470 }
557 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr); 471 gdth_ioctl_free(ha, GDTH_SCRATCH, buf, paddr);
558 472
559 if (!flag) { 473 if (!flag)
560 size = sprintf(buffer+len, "\n --\n"); 474 seq_printf(m, "\n --\n");
561 len += size; pos = begin + len;
562 }
563 475
564 /* 5. about host drives */ 476 /* 5. about host drives */
565 size = sprintf(buffer+len,"\nHost Drives:"); 477 seq_printf(m,"\nHost Drives:");
566 len += size; pos = begin + len;
567 flag = FALSE; 478 flag = FALSE;
568 479
569 buf = gdth_ioctl_alloc(ha, sizeof(gdth_hget_str), FALSE, &paddr); 480 buf = gdth_ioctl_alloc(ha, sizeof(gdth_hget_str), FALSE, &paddr);
@@ -605,33 +516,22 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
605 if (!(ha->hdr[i].present)) 516 if (!(ha->hdr[i].present))
606 continue; 517 continue;
607 518
608 size = sprintf(buffer+len, 519 seq_printf(m,
609 "\n Number: \t%-2d \tArr/Log. Drive:\t%d\n", 520 "\n Number: \t%-2d \tArr/Log. Drive:\t%d\n",
610 i, ha->hdr[i].ldr_no); 521 i, ha->hdr[i].ldr_no);
611 len += size; pos = begin + len;
612 flag = TRUE; 522 flag = TRUE;
613 523
614 size = sprintf(buffer+len, 524 seq_printf(m,
615 " Capacity [MB]:\t%-6d \tStart Sector: \t%d\n", 525 " Capacity [MB]:\t%-6d \tStart Sector: \t%d\n",
616 (u32)(ha->hdr[i].size/2048), ha->hdr[i].start_sec); 526 (u32)(ha->hdr[i].size/2048), ha->hdr[i].start_sec);
617 len += size; pos = begin + len;
618 if (pos < offset) {
619 len = 0;
620 begin = pos;
621 }
622 if (pos > offset + length)
623 goto stop_output;
624 } 527 }
625 528
626 if (!flag) { 529 if (!flag)
627 size = sprintf(buffer+len, "\n --\n"); 530 seq_printf(m, "\n --\n");
628 len += size; pos = begin + len;
629 }
630 } 531 }
631 532
632 /* controller events */ 533 /* controller events */
633 size = sprintf(buffer+len,"\nController Events:\n"); 534 seq_printf(m,"\nController Events:\n");
634 len += size; pos = begin + len;
635 535
636 for (id = -1;;) { 536 for (id = -1;;) {
637 id = gdth_read_event(ha, id, estr); 537 id = gdth_read_event(ha, id, estr);
@@ -643,29 +543,14 @@ static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
643 do_gettimeofday(&tv); 543 do_gettimeofday(&tv);
644 sec = (int)(tv.tv_sec - estr->first_stamp); 544 sec = (int)(tv.tv_sec - estr->first_stamp);
645 if (sec < 0) sec = 0; 545 if (sec < 0) sec = 0;
646 size = sprintf(buffer+len," date- %02d:%02d:%02d\t%s\n", 546 seq_printf(m," date- %02d:%02d:%02d\t%s\n",
647 sec/3600, sec%3600/60, sec%60, hrec); 547 sec/3600, sec%3600/60, sec%60, hrec);
648 len += size; pos = begin + len;
649 if (pos < offset) {
650 len = 0;
651 begin = pos;
652 }
653 if (pos > offset + length)
654 goto stop_output;
655 } 548 }
656 if (id == -1) 549 if (id == -1)
657 break; 550 break;
658 } 551 }
659
660stop_output: 552stop_output:
661 *start = buffer +(offset-begin); 553 rc = 0;
662 len -= (offset-begin);
663 if (len > length)
664 len = length;
665 TRACE2(("get_info() len %d pos %d begin %d offset %d length %d size %d\n",
666 len,(int)pos,(int)begin,(int)offset,length,size));
667 rc = len;
668
669free_fail: 554free_fail:
670 kfree(gdtcmd); 555 kfree(gdtcmd);
671 kfree(estr); 556 kfree(estr);
diff --git a/drivers/scsi/gdth_proc.h b/drivers/scsi/gdth_proc.h
index dab15f59f2cc..aaa618198972 100644
--- a/drivers/scsi/gdth_proc.h
+++ b/drivers/scsi/gdth_proc.h
@@ -8,11 +8,6 @@
8int gdth_execute(struct Scsi_Host *shost, gdth_cmd_str *gdtcmd, char *cmnd, 8int gdth_execute(struct Scsi_Host *shost, gdth_cmd_str *gdtcmd, char *cmnd,
9 int timeout, u32 *info); 9 int timeout, u32 *info);
10 10
11static int gdth_set_info(char *buffer,int length,struct Scsi_Host *host,
12 gdth_ha_str *ha);
13static int gdth_get_info(char *buffer,char **start,off_t offset,int length,
14 struct Scsi_Host *host, gdth_ha_str *ha);
15
16static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer, 11static int gdth_set_asc_info(struct Scsi_Host *host, char *buffer,
17 int length, gdth_ha_str *ha); 12 int length, gdth_ha_str *ha);
18 13
diff --git a/drivers/scsi/gvp11.c b/drivers/scsi/gvp11.c
index dbe4cc6b9f8b..2203ac281103 100644
--- a/drivers/scsi/gvp11.c
+++ b/drivers/scsi/gvp11.c
@@ -191,7 +191,8 @@ static int gvp11_bus_reset(struct scsi_cmnd *cmd)
191static struct scsi_host_template gvp11_scsi_template = { 191static struct scsi_host_template gvp11_scsi_template = {
192 .module = THIS_MODULE, 192 .module = THIS_MODULE,
193 .name = "GVP Series II SCSI", 193 .name = "GVP Series II SCSI",
194 .proc_info = wd33c93_proc_info, 194 .show_info = wd33c93_show_info,
195 .write_info = wd33c93_write_info,
195 .proc_name = "GVP11", 196 .proc_name = "GVP11",
196 .queuecommand = wd33c93_queuecommand, 197 .queuecommand = wd33c93_queuecommand,
197 .eh_abort_handler = wd33c93_abort, 198 .eh_abort_handler = wd33c93_abort,
diff --git a/drivers/scsi/imm.c b/drivers/scsi/imm.c
index 26cd9d1d7571..89a8266560d0 100644
--- a/drivers/scsi/imm.c
+++ b/drivers/scsi/imm.c
@@ -121,45 +121,26 @@ static inline void imm_pb_release(imm_struct *dev)
121 * testing... 121 * testing...
122 * Also gives a method to use a script to obtain optimum timings (TODO) 122 * Also gives a method to use a script to obtain optimum timings (TODO)
123 */ 123 */
124static inline int imm_proc_write(imm_struct *dev, char *buffer, int length) 124static int imm_write_info(struct Scsi_Host *host, char *buffer, int length)
125{ 125{
126 unsigned long x; 126 imm_struct *dev = imm_dev(host);
127 127
128 if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) { 128 if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) {
129 x = simple_strtoul(buffer + 5, NULL, 0); 129 dev->mode = simple_strtoul(buffer + 5, NULL, 0);
130 dev->mode = x;
131 return length; 130 return length;
132 } 131 }
133 printk("imm /proc: invalid variable\n"); 132 printk("imm /proc: invalid variable\n");
134 return (-EINVAL); 133 return -EINVAL;
135} 134}
136 135
137static int imm_proc_info(struct Scsi_Host *host, char *buffer, char **start, 136static int imm_show_info(struct seq_file *m, struct Scsi_Host *host)
138 off_t offset, int length, int inout)
139{ 137{
140 imm_struct *dev = imm_dev(host); 138 imm_struct *dev = imm_dev(host);
141 int len = 0;
142
143 if (inout)
144 return imm_proc_write(dev, buffer, length);
145
146 len += sprintf(buffer + len, "Version : %s\n", IMM_VERSION);
147 len +=
148 sprintf(buffer + len, "Parport : %s\n",
149 dev->dev->port->name);
150 len +=
151 sprintf(buffer + len, "Mode : %s\n",
152 IMM_MODE_STRING[dev->mode]);
153 139
154 /* Request for beyond end of buffer */ 140 seq_printf(m, "Version : %s\n", IMM_VERSION);
155 if (offset > len) 141 seq_printf(m, "Parport : %s\n", dev->dev->port->name);
156 return 0; 142 seq_printf(m, "Mode : %s\n", IMM_MODE_STRING[dev->mode]);
157 143 return 0;
158 *start = buffer + offset;
159 len -= offset;
160 if (len > length)
161 len = length;
162 return len;
163} 144}
164 145
165#if IMM_DEBUG > 0 146#if IMM_DEBUG > 0
@@ -1118,7 +1099,8 @@ static int imm_adjust_queue(struct scsi_device *device)
1118static struct scsi_host_template imm_template = { 1099static struct scsi_host_template imm_template = {
1119 .module = THIS_MODULE, 1100 .module = THIS_MODULE,
1120 .proc_name = "imm", 1101 .proc_name = "imm",
1121 .proc_info = imm_proc_info, 1102 .show_info = imm_show_info,
1103 .write_info = imm_write_info,
1122 .name = "Iomega VPI2 (imm) interface", 1104 .name = "Iomega VPI2 (imm) interface",
1123 .queuecommand = imm_queuecommand, 1105 .queuecommand = imm_queuecommand,
1124 .eh_abort_handler = imm_abort, 1106 .eh_abort_handler = imm_abort,
diff --git a/drivers/scsi/in2000.c b/drivers/scsi/in2000.c
index deb5b6d8398e..bf028218ac36 100644
--- a/drivers/scsi/in2000.c
+++ b/drivers/scsi/in2000.c
@@ -2166,152 +2166,117 @@ static int in2000_biosparam(struct scsi_device *sdev, struct block_device *bdev,
2166} 2166}
2167 2167
2168 2168
2169static int in2000_proc_info(struct Scsi_Host *instance, char *buf, char **start, off_t off, int len, int in) 2169static int in2000_write_info(struct Scsi_Host *instance, char *buf, int len)
2170{ 2170{
2171 2171
2172#ifdef PROC_INTERFACE 2172#ifdef PROC_INTERFACE
2173 2173
2174 char *bp; 2174 char *bp;
2175 char tbuf[128];
2176 unsigned long flags;
2177 struct IN2000_hostdata *hd; 2175 struct IN2000_hostdata *hd;
2178 Scsi_Cmnd *cmd;
2179 int x, i; 2176 int x, i;
2180 static int stop = 0;
2181 2177
2182 hd = (struct IN2000_hostdata *) instance->hostdata; 2178 hd = (struct IN2000_hostdata *) instance->hostdata;
2183 2179
2184/* If 'in' is TRUE we need to _read_ the proc file. We accept the following 2180 buf[len] = '\0';
2185 * keywords (same format as command-line, but only ONE per read): 2181 bp = buf;
2186 * debug 2182 if (!strncmp(bp, "debug:", 6)) {
2187 * disconnect 2183 bp += 6;
2188 * period 2184 hd->args = simple_strtoul(bp, NULL, 0) & DB_MASK;
2189 * resync 2185 } else if (!strncmp(bp, "disconnect:", 11)) {
2190 * proc 2186 bp += 11;
2191 */ 2187 x = simple_strtoul(bp, NULL, 0);
2192 2188 if (x < DIS_NEVER || x > DIS_ALWAYS)
2193 if (in) { 2189 x = DIS_ADAPTIVE;
2194 buf[len] = '\0'; 2190 hd->disconnect = x;
2195 bp = buf; 2191 } else if (!strncmp(bp, "period:", 7)) {
2196 if (!strncmp(bp, "debug:", 6)) { 2192 bp += 7;
2197 bp += 6; 2193 x = simple_strtoul(bp, NULL, 0);
2198 hd->args = simple_strtoul(bp, NULL, 0) & DB_MASK; 2194 hd->default_sx_per = sx_table[round_period((unsigned int) x)].period_ns;
2199 } else if (!strncmp(bp, "disconnect:", 11)) { 2195 } else if (!strncmp(bp, "resync:", 7)) {
2200 bp += 11; 2196 bp += 7;
2201 x = simple_strtoul(bp, NULL, 0); 2197 x = simple_strtoul(bp, NULL, 0);
2202 if (x < DIS_NEVER || x > DIS_ALWAYS) 2198 for (i = 0; i < 7; i++)
2203 x = DIS_ADAPTIVE; 2199 if (x & (1 << i))
2204 hd->disconnect = x; 2200 hd->sync_stat[i] = SS_UNSET;
2205 } else if (!strncmp(bp, "period:", 7)) { 2201 } else if (!strncmp(bp, "proc:", 5)) {
2206 bp += 7; 2202 bp += 5;
2207 x = simple_strtoul(bp, NULL, 0); 2203 hd->proc = simple_strtoul(bp, NULL, 0);
2208 hd->default_sx_per = sx_table[round_period((unsigned int) x)].period_ns; 2204 } else if (!strncmp(bp, "level2:", 7)) {
2209 } else if (!strncmp(bp, "resync:", 7)) { 2205 bp += 7;
2210 bp += 7; 2206 hd->level2 = simple_strtoul(bp, NULL, 0);
2211 x = simple_strtoul(bp, NULL, 0);
2212 for (i = 0; i < 7; i++)
2213 if (x & (1 << i))
2214 hd->sync_stat[i] = SS_UNSET;
2215 } else if (!strncmp(bp, "proc:", 5)) {
2216 bp += 5;
2217 hd->proc = simple_strtoul(bp, NULL, 0);
2218 } else if (!strncmp(bp, "level2:", 7)) {
2219 bp += 7;
2220 hd->level2 = simple_strtoul(bp, NULL, 0);
2221 }
2222 return len;
2223 } 2207 }
2208#endif
2209 return len;
2210}
2211
2212static int in2000_show_info(struct seq_file *m, struct Scsi_Host *instance)
2213{
2214
2215#ifdef PROC_INTERFACE
2216 unsigned long flags;
2217 struct IN2000_hostdata *hd;
2218 Scsi_Cmnd *cmd;
2219 int x;
2220
2221 hd = (struct IN2000_hostdata *) instance->hostdata;
2224 2222
2225 spin_lock_irqsave(instance->host_lock, flags); 2223 spin_lock_irqsave(instance->host_lock, flags);
2226 bp = buf; 2224 if (hd->proc & PR_VERSION)
2227 *bp = '\0'; 2225 seq_printf(m, "\nVersion %s - %s.", IN2000_VERSION, IN2000_DATE);
2228 if (hd->proc & PR_VERSION) { 2226
2229 sprintf(tbuf, "\nVersion %s - %s.", IN2000_VERSION, IN2000_DATE);
2230 strcat(bp, tbuf);
2231 }
2232 if (hd->proc & PR_INFO) { 2227 if (hd->proc & PR_INFO) {
2233 sprintf(tbuf, "\ndip_switch=%02x: irq=%d io=%02x floppy=%s sync/DOS5=%s", (hd->dip_switch & 0x7f), instance->irq, hd->io_base, (hd->dip_switch & 0x40) ? "Yes" : "No", (hd->dip_switch & 0x20) ? "Yes" : "No"); 2228 seq_printf(m, "\ndip_switch=%02x: irq=%d io=%02x floppy=%s sync/DOS5=%s", (hd->dip_switch & 0x7f), instance->irq, hd->io_base, (hd->dip_switch & 0x40) ? "Yes" : "No", (hd->dip_switch & 0x20) ? "Yes" : "No");
2234 strcat(bp, tbuf); 2229 seq_printf(m, "\nsync_xfer[] = ");
2235 strcat(bp, "\nsync_xfer[] = "); 2230 for (x = 0; x < 7; x++)
2236 for (x = 0; x < 7; x++) { 2231 seq_printf(m, "\t%02x", hd->sync_xfer[x]);
2237 sprintf(tbuf, "\t%02x", hd->sync_xfer[x]); 2232 seq_printf(m, "\nsync_stat[] = ");
2238 strcat(bp, tbuf); 2233 for (x = 0; x < 7; x++)
2239 } 2234 seq_printf(m, "\t%02x", hd->sync_stat[x]);
2240 strcat(bp, "\nsync_stat[] = ");
2241 for (x = 0; x < 7; x++) {
2242 sprintf(tbuf, "\t%02x", hd->sync_stat[x]);
2243 strcat(bp, tbuf);
2244 }
2245 } 2235 }
2246#ifdef PROC_STATISTICS 2236#ifdef PROC_STATISTICS
2247 if (hd->proc & PR_STATISTICS) { 2237 if (hd->proc & PR_STATISTICS) {
2248 strcat(bp, "\ncommands issued: "); 2238 seq_printf(m, "\ncommands issued: ");
2249 for (x = 0; x < 7; x++) { 2239 for (x = 0; x < 7; x++)
2250 sprintf(tbuf, "\t%ld", hd->cmd_cnt[x]); 2240 seq_printf(m, "\t%ld", hd->cmd_cnt[x]);
2251 strcat(bp, tbuf); 2241 seq_printf(m, "\ndisconnects allowed:");
2252 } 2242 for (x = 0; x < 7; x++)
2253 strcat(bp, "\ndisconnects allowed:"); 2243 seq_printf(m, "\t%ld", hd->disc_allowed_cnt[x]);
2254 for (x = 0; x < 7; x++) { 2244 seq_printf(m, "\ndisconnects done: ");
2255 sprintf(tbuf, "\t%ld", hd->disc_allowed_cnt[x]); 2245 for (x = 0; x < 7; x++)
2256 strcat(bp, tbuf); 2246 seq_printf(m, "\t%ld", hd->disc_done_cnt[x]);
2257 } 2247 seq_printf(m, "\ninterrupts: \t%ld", hd->int_cnt);
2258 strcat(bp, "\ndisconnects done: ");
2259 for (x = 0; x < 7; x++) {
2260 sprintf(tbuf, "\t%ld", hd->disc_done_cnt[x]);
2261 strcat(bp, tbuf);
2262 }
2263 sprintf(tbuf, "\ninterrupts: \t%ld", hd->int_cnt);
2264 strcat(bp, tbuf);
2265 } 2248 }
2266#endif 2249#endif
2267 if (hd->proc & PR_CONNECTED) { 2250 if (hd->proc & PR_CONNECTED) {
2268 strcat(bp, "\nconnected: "); 2251 seq_printf(m, "\nconnected: ");
2269 if (hd->connected) { 2252 if (hd->connected) {
2270 cmd = (Scsi_Cmnd *) hd->connected; 2253 cmd = (Scsi_Cmnd *) hd->connected;
2271 sprintf(tbuf, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]); 2254 seq_printf(m, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2272 strcat(bp, tbuf);
2273 } 2255 }
2274 } 2256 }
2275 if (hd->proc & PR_INPUTQ) { 2257 if (hd->proc & PR_INPUTQ) {
2276 strcat(bp, "\ninput_Q: "); 2258 seq_printf(m, "\ninput_Q: ");
2277 cmd = (Scsi_Cmnd *) hd->input_Q; 2259 cmd = (Scsi_Cmnd *) hd->input_Q;
2278 while (cmd) { 2260 while (cmd) {
2279 sprintf(tbuf, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]); 2261 seq_printf(m, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2280 strcat(bp, tbuf);
2281 cmd = (Scsi_Cmnd *) cmd->host_scribble; 2262 cmd = (Scsi_Cmnd *) cmd->host_scribble;
2282 } 2263 }
2283 } 2264 }
2284 if (hd->proc & PR_DISCQ) { 2265 if (hd->proc & PR_DISCQ) {
2285 strcat(bp, "\ndisconnected_Q:"); 2266 seq_printf(m, "\ndisconnected_Q:");
2286 cmd = (Scsi_Cmnd *) hd->disconnected_Q; 2267 cmd = (Scsi_Cmnd *) hd->disconnected_Q;
2287 while (cmd) { 2268 while (cmd) {
2288 sprintf(tbuf, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]); 2269 seq_printf(m, " %d:%d(%02x)", cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2289 strcat(bp, tbuf);
2290 cmd = (Scsi_Cmnd *) cmd->host_scribble; 2270 cmd = (Scsi_Cmnd *) cmd->host_scribble;
2291 } 2271 }
2292 } 2272 }
2293 if (hd->proc & PR_TEST) { 2273 if (hd->proc & PR_TEST) {
2294 ; /* insert your own custom function here */ 2274 ; /* insert your own custom function here */
2295 } 2275 }
2296 strcat(bp, "\n"); 2276 seq_printf(m, "\n");
2297 spin_unlock_irqrestore(instance->host_lock, flags); 2277 spin_unlock_irqrestore(instance->host_lock, flags);
2298 *start = buf;
2299 if (stop) {
2300 stop = 0;
2301 return 0; /* return 0 to signal end-of-file */
2302 }
2303 if (off > 0x40000) /* ALWAYS stop after 256k bytes have been read */
2304 stop = 1;
2305 if (hd->proc & PR_STOP) /* stop every other time */
2306 stop = 1;
2307 return strlen(bp);
2308
2309#else /* PROC_INTERFACE */
2310
2311 return 0;
2312
2313#endif /* PROC_INTERFACE */ 2278#endif /* PROC_INTERFACE */
2314 2279 return 0;
2315} 2280}
2316 2281
2317MODULE_LICENSE("GPL"); 2282MODULE_LICENSE("GPL");
@@ -2319,7 +2284,8 @@ MODULE_LICENSE("GPL");
2319 2284
2320static struct scsi_host_template driver_template = { 2285static struct scsi_host_template driver_template = {
2321 .proc_name = "in2000", 2286 .proc_name = "in2000",
2322 .proc_info = in2000_proc_info, 2287 .write_info = in2000_write_info,
2288 .show_info = in2000_show_info,
2323 .name = "Always IN2000", 2289 .name = "Always IN2000",
2324 .detect = in2000_detect, 2290 .detect = in2000_detect,
2325 .release = in2000_release, 2291 .release = in2000_release,
diff --git a/drivers/scsi/ips.c b/drivers/scsi/ips.c
index 9aa86a315a08..8d5ea8a1e5a6 100644
--- a/drivers/scsi/ips.c
+++ b/drivers/scsi/ips.c
@@ -326,10 +326,9 @@ static void ips_scmd_buf_write(struct scsi_cmnd * scmd, void *data,
326static void ips_scmd_buf_read(struct scsi_cmnd * scmd, void *data, 326static void ips_scmd_buf_read(struct scsi_cmnd * scmd, void *data,
327 unsigned int count); 327 unsigned int count);
328 328
329static int ips_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int); 329static int ips_write_info(struct Scsi_Host *, char *, int);
330static int ips_host_info(ips_ha_t *, char *, off_t, int); 330static int ips_show_info(struct seq_file *, struct Scsi_Host *);
331static void copy_mem_info(IPS_INFOSTR *, char *, int); 331static int ips_host_info(ips_ha_t *, struct seq_file *);
332static int copy_info(IPS_INFOSTR *, char *, ...);
333static int ips_abort_init(ips_ha_t * ha, int index); 332static int ips_abort_init(ips_ha_t * ha, int index);
334static int ips_init_phase2(int index); 333static int ips_init_phase2(int index);
335 334
@@ -367,7 +366,8 @@ static struct scsi_host_template ips_driver_template = {
367 .eh_abort_handler = ips_eh_abort, 366 .eh_abort_handler = ips_eh_abort,
368 .eh_host_reset_handler = ips_eh_reset, 367 .eh_host_reset_handler = ips_eh_reset,
369 .proc_name = "ips", 368 .proc_name = "ips",
370 .proc_info = ips_proc_info, 369 .show_info = ips_show_info,
370 .write_info = ips_write_info,
371 .slave_configure = ips_slave_configure, 371 .slave_configure = ips_slave_configure,
372 .bios_param = ips_biosparam, 372 .bios_param = ips_biosparam,
373 .this_id = -1, 373 .this_id = -1,
@@ -1433,25 +1433,12 @@ ips_info(struct Scsi_Host *SH)
1433 return (bp); 1433 return (bp);
1434} 1434}
1435 1435
1436/****************************************************************************/
1437/* */
1438/* Routine Name: ips_proc_info */
1439/* */
1440/* Routine Description: */
1441/* */
1442/* The passthru interface for the driver */
1443/* */
1444/****************************************************************************/
1445static int 1436static int
1446ips_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, 1437ips_write_info(struct Scsi_Host *host, char *buffer, int length)
1447 int length, int func)
1448{ 1438{
1449 int i; 1439 int i;
1450 int ret;
1451 ips_ha_t *ha = NULL; 1440 ips_ha_t *ha = NULL;
1452 1441
1453 METHOD_TRACE("ips_proc_info", 1);
1454
1455 /* Find our host structure */ 1442 /* Find our host structure */
1456 for (i = 0; i < ips_next_controller; i++) { 1443 for (i = 0; i < ips_next_controller; i++) {
1457 if (ips_sh[i]) { 1444 if (ips_sh[i]) {
@@ -1465,18 +1452,29 @@ ips_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset,
1465 if (!ha) 1452 if (!ha)
1466 return (-EINVAL); 1453 return (-EINVAL);
1467 1454
1468 if (func) { 1455 return 0;
1469 /* write */ 1456}
1470 return (0);
1471 } else {
1472 /* read */
1473 if (start)
1474 *start = buffer;
1475 1457
1476 ret = ips_host_info(ha, buffer, offset, length); 1458static int
1459ips_show_info(struct seq_file *m, struct Scsi_Host *host)
1460{
1461 int i;
1462 ips_ha_t *ha = NULL;
1477 1463
1478 return (ret); 1464 /* Find our host structure */
1465 for (i = 0; i < ips_next_controller; i++) {
1466 if (ips_sh[i]) {
1467 if (ips_sh[i] == host) {
1468 ha = (ips_ha_t *) ips_sh[i]->hostdata;
1469 break;
1470 }
1471 }
1479 } 1472 }
1473
1474 if (!ha)
1475 return (-EINVAL);
1476
1477 return ips_host_info(ha, m);
1480} 1478}
1481 1479
1482/*--------------------------------------------------------------------------*/ 1480/*--------------------------------------------------------------------------*/
@@ -2035,183 +2033,113 @@ ips_cleanup_passthru(ips_ha_t * ha, ips_scb_t * scb)
2035/* */ 2033/* */
2036/****************************************************************************/ 2034/****************************************************************************/
2037static int 2035static int
2038ips_host_info(ips_ha_t * ha, char *ptr, off_t offset, int len) 2036ips_host_info(ips_ha_t *ha, struct seq_file *m)
2039{ 2037{
2040 IPS_INFOSTR info;
2041
2042 METHOD_TRACE("ips_host_info", 1); 2038 METHOD_TRACE("ips_host_info", 1);
2043 2039
2044 info.buffer = ptr; 2040 seq_printf(m, "\nIBM ServeRAID General Information:\n\n");
2045 info.length = len;
2046 info.offset = offset;
2047 info.pos = 0;
2048 info.localpos = 0;
2049
2050 copy_info(&info, "\nIBM ServeRAID General Information:\n\n");
2051 2041
2052 if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) && 2042 if ((le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) &&
2053 (le16_to_cpu(ha->nvram->adapter_type) != 0)) 2043 (le16_to_cpu(ha->nvram->adapter_type) != 0))
2054 copy_info(&info, "\tController Type : %s\n", 2044 seq_printf(m, "\tController Type : %s\n",
2055 ips_adapter_name[ha->ad_type - 1]); 2045 ips_adapter_name[ha->ad_type - 1]);
2056 else 2046 else
2057 copy_info(&info, 2047 seq_printf(m,
2058 "\tController Type : Unknown\n"); 2048 "\tController Type : Unknown\n");
2059 2049
2060 if (ha->io_addr) 2050 if (ha->io_addr)
2061 copy_info(&info, 2051 seq_printf(m,
2062 "\tIO region : 0x%lx (%d bytes)\n", 2052 "\tIO region : 0x%x (%d bytes)\n",
2063 ha->io_addr, ha->io_len); 2053 ha->io_addr, ha->io_len);
2064 2054
2065 if (ha->mem_addr) { 2055 if (ha->mem_addr) {
2066 copy_info(&info, 2056 seq_printf(m,
2067 "\tMemory region : 0x%lx (%d bytes)\n", 2057 "\tMemory region : 0x%x (%d bytes)\n",
2068 ha->mem_addr, ha->mem_len); 2058 ha->mem_addr, ha->mem_len);
2069 copy_info(&info, 2059 seq_printf(m,
2070 "\tShared memory address : 0x%lx\n", 2060 "\tShared memory address : 0x%lx\n",
2071 ha->mem_ptr); 2061 (unsigned long)ha->mem_ptr);
2072 } 2062 }
2073 2063
2074 copy_info(&info, "\tIRQ number : %d\n", ha->pcidev->irq); 2064 seq_printf(m, "\tIRQ number : %d\n", ha->pcidev->irq);
2075 2065
2076 /* For the Next 3 lines Check for Binary 0 at the end and don't include it if it's there. */ 2066 /* For the Next 3 lines Check for Binary 0 at the end and don't include it if it's there. */
2077 /* That keeps everything happy for "text" operations on the proc file. */ 2067 /* That keeps everything happy for "text" operations on the proc file. */
2078 2068
2079 if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) { 2069 if (le32_to_cpu(ha->nvram->signature) == IPS_NVRAM_P5_SIG) {
2080 if (ha->nvram->bios_low[3] == 0) { 2070 if (ha->nvram->bios_low[3] == 0) {
2081 copy_info(&info, 2071 seq_printf(m,
2082 "\tBIOS Version : %c%c%c%c%c%c%c\n", 2072 "\tBIOS Version : %c%c%c%c%c%c%c\n",
2083 ha->nvram->bios_high[0], ha->nvram->bios_high[1], 2073 ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2084 ha->nvram->bios_high[2], ha->nvram->bios_high[3], 2074 ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2085 ha->nvram->bios_low[0], ha->nvram->bios_low[1], 2075 ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2086 ha->nvram->bios_low[2]); 2076 ha->nvram->bios_low[2]);
2087 2077
2088 } else { 2078 } else {
2089 copy_info(&info, 2079 seq_printf(m,
2090 "\tBIOS Version : %c%c%c%c%c%c%c%c\n", 2080 "\tBIOS Version : %c%c%c%c%c%c%c%c\n",
2091 ha->nvram->bios_high[0], ha->nvram->bios_high[1], 2081 ha->nvram->bios_high[0], ha->nvram->bios_high[1],
2092 ha->nvram->bios_high[2], ha->nvram->bios_high[3], 2082 ha->nvram->bios_high[2], ha->nvram->bios_high[3],
2093 ha->nvram->bios_low[0], ha->nvram->bios_low[1], 2083 ha->nvram->bios_low[0], ha->nvram->bios_low[1],
2094 ha->nvram->bios_low[2], ha->nvram->bios_low[3]); 2084 ha->nvram->bios_low[2], ha->nvram->bios_low[3]);
2095 } 2085 }
2096 2086
2097 } 2087 }
2098 2088
2099 if (ha->enq->CodeBlkVersion[7] == 0) { 2089 if (ha->enq->CodeBlkVersion[7] == 0) {
2100 copy_info(&info, 2090 seq_printf(m,
2101 "\tFirmware Version : %c%c%c%c%c%c%c\n", 2091 "\tFirmware Version : %c%c%c%c%c%c%c\n",
2102 ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1], 2092 ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2103 ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3], 2093 ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2104 ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5], 2094 ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2105 ha->enq->CodeBlkVersion[6]); 2095 ha->enq->CodeBlkVersion[6]);
2106 } else { 2096 } else {
2107 copy_info(&info, 2097 seq_printf(m,
2108 "\tFirmware Version : %c%c%c%c%c%c%c%c\n", 2098 "\tFirmware Version : %c%c%c%c%c%c%c%c\n",
2109 ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1], 2099 ha->enq->CodeBlkVersion[0], ha->enq->CodeBlkVersion[1],
2110 ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3], 2100 ha->enq->CodeBlkVersion[2], ha->enq->CodeBlkVersion[3],
2111 ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5], 2101 ha->enq->CodeBlkVersion[4], ha->enq->CodeBlkVersion[5],
2112 ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]); 2102 ha->enq->CodeBlkVersion[6], ha->enq->CodeBlkVersion[7]);
2113 } 2103 }
2114 2104
2115 if (ha->enq->BootBlkVersion[7] == 0) { 2105 if (ha->enq->BootBlkVersion[7] == 0) {
2116 copy_info(&info, 2106 seq_printf(m,
2117 "\tBoot Block Version : %c%c%c%c%c%c%c\n", 2107 "\tBoot Block Version : %c%c%c%c%c%c%c\n",
2118 ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1], 2108 ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2119 ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3], 2109 ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2120 ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5], 2110 ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2121 ha->enq->BootBlkVersion[6]); 2111 ha->enq->BootBlkVersion[6]);
2122 } else { 2112 } else {
2123 copy_info(&info, 2113 seq_printf(m,
2124 "\tBoot Block Version : %c%c%c%c%c%c%c%c\n", 2114 "\tBoot Block Version : %c%c%c%c%c%c%c%c\n",
2125 ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1], 2115 ha->enq->BootBlkVersion[0], ha->enq->BootBlkVersion[1],
2126 ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3], 2116 ha->enq->BootBlkVersion[2], ha->enq->BootBlkVersion[3],
2127 ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5], 2117 ha->enq->BootBlkVersion[4], ha->enq->BootBlkVersion[5],
2128 ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]); 2118 ha->enq->BootBlkVersion[6], ha->enq->BootBlkVersion[7]);
2129 } 2119 }
2130 2120
2131 copy_info(&info, "\tDriver Version : %s%s\n", 2121 seq_printf(m, "\tDriver Version : %s%s\n",
2132 IPS_VERSION_HIGH, IPS_VERSION_LOW); 2122 IPS_VERSION_HIGH, IPS_VERSION_LOW);
2133 2123
2134 copy_info(&info, "\tDriver Build : %d\n", 2124 seq_printf(m, "\tDriver Build : %d\n",
2135 IPS_BUILD_IDENT); 2125 IPS_BUILD_IDENT);
2136 2126
2137 copy_info(&info, "\tMax Physical Devices : %d\n", 2127 seq_printf(m, "\tMax Physical Devices : %d\n",
2138 ha->enq->ucMaxPhysicalDevices); 2128 ha->enq->ucMaxPhysicalDevices);
2139 copy_info(&info, "\tMax Active Commands : %d\n", 2129 seq_printf(m, "\tMax Active Commands : %d\n",
2140 ha->max_cmds); 2130 ha->max_cmds);
2141 copy_info(&info, "\tCurrent Queued Commands : %d\n", 2131 seq_printf(m, "\tCurrent Queued Commands : %d\n",
2142 ha->scb_waitlist.count); 2132 ha->scb_waitlist.count);
2143 copy_info(&info, "\tCurrent Active Commands : %d\n", 2133 seq_printf(m, "\tCurrent Active Commands : %d\n",
2144 ha->scb_activelist.count - ha->num_ioctl); 2134 ha->scb_activelist.count - ha->num_ioctl);
2145 copy_info(&info, "\tCurrent Queued PT Commands : %d\n", 2135 seq_printf(m, "\tCurrent Queued PT Commands : %d\n",
2146 ha->copp_waitlist.count); 2136 ha->copp_waitlist.count);
2147 copy_info(&info, "\tCurrent Active PT Commands : %d\n", 2137 seq_printf(m, "\tCurrent Active PT Commands : %d\n",
2148 ha->num_ioctl); 2138 ha->num_ioctl);
2149 2139
2150 copy_info(&info, "\n"); 2140 seq_printf(m, "\n");
2151
2152 return (info.localpos);
2153}
2154
2155/****************************************************************************/
2156/* */
2157/* Routine Name: copy_mem_info */
2158/* */
2159/* Routine Description: */
2160/* */
2161/* Copy data into an IPS_INFOSTR structure */
2162/* */
2163/****************************************************************************/
2164static void
2165copy_mem_info(IPS_INFOSTR * info, char *data, int len)
2166{
2167 METHOD_TRACE("copy_mem_info", 1);
2168
2169 if (info->pos + len < info->offset) {
2170 info->pos += len;
2171 return;
2172 }
2173
2174 if (info->pos < info->offset) {
2175 data += (info->offset - info->pos);
2176 len -= (info->offset - info->pos);
2177 info->pos += (info->offset - info->pos);
2178 }
2179
2180 if (info->localpos + len > info->length)
2181 len = info->length - info->localpos;
2182 2141
2183 if (len > 0) { 2142 return 0;
2184 memcpy(info->buffer + info->localpos, data, len);
2185 info->pos += len;
2186 info->localpos += len;
2187 }
2188}
2189
2190/****************************************************************************/
2191/* */
2192/* Routine Name: copy_info */
2193/* */
2194/* Routine Description: */
2195/* */
2196/* printf style wrapper for an info structure */
2197/* */
2198/****************************************************************************/
2199static int
2200copy_info(IPS_INFOSTR * info, char *fmt, ...)
2201{
2202 va_list args;
2203 char buf[128];
2204 int len;
2205
2206 METHOD_TRACE("copy_info", 1);
2207
2208 va_start(args, fmt);
2209 len = vsprintf(buf, fmt, args);
2210 va_end(args);
2211
2212 copy_mem_info(info, buf, len);
2213
2214 return (len);
2215} 2143}
2216 2144
2217/****************************************************************************/ 2145/****************************************************************************/
diff --git a/drivers/scsi/ips.h b/drivers/scsi/ips.h
index f2df0593332b..45b9566b928e 100644
--- a/drivers/scsi/ips.h
+++ b/drivers/scsi/ips.h
@@ -416,7 +416,6 @@
416 /* 416 /*
417 * Scsi_Host Template 417 * Scsi_Host Template
418 */ 418 */
419 static int ips_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int);
420 static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev, 419 static int ips_biosparam(struct scsi_device *sdev, struct block_device *bdev,
421 sector_t capacity, int geom[]); 420 sector_t capacity, int geom[]);
422 static int ips_slave_configure(struct scsi_device *SDptr); 421 static int ips_slave_configure(struct scsi_device *SDptr);
@@ -959,14 +958,6 @@ typedef union {
959 IPS_ENH_SG_LIST *enh_list; 958 IPS_ENH_SG_LIST *enh_list;
960} IPS_SG_LIST; 959} IPS_SG_LIST;
961 960
962typedef struct _IPS_INFOSTR {
963 char *buffer;
964 int length;
965 int offset;
966 int pos;
967 int localpos;
968} IPS_INFOSTR;
969
970typedef struct { 961typedef struct {
971 char *option_name; 962 char *option_name;
972 int *option_flag; 963 int *option_flag;
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c
index 5da297290262..90b8b0515e23 100644
--- a/drivers/scsi/lpfc/lpfc_init.c
+++ b/drivers/scsi/lpfc/lpfc_init.c
@@ -10394,36 +10394,6 @@ lpfc_io_resume(struct pci_dev *pdev)
10394 return; 10394 return;
10395} 10395}
10396 10396
10397/**
10398 * lpfc_mgmt_open - method called when 'lpfcmgmt' is opened from userspace
10399 * @inode: pointer to the inode representing the lpfcmgmt device
10400 * @filep: pointer to the file representing the open lpfcmgmt device
10401 *
10402 * This routine puts a reference count on the lpfc module whenever the
10403 * character device is opened
10404 **/
10405static int
10406lpfc_mgmt_open(struct inode *inode, struct file *filep)
10407{
10408 try_module_get(THIS_MODULE);
10409 return 0;
10410}
10411
10412/**
10413 * lpfc_mgmt_release - method called when 'lpfcmgmt' is closed in userspace
10414 * @inode: pointer to the inode representing the lpfcmgmt device
10415 * @filep: pointer to the file representing the open lpfcmgmt device
10416 *
10417 * This routine removes a reference count from the lpfc module when the
10418 * character device is closed
10419 **/
10420static int
10421lpfc_mgmt_release(struct inode *inode, struct file *filep)
10422{
10423 module_put(THIS_MODULE);
10424 return 0;
10425}
10426
10427static struct pci_device_id lpfc_id_table[] = { 10397static struct pci_device_id lpfc_id_table[] = {
10428 {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_VIPER, 10398 {PCI_VENDOR_ID_EMULEX, PCI_DEVICE_ID_VIPER,
10429 PCI_ANY_ID, PCI_ANY_ID, }, 10399 PCI_ANY_ID, PCI_ANY_ID, },
@@ -10541,8 +10511,7 @@ static struct pci_driver lpfc_driver = {
10541}; 10511};
10542 10512
10543static const struct file_operations lpfc_mgmt_fop = { 10513static const struct file_operations lpfc_mgmt_fop = {
10544 .open = lpfc_mgmt_open, 10514 .owner = THIS_MODULE,
10545 .release = lpfc_mgmt_release,
10546}; 10515};
10547 10516
10548static struct miscdevice lpfc_mgmt_dev = { 10517static struct miscdevice lpfc_mgmt_dev = {
diff --git a/drivers/scsi/mac_scsi.c b/drivers/scsi/mac_scsi.c
index 24828b54773a..858075723c87 100644
--- a/drivers/scsi/mac_scsi.c
+++ b/drivers/scsi/mac_scsi.c
@@ -561,7 +561,8 @@ static int macscsi_pwrite (struct Scsi_Host *instance,
561 561
562static struct scsi_host_template driver_template = { 562static struct scsi_host_template driver_template = {
563 .proc_name = "Mac5380", 563 .proc_name = "Mac5380",
564 .proc_info = macscsi_proc_info, 564 .show_info = macscsi_show_info,
565 .write_info = macscsi_write_info,
565 .name = "Macintosh NCR5380 SCSI", 566 .name = "Macintosh NCR5380 SCSI",
566 .detect = macscsi_detect, 567 .detect = macscsi_detect,
567 .release = macscsi_release, 568 .release = macscsi_release,
diff --git a/drivers/scsi/mac_scsi.h b/drivers/scsi/mac_scsi.h
index d26e331c6c12..7dc62fce1c4c 100644
--- a/drivers/scsi/mac_scsi.h
+++ b/drivers/scsi/mac_scsi.h
@@ -72,7 +72,8 @@
72#define NCR5380_queue_command macscsi_queue_command 72#define NCR5380_queue_command macscsi_queue_command
73#define NCR5380_abort macscsi_abort 73#define NCR5380_abort macscsi_abort
74#define NCR5380_bus_reset macscsi_bus_reset 74#define NCR5380_bus_reset macscsi_bus_reset
75#define NCR5380_proc_info macscsi_proc_info 75#define NCR5380_show_info macscsi_show_info
76#define NCR5380_write_info macscsi_write_info
76 77
77#define BOARD_NORMAL 0 78#define BOARD_NORMAL 0
78#define BOARD_NCR53C400 1 79#define BOARD_NCR53C400 1
diff --git a/drivers/scsi/megaraid.c b/drivers/scsi/megaraid.c
index 9504ec0ec682..7373255aa1e8 100644
--- a/drivers/scsi/megaraid.c
+++ b/drivers/scsi/megaraid.c
@@ -39,6 +39,7 @@
39#include <linux/completion.h> 39#include <linux/completion.h>
40#include <linux/delay.h> 40#include <linux/delay.h>
41#include <linux/proc_fs.h> 41#include <linux/proc_fs.h>
42#include <linux/seq_file.h>
42#include <linux/reboot.h> 43#include <linux/reboot.h>
43#include <linux/module.h> 44#include <linux/module.h>
44#include <linux/list.h> 45#include <linux/list.h>
@@ -2069,385 +2070,201 @@ mega_free_inquiry(void *inquiry, dma_addr_t dma_handle, struct pci_dev *pdev)
2069#ifdef CONFIG_PROC_FS 2070#ifdef CONFIG_PROC_FS
2070/* Following code handles /proc fs */ 2071/* Following code handles /proc fs */
2071 2072
2072#define CREATE_READ_PROC(string, func) create_proc_read_entry(string, \
2073 S_IRUSR | S_IFREG, \
2074 controller_proc_dir_entry, \
2075 func, adapter)
2076
2077/**
2078 * mega_create_proc_entry()
2079 * @index - index in soft state array
2080 * @parent - parent node for this /proc entry
2081 *
2082 * Creates /proc entries for our controllers.
2083 */
2084static void
2085mega_create_proc_entry(int index, struct proc_dir_entry *parent)
2086{
2087 struct proc_dir_entry *controller_proc_dir_entry = NULL;
2088 u8 string[64] = { 0 };
2089 adapter_t *adapter = hba_soft_state[index];
2090
2091 sprintf(string, "hba%d", adapter->host->host_no);
2092
2093 controller_proc_dir_entry =
2094 adapter->controller_proc_dir_entry = proc_mkdir(string, parent);
2095
2096 if(!controller_proc_dir_entry) {
2097 printk(KERN_WARNING "\nmegaraid: proc_mkdir failed\n");
2098 return;
2099 }
2100 adapter->proc_read = CREATE_READ_PROC("config", proc_read_config);
2101 adapter->proc_stat = CREATE_READ_PROC("stat", proc_read_stat);
2102 adapter->proc_mbox = CREATE_READ_PROC("mailbox", proc_read_mbox);
2103#if MEGA_HAVE_ENH_PROC
2104 adapter->proc_rr = CREATE_READ_PROC("rebuild-rate", proc_rebuild_rate);
2105 adapter->proc_battery = CREATE_READ_PROC("battery-status",
2106 proc_battery);
2107
2108 /*
2109 * Display each physical drive on its channel
2110 */
2111 adapter->proc_pdrvstat[0] = CREATE_READ_PROC("diskdrives-ch0",
2112 proc_pdrv_ch0);
2113 adapter->proc_pdrvstat[1] = CREATE_READ_PROC("diskdrives-ch1",
2114 proc_pdrv_ch1);
2115 adapter->proc_pdrvstat[2] = CREATE_READ_PROC("diskdrives-ch2",
2116 proc_pdrv_ch2);
2117 adapter->proc_pdrvstat[3] = CREATE_READ_PROC("diskdrives-ch3",
2118 proc_pdrv_ch3);
2119
2120 /*
2121 * Display a set of up to 10 logical drive through each of following
2122 * /proc entries
2123 */
2124 adapter->proc_rdrvstat[0] = CREATE_READ_PROC("raiddrives-0-9",
2125 proc_rdrv_10);
2126 adapter->proc_rdrvstat[1] = CREATE_READ_PROC("raiddrives-10-19",
2127 proc_rdrv_20);
2128 adapter->proc_rdrvstat[2] = CREATE_READ_PROC("raiddrives-20-29",
2129 proc_rdrv_30);
2130 adapter->proc_rdrvstat[3] = CREATE_READ_PROC("raiddrives-30-39",
2131 proc_rdrv_40);
2132#endif
2133}
2134
2135
2136/** 2073/**
2137 * proc_read_config() 2074 * proc_show_config()
2138 * @page - buffer to write the data in 2075 * @m - Synthetic file construction data
2139 * @start - where the actual data has been written in page 2076 * @v - File iterator
2140 * @offset - same meaning as the read system call
2141 * @count - same meaning as the read system call
2142 * @eof - set if no more data needs to be returned
2143 * @data - pointer to our soft state
2144 * 2077 *
2145 * Display configuration information about the controller. 2078 * Display configuration information about the controller.
2146 */ 2079 */
2147static int 2080static int
2148proc_read_config(char *page, char **start, off_t offset, int count, int *eof, 2081proc_show_config(struct seq_file *m, void *v)
2149 void *data)
2150{ 2082{
2151 2083
2152 adapter_t *adapter = (adapter_t *)data; 2084 adapter_t *adapter = m->private;
2153 int len = 0;
2154
2155 len += sprintf(page+len, "%s", MEGARAID_VERSION);
2156 2085
2086 seq_puts(m, MEGARAID_VERSION);
2157 if(adapter->product_info.product_name[0]) 2087 if(adapter->product_info.product_name[0])
2158 len += sprintf(page+len, "%s\n", 2088 seq_printf(m, "%s\n", adapter->product_info.product_name);
2159 adapter->product_info.product_name);
2160
2161 len += sprintf(page+len, "Controller Type: ");
2162 2089
2163 if( adapter->flag & BOARD_MEMMAP ) { 2090 seq_puts(m, "Controller Type: ");
2164 len += sprintf(page+len,
2165 "438/466/467/471/493/518/520/531/532\n");
2166 }
2167 else {
2168 len += sprintf(page+len,
2169 "418/428/434\n");
2170 }
2171 2091
2172 if(adapter->flag & BOARD_40LD) { 2092 if( adapter->flag & BOARD_MEMMAP )
2173 len += sprintf(page+len, 2093 seq_puts(m, "438/466/467/471/493/518/520/531/532\n");
2174 "Controller Supports 40 Logical Drives\n"); 2094 else
2175 } 2095 seq_puts(m, "418/428/434\n");
2176 2096
2177 if(adapter->flag & BOARD_64BIT) { 2097 if(adapter->flag & BOARD_40LD)
2178 len += sprintf(page+len, 2098 seq_puts(m, "Controller Supports 40 Logical Drives\n");
2179 "Controller capable of 64-bit memory addressing\n");
2180 }
2181 if( adapter->has_64bit_addr ) {
2182 len += sprintf(page+len,
2183 "Controller using 64-bit memory addressing\n");
2184 }
2185 else {
2186 len += sprintf(page+len,
2187 "Controller is not using 64-bit memory addressing\n");
2188 }
2189 2099
2190 len += sprintf(page+len, "Base = %08lx, Irq = %d, ", adapter->base, 2100 if(adapter->flag & BOARD_64BIT)
2191 adapter->host->irq); 2101 seq_puts(m, "Controller capable of 64-bit memory addressing\n");
2192 2102 if( adapter->has_64bit_addr )
2193 len += sprintf(page+len, "Logical Drives = %d, Channels = %d\n", 2103 seq_puts(m, "Controller using 64-bit memory addressing\n");
2194 adapter->numldrv, adapter->product_info.nchannels); 2104 else
2195 2105 seq_puts(m, "Controller is not using 64-bit memory addressing\n");
2196 len += sprintf(page+len, "Version =%s:%s, DRAM = %dMb\n", 2106
2197 adapter->fw_version, adapter->bios_version, 2107 seq_printf(m, "Base = %08lx, Irq = %d, ",
2198 adapter->product_info.dram_size); 2108 adapter->base, adapter->host->irq);
2199 2109
2200 len += sprintf(page+len, 2110 seq_printf(m, "Logical Drives = %d, Channels = %d\n",
2201 "Controller Queue Depth = %d, Driver Queue Depth = %d\n", 2111 adapter->numldrv, adapter->product_info.nchannels);
2202 adapter->product_info.max_commands, adapter->max_cmds); 2112
2203 2113 seq_printf(m, "Version =%s:%s, DRAM = %dMb\n",
2204 len += sprintf(page+len, "support_ext_cdb = %d\n", 2114 adapter->fw_version, adapter->bios_version,
2205 adapter->support_ext_cdb); 2115 adapter->product_info.dram_size);
2206 len += sprintf(page+len, "support_random_del = %d\n", 2116
2207 adapter->support_random_del); 2117 seq_printf(m, "Controller Queue Depth = %d, Driver Queue Depth = %d\n",
2208 len += sprintf(page+len, "boot_ldrv_enabled = %d\n", 2118 adapter->product_info.max_commands, adapter->max_cmds);
2209 adapter->boot_ldrv_enabled); 2119
2210 len += sprintf(page+len, "boot_ldrv = %d\n", 2120 seq_printf(m, "support_ext_cdb = %d\n", adapter->support_ext_cdb);
2211 adapter->boot_ldrv); 2121 seq_printf(m, "support_random_del = %d\n", adapter->support_random_del);
2212 len += sprintf(page+len, "boot_pdrv_enabled = %d\n", 2122 seq_printf(m, "boot_ldrv_enabled = %d\n", adapter->boot_ldrv_enabled);
2213 adapter->boot_pdrv_enabled); 2123 seq_printf(m, "boot_ldrv = %d\n", adapter->boot_ldrv);
2214 len += sprintf(page+len, "boot_pdrv_ch = %d\n", 2124 seq_printf(m, "boot_pdrv_enabled = %d\n", adapter->boot_pdrv_enabled);
2215 adapter->boot_pdrv_ch); 2125 seq_printf(m, "boot_pdrv_ch = %d\n", adapter->boot_pdrv_ch);
2216 len += sprintf(page+len, "boot_pdrv_tgt = %d\n", 2126 seq_printf(m, "boot_pdrv_tgt = %d\n", adapter->boot_pdrv_tgt);
2217 adapter->boot_pdrv_tgt); 2127 seq_printf(m, "quiescent = %d\n",
2218 len += sprintf(page+len, "quiescent = %d\n", 2128 atomic_read(&adapter->quiescent));
2219 atomic_read(&adapter->quiescent)); 2129 seq_printf(m, "has_cluster = %d\n", adapter->has_cluster);
2220 len += sprintf(page+len, "has_cluster = %d\n", 2130
2221 adapter->has_cluster); 2131 seq_puts(m, "\nModule Parameters:\n");
2222 2132 seq_printf(m, "max_cmd_per_lun = %d\n", max_cmd_per_lun);
2223 len += sprintf(page+len, "\nModule Parameters:\n"); 2133 seq_printf(m, "max_sectors_per_io = %d\n", max_sectors_per_io);
2224 len += sprintf(page+len, "max_cmd_per_lun = %d\n", 2134 return 0;
2225 max_cmd_per_lun);
2226 len += sprintf(page+len, "max_sectors_per_io = %d\n",
2227 max_sectors_per_io);
2228
2229 *eof = 1;
2230
2231 return len;
2232} 2135}
2233 2136
2234
2235
2236/** 2137/**
2237 * proc_read_stat() 2138 * proc_show_stat()
2238 * @page - buffer to write the data in 2139 * @m - Synthetic file construction data
2239 * @start - where the actual data has been written in page 2140 * @v - File iterator
2240 * @offset - same meaning as the read system call
2241 * @count - same meaning as the read system call
2242 * @eof - set if no more data needs to be returned
2243 * @data - pointer to our soft state
2244 * 2141 *
2245 * Diaplay statistical information about the I/O activity. 2142 * Display statistical information about the I/O activity.
2246 */ 2143 */
2247static int 2144static int
2248proc_read_stat(char *page, char **start, off_t offset, int count, int *eof, 2145proc_show_stat(struct seq_file *m, void *v)
2249 void *data)
2250{ 2146{
2251 adapter_t *adapter; 2147 adapter_t *adapter = m->private;
2252 int len; 2148#if MEGA_HAVE_STATS
2253 int i; 2149 int i;
2150#endif
2254 2151
2255 i = 0; /* avoid compilation warnings */ 2152 seq_puts(m, "Statistical Information for this controller\n");
2256 len = 0; 2153 seq_printf(m, "pend_cmds = %d\n", atomic_read(&adapter->pend_cmds));
2257 adapter = (adapter_t *)data;
2258
2259 len = sprintf(page, "Statistical Information for this controller\n");
2260 len += sprintf(page+len, "pend_cmds = %d\n",
2261 atomic_read(&adapter->pend_cmds));
2262#if MEGA_HAVE_STATS 2154#if MEGA_HAVE_STATS
2263 for(i = 0; i < adapter->numldrv; i++) { 2155 for(i = 0; i < adapter->numldrv; i++) {
2264 len += sprintf(page+len, "Logical Drive %d:\n", i); 2156 seq_printf(m, "Logical Drive %d:\n", i);
2265 2157 seq_printf(m, "\tReads Issued = %lu, Writes Issued = %lu\n",
2266 len += sprintf(page+len, 2158 adapter->nreads[i], adapter->nwrites[i]);
2267 "\tReads Issued = %lu, Writes Issued = %lu\n", 2159 seq_printf(m, "\tSectors Read = %lu, Sectors Written = %lu\n",
2268 adapter->nreads[i], adapter->nwrites[i]); 2160 adapter->nreadblocks[i], adapter->nwriteblocks[i]);
2269 2161 seq_printf(m, "\tRead errors = %lu, Write errors = %lu\n\n",
2270 len += sprintf(page+len, 2162 adapter->rd_errors[i], adapter->wr_errors[i]);
2271 "\tSectors Read = %lu, Sectors Written = %lu\n",
2272 adapter->nreadblocks[i], adapter->nwriteblocks[i]);
2273
2274 len += sprintf(page+len,
2275 "\tRead errors = %lu, Write errors = %lu\n\n",
2276 adapter->rd_errors[i], adapter->wr_errors[i]);
2277 } 2163 }
2278#else 2164#else
2279 len += sprintf(page+len, 2165 seq_puts(m, "IO and error counters not compiled in driver.\n");
2280 "IO and error counters not compiled in driver.\n");
2281#endif 2166#endif
2282 2167 return 0;
2283 *eof = 1;
2284
2285 return len;
2286} 2168}
2287 2169
2288 2170
2289/** 2171/**
2290 * proc_read_mbox() 2172 * proc_show_mbox()
2291 * @page - buffer to write the data in 2173 * @m - Synthetic file construction data
2292 * @start - where the actual data has been written in page 2174 * @v - File iterator
2293 * @offset - same meaning as the read system call
2294 * @count - same meaning as the read system call
2295 * @eof - set if no more data needs to be returned
2296 * @data - pointer to our soft state
2297 * 2175 *
2298 * Display mailbox information for the last command issued. This information 2176 * Display mailbox information for the last command issued. This information
2299 * is good for debugging. 2177 * is good for debugging.
2300 */ 2178 */
2301static int 2179static int
2302proc_read_mbox(char *page, char **start, off_t offset, int count, int *eof, 2180proc_show_mbox(struct seq_file *m, void *v)
2303 void *data)
2304{ 2181{
2305 2182 adapter_t *adapter = m->private;
2306 adapter_t *adapter = (adapter_t *)data;
2307 volatile mbox_t *mbox = adapter->mbox; 2183 volatile mbox_t *mbox = adapter->mbox;
2308 int len = 0; 2184
2309 2185 seq_puts(m, "Contents of Mail Box Structure\n");
2310 len = sprintf(page, "Contents of Mail Box Structure\n"); 2186 seq_printf(m, " Fw Command = 0x%02x\n", mbox->m_out.cmd);
2311 len += sprintf(page+len, " Fw Command = 0x%02x\n", 2187 seq_printf(m, " Cmd Sequence = 0x%02x\n", mbox->m_out.cmdid);
2312 mbox->m_out.cmd); 2188 seq_printf(m, " No of Sectors= %04d\n", mbox->m_out.numsectors);
2313 len += sprintf(page+len, " Cmd Sequence = 0x%02x\n", 2189 seq_printf(m, " LBA = 0x%02x\n", mbox->m_out.lba);
2314 mbox->m_out.cmdid); 2190 seq_printf(m, " DTA = 0x%08x\n", mbox->m_out.xferaddr);
2315 len += sprintf(page+len, " No of Sectors= %04d\n", 2191 seq_printf(m, " Logical Drive= 0x%02x\n", mbox->m_out.logdrv);
2316 mbox->m_out.numsectors); 2192 seq_printf(m, " No of SG Elmt= 0x%02x\n", mbox->m_out.numsgelements);
2317 len += sprintf(page+len, " LBA = 0x%02x\n", 2193 seq_printf(m, " Busy = %01x\n", mbox->m_in.busy);
2318 mbox->m_out.lba); 2194 seq_printf(m, " Status = 0x%02x\n", mbox->m_in.status);
2319 len += sprintf(page+len, " DTA = 0x%08x\n", 2195 return 0;
2320 mbox->m_out.xferaddr);
2321 len += sprintf(page+len, " Logical Drive= 0x%02x\n",
2322 mbox->m_out.logdrv);
2323 len += sprintf(page+len, " No of SG Elmt= 0x%02x\n",
2324 mbox->m_out.numsgelements);
2325 len += sprintf(page+len, " Busy = %01x\n",
2326 mbox->m_in.busy);
2327 len += sprintf(page+len, " Status = 0x%02x\n",
2328 mbox->m_in.status);
2329
2330 *eof = 1;
2331
2332 return len;
2333} 2196}
2334 2197
2335 2198
2336/** 2199/**
2337 * proc_rebuild_rate() 2200 * proc_show_rebuild_rate()
2338 * @page - buffer to write the data in 2201 * @m - Synthetic file construction data
2339 * @start - where the actual data has been written in page 2202 * @v - File iterator
2340 * @offset - same meaning as the read system call
2341 * @count - same meaning as the read system call
2342 * @eof - set if no more data needs to be returned
2343 * @data - pointer to our soft state
2344 * 2203 *
2345 * Display current rebuild rate 2204 * Display current rebuild rate
2346 */ 2205 */
2347static int 2206static int
2348proc_rebuild_rate(char *page, char **start, off_t offset, int count, int *eof, 2207proc_show_rebuild_rate(struct seq_file *m, void *v)
2349 void *data)
2350{ 2208{
2351 adapter_t *adapter = (adapter_t *)data; 2209 adapter_t *adapter = m->private;
2352 dma_addr_t dma_handle; 2210 dma_addr_t dma_handle;
2353 caddr_t inquiry; 2211 caddr_t inquiry;
2354 struct pci_dev *pdev; 2212 struct pci_dev *pdev;
2355 int len = 0;
2356 2213
2357 if( make_local_pdev(adapter, &pdev) != 0 ) { 2214 if( make_local_pdev(adapter, &pdev) != 0 )
2358 *eof = 1; 2215 return 0;
2359 return len;
2360 }
2361 2216
2362 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { 2217 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL )
2363 free_local_pdev(pdev); 2218 goto free_pdev;
2364 *eof = 1;
2365 return len;
2366 }
2367 2219
2368 if( mega_adapinq(adapter, dma_handle) != 0 ) { 2220 if( mega_adapinq(adapter, dma_handle) != 0 ) {
2369 2221 seq_puts(m, "Adapter inquiry failed.\n");
2370 len = sprintf(page, "Adapter inquiry failed.\n");
2371
2372 printk(KERN_WARNING "megaraid: inquiry failed.\n"); 2222 printk(KERN_WARNING "megaraid: inquiry failed.\n");
2373 2223 goto free_inquiry;
2374 mega_free_inquiry(inquiry, dma_handle, pdev);
2375
2376 free_local_pdev(pdev);
2377
2378 *eof = 1;
2379
2380 return len;
2381 } 2224 }
2382 2225
2383 if( adapter->flag & BOARD_40LD ) { 2226 if( adapter->flag & BOARD_40LD )
2384 len = sprintf(page, "Rebuild Rate: [%d%%]\n", 2227 seq_printf(m, "Rebuild Rate: [%d%%]\n",
2385 ((mega_inquiry3 *)inquiry)->rebuild_rate); 2228 ((mega_inquiry3 *)inquiry)->rebuild_rate);
2386 } 2229 else
2387 else { 2230 seq_printf(m, "Rebuild Rate: [%d%%]\n",
2388 len = sprintf(page, "Rebuild Rate: [%d%%]\n",
2389 ((mraid_ext_inquiry *) 2231 ((mraid_ext_inquiry *)
2390 inquiry)->raid_inq.adapter_info.rebuild_rate); 2232 inquiry)->raid_inq.adapter_info.rebuild_rate);
2391 }
2392
2393 2233
2234free_inquiry:
2394 mega_free_inquiry(inquiry, dma_handle, pdev); 2235 mega_free_inquiry(inquiry, dma_handle, pdev);
2395 2236free_pdev:
2396 free_local_pdev(pdev); 2237 free_local_pdev(pdev);
2397 2238 return 0;
2398 *eof = 1;
2399
2400 return len;
2401} 2239}
2402 2240
2403 2241
2404/** 2242/**
2405 * proc_battery() 2243 * proc_show_battery()
2406 * @page - buffer to write the data in 2244 * @m - Synthetic file construction data
2407 * @start - where the actual data has been written in page 2245 * @v - File iterator
2408 * @offset - same meaning as the read system call
2409 * @count - same meaning as the read system call
2410 * @eof - set if no more data needs to be returned
2411 * @data - pointer to our soft state
2412 * 2246 *
2413 * Display information about the battery module on the controller. 2247 * Display information about the battery module on the controller.
2414 */ 2248 */
2415static int 2249static int
2416proc_battery(char *page, char **start, off_t offset, int count, int *eof, 2250proc_show_battery(struct seq_file *m, void *v)
2417 void *data)
2418{ 2251{
2419 adapter_t *adapter = (adapter_t *)data; 2252 adapter_t *adapter = m->private;
2420 dma_addr_t dma_handle; 2253 dma_addr_t dma_handle;
2421 caddr_t inquiry; 2254 caddr_t inquiry;
2422 struct pci_dev *pdev; 2255 struct pci_dev *pdev;
2423 u8 battery_status = 0; 2256 u8 battery_status;
2424 char str[256];
2425 int len = 0;
2426 2257
2427 if( make_local_pdev(adapter, &pdev) != 0 ) { 2258 if( make_local_pdev(adapter, &pdev) != 0 )
2428 *eof = 1; 2259 return 0;
2429 return len;
2430 }
2431 2260
2432 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { 2261 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL )
2433 free_local_pdev(pdev); 2262 goto free_pdev;
2434 *eof = 1;
2435 return len;
2436 }
2437 2263
2438 if( mega_adapinq(adapter, dma_handle) != 0 ) { 2264 if( mega_adapinq(adapter, dma_handle) != 0 ) {
2439 2265 seq_printf(m, "Adapter inquiry failed.\n");
2440 len = sprintf(page, "Adapter inquiry failed.\n");
2441
2442 printk(KERN_WARNING "megaraid: inquiry failed.\n"); 2266 printk(KERN_WARNING "megaraid: inquiry failed.\n");
2443 2267 goto free_inquiry;
2444 mega_free_inquiry(inquiry, dma_handle, pdev);
2445
2446 free_local_pdev(pdev);
2447
2448 *eof = 1;
2449
2450 return len;
2451 } 2268 }
2452 2269
2453 if( adapter->flag & BOARD_40LD ) { 2270 if( adapter->flag & BOARD_40LD ) {
@@ -2461,146 +2278,80 @@ proc_battery(char *page, char **start, off_t offset, int count, int *eof,
2461 /* 2278 /*
2462 * Decode the battery status 2279 * Decode the battery status
2463 */ 2280 */
2464 sprintf(str, "Battery Status:[%d]", battery_status); 2281 seq_printf(m, "Battery Status:[%d]", battery_status);
2465 2282
2466 if(battery_status == MEGA_BATT_CHARGE_DONE) 2283 if(battery_status == MEGA_BATT_CHARGE_DONE)
2467 strcat(str, " Charge Done"); 2284 seq_puts(m, " Charge Done");
2468 2285
2469 if(battery_status & MEGA_BATT_MODULE_MISSING) 2286 if(battery_status & MEGA_BATT_MODULE_MISSING)
2470 strcat(str, " Module Missing"); 2287 seq_puts(m, " Module Missing");
2471 2288
2472 if(battery_status & MEGA_BATT_LOW_VOLTAGE) 2289 if(battery_status & MEGA_BATT_LOW_VOLTAGE)
2473 strcat(str, " Low Voltage"); 2290 seq_puts(m, " Low Voltage");
2474 2291
2475 if(battery_status & MEGA_BATT_TEMP_HIGH) 2292 if(battery_status & MEGA_BATT_TEMP_HIGH)
2476 strcat(str, " Temperature High"); 2293 seq_puts(m, " Temperature High");
2477 2294
2478 if(battery_status & MEGA_BATT_PACK_MISSING) 2295 if(battery_status & MEGA_BATT_PACK_MISSING)
2479 strcat(str, " Pack Missing"); 2296 seq_puts(m, " Pack Missing");
2480 2297
2481 if(battery_status & MEGA_BATT_CHARGE_INPROG) 2298 if(battery_status & MEGA_BATT_CHARGE_INPROG)
2482 strcat(str, " Charge In-progress"); 2299 seq_puts(m, " Charge In-progress");
2483 2300
2484 if(battery_status & MEGA_BATT_CHARGE_FAIL) 2301 if(battery_status & MEGA_BATT_CHARGE_FAIL)
2485 strcat(str, " Charge Fail"); 2302 seq_puts(m, " Charge Fail");
2486 2303
2487 if(battery_status & MEGA_BATT_CYCLES_EXCEEDED) 2304 if(battery_status & MEGA_BATT_CYCLES_EXCEEDED)
2488 strcat(str, " Cycles Exceeded"); 2305 seq_puts(m, " Cycles Exceeded");
2489
2490 len = sprintf(page, "%s\n", str);
2491 2306
2307 seq_putc(m, '\n');
2492 2308
2309free_inquiry:
2493 mega_free_inquiry(inquiry, dma_handle, pdev); 2310 mega_free_inquiry(inquiry, dma_handle, pdev);
2494 2311free_pdev:
2495 free_local_pdev(pdev); 2312 free_local_pdev(pdev);
2496 2313 return 0;
2497 *eof = 1;
2498
2499 return len;
2500}
2501
2502
2503/**
2504 * proc_pdrv_ch0()
2505 * @page - buffer to write the data in
2506 * @start - where the actual data has been written in page
2507 * @offset - same meaning as the read system call
2508 * @count - same meaning as the read system call
2509 * @eof - set if no more data needs to be returned
2510 * @data - pointer to our soft state
2511 *
2512 * Display information about the physical drives on physical channel 0.
2513 */
2514static int
2515proc_pdrv_ch0(char *page, char **start, off_t offset, int count, int *eof,
2516 void *data)
2517{
2518 adapter_t *adapter = (adapter_t *)data;
2519
2520 *eof = 1;
2521
2522 return (proc_pdrv(adapter, page, 0));
2523}
2524
2525
2526/**
2527 * proc_pdrv_ch1()
2528 * @page - buffer to write the data in
2529 * @start - where the actual data has been written in page
2530 * @offset - same meaning as the read system call
2531 * @count - same meaning as the read system call
2532 * @eof - set if no more data needs to be returned
2533 * @data - pointer to our soft state
2534 *
2535 * Display information about the physical drives on physical channel 1.
2536 */
2537static int
2538proc_pdrv_ch1(char *page, char **start, off_t offset, int count, int *eof,
2539 void *data)
2540{
2541 adapter_t *adapter = (adapter_t *)data;
2542
2543 *eof = 1;
2544
2545 return (proc_pdrv(adapter, page, 1));
2546} 2314}
2547 2315
2548 2316
2549/** 2317/*
2550 * proc_pdrv_ch2() 2318 * Display scsi inquiry
2551 * @page - buffer to write the data in
2552 * @start - where the actual data has been written in page
2553 * @offset - same meaning as the read system call
2554 * @count - same meaning as the read system call
2555 * @eof - set if no more data needs to be returned
2556 * @data - pointer to our soft state
2557 *
2558 * Display information about the physical drives on physical channel 2.
2559 */ 2319 */
2560static int 2320static void
2561proc_pdrv_ch2(char *page, char **start, off_t offset, int count, int *eof, 2321mega_print_inquiry(struct seq_file *m, char *scsi_inq)
2562 void *data)
2563{ 2322{
2564 adapter_t *adapter = (adapter_t *)data; 2323 int i;
2565
2566 *eof = 1;
2567
2568 return (proc_pdrv(adapter, page, 2));
2569}
2570 2324
2325 seq_puts(m, " Vendor: ");
2326 seq_write(m, scsi_inq + 8, 8);
2327 seq_puts(m, " Model: ");
2328 seq_write(m, scsi_inq + 16, 16);
2329 seq_puts(m, " Rev: ");
2330 seq_write(m, scsi_inq + 32, 4);
2331 seq_putc(m, '\n');
2571 2332
2572/** 2333 i = scsi_inq[0] & 0x1f;
2573 * proc_pdrv_ch3() 2334 seq_printf(m, " Type: %s ", scsi_device_type(i));
2574 * @page - buffer to write the data in
2575 * @start - where the actual data has been written in page
2576 * @offset - same meaning as the read system call
2577 * @count - same meaning as the read system call
2578 * @eof - set if no more data needs to be returned
2579 * @data - pointer to our soft state
2580 *
2581 * Display information about the physical drives on physical channel 3.
2582 */
2583static int
2584proc_pdrv_ch3(char *page, char **start, off_t offset, int count, int *eof,
2585 void *data)
2586{
2587 adapter_t *adapter = (adapter_t *)data;
2588 2335
2589 *eof = 1; 2336 seq_printf(m, " ANSI SCSI revision: %02x",
2337 scsi_inq[2] & 0x07);
2590 2338
2591 return (proc_pdrv(adapter, page, 3)); 2339 if( (scsi_inq[2] & 0x07) == 1 && (scsi_inq[3] & 0x0f) == 1 )
2340 seq_puts(m, " CCS\n");
2341 else
2342 seq_putc(m, '\n');
2592} 2343}
2593 2344
2594
2595/** 2345/**
2596 * proc_pdrv() 2346 * proc_show_pdrv()
2347 * @m - Synthetic file construction data
2597 * @page - buffer to write the data in 2348 * @page - buffer to write the data in
2598 * @adapter - pointer to our soft state 2349 * @adapter - pointer to our soft state
2599 * 2350 *
2600 * Display information about the physical drives. 2351 * Display information about the physical drives.
2601 */ 2352 */
2602static int 2353static int
2603proc_pdrv(adapter_t *adapter, char *page, int channel) 2354proc_show_pdrv(struct seq_file *m, adapter_t *adapter, int channel)
2604{ 2355{
2605 dma_addr_t dma_handle; 2356 dma_addr_t dma_handle;
2606 char *scsi_inq; 2357 char *scsi_inq;
@@ -2611,32 +2362,24 @@ proc_pdrv(adapter_t *adapter, char *page, int channel)
2611 u8 state; 2362 u8 state;
2612 int tgt; 2363 int tgt;
2613 int max_channels; 2364 int max_channels;
2614 int len = 0;
2615 char str[80];
2616 int i; 2365 int i;
2617 2366
2618 if( make_local_pdev(adapter, &pdev) != 0 ) { 2367 if( make_local_pdev(adapter, &pdev) != 0 )
2619 return len; 2368 return 0;
2620 }
2621 2369
2622 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { 2370 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL )
2623 goto free_pdev; 2371 goto free_pdev;
2624 }
2625 2372
2626 if( mega_adapinq(adapter, dma_handle) != 0 ) { 2373 if( mega_adapinq(adapter, dma_handle) != 0 ) {
2627 len = sprintf(page, "Adapter inquiry failed.\n"); 2374 seq_puts(m, "Adapter inquiry failed.\n");
2628
2629 printk(KERN_WARNING "megaraid: inquiry failed.\n"); 2375 printk(KERN_WARNING "megaraid: inquiry failed.\n");
2630
2631 goto free_inquiry; 2376 goto free_inquiry;
2632 } 2377 }
2633 2378
2634 2379
2635 scsi_inq = pci_alloc_consistent(pdev, 256, &scsi_inq_dma_handle); 2380 scsi_inq = pci_alloc_consistent(pdev, 256, &scsi_inq_dma_handle);
2636
2637 if( scsi_inq == NULL ) { 2381 if( scsi_inq == NULL ) {
2638 len = sprintf(page, "memory not available for scsi inq.\n"); 2382 seq_puts(m, "memory not available for scsi inq.\n");
2639
2640 goto free_inquiry; 2383 goto free_inquiry;
2641 } 2384 }
2642 2385
@@ -2659,39 +2402,31 @@ proc_pdrv(adapter_t *adapter, char *page, int channel)
2659 i = channel*16 + tgt; 2402 i = channel*16 + tgt;
2660 2403
2661 state = *(pdrv_state + i); 2404 state = *(pdrv_state + i);
2662
2663 switch( state & 0x0F ) { 2405 switch( state & 0x0F ) {
2664
2665 case PDRV_ONLINE: 2406 case PDRV_ONLINE:
2666 sprintf(str, 2407 seq_printf(m, "Channel:%2d Id:%2d State: Online",
2667 "Channel:%2d Id:%2d State: Online", 2408 channel, tgt);
2668 channel, tgt);
2669 break; 2409 break;
2670 2410
2671 case PDRV_FAILED: 2411 case PDRV_FAILED:
2672 sprintf(str, 2412 seq_printf(m, "Channel:%2d Id:%2d State: Failed",
2673 "Channel:%2d Id:%2d State: Failed", 2413 channel, tgt);
2674 channel, tgt);
2675 break; 2414 break;
2676 2415
2677 case PDRV_RBLD: 2416 case PDRV_RBLD:
2678 sprintf(str, 2417 seq_printf(m, "Channel:%2d Id:%2d State: Rebuild",
2679 "Channel:%2d Id:%2d State: Rebuild", 2418 channel, tgt);
2680 channel, tgt);
2681 break; 2419 break;
2682 2420
2683 case PDRV_HOTSPARE: 2421 case PDRV_HOTSPARE:
2684 sprintf(str, 2422 seq_printf(m, "Channel:%2d Id:%2d State: Hot spare",
2685 "Channel:%2d Id:%2d State: Hot spare", 2423 channel, tgt);
2686 channel, tgt);
2687 break; 2424 break;
2688 2425
2689 default: 2426 default:
2690 sprintf(str, 2427 seq_printf(m, "Channel:%2d Id:%2d State: Un-configured",
2691 "Channel:%2d Id:%2d State: Un-configured", 2428 channel, tgt);
2692 channel, tgt);
2693 break; 2429 break;
2694
2695 } 2430 }
2696 2431
2697 /* 2432 /*
@@ -2710,11 +2445,8 @@ proc_pdrv(adapter_t *adapter, char *page, int channel)
2710 * Check for overflow. We print less than 240 2445 * Check for overflow. We print less than 240
2711 * characters for inquiry 2446 * characters for inquiry
2712 */ 2447 */
2713 if( (len + 240) >= PAGE_SIZE ) break; 2448 seq_puts(m, ".\n");
2714 2449 mega_print_inquiry(m, scsi_inq);
2715 len += sprintf(page+len, "%s.\n", str);
2716
2717 len += mega_print_inquiry(page+len, scsi_inq);
2718 } 2450 }
2719 2451
2720free_pci: 2452free_pci:
@@ -2723,150 +2455,68 @@ free_inquiry:
2723 mega_free_inquiry(inquiry, dma_handle, pdev); 2455 mega_free_inquiry(inquiry, dma_handle, pdev);
2724free_pdev: 2456free_pdev:
2725 free_local_pdev(pdev); 2457 free_local_pdev(pdev);
2726 2458 return 0;
2727 return len;
2728}
2729
2730
2731/*
2732 * Display scsi inquiry
2733 */
2734static int
2735mega_print_inquiry(char *page, char *scsi_inq)
2736{
2737 int len = 0;
2738 int i;
2739
2740 len = sprintf(page, " Vendor: ");
2741 for( i = 8; i < 16; i++ ) {
2742 len += sprintf(page+len, "%c", scsi_inq[i]);
2743 }
2744
2745 len += sprintf(page+len, " Model: ");
2746
2747 for( i = 16; i < 32; i++ ) {
2748 len += sprintf(page+len, "%c", scsi_inq[i]);
2749 }
2750
2751 len += sprintf(page+len, " Rev: ");
2752
2753 for( i = 32; i < 36; i++ ) {
2754 len += sprintf(page+len, "%c", scsi_inq[i]);
2755 }
2756
2757 len += sprintf(page+len, "\n");
2758
2759 i = scsi_inq[0] & 0x1f;
2760
2761 len += sprintf(page+len, " Type: %s ", scsi_device_type(i));
2762
2763 len += sprintf(page+len,
2764 " ANSI SCSI revision: %02x", scsi_inq[2] & 0x07);
2765
2766 if( (scsi_inq[2] & 0x07) == 1 && (scsi_inq[3] & 0x0f) == 1 )
2767 len += sprintf(page+len, " CCS\n");
2768 else
2769 len += sprintf(page+len, "\n");
2770
2771 return len;
2772} 2459}
2773 2460
2774
2775/** 2461/**
2776 * proc_rdrv_10() 2462 * proc_show_pdrv_ch0()
2777 * @page - buffer to write the data in 2463 * @m - Synthetic file construction data
2778 * @start - where the actual data has been written in page 2464 * @v - File iterator
2779 * @offset - same meaning as the read system call
2780 * @count - same meaning as the read system call
2781 * @eof - set if no more data needs to be returned
2782 * @data - pointer to our soft state
2783 * 2465 *
2784 * Display real time information about the logical drives 0 through 9. 2466 * Display information about the physical drives on physical channel 0.
2785 */ 2467 */
2786static int 2468static int
2787proc_rdrv_10(char *page, char **start, off_t offset, int count, int *eof, 2469proc_show_pdrv_ch0(struct seq_file *m, void *v)
2788 void *data)
2789{ 2470{
2790 adapter_t *adapter = (adapter_t *)data; 2471 return proc_show_pdrv(m, m->private, 0);
2791
2792 *eof = 1;
2793
2794 return (proc_rdrv(adapter, page, 0, 9));
2795} 2472}
2796 2473
2797 2474
2798/** 2475/**
2799 * proc_rdrv_20() 2476 * proc_show_pdrv_ch1()
2800 * @page - buffer to write the data in 2477 * @m - Synthetic file construction data
2801 * @start - where the actual data has been written in page 2478 * @v - File iterator
2802 * @offset - same meaning as the read system call
2803 * @count - same meaning as the read system call
2804 * @eof - set if no more data needs to be returned
2805 * @data - pointer to our soft state
2806 * 2479 *
2807 * Display real time information about the logical drives 0 through 9. 2480 * Display information about the physical drives on physical channel 1.
2808 */ 2481 */
2809static int 2482static int
2810proc_rdrv_20(char *page, char **start, off_t offset, int count, int *eof, 2483proc_show_pdrv_ch1(struct seq_file *m, void *v)
2811 void *data)
2812{ 2484{
2813 adapter_t *adapter = (adapter_t *)data; 2485 return proc_show_pdrv(m, m->private, 1);
2814
2815 *eof = 1;
2816
2817 return (proc_rdrv(adapter, page, 10, 19));
2818} 2486}
2819 2487
2820 2488
2821/** 2489/**
2822 * proc_rdrv_30() 2490 * proc_show_pdrv_ch2()
2823 * @page - buffer to write the data in 2491 * @m - Synthetic file construction data
2824 * @start - where the actual data has been written in page 2492 * @v - File iterator
2825 * @offset - same meaning as the read system call
2826 * @count - same meaning as the read system call
2827 * @eof - set if no more data needs to be returned
2828 * @data - pointer to our soft state
2829 * 2493 *
2830 * Display real time information about the logical drives 0 through 9. 2494 * Display information about the physical drives on physical channel 2.
2831 */ 2495 */
2832static int 2496static int
2833proc_rdrv_30(char *page, char **start, off_t offset, int count, int *eof, 2497proc_show_pdrv_ch2(struct seq_file *m, void *v)
2834 void *data)
2835{ 2498{
2836 adapter_t *adapter = (adapter_t *)data; 2499 return proc_show_pdrv(m, m->private, 2);
2837
2838 *eof = 1;
2839
2840 return (proc_rdrv(adapter, page, 20, 29));
2841} 2500}
2842 2501
2843 2502
2844/** 2503/**
2845 * proc_rdrv_40() 2504 * proc_show_pdrv_ch3()
2846 * @page - buffer to write the data in 2505 * @m - Synthetic file construction data
2847 * @start - where the actual data has been written in page 2506 * @v - File iterator
2848 * @offset - same meaning as the read system call
2849 * @count - same meaning as the read system call
2850 * @eof - set if no more data needs to be returned
2851 * @data - pointer to our soft state
2852 * 2507 *
2853 * Display real time information about the logical drives 0 through 9. 2508 * Display information about the physical drives on physical channel 3.
2854 */ 2509 */
2855static int 2510static int
2856proc_rdrv_40(char *page, char **start, off_t offset, int count, int *eof, 2511proc_show_pdrv_ch3(struct seq_file *m, void *v)
2857 void *data)
2858{ 2512{
2859 adapter_t *adapter = (adapter_t *)data; 2513 return proc_show_pdrv(m, m->private, 3);
2860
2861 *eof = 1;
2862
2863 return (proc_rdrv(adapter, page, 30, 39));
2864} 2514}
2865 2515
2866 2516
2867/** 2517/**
2868 * proc_rdrv() 2518 * proc_show_rdrv()
2869 * @page - buffer to write the data in 2519 * @m - Synthetic file construction data
2870 * @adapter - pointer to our soft state 2520 * @adapter - pointer to our soft state
2871 * @start - starting logical drive to display 2521 * @start - starting logical drive to display
2872 * @end - ending logical drive to display 2522 * @end - ending logical drive to display
@@ -2875,7 +2525,7 @@ proc_rdrv_40(char *page, char **start, off_t offset, int count, int *eof,
2875 * /proc/scsi/scsi interface 2525 * /proc/scsi/scsi interface
2876 */ 2526 */
2877static int 2527static int
2878proc_rdrv(adapter_t *adapter, char *page, int start, int end ) 2528proc_show_rdrv(struct seq_file *m, adapter_t *adapter, int start, int end )
2879{ 2529{
2880 dma_addr_t dma_handle; 2530 dma_addr_t dma_handle;
2881 logdrv_param *lparam; 2531 logdrv_param *lparam;
@@ -2887,29 +2537,18 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
2887 u8 *rdrv_state; 2537 u8 *rdrv_state;
2888 int num_ldrv; 2538 int num_ldrv;
2889 u32 array_sz; 2539 u32 array_sz;
2890 int len = 0;
2891 int i; 2540 int i;
2892 2541
2893 if( make_local_pdev(adapter, &pdev) != 0 ) { 2542 if( make_local_pdev(adapter, &pdev) != 0 )
2894 return len; 2543 return 0;
2895 }
2896 2544
2897 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL ) { 2545 if( (inquiry = mega_allocate_inquiry(&dma_handle, pdev)) == NULL )
2898 free_local_pdev(pdev); 2546 goto free_pdev;
2899 return len;
2900 }
2901 2547
2902 if( mega_adapinq(adapter, dma_handle) != 0 ) { 2548 if( mega_adapinq(adapter, dma_handle) != 0 ) {
2903 2549 seq_puts(m, "Adapter inquiry failed.\n");
2904 len = sprintf(page, "Adapter inquiry failed.\n");
2905
2906 printk(KERN_WARNING "megaraid: inquiry failed.\n"); 2550 printk(KERN_WARNING "megaraid: inquiry failed.\n");
2907 2551 goto free_inquiry;
2908 mega_free_inquiry(inquiry, dma_handle, pdev);
2909
2910 free_local_pdev(pdev);
2911
2912 return len;
2913 } 2552 }
2914 2553
2915 memset(&mc, 0, sizeof(megacmd_t)); 2554 memset(&mc, 0, sizeof(megacmd_t));
@@ -2935,13 +2574,8 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
2935 &disk_array_dma_handle); 2574 &disk_array_dma_handle);
2936 2575
2937 if( disk_array == NULL ) { 2576 if( disk_array == NULL ) {
2938 len = sprintf(page, "memory not available.\n"); 2577 seq_puts(m, "memory not available.\n");
2939 2578 goto free_inquiry;
2940 mega_free_inquiry(inquiry, dma_handle, pdev);
2941
2942 free_local_pdev(pdev);
2943
2944 return len;
2945 } 2579 }
2946 2580
2947 mc.xferaddr = (u32)disk_array_dma_handle; 2581 mc.xferaddr = (u32)disk_array_dma_handle;
@@ -2951,17 +2585,8 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
2951 mc.opcode = OP_DCMD_READ_CONFIG; 2585 mc.opcode = OP_DCMD_READ_CONFIG;
2952 2586
2953 if( mega_internal_command(adapter, &mc, NULL) ) { 2587 if( mega_internal_command(adapter, &mc, NULL) ) {
2954 2588 seq_puts(m, "40LD read config failed.\n");
2955 len = sprintf(page, "40LD read config failed.\n"); 2589 goto free_pci;
2956
2957 mega_free_inquiry(inquiry, dma_handle, pdev);
2958
2959 pci_free_consistent(pdev, array_sz, disk_array,
2960 disk_array_dma_handle);
2961
2962 free_local_pdev(pdev);
2963
2964 return len;
2965 } 2590 }
2966 2591
2967 } 2592 }
@@ -2969,24 +2594,10 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
2969 mc.cmd = NEW_READ_CONFIG_8LD; 2594 mc.cmd = NEW_READ_CONFIG_8LD;
2970 2595
2971 if( mega_internal_command(adapter, &mc, NULL) ) { 2596 if( mega_internal_command(adapter, &mc, NULL) ) {
2972
2973 mc.cmd = READ_CONFIG_8LD; 2597 mc.cmd = READ_CONFIG_8LD;
2974 2598 if( mega_internal_command(adapter, &mc, NULL) ) {
2975 if( mega_internal_command(adapter, &mc, 2599 seq_puts(m, "8LD read config failed.\n");
2976 NULL) ){ 2600 goto free_pci;
2977
2978 len = sprintf(page,
2979 "8LD read config failed.\n");
2980
2981 mega_free_inquiry(inquiry, dma_handle, pdev);
2982
2983 pci_free_consistent(pdev, array_sz,
2984 disk_array,
2985 disk_array_dma_handle);
2986
2987 free_local_pdev(pdev);
2988
2989 return len;
2990 } 2601 }
2991 } 2602 }
2992 } 2603 }
@@ -3006,29 +2617,23 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
3006 * Check for overflow. We print less than 240 characters for 2617 * Check for overflow. We print less than 240 characters for
3007 * information about each logical drive. 2618 * information about each logical drive.
3008 */ 2619 */
3009 if( (len + 240) >= PAGE_SIZE ) break; 2620 seq_printf(m, "Logical drive:%2d:, ", i);
3010
3011 len += sprintf(page+len, "Logical drive:%2d:, ", i);
3012 2621
3013 switch( rdrv_state[i] & 0x0F ) { 2622 switch( rdrv_state[i] & 0x0F ) {
3014 case RDRV_OFFLINE: 2623 case RDRV_OFFLINE:
3015 len += sprintf(page+len, "state: offline"); 2624 seq_puts(m, "state: offline");
3016 break; 2625 break;
3017
3018 case RDRV_DEGRADED: 2626 case RDRV_DEGRADED:
3019 len += sprintf(page+len, "state: degraded"); 2627 seq_puts(m, "state: degraded");
3020 break; 2628 break;
3021
3022 case RDRV_OPTIMAL: 2629 case RDRV_OPTIMAL:
3023 len += sprintf(page+len, "state: optimal"); 2630 seq_puts(m, "state: optimal");
3024 break; 2631 break;
3025
3026 case RDRV_DELETED: 2632 case RDRV_DELETED:
3027 len += sprintf(page+len, "state: deleted"); 2633 seq_puts(m, "state: deleted");
3028 break; 2634 break;
3029
3030 default: 2635 default:
3031 len += sprintf(page+len, "state: unknown"); 2636 seq_puts(m, "state: unknown");
3032 break; 2637 break;
3033 } 2638 }
3034 2639
@@ -3036,84 +2641,203 @@ proc_rdrv(adapter_t *adapter, char *page, int start, int end )
3036 * Check if check consistency or initialization is going on 2641 * Check if check consistency or initialization is going on
3037 * for this logical drive. 2642 * for this logical drive.
3038 */ 2643 */
3039 if( (rdrv_state[i] & 0xF0) == 0x20 ) { 2644 if( (rdrv_state[i] & 0xF0) == 0x20 )
3040 len += sprintf(page+len, 2645 seq_puts(m, ", check-consistency in progress");
3041 ", check-consistency in progress"); 2646 else if( (rdrv_state[i] & 0xF0) == 0x10 )
3042 } 2647 seq_puts(m, ", initialization in progress");
3043 else if( (rdrv_state[i] & 0xF0) == 0x10 ) {
3044 len += sprintf(page+len,
3045 ", initialization in progress");
3046 }
3047 2648
3048 len += sprintf(page+len, "\n"); 2649 seq_putc(m, '\n');
3049
3050 len += sprintf(page+len, "Span depth:%3d, ",
3051 lparam->span_depth);
3052
3053 len += sprintf(page+len, "RAID level:%3d, ",
3054 lparam->level);
3055
3056 len += sprintf(page+len, "Stripe size:%3d, ",
3057 lparam->stripe_sz ? lparam->stripe_sz/2: 128);
3058
3059 len += sprintf(page+len, "Row size:%3d\n",
3060 lparam->row_size);
3061 2650
2651 seq_printf(m, "Span depth:%3d, ", lparam->span_depth);
2652 seq_printf(m, "RAID level:%3d, ", lparam->level);
2653 seq_printf(m, "Stripe size:%3d, ",
2654 lparam->stripe_sz ? lparam->stripe_sz/2: 128);
2655 seq_printf(m, "Row size:%3d\n", lparam->row_size);
3062 2656
3063 len += sprintf(page+len, "Read Policy: "); 2657 seq_puts(m, "Read Policy: ");
3064
3065 switch(lparam->read_ahead) { 2658 switch(lparam->read_ahead) {
3066
3067 case NO_READ_AHEAD: 2659 case NO_READ_AHEAD:
3068 len += sprintf(page+len, "No read ahead, "); 2660 seq_puts(m, "No read ahead, ");
3069 break; 2661 break;
3070
3071 case READ_AHEAD: 2662 case READ_AHEAD:
3072 len += sprintf(page+len, "Read ahead, "); 2663 seq_puts(m, "Read ahead, ");
3073 break; 2664 break;
3074
3075 case ADAP_READ_AHEAD: 2665 case ADAP_READ_AHEAD:
3076 len += sprintf(page+len, "Adaptive, "); 2666 seq_puts(m, "Adaptive, ");
3077 break; 2667 break;
3078 2668
3079 } 2669 }
3080 2670
3081 len += sprintf(page+len, "Write Policy: "); 2671 seq_puts(m, "Write Policy: ");
3082
3083 switch(lparam->write_mode) { 2672 switch(lparam->write_mode) {
3084
3085 case WRMODE_WRITE_THRU: 2673 case WRMODE_WRITE_THRU:
3086 len += sprintf(page+len, "Write thru, "); 2674 seq_puts(m, "Write thru, ");
3087 break; 2675 break;
3088
3089 case WRMODE_WRITE_BACK: 2676 case WRMODE_WRITE_BACK:
3090 len += sprintf(page+len, "Write back, "); 2677 seq_puts(m, "Write back, ");
3091 break; 2678 break;
3092 } 2679 }
3093 2680
3094 len += sprintf(page+len, "Cache Policy: "); 2681 seq_puts(m, "Cache Policy: ");
3095
3096 switch(lparam->direct_io) { 2682 switch(lparam->direct_io) {
3097
3098 case CACHED_IO: 2683 case CACHED_IO:
3099 len += sprintf(page+len, "Cached IO\n\n"); 2684 seq_puts(m, "Cached IO\n\n");
3100 break; 2685 break;
3101
3102 case DIRECT_IO: 2686 case DIRECT_IO:
3103 len += sprintf(page+len, "Direct IO\n\n"); 2687 seq_puts(m, "Direct IO\n\n");
3104 break; 2688 break;
3105 } 2689 }
3106 } 2690 }
3107 2691
3108 mega_free_inquiry(inquiry, dma_handle, pdev); 2692free_pci:
3109
3110 pci_free_consistent(pdev, array_sz, disk_array, 2693 pci_free_consistent(pdev, array_sz, disk_array,
3111 disk_array_dma_handle); 2694 disk_array_dma_handle);
3112 2695free_inquiry:
2696 mega_free_inquiry(inquiry, dma_handle, pdev);
2697free_pdev:
3113 free_local_pdev(pdev); 2698 free_local_pdev(pdev);
2699 return 0;
2700}
2701
2702/**
2703 * proc_show_rdrv_10()
2704 * @m - Synthetic file construction data
2705 * @v - File iterator
2706 *
2707 * Display real time information about the logical drives 0 through 9.
2708 */
2709static int
2710proc_show_rdrv_10(struct seq_file *m, void *v)
2711{
2712 return proc_show_rdrv(m, m->private, 0, 9);
2713}
2714
2715
2716/**
2717 * proc_show_rdrv_20()
2718 * @m - Synthetic file construction data
2719 * @v - File iterator
2720 *
2721 * Display real time information about the logical drives 0 through 9.
2722 */
2723static int
2724proc_show_rdrv_20(struct seq_file *m, void *v)
2725{
2726 return proc_show_rdrv(m, m->private, 10, 19);
2727}
2728
2729
2730/**
2731 * proc_show_rdrv_30()
2732 * @m - Synthetic file construction data
2733 * @v - File iterator
2734 *
2735 * Display real time information about the logical drives 0 through 9.
2736 */
2737static int
2738proc_show_rdrv_30(struct seq_file *m, void *v)
2739{
2740 return proc_show_rdrv(m, m->private, 20, 29);
2741}
2742
2743
2744/**
2745 * proc_show_rdrv_40()
2746 * @m - Synthetic file construction data
2747 * @v - File iterator
2748 *
2749 * Display real time information about the logical drives 0 through 9.
2750 */
2751static int
2752proc_show_rdrv_40(struct seq_file *m, void *v)
2753{
2754 return proc_show_rdrv(m, m->private, 30, 39);
2755}
2756
2757
2758/*
2759 * seq_file wrappers for procfile show routines.
2760 */
2761static int mega_proc_open(struct inode *inode, struct file *file)
2762{
2763 adapter_t *adapter = proc_get_parent_data(inode);
2764 int (*show)(struct seq_file *, void *) = PDE_DATA(inode);
2765
2766 return single_open(file, show, adapter);
2767}
2768
2769static const struct file_operations mega_proc_fops = {
2770 .open = mega_proc_open,
2771 .read = seq_read,
2772 .llseek = seq_lseek,
2773 .release = seq_release,
2774};
2775
2776/*
2777 * Table of proc files we need to create.
2778 */
2779struct mega_proc_file {
2780 const char *name;
2781 unsigned short ptr_offset;
2782 int (*show) (struct seq_file *m, void *v);
2783};
2784
2785static const struct mega_proc_file mega_proc_files[] = {
2786 { "config", offsetof(adapter_t, proc_read), proc_show_config },
2787 { "stat", offsetof(adapter_t, proc_stat), proc_show_stat },
2788 { "mailbox", offsetof(adapter_t, proc_mbox), proc_show_mbox },
2789#if MEGA_HAVE_ENH_PROC
2790 { "rebuild-rate", offsetof(adapter_t, proc_rr), proc_show_rebuild_rate },
2791 { "battery-status", offsetof(adapter_t, proc_battery), proc_show_battery },
2792 { "diskdrives-ch0", offsetof(adapter_t, proc_pdrvstat[0]), proc_show_pdrv_ch0 },
2793 { "diskdrives-ch1", offsetof(adapter_t, proc_pdrvstat[1]), proc_show_pdrv_ch1 },
2794 { "diskdrives-ch2", offsetof(adapter_t, proc_pdrvstat[2]), proc_show_pdrv_ch2 },
2795 { "diskdrives-ch3", offsetof(adapter_t, proc_pdrvstat[3]), proc_show_pdrv_ch3 },
2796 { "raiddrives-0-9", offsetof(adapter_t, proc_rdrvstat[0]), proc_show_rdrv_10 },
2797 { "raiddrives-10-19", offsetof(adapter_t, proc_rdrvstat[1]), proc_show_rdrv_20 },
2798 { "raiddrives-20-29", offsetof(adapter_t, proc_rdrvstat[2]), proc_show_rdrv_30 },
2799 { "raiddrives-30-39", offsetof(adapter_t, proc_rdrvstat[3]), proc_show_rdrv_40 },
2800#endif
2801 { NULL }
2802};
3114 2803
3115 return len; 2804/**
2805 * mega_create_proc_entry()
2806 * @index - index in soft state array
2807 * @parent - parent node for this /proc entry
2808 *
2809 * Creates /proc entries for our controllers.
2810 */
2811static void
2812mega_create_proc_entry(int index, struct proc_dir_entry *parent)
2813{
2814 const struct mega_proc_file *f;
2815 adapter_t *adapter = hba_soft_state[index];
2816 struct proc_dir_entry *dir, *de, **ppde;
2817 u8 string[16];
2818
2819 sprintf(string, "hba%d", adapter->host->host_no);
2820
2821 dir = adapter->controller_proc_dir_entry =
2822 proc_mkdir_data(string, 0, parent, adapter);
2823 if(!dir) {
2824 printk(KERN_WARNING "\nmegaraid: proc_mkdir failed\n");
2825 return;
2826 }
2827
2828 for (f = mega_proc_files; f->name; f++) {
2829 de = proc_create_data(f->name, S_IRUSR, dir, &mega_proc_fops,
2830 f->show);
2831 if (!de) {
2832 printk(KERN_WARNING "\nmegaraid: proc_create failed\n");
2833 return;
2834 }
2835
2836 ppde = (void *)adapter + f->ptr_offset;
2837 *ppde = de;
2838 }
3116} 2839}
2840
3117#else 2841#else
3118static inline void mega_create_proc_entry(int index, struct proc_dir_entry *parent) 2842static inline void mega_create_proc_entry(int index, struct proc_dir_entry *parent)
3119{ 2843{
diff --git a/drivers/scsi/megaraid.h b/drivers/scsi/megaraid.h
index 4fb2adf6b80d..4d0ce4e78dfd 100644
--- a/drivers/scsi/megaraid.h
+++ b/drivers/scsi/megaraid.h
@@ -987,24 +987,7 @@ static int mega_init_scb (adapter_t *);
987static int mega_is_bios_enabled (adapter_t *); 987static int mega_is_bios_enabled (adapter_t *);
988 988
989#ifdef CONFIG_PROC_FS 989#ifdef CONFIG_PROC_FS
990static int mega_print_inquiry(char *, char *);
991static void mega_create_proc_entry(int, struct proc_dir_entry *); 990static void mega_create_proc_entry(int, struct proc_dir_entry *);
992static int proc_read_config(char *, char **, off_t, int, int *, void *);
993static int proc_read_stat(char *, char **, off_t, int, int *, void *);
994static int proc_read_mbox(char *, char **, off_t, int, int *, void *);
995static int proc_rebuild_rate(char *, char **, off_t, int, int *, void *);
996static int proc_battery(char *, char **, off_t, int, int *, void *);
997static int proc_pdrv_ch0(char *, char **, off_t, int, int *, void *);
998static int proc_pdrv_ch1(char *, char **, off_t, int, int *, void *);
999static int proc_pdrv_ch2(char *, char **, off_t, int, int *, void *);
1000static int proc_pdrv_ch3(char *, char **, off_t, int, int *, void *);
1001static int proc_pdrv(adapter_t *, char *, int);
1002static int proc_rdrv_10(char *, char **, off_t, int, int *, void *);
1003static int proc_rdrv_20(char *, char **, off_t, int, int *, void *);
1004static int proc_rdrv_30(char *, char **, off_t, int, int *, void *);
1005static int proc_rdrv_40(char *, char **, off_t, int, int *, void *);
1006static int proc_rdrv(adapter_t *, char *, int, int);
1007
1008static int mega_adapinq(adapter_t *, dma_addr_t); 991static int mega_adapinq(adapter_t *, dma_addr_t);
1009static int mega_internal_dev_inquiry(adapter_t *, u8, u8, dma_addr_t); 992static int mega_internal_dev_inquiry(adapter_t *, u8, u8, dma_addr_t);
1010#endif 993#endif
diff --git a/drivers/scsi/mpt2sas/mpt2sas_ctl.c b/drivers/scsi/mpt2sas/mpt2sas_ctl.c
index 08685c4cf231..eec052c2670a 100644
--- a/drivers/scsi/mpt2sas/mpt2sas_ctl.c
+++ b/drivers/scsi/mpt2sas/mpt2sas_ctl.c
@@ -505,19 +505,6 @@ _ctl_fasync(int fd, struct file *filep, int mode)
505} 505}
506 506
507/** 507/**
508 * _ctl_release -
509 * @inode -
510 * @filep -
511 *
512 * Called when application releases the fasyn callback handler.
513 */
514static int
515_ctl_release(struct inode *inode, struct file *filep)
516{
517 return fasync_helper(-1, filep, 0, &async_queue);
518}
519
520/**
521 * _ctl_poll - 508 * _ctl_poll -
522 * @file - 509 * @file -
523 * @wait - 510 * @wait -
@@ -3027,7 +3014,6 @@ struct device_attribute *mpt2sas_dev_attrs[] = {
3027static const struct file_operations ctl_fops = { 3014static const struct file_operations ctl_fops = {
3028 .owner = THIS_MODULE, 3015 .owner = THIS_MODULE,
3029 .unlocked_ioctl = _ctl_ioctl, 3016 .unlocked_ioctl = _ctl_ioctl,
3030 .release = _ctl_release,
3031 .poll = _ctl_poll, 3017 .poll = _ctl_poll,
3032 .fasync = _ctl_fasync, 3018 .fasync = _ctl_fasync,
3033#ifdef CONFIG_COMPAT 3019#ifdef CONFIG_COMPAT
diff --git a/drivers/scsi/mpt3sas/mpt3sas_ctl.c b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
index 054d5231c974..0b402b6f2d26 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_ctl.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_ctl.c
@@ -503,19 +503,6 @@ _ctl_fasync(int fd, struct file *filep, int mode)
503} 503}
504 504
505/** 505/**
506 * _ctl_release -
507 * @inode -
508 * @filep -
509 *
510 * Called when application releases the fasyn callback handler.
511 */
512static int
513_ctl_release(struct inode *inode, struct file *filep)
514{
515 return fasync_helper(-1, filep, 0, &async_queue);
516}
517
518/**
519 * _ctl_poll - 506 * _ctl_poll -
520 * @file - 507 * @file -
521 * @wait - 508 * @wait -
@@ -3233,7 +3220,6 @@ struct device_attribute *mpt3sas_dev_attrs[] = {
3233static const struct file_operations ctl_fops = { 3220static const struct file_operations ctl_fops = {
3234 .owner = THIS_MODULE, 3221 .owner = THIS_MODULE,
3235 .unlocked_ioctl = _ctl_ioctl, 3222 .unlocked_ioctl = _ctl_ioctl,
3236 .release = _ctl_release,
3237 .poll = _ctl_poll, 3223 .poll = _ctl_poll,
3238 .fasync = _ctl_fasync, 3224 .fasync = _ctl_fasync,
3239#ifdef CONFIG_COMPAT 3225#ifdef CONFIG_COMPAT
diff --git a/drivers/scsi/mvme147.c b/drivers/scsi/mvme147.c
index c29d0dbb9660..e7f6661a8862 100644
--- a/drivers/scsi/mvme147.c
+++ b/drivers/scsi/mvme147.c
@@ -76,7 +76,8 @@ int mvme147_detect(struct scsi_host_template *tpnt)
76 called++; 76 called++;
77 77
78 tpnt->proc_name = "MVME147"; 78 tpnt->proc_name = "MVME147";
79 tpnt->proc_info = &wd33c93_proc_info; 79 tpnt->show_info = wd33c93_show_info,
80 tpnt->write_info = wd33c93_write_info,
80 81
81 instance = scsi_register(tpnt, sizeof(struct WD33C93_hostdata)); 82 instance = scsi_register(tpnt, sizeof(struct WD33C93_hostdata));
82 if (!instance) 83 if (!instance)
diff --git a/drivers/scsi/nsp32.c b/drivers/scsi/nsp32.c
index 1cc0c1c69c88..1e3879dcbdcc 100644
--- a/drivers/scsi/nsp32.c
+++ b/drivers/scsi/nsp32.c
@@ -192,7 +192,7 @@ static int __init init_nsp32 (void);
192static void __exit exit_nsp32 (void); 192static void __exit exit_nsp32 (void);
193 193
194/* struct struct scsi_host_template */ 194/* struct struct scsi_host_template */
195static int nsp32_proc_info (struct Scsi_Host *, char *, char **, off_t, int, int); 195static int nsp32_show_info (struct seq_file *, struct Scsi_Host *);
196 196
197static int nsp32_detect (struct pci_dev *pdev); 197static int nsp32_detect (struct pci_dev *pdev);
198static int nsp32_queuecommand(struct Scsi_Host *, struct scsi_cmnd *); 198static int nsp32_queuecommand(struct Scsi_Host *, struct scsi_cmnd *);
@@ -268,7 +268,7 @@ static void nsp32_dmessage(const char *, int, int, char *, ...);
268static struct scsi_host_template nsp32_template = { 268static struct scsi_host_template nsp32_template = {
269 .proc_name = "nsp32", 269 .proc_name = "nsp32",
270 .name = "Workbit NinjaSCSI-32Bi/UDE", 270 .name = "Workbit NinjaSCSI-32Bi/UDE",
271 .proc_info = nsp32_proc_info, 271 .show_info = nsp32_show_info,
272 .info = nsp32_info, 272 .info = nsp32_info,
273 .queuecommand = nsp32_queuecommand, 273 .queuecommand = nsp32_queuecommand,
274 .can_queue = 1, 274 .can_queue = 1,
@@ -1442,19 +1442,10 @@ static irqreturn_t do_nsp32_isr(int irq, void *dev_id)
1442} 1442}
1443 1443
1444#undef SPRINTF 1444#undef SPRINTF
1445#define SPRINTF(args...) \ 1445#define SPRINTF(args...) seq_printf(m, ##args)
1446 do { \ 1446
1447 if(length > (pos - buffer)) { \ 1447static int nsp32_show_info(struct seq_file *m, struct Scsi_Host *host)
1448 pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \
1449 nsp32_dbg(NSP32_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length, length - (pos - buffer));\
1450 } \
1451 } while(0)
1452
1453static int nsp32_proc_info(struct Scsi_Host *host, char *buffer, char **start,
1454 off_t offset, int length, int inout)
1455{ 1448{
1456 char *pos = buffer;
1457 int thislength;
1458 unsigned long flags; 1449 unsigned long flags;
1459 nsp32_hw_data *data; 1450 nsp32_hw_data *data;
1460 int hostno; 1451 int hostno;
@@ -1463,11 +1454,6 @@ static int nsp32_proc_info(struct Scsi_Host *host, char *buffer, char **start,
1463 int id, speed; 1454 int id, speed;
1464 long model; 1455 long model;
1465 1456
1466 /* Write is not supported, just return. */
1467 if (inout == TRUE) {
1468 return -EINVAL;
1469 }
1470
1471 hostno = host->host_no; 1457 hostno = host->host_no;
1472 data = (nsp32_hw_data *)host->hostdata; 1458 data = (nsp32_hw_data *)host->hostdata;
1473 base = host->io_port; 1459 base = host->io_port;
@@ -1527,20 +1513,7 @@ static int nsp32_proc_info(struct Scsi_Host *host, char *buffer, char **start,
1527 } 1513 }
1528 SPRINTF("\n"); 1514 SPRINTF("\n");
1529 } 1515 }
1530 1516 return 0;
1531
1532 thislength = pos - (buffer + offset);
1533
1534 if(thislength < 0) {
1535 *start = NULL;
1536 return 0;
1537 }
1538
1539
1540 thislength = min(thislength, length);
1541 *start = buffer + offset;
1542
1543 return thislength;
1544} 1517}
1545#undef SPRINTF 1518#undef SPRINTF
1546 1519
diff --git a/drivers/scsi/pas16.c b/drivers/scsi/pas16.c
index 2f72c9807b12..62f1a6031765 100644
--- a/drivers/scsi/pas16.c
+++ b/drivers/scsi/pas16.c
@@ -388,7 +388,8 @@ int __init pas16_detect(struct scsi_host_template * tpnt)
388 int count; 388 int count;
389 389
390 tpnt->proc_name = "pas16"; 390 tpnt->proc_name = "pas16";
391 tpnt->proc_info = &pas16_proc_info; 391 tpnt->show_info = pas16_show_info;
392 tpnt->write_info = pas16_write_info;
392 393
393 if (pas16_addr != 0) { 394 if (pas16_addr != 0) {
394 overrides[0].io_port = pas16_addr; 395 overrides[0].io_port = pas16_addr;
diff --git a/drivers/scsi/pas16.h b/drivers/scsi/pas16.h
index a04281cace2e..3721342835e9 100644
--- a/drivers/scsi/pas16.h
+++ b/drivers/scsi/pas16.h
@@ -163,7 +163,8 @@ static int pas16_bus_reset(Scsi_Cmnd *);
163#define NCR5380_queue_command pas16_queue_command 163#define NCR5380_queue_command pas16_queue_command
164#define NCR5380_abort pas16_abort 164#define NCR5380_abort pas16_abort
165#define NCR5380_bus_reset pas16_bus_reset 165#define NCR5380_bus_reset pas16_bus_reset
166#define NCR5380_proc_info pas16_proc_info 166#define NCR5380_show_info pas16_show_info
167#define NCR5380_write_info pas16_write_info
167 168
168/* 15 14 12 10 7 5 3 169/* 15 14 12 10 7 5 3
169 1101 0100 1010 1000 */ 170 1101 0100 1010 1000 */
diff --git a/drivers/scsi/pcmcia/nsp_cs.c b/drivers/scsi/pcmcia/nsp_cs.c
index b61a753eb896..987fbb1b244e 100644
--- a/drivers/scsi/pcmcia/nsp_cs.c
+++ b/drivers/scsi/pcmcia/nsp_cs.c
@@ -76,7 +76,7 @@ MODULE_PARM_DESC(free_ports, "Release IO ports after configuration? (default: 0
76 76
77static struct scsi_host_template nsp_driver_template = { 77static struct scsi_host_template nsp_driver_template = {
78 .proc_name = "nsp_cs", 78 .proc_name = "nsp_cs",
79 .proc_info = nsp_proc_info, 79 .show_info = nsp_show_info,
80 .name = "WorkBit NinjaSCSI-3/32Bi(16bit)", 80 .name = "WorkBit NinjaSCSI-3/32Bi(16bit)",
81 .info = nsp_info, 81 .info = nsp_info,
82 .queuecommand = nsp_queuecommand, 82 .queuecommand = nsp_queuecommand,
@@ -1365,33 +1365,19 @@ static const char *nsp_info(struct Scsi_Host *shpnt)
1365} 1365}
1366 1366
1367#undef SPRINTF 1367#undef SPRINTF
1368#define SPRINTF(args...) \ 1368#define SPRINTF(args...) seq_printf(m, ##args)
1369 do { \ 1369
1370 if(length > (pos - buffer)) { \ 1370static int nsp_show_info(struct seq_file *m, struct Scsi_Host *host)
1371 pos += snprintf(pos, length - (pos - buffer) + 1, ## args); \
1372 nsp_dbg(NSP_DEBUG_PROC, "buffer=0x%p pos=0x%p length=%d %d\n", buffer, pos, length, length - (pos - buffer));\
1373 } \
1374 } while(0)
1375
1376static int nsp_proc_info(struct Scsi_Host *host, char *buffer, char **start,
1377 off_t offset, int length, int inout)
1378{ 1371{
1379 int id; 1372 int id;
1380 char *pos = buffer;
1381 int thislength;
1382 int speed; 1373 int speed;
1383 unsigned long flags; 1374 unsigned long flags;
1384 nsp_hw_data *data; 1375 nsp_hw_data *data;
1385 int hostno; 1376 int hostno;
1386 1377
1387 if (inout) {
1388 return -EINVAL;
1389 }
1390
1391 hostno = host->host_no; 1378 hostno = host->host_no;
1392 data = (nsp_hw_data *)host->hostdata; 1379 data = (nsp_hw_data *)host->hostdata;
1393 1380
1394
1395 SPRINTF("NinjaSCSI status\n\n"); 1381 SPRINTF("NinjaSCSI status\n\n");
1396 SPRINTF("Driver version: $Revision: 1.23 $\n"); 1382 SPRINTF("Driver version: $Revision: 1.23 $\n");
1397 SPRINTF("SCSI host No.: %d\n", hostno); 1383 SPRINTF("SCSI host No.: %d\n", hostno);
@@ -1458,19 +1444,7 @@ static int nsp_proc_info(struct Scsi_Host *host, char *buffer, char **start,
1458 } 1444 }
1459 SPRINTF("\n"); 1445 SPRINTF("\n");
1460 } 1446 }
1461 1447 return 0;
1462 thislength = pos - (buffer + offset);
1463
1464 if(thislength < 0) {
1465 *start = NULL;
1466 return 0;
1467 }
1468
1469
1470 thislength = min(thislength, length);
1471 *start = buffer + offset;
1472
1473 return thislength;
1474} 1448}
1475#undef SPRINTF 1449#undef SPRINTF
1476 1450
diff --git a/drivers/scsi/pcmcia/nsp_cs.h b/drivers/scsi/pcmcia/nsp_cs.h
index 7fc9a9d0a448..afd64f0adc4b 100644
--- a/drivers/scsi/pcmcia/nsp_cs.h
+++ b/drivers/scsi/pcmcia/nsp_cs.h
@@ -292,13 +292,8 @@ static int nsp_cs_config (struct pcmcia_device *link);
292/* Linux SCSI subsystem specific functions */ 292/* Linux SCSI subsystem specific functions */
293static struct Scsi_Host *nsp_detect (struct scsi_host_template *sht); 293static struct Scsi_Host *nsp_detect (struct scsi_host_template *sht);
294static const char *nsp_info (struct Scsi_Host *shpnt); 294static const char *nsp_info (struct Scsi_Host *shpnt);
295static int nsp_proc_info ( 295static int nsp_show_info (struct seq_file *m,
296 struct Scsi_Host *host, 296 struct Scsi_Host *host);
297 char *buffer,
298 char **start,
299 off_t offset,
300 int length,
301 int inout);
302static int nsp_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *SCpnt); 297static int nsp_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *SCpnt);
303 298
304/* Error handler */ 299/* Error handler */
diff --git a/drivers/scsi/pmcraid.c b/drivers/scsi/pmcraid.c
index b46f5e906837..8e1b73775065 100644
--- a/drivers/scsi/pmcraid.c
+++ b/drivers/scsi/pmcraid.c
@@ -3599,19 +3599,6 @@ static int pmcraid_chr_open(struct inode *inode, struct file *filep)
3599} 3599}
3600 3600
3601/** 3601/**
3602 * pmcraid_release - char node "release" entry point
3603 */
3604static int pmcraid_chr_release(struct inode *inode, struct file *filep)
3605{
3606 struct pmcraid_instance *pinstance = filep->private_data;
3607
3608 filep->private_data = NULL;
3609 fasync_helper(-1, filep, 0, &pinstance->aen_queue);
3610
3611 return 0;
3612}
3613
3614/**
3615 * pmcraid_fasync - Async notifier registration from applications 3602 * pmcraid_fasync - Async notifier registration from applications
3616 * 3603 *
3617 * This function adds the calling process to a driver global queue. When an 3604 * This function adds the calling process to a driver global queue. When an
@@ -4167,7 +4154,6 @@ static long pmcraid_chr_ioctl(
4167static const struct file_operations pmcraid_fops = { 4154static const struct file_operations pmcraid_fops = {
4168 .owner = THIS_MODULE, 4155 .owner = THIS_MODULE,
4169 .open = pmcraid_chr_open, 4156 .open = pmcraid_chr_open,
4170 .release = pmcraid_chr_release,
4171 .fasync = pmcraid_chr_fasync, 4157 .fasync = pmcraid_chr_fasync,
4172 .unlocked_ioctl = pmcraid_chr_ioctl, 4158 .unlocked_ioctl = pmcraid_chr_ioctl,
4173#ifdef CONFIG_COMPAT 4159#ifdef CONFIG_COMPAT
diff --git a/drivers/scsi/ppa.c b/drivers/scsi/ppa.c
index d164c9639361..1db8b26063b4 100644
--- a/drivers/scsi/ppa.c
+++ b/drivers/scsi/ppa.c
@@ -118,8 +118,9 @@ static inline void ppa_pb_release(ppa_struct *dev)
118 * Also gives a method to use a script to obtain optimum timings (TODO) 118 * Also gives a method to use a script to obtain optimum timings (TODO)
119 */ 119 */
120 120
121static inline int ppa_proc_write(ppa_struct *dev, char *buffer, int length) 121static inline int ppa_write_info(struct Scsi_Host *host, char *buffer, int length)
122{ 122{
123 ppa_struct *dev = ppa_dev(host);
123 unsigned long x; 124 unsigned long x;
124 125
125 if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) { 126 if ((length > 5) && (strncmp(buffer, "mode=", 5) == 0)) {
@@ -137,35 +138,17 @@ static inline int ppa_proc_write(ppa_struct *dev, char *buffer, int length)
137 return -EINVAL; 138 return -EINVAL;
138} 139}
139 140
140static int ppa_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int inout) 141static int ppa_show_info(struct seq_file *m, struct Scsi_Host *host)
141{ 142{
142 int len = 0;
143 ppa_struct *dev = ppa_dev(host); 143 ppa_struct *dev = ppa_dev(host);
144 144
145 if (inout) 145 seq_printf(m, "Version : %s\n", PPA_VERSION);
146 return ppa_proc_write(dev, buffer, length); 146 seq_printf(m, "Parport : %s\n", dev->dev->port->name);
147 147 seq_printf(m, "Mode : %s\n", PPA_MODE_STRING[dev->mode]);
148 len += sprintf(buffer + len, "Version : %s\n", PPA_VERSION);
149 len +=
150 sprintf(buffer + len, "Parport : %s\n",
151 dev->dev->port->name);
152 len +=
153 sprintf(buffer + len, "Mode : %s\n",
154 PPA_MODE_STRING[dev->mode]);
155#if PPA_DEBUG > 0 148#if PPA_DEBUG > 0
156 len += 149 seq_printf(m, "recon_tmo : %lu\n", dev->recon_tmo);
157 sprintf(buffer + len, "recon_tmo : %lu\n", dev->recon_tmo);
158#endif 150#endif
159 151 return 0;
160 /* Request for beyond end of buffer */
161 if (offset > length)
162 return 0;
163
164 *start = buffer + offset;
165 len -= offset;
166 if (len > length)
167 len = length;
168 return len;
169} 152}
170 153
171static int device_check(ppa_struct *dev); 154static int device_check(ppa_struct *dev);
@@ -981,7 +964,8 @@ static int ppa_adjust_queue(struct scsi_device *device)
981static struct scsi_host_template ppa_template = { 964static struct scsi_host_template ppa_template = {
982 .module = THIS_MODULE, 965 .module = THIS_MODULE,
983 .proc_name = "ppa", 966 .proc_name = "ppa",
984 .proc_info = ppa_proc_info, 967 .show_info = ppa_show_info,
968 .write_info = ppa_write_info,
985 .name = "Iomega VPI0 (ppa) interface", 969 .name = "Iomega VPI0 (ppa) interface",
986 .queuecommand = ppa_queuecommand, 970 .queuecommand = ppa_queuecommand,
987 .eh_abort_handler = ppa_abort, 971 .eh_abort_handler = ppa_abort,
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index a083715843bd..5307bf86d5e0 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -5539,7 +5539,7 @@ static struct pci_driver qla2xxx_pci_driver = {
5539 .err_handler = &qla2xxx_err_handler, 5539 .err_handler = &qla2xxx_err_handler,
5540}; 5540};
5541 5541
5542static struct file_operations apidev_fops = { 5542static const struct file_operations apidev_fops = {
5543 .owner = THIS_MODULE, 5543 .owner = THIS_MODULE,
5544 .llseek = noop_llseek, 5544 .llseek = noop_llseek,
5545}; 5545};
diff --git a/drivers/scsi/scsi_debug.c b/drivers/scsi/scsi_debug.c
index 5cda11c07c68..5add6f4e7928 100644
--- a/drivers/scsi/scsi_debug.c
+++ b/drivers/scsi/scsi_debug.c
@@ -2823,31 +2823,27 @@ static const char * scsi_debug_info(struct Scsi_Host * shp)
2823/* scsi_debug_proc_info 2823/* scsi_debug_proc_info
2824 * Used if the driver currently has no own support for /proc/scsi 2824 * Used if the driver currently has no own support for /proc/scsi
2825 */ 2825 */
2826static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, 2826static int scsi_debug_write_info(struct Scsi_Host *host, char *buffer, int length)
2827 int length, int inout)
2828{ 2827{
2829 int len, pos, begin; 2828 char arr[16];
2830 int orig_length; 2829 int opts;
2830 int minLen = length > 15 ? 15 : length;
2831 2831
2832 orig_length = length; 2832 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
2833 2833 return -EACCES;
2834 if (inout == 1) { 2834 memcpy(arr, buffer, minLen);
2835 char arr[16]; 2835 arr[minLen] = '\0';
2836 int minLen = length > 15 ? 15 : length; 2836 if (1 != sscanf(arr, "%d", &opts))
2837 return -EINVAL;
2838 scsi_debug_opts = opts;
2839 if (scsi_debug_every_nth != 0)
2840 scsi_debug_cmnd_count = 0;
2841 return length;
2842}
2837 2843
2838 if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) 2844static int scsi_debug_show_info(struct seq_file *m, struct Scsi_Host *host)
2839 return -EACCES; 2845{
2840 memcpy(arr, buffer, minLen); 2846 seq_printf(m, "scsi_debug adapter driver, version "
2841 arr[minLen] = '\0';
2842 if (1 != sscanf(arr, "%d", &pos))
2843 return -EINVAL;
2844 scsi_debug_opts = pos;
2845 if (scsi_debug_every_nth != 0)
2846 scsi_debug_cmnd_count = 0;
2847 return length;
2848 }
2849 begin = 0;
2850 pos = len = sprintf(buffer, "scsi_debug adapter driver, version "
2851 "%s [%s]\n" 2847 "%s [%s]\n"
2852 "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, " 2848 "num_tgts=%d, shared (ram) size=%d MB, opts=0x%x, "
2853 "every_nth=%d(curr:%d)\n" 2849 "every_nth=%d(curr:%d)\n"
@@ -2862,15 +2858,7 @@ static int scsi_debug_proc_info(struct Scsi_Host *host, char *buffer, char **sta
2862 scsi_debug_sector_size, sdebug_cylinders_per, sdebug_heads, 2858 scsi_debug_sector_size, sdebug_cylinders_per, sdebug_heads,
2863 sdebug_sectors_per, num_aborts, num_dev_resets, num_bus_resets, 2859 sdebug_sectors_per, num_aborts, num_dev_resets, num_bus_resets,
2864 num_host_resets, dix_reads, dix_writes, dif_errors); 2860 num_host_resets, dix_reads, dix_writes, dif_errors);
2865 if (pos < offset) { 2861 return 0;
2866 len = 0;
2867 begin = pos;
2868 }
2869 *start = buffer + (offset - begin); /* Start of wanted data */
2870 len -= (offset - begin);
2871 if (len > length)
2872 len = length;
2873 return len;
2874} 2862}
2875 2863
2876static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf) 2864static ssize_t sdebug_delay_show(struct device_driver * ddp, char * buf)
@@ -3957,7 +3945,8 @@ write:
3957static DEF_SCSI_QCMD(scsi_debug_queuecommand) 3945static DEF_SCSI_QCMD(scsi_debug_queuecommand)
3958 3946
3959static struct scsi_host_template sdebug_driver_template = { 3947static struct scsi_host_template sdebug_driver_template = {
3960 .proc_info = scsi_debug_proc_info, 3948 .show_info = scsi_debug_show_info,
3949 .write_info = scsi_debug_write_info,
3961 .proc_name = sdebug_proc_name, 3950 .proc_name = sdebug_proc_name,
3962 .name = "SCSI DEBUG", 3951 .name = "SCSI DEBUG",
3963 .info = scsi_debug_info, 3952 .info = scsi_debug_info,
diff --git a/drivers/scsi/scsi_proc.c b/drivers/scsi/scsi_proc.c
index ad747dc337da..db66357211ed 100644
--- a/drivers/scsi/scsi_proc.c
+++ b/drivers/scsi/scsi_proc.c
@@ -45,58 +45,50 @@ static struct proc_dir_entry *proc_scsi;
45/* Protect sht->present and sht->proc_dir */ 45/* Protect sht->present and sht->proc_dir */
46static DEFINE_MUTEX(global_host_template_mutex); 46static DEFINE_MUTEX(global_host_template_mutex);
47 47
48/** 48static ssize_t proc_scsi_host_write(struct file *file, const char __user *buf,
49 * proc_scsi_read - handle read from /proc by calling host's proc_info() command 49 size_t count, loff_t *ppos)
50 * @buffer: passed to proc_info
51 * @start: passed to proc_info
52 * @offset: passed to proc_info
53 * @length: passed to proc_info
54 * @eof: returns whether length read was less than requested
55 * @data: pointer to a &struct Scsi_Host
56 */
57
58static int proc_scsi_read(char *buffer, char **start, off_t offset,
59 int length, int *eof, void *data)
60{
61 struct Scsi_Host *shost = data;
62 int n;
63
64 n = shost->hostt->proc_info(shost, buffer, start, offset, length, 0);
65 *eof = (n < length);
66
67 return n;
68}
69
70/**
71 * proc_scsi_write_proc - Handle write to /proc by calling host's proc_info()
72 * @file: not used
73 * @buf: source of data to write.
74 * @count: number of bytes (at most PROC_BLOCK_SIZE) to write.
75 * @data: pointer to &struct Scsi_Host
76 */
77static int proc_scsi_write_proc(struct file *file, const char __user *buf,
78 unsigned long count, void *data)
79{ 50{
80 struct Scsi_Host *shost = data; 51 struct Scsi_Host *shost = PDE_DATA(file_inode(file));
81 ssize_t ret = -ENOMEM; 52 ssize_t ret = -ENOMEM;
82 char *page; 53 char *page;
83 char *start;
84 54
85 if (count > PROC_BLOCK_SIZE) 55 if (count > PROC_BLOCK_SIZE)
86 return -EOVERFLOW; 56 return -EOVERFLOW;
87 57
58 if (!shost->hostt->write_info)
59 return -EINVAL;
60
88 page = (char *)__get_free_page(GFP_KERNEL); 61 page = (char *)__get_free_page(GFP_KERNEL);
89 if (page) { 62 if (page) {
90 ret = -EFAULT; 63 ret = -EFAULT;
91 if (copy_from_user(page, buf, count)) 64 if (copy_from_user(page, buf, count))
92 goto out; 65 goto out;
93 ret = shost->hostt->proc_info(shost, page, &start, 0, count, 1); 66 ret = shost->hostt->write_info(shost, page, count);
94 } 67 }
95out: 68out:
96 free_page((unsigned long)page); 69 free_page((unsigned long)page);
97 return ret; 70 return ret;
98} 71}
99 72
73static int proc_scsi_show(struct seq_file *m, void *v)
74{
75 struct Scsi_Host *shost = m->private;
76 return shost->hostt->show_info(m, shost);
77}
78
79static int proc_scsi_host_open(struct inode *inode, struct file *file)
80{
81 return single_open_size(file, proc_scsi_show, PDE_DATA(inode),
82 4 * PAGE_SIZE);
83}
84
85static const struct file_operations proc_scsi_fops = {
86 .open = proc_scsi_host_open,
87 .read = seq_read,
88 .llseek = seq_lseek,
89 .write = proc_scsi_host_write
90};
91
100/** 92/**
101 * scsi_proc_hostdir_add - Create directory in /proc for a scsi host 93 * scsi_proc_hostdir_add - Create directory in /proc for a scsi host
102 * @sht: owner of this directory 94 * @sht: owner of this directory
@@ -106,7 +98,7 @@ out:
106 98
107void scsi_proc_hostdir_add(struct scsi_host_template *sht) 99void scsi_proc_hostdir_add(struct scsi_host_template *sht)
108{ 100{
109 if (!sht->proc_info) 101 if (!sht->show_info)
110 return; 102 return;
111 103
112 mutex_lock(&global_host_template_mutex); 104 mutex_lock(&global_host_template_mutex);
@@ -125,7 +117,7 @@ void scsi_proc_hostdir_add(struct scsi_host_template *sht)
125 */ 117 */
126void scsi_proc_hostdir_rm(struct scsi_host_template *sht) 118void scsi_proc_hostdir_rm(struct scsi_host_template *sht)
127{ 119{
128 if (!sht->proc_info) 120 if (!sht->show_info)
129 return; 121 return;
130 122
131 mutex_lock(&global_host_template_mutex); 123 mutex_lock(&global_host_template_mutex);
@@ -151,16 +143,12 @@ void scsi_proc_host_add(struct Scsi_Host *shost)
151 return; 143 return;
152 144
153 sprintf(name,"%d", shost->host_no); 145 sprintf(name,"%d", shost->host_no);
154 p = create_proc_read_entry(name, S_IFREG | S_IRUGO | S_IWUSR, 146 p = proc_create_data(name, S_IRUGO | S_IWUSR,
155 sht->proc_dir, proc_scsi_read, shost); 147 sht->proc_dir, &proc_scsi_fops, shost);
156 if (!p) { 148 if (!p)
157 printk(KERN_ERR "%s: Failed to register host %d in" 149 printk(KERN_ERR "%s: Failed to register host %d in"
158 "%s\n", __func__, shost->host_no, 150 "%s\n", __func__, shost->host_no,
159 sht->proc_name); 151 sht->proc_name);
160 return;
161 }
162
163 p->write_proc = proc_scsi_write_proc;
164} 152}
165 153
166/** 154/**
diff --git a/drivers/scsi/sym53c8xx_2/sym_glue.c b/drivers/scsi/sym53c8xx_2/sym_glue.c
index 599568299fbe..bac55f7f69f9 100644
--- a/drivers/scsi/sym53c8xx_2/sym_glue.c
+++ b/drivers/scsi/sym53c8xx_2/sym_glue.c
@@ -1171,112 +1171,36 @@ printk("sym_user_command: data=%ld\n", uc->data);
1171#endif /* SYM_LINUX_USER_COMMAND_SUPPORT */ 1171#endif /* SYM_LINUX_USER_COMMAND_SUPPORT */
1172 1172
1173 1173
1174#ifdef SYM_LINUX_USER_INFO_SUPPORT
1175/*
1176 * Informations through the proc file system.
1177 */
1178struct info_str {
1179 char *buffer;
1180 int length;
1181 int offset;
1182 int pos;
1183};
1184
1185static void copy_mem_info(struct info_str *info, char *data, int len)
1186{
1187 if (info->pos + len > info->length)
1188 len = info->length - info->pos;
1189
1190 if (info->pos + len < info->offset) {
1191 info->pos += len;
1192 return;
1193 }
1194 if (info->pos < info->offset) {
1195 data += (info->offset - info->pos);
1196 len -= (info->offset - info->pos);
1197 }
1198
1199 if (len > 0) {
1200 memcpy(info->buffer + info->pos, data, len);
1201 info->pos += len;
1202 }
1203}
1204
1205static int copy_info(struct info_str *info, char *fmt, ...)
1206{
1207 va_list args;
1208 char buf[81];
1209 int len;
1210
1211 va_start(args, fmt);
1212 len = vsprintf(buf, fmt, args);
1213 va_end(args);
1214
1215 copy_mem_info(info, buf, len);
1216 return len;
1217}
1218
1219/* 1174/*
1220 * Copy formatted information into the input buffer. 1175 * Copy formatted information into the input buffer.
1221 */ 1176 */
1222static int sym_host_info(struct Scsi_Host *shost, char *ptr, off_t offset, int len) 1177static int sym_show_info(struct seq_file *m, struct Scsi_Host *shost)
1223{ 1178{
1179#ifdef SYM_LINUX_USER_INFO_SUPPORT
1224 struct sym_data *sym_data = shost_priv(shost); 1180 struct sym_data *sym_data = shost_priv(shost);
1225 struct pci_dev *pdev = sym_data->pdev; 1181 struct pci_dev *pdev = sym_data->pdev;
1226 struct sym_hcb *np = sym_data->ncb; 1182 struct sym_hcb *np = sym_data->ncb;
1227 struct info_str info;
1228
1229 info.buffer = ptr;
1230 info.length = len;
1231 info.offset = offset;
1232 info.pos = 0;
1233 1183
1234 copy_info(&info, "Chip " NAME53C "%s, device id 0x%x, " 1184 seq_printf(m, "Chip " NAME53C "%s, device id 0x%x, "
1235 "revision id 0x%x\n", np->s.chip_name, 1185 "revision id 0x%x\n", np->s.chip_name,
1236 pdev->device, pdev->revision); 1186 pdev->device, pdev->revision);
1237 copy_info(&info, "At PCI address %s, IRQ %u\n", 1187 seq_printf(m, "At PCI address %s, IRQ %u\n",
1238 pci_name(pdev), pdev->irq); 1188 pci_name(pdev), pdev->irq);
1239 copy_info(&info, "Min. period factor %d, %s SCSI BUS%s\n", 1189 seq_printf(m, "Min. period factor %d, %s SCSI BUS%s\n",
1240 (int) (np->minsync_dt ? np->minsync_dt : np->minsync), 1190 (int) (np->minsync_dt ? np->minsync_dt : np->minsync),
1241 np->maxwide ? "Wide" : "Narrow", 1191 np->maxwide ? "Wide" : "Narrow",
1242 np->minsync_dt ? ", DT capable" : ""); 1192 np->minsync_dt ? ", DT capable" : "");
1243 1193
1244 copy_info(&info, "Max. started commands %d, " 1194 seq_printf(m, "Max. started commands %d, "
1245 "max. commands per LUN %d\n", 1195 "max. commands per LUN %d\n",
1246 SYM_CONF_MAX_START, SYM_CONF_MAX_TAG); 1196 SYM_CONF_MAX_START, SYM_CONF_MAX_TAG);
1247 1197
1248 return info.pos > info.offset? info.pos - info.offset : 0; 1198 return 0;
1249}
1250#endif /* SYM_LINUX_USER_INFO_SUPPORT */
1251
1252/*
1253 * Entry point of the scsi proc fs of the driver.
1254 * - func = 0 means read (returns adapter infos)
1255 * - func = 1 means write (not yet merget from sym53c8xx)
1256 */
1257static int sym53c8xx_proc_info(struct Scsi_Host *shost, char *buffer,
1258 char **start, off_t offset, int length, int func)
1259{
1260 int retv;
1261
1262 if (func) {
1263#ifdef SYM_LINUX_USER_COMMAND_SUPPORT
1264 retv = sym_user_command(shost, buffer, length);
1265#else
1266 retv = -EINVAL;
1267#endif
1268 } else {
1269 if (start)
1270 *start = buffer;
1271#ifdef SYM_LINUX_USER_INFO_SUPPORT
1272 retv = sym_host_info(shost, buffer, offset, length);
1273#else 1199#else
1274 retv = -EINVAL; 1200 return -EINVAL;
1275#endif 1201#endif /* SYM_LINUX_USER_INFO_SUPPORT */
1276 }
1277
1278 return retv;
1279} 1202}
1203
1280#endif /* SYM_LINUX_PROC_INFO_SUPPORT */ 1204#endif /* SYM_LINUX_PROC_INFO_SUPPORT */
1281 1205
1282/* 1206/*
@@ -1742,7 +1666,10 @@ static struct scsi_host_template sym2_template = {
1742 .use_clustering = ENABLE_CLUSTERING, 1666 .use_clustering = ENABLE_CLUSTERING,
1743 .max_sectors = 0xFFFF, 1667 .max_sectors = 0xFFFF,
1744#ifdef SYM_LINUX_PROC_INFO_SUPPORT 1668#ifdef SYM_LINUX_PROC_INFO_SUPPORT
1745 .proc_info = sym53c8xx_proc_info, 1669 .show_info = sym_show_info,
1670#ifdef SYM_LINUX_USER_COMMAND_SUPPORT
1671 .write_info = sym_user_command,
1672#endif
1746 .proc_name = NAME53C8XX, 1673 .proc_name = NAME53C8XX,
1747#endif 1674#endif
1748}; 1675};
diff --git a/drivers/scsi/t128.c b/drivers/scsi/t128.c
index d672d97fb84a..f1e4b4148c75 100644
--- a/drivers/scsi/t128.c
+++ b/drivers/scsi/t128.c
@@ -201,7 +201,8 @@ int __init t128_detect(struct scsi_host_template * tpnt){
201 int sig, count; 201 int sig, count;
202 202
203 tpnt->proc_name = "t128"; 203 tpnt->proc_name = "t128";
204 tpnt->proc_info = &t128_proc_info; 204 tpnt->show_info = t128_show_info;
205 tpnt->write_info = t128_write_info;
205 206
206 for (count = 0; current_override < NO_OVERRIDES; ++current_override) { 207 for (count = 0; current_override < NO_OVERRIDES; ++current_override) {
207 base = 0; 208 base = 0;
diff --git a/drivers/scsi/t128.h b/drivers/scsi/t128.h
index ada1115079c9..1df82c28e56d 100644
--- a/drivers/scsi/t128.h
+++ b/drivers/scsi/t128.h
@@ -140,7 +140,8 @@ static int t128_bus_reset(struct scsi_cmnd *);
140#define NCR5380_queue_command t128_queue_command 140#define NCR5380_queue_command t128_queue_command
141#define NCR5380_abort t128_abort 141#define NCR5380_abort t128_abort
142#define NCR5380_bus_reset t128_bus_reset 142#define NCR5380_bus_reset t128_bus_reset
143#define NCR5380_proc_info t128_proc_info 143#define NCR5380_show_info t128_show_info
144#define NCR5380_write_info t128_write_info
144 145
145/* 15 14 12 10 7 5 3 146/* 15 14 12 10 7 5 3
146 1101 0100 1010 1000 */ 147 1101 0100 1010 1000 */
diff --git a/drivers/scsi/wd33c93.c b/drivers/scsi/wd33c93.c
index c0ee4ea28a19..41883a87931d 100644
--- a/drivers/scsi/wd33c93.c
+++ b/drivers/scsi/wd33c93.c
@@ -2054,22 +2054,16 @@ wd33c93_init(struct Scsi_Host *instance, const wd33c93_regs regs,
2054 printk(" Version %s - %s\n", WD33C93_VERSION, WD33C93_DATE); 2054 printk(" Version %s - %s\n", WD33C93_VERSION, WD33C93_DATE);
2055} 2055}
2056 2056
2057int 2057int wd33c93_write_info(struct Scsi_Host *instance, char *buf, int len)
2058wd33c93_proc_info(struct Scsi_Host *instance, char *buf, char **start, off_t off, int len, int in)
2059{ 2058{
2060
2061#ifdef PROC_INTERFACE 2059#ifdef PROC_INTERFACE
2062
2063 char *bp; 2060 char *bp;
2064 char tbuf[128];
2065 struct WD33C93_hostdata *hd; 2061 struct WD33C93_hostdata *hd;
2066 struct scsi_cmnd *cmd;
2067 int x; 2062 int x;
2068 static int stop = 0;
2069 2063
2070 hd = (struct WD33C93_hostdata *) instance->hostdata; 2064 hd = (struct WD33C93_hostdata *) instance->hostdata;
2071 2065
2072/* If 'in' is TRUE we need to _read_ the proc file. We accept the following 2066/* We accept the following
2073 * keywords (same format as command-line, but arguments are not optional): 2067 * keywords (same format as command-line, but arguments are not optional):
2074 * debug 2068 * debug
2075 * disconnect 2069 * disconnect
@@ -2083,145 +2077,124 @@ wd33c93_proc_info(struct Scsi_Host *instance, char *buf, char **start, off_t off
2083 * nosync 2077 * nosync
2084 */ 2078 */
2085 2079
2086 if (in) { 2080 buf[len] = '\0';
2087 buf[len] = '\0'; 2081 for (bp = buf; *bp; ) {
2088 for (bp = buf; *bp; ) { 2082 while (',' == *bp || ' ' == *bp)
2089 while (',' == *bp || ' ' == *bp) 2083 ++bp;
2090 ++bp; 2084 if (!strncmp(bp, "debug:", 6)) {
2091 if (!strncmp(bp, "debug:", 6)) { 2085 hd->args = simple_strtoul(bp+6, &bp, 0) & DB_MASK;
2092 hd->args = simple_strtoul(bp+6, &bp, 0) & DB_MASK; 2086 } else if (!strncmp(bp, "disconnect:", 11)) {
2093 } else if (!strncmp(bp, "disconnect:", 11)) { 2087 x = simple_strtoul(bp+11, &bp, 0);
2094 x = simple_strtoul(bp+11, &bp, 0); 2088 if (x < DIS_NEVER || x > DIS_ALWAYS)
2095 if (x < DIS_NEVER || x > DIS_ALWAYS) 2089 x = DIS_ADAPTIVE;
2096 x = DIS_ADAPTIVE; 2090 hd->disconnect = x;
2097 hd->disconnect = x; 2091 } else if (!strncmp(bp, "period:", 7)) {
2098 } else if (!strncmp(bp, "period:", 7)) { 2092 x = simple_strtoul(bp+7, &bp, 0);
2093 hd->default_sx_per =
2094 hd->sx_table[round_period((unsigned int) x,
2095 hd->sx_table)].period_ns;
2096 } else if (!strncmp(bp, "resync:", 7)) {
2097 set_resync(hd, (int)simple_strtoul(bp+7, &bp, 0));
2098 } else if (!strncmp(bp, "proc:", 5)) {
2099 hd->proc = simple_strtoul(bp+5, &bp, 0);
2100 } else if (!strncmp(bp, "nodma:", 6)) {
2101 hd->no_dma = simple_strtoul(bp+6, &bp, 0);
2102 } else if (!strncmp(bp, "level2:", 7)) {
2103 hd->level2 = simple_strtoul(bp+7, &bp, 0);
2104 } else if (!strncmp(bp, "burst:", 6)) {
2105 hd->dma_mode =
2106 simple_strtol(bp+6, &bp, 0) ? CTRL_BURST:CTRL_DMA;
2107 } else if (!strncmp(bp, "fast:", 5)) {
2108 x = !!simple_strtol(bp+5, &bp, 0);
2109 if (x != hd->fast)
2110 set_resync(hd, 0xff);
2111 hd->fast = x;
2112 } else if (!strncmp(bp, "nosync:", 7)) {
2099 x = simple_strtoul(bp+7, &bp, 0); 2113 x = simple_strtoul(bp+7, &bp, 0);
2100 hd->default_sx_per = 2114 set_resync(hd, x ^ hd->no_sync);
2101 hd->sx_table[round_period((unsigned int) x, 2115 hd->no_sync = x;
2102 hd->sx_table)].period_ns; 2116 } else {
2103 } else if (!strncmp(bp, "resync:", 7)) { 2117 break; /* unknown keyword,syntax-error,... */
2104 set_resync(hd, (int)simple_strtoul(bp+7, &bp, 0));
2105 } else if (!strncmp(bp, "proc:", 5)) {
2106 hd->proc = simple_strtoul(bp+5, &bp, 0);
2107 } else if (!strncmp(bp, "nodma:", 6)) {
2108 hd->no_dma = simple_strtoul(bp+6, &bp, 0);
2109 } else if (!strncmp(bp, "level2:", 7)) {
2110 hd->level2 = simple_strtoul(bp+7, &bp, 0);
2111 } else if (!strncmp(bp, "burst:", 6)) {
2112 hd->dma_mode =
2113 simple_strtol(bp+6, &bp, 0) ? CTRL_BURST:CTRL_DMA;
2114 } else if (!strncmp(bp, "fast:", 5)) {
2115 x = !!simple_strtol(bp+5, &bp, 0);
2116 if (x != hd->fast)
2117 set_resync(hd, 0xff);
2118 hd->fast = x;
2119 } else if (!strncmp(bp, "nosync:", 7)) {
2120 x = simple_strtoul(bp+7, &bp, 0);
2121 set_resync(hd, x ^ hd->no_sync);
2122 hd->no_sync = x;
2123 } else {
2124 break; /* unknown keyword,syntax-error,... */
2125 }
2126 } 2118 }
2127 return len;
2128 } 2119 }
2120 return len;
2121#else
2122 return 0;
2123#endif
2124}
2125
2126int
2127wd33c93_show_info(struct seq_file *m, struct Scsi_Host *instance)
2128{
2129#ifdef PROC_INTERFACE
2130 struct WD33C93_hostdata *hd;
2131 struct scsi_cmnd *cmd;
2132 int x;
2133
2134 hd = (struct WD33C93_hostdata *) instance->hostdata;
2129 2135
2130 spin_lock_irq(&hd->lock); 2136 spin_lock_irq(&hd->lock);
2131 bp = buf; 2137 if (hd->proc & PR_VERSION)
2132 *bp = '\0'; 2138 seq_printf(m, "\nVersion %s - %s.",
2133 if (hd->proc & PR_VERSION) {
2134 sprintf(tbuf, "\nVersion %s - %s.",
2135 WD33C93_VERSION, WD33C93_DATE); 2139 WD33C93_VERSION, WD33C93_DATE);
2136 strcat(bp, tbuf); 2140
2137 }
2138 if (hd->proc & PR_INFO) { 2141 if (hd->proc & PR_INFO) {
2139 sprintf(tbuf, "\nclock_freq=%02x no_sync=%02x no_dma=%d" 2142 seq_printf(m, "\nclock_freq=%02x no_sync=%02x no_dma=%d"
2140 " dma_mode=%02x fast=%d", 2143 " dma_mode=%02x fast=%d",
2141 hd->clock_freq, hd->no_sync, hd->no_dma, hd->dma_mode, hd->fast); 2144 hd->clock_freq, hd->no_sync, hd->no_dma, hd->dma_mode, hd->fast);
2142 strcat(bp, tbuf); 2145 seq_printf(m, "\nsync_xfer[] = ");
2143 strcat(bp, "\nsync_xfer[] = "); 2146 for (x = 0; x < 7; x++)
2144 for (x = 0; x < 7; x++) { 2147 seq_printf(m, "\t%02x", hd->sync_xfer[x]);
2145 sprintf(tbuf, "\t%02x", hd->sync_xfer[x]); 2148 seq_printf(m, "\nsync_stat[] = ");
2146 strcat(bp, tbuf); 2149 for (x = 0; x < 7; x++)
2147 } 2150 seq_printf(m, "\t%02x", hd->sync_stat[x]);
2148 strcat(bp, "\nsync_stat[] = ");
2149 for (x = 0; x < 7; x++) {
2150 sprintf(tbuf, "\t%02x", hd->sync_stat[x]);
2151 strcat(bp, tbuf);
2152 }
2153 } 2151 }
2154#ifdef PROC_STATISTICS 2152#ifdef PROC_STATISTICS
2155 if (hd->proc & PR_STATISTICS) { 2153 if (hd->proc & PR_STATISTICS) {
2156 strcat(bp, "\ncommands issued: "); 2154 seq_printf(m, "\ncommands issued: ");
2157 for (x = 0; x < 7; x++) { 2155 for (x = 0; x < 7; x++)
2158 sprintf(tbuf, "\t%ld", hd->cmd_cnt[x]); 2156 seq_printf(m, "\t%ld", hd->cmd_cnt[x]);
2159 strcat(bp, tbuf); 2157 seq_printf(m, "\ndisconnects allowed:");
2160 } 2158 for (x = 0; x < 7; x++)
2161 strcat(bp, "\ndisconnects allowed:"); 2159 seq_printf(m, "\t%ld", hd->disc_allowed_cnt[x]);
2162 for (x = 0; x < 7; x++) { 2160 seq_printf(m, "\ndisconnects done: ");
2163 sprintf(tbuf, "\t%ld", hd->disc_allowed_cnt[x]); 2161 for (x = 0; x < 7; x++)
2164 strcat(bp, tbuf); 2162 seq_printf(m, "\t%ld", hd->disc_done_cnt[x]);
2165 } 2163 seq_printf(m,
2166 strcat(bp, "\ndisconnects done: ");
2167 for (x = 0; x < 7; x++) {
2168 sprintf(tbuf, "\t%ld", hd->disc_done_cnt[x]);
2169 strcat(bp, tbuf);
2170 }
2171 sprintf(tbuf,
2172 "\ninterrupts: %ld, DATA_PHASE ints: %ld DMA, %ld PIO", 2164 "\ninterrupts: %ld, DATA_PHASE ints: %ld DMA, %ld PIO",
2173 hd->int_cnt, hd->dma_cnt, hd->pio_cnt); 2165 hd->int_cnt, hd->dma_cnt, hd->pio_cnt);
2174 strcat(bp, tbuf);
2175 } 2166 }
2176#endif 2167#endif
2177 if (hd->proc & PR_CONNECTED) { 2168 if (hd->proc & PR_CONNECTED) {
2178 strcat(bp, "\nconnected: "); 2169 seq_printf(m, "\nconnected: ");
2179 if (hd->connected) { 2170 if (hd->connected) {
2180 cmd = (struct scsi_cmnd *) hd->connected; 2171 cmd = (struct scsi_cmnd *) hd->connected;
2181 sprintf(tbuf, " %d:%d(%02x)", 2172 seq_printf(m, " %d:%d(%02x)",
2182 cmd->device->id, cmd->device->lun, cmd->cmnd[0]); 2173 cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2183 strcat(bp, tbuf);
2184 } 2174 }
2185 } 2175 }
2186 if (hd->proc & PR_INPUTQ) { 2176 if (hd->proc & PR_INPUTQ) {
2187 strcat(bp, "\ninput_Q: "); 2177 seq_printf(m, "\ninput_Q: ");
2188 cmd = (struct scsi_cmnd *) hd->input_Q; 2178 cmd = (struct scsi_cmnd *) hd->input_Q;
2189 while (cmd) { 2179 while (cmd) {
2190 sprintf(tbuf, " %d:%d(%02x)", 2180 seq_printf(m, " %d:%d(%02x)",
2191 cmd->device->id, cmd->device->lun, cmd->cmnd[0]); 2181 cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2192 strcat(bp, tbuf);
2193 cmd = (struct scsi_cmnd *) cmd->host_scribble; 2182 cmd = (struct scsi_cmnd *) cmd->host_scribble;
2194 } 2183 }
2195 } 2184 }
2196 if (hd->proc & PR_DISCQ) { 2185 if (hd->proc & PR_DISCQ) {
2197 strcat(bp, "\ndisconnected_Q:"); 2186 seq_printf(m, "\ndisconnected_Q:");
2198 cmd = (struct scsi_cmnd *) hd->disconnected_Q; 2187 cmd = (struct scsi_cmnd *) hd->disconnected_Q;
2199 while (cmd) { 2188 while (cmd) {
2200 sprintf(tbuf, " %d:%d(%02x)", 2189 seq_printf(m, " %d:%d(%02x)",
2201 cmd->device->id, cmd->device->lun, cmd->cmnd[0]); 2190 cmd->device->id, cmd->device->lun, cmd->cmnd[0]);
2202 strcat(bp, tbuf);
2203 cmd = (struct scsi_cmnd *) cmd->host_scribble; 2191 cmd = (struct scsi_cmnd *) cmd->host_scribble;
2204 } 2192 }
2205 } 2193 }
2206 strcat(bp, "\n"); 2194 seq_printf(m, "\n");
2207 spin_unlock_irq(&hd->lock); 2195 spin_unlock_irq(&hd->lock);
2208 *start = buf;
2209 if (stop) {
2210 stop = 0;
2211 return 0;
2212 }
2213 if (off > 0x40000) /* ALWAYS stop after 256k bytes have been read */
2214 stop = 1;
2215 if (hd->proc & PR_STOP) /* stop every other time */
2216 stop = 1;
2217 return strlen(bp);
2218
2219#else /* PROC_INTERFACE */
2220
2221 return 0;
2222
2223#endif /* PROC_INTERFACE */ 2196#endif /* PROC_INTERFACE */
2224 2197 return 0;
2225} 2198}
2226 2199
2227EXPORT_SYMBOL(wd33c93_host_reset); 2200EXPORT_SYMBOL(wd33c93_host_reset);
@@ -2229,4 +2202,5 @@ EXPORT_SYMBOL(wd33c93_init);
2229EXPORT_SYMBOL(wd33c93_abort); 2202EXPORT_SYMBOL(wd33c93_abort);
2230EXPORT_SYMBOL(wd33c93_queuecommand); 2203EXPORT_SYMBOL(wd33c93_queuecommand);
2231EXPORT_SYMBOL(wd33c93_intr); 2204EXPORT_SYMBOL(wd33c93_intr);
2232EXPORT_SYMBOL(wd33c93_proc_info); 2205EXPORT_SYMBOL(wd33c93_show_info);
2206EXPORT_SYMBOL(wd33c93_write_info);
diff --git a/drivers/scsi/wd33c93.h b/drivers/scsi/wd33c93.h
index 3b463d7304dc..08abe508e9ad 100644
--- a/drivers/scsi/wd33c93.h
+++ b/drivers/scsi/wd33c93.h
@@ -345,7 +345,8 @@ void wd33c93_init (struct Scsi_Host *instance, const wd33c93_regs regs,
345int wd33c93_abort (struct scsi_cmnd *cmd); 345int wd33c93_abort (struct scsi_cmnd *cmd);
346int wd33c93_queuecommand (struct Scsi_Host *h, struct scsi_cmnd *cmd); 346int wd33c93_queuecommand (struct Scsi_Host *h, struct scsi_cmnd *cmd);
347void wd33c93_intr (struct Scsi_Host *instance); 347void wd33c93_intr (struct Scsi_Host *instance);
348int wd33c93_proc_info(struct Scsi_Host *, char *, char **, off_t, int, int); 348int wd33c93_show_info(struct seq_file *, struct Scsi_Host *);
349int wd33c93_write_info(struct Scsi_Host *, char *, int);
349int wd33c93_host_reset (struct scsi_cmnd *); 350int wd33c93_host_reset (struct scsi_cmnd *);
350 351
351#endif /* WD33C93_H */ 352#endif /* WD33C93_H */
diff --git a/drivers/scsi/wd7000.c b/drivers/scsi/wd7000.c
index d89a5dfd3ade..f9a6e4b0affe 100644
--- a/drivers/scsi/wd7000.c
+++ b/drivers/scsi/wd7000.c
@@ -1296,9 +1296,9 @@ static void wd7000_revision(Adapter * host)
1296 1296
1297 1297
1298#undef SPRINTF 1298#undef SPRINTF
1299#define SPRINTF(args...) { if (pos < (buffer + length)) pos += sprintf (pos, ## args); } 1299#define SPRINTF(args...) { seq_printf(m, ## args); }
1300 1300
1301static int wd7000_set_info(char *buffer, int length, struct Scsi_Host *host) 1301static int wd7000_set_info(struct Scsi_Host *host, char *buffer, int length)
1302{ 1302{
1303 dprintk("Buffer = <%.*s>, length = %d\n", length, buffer, length); 1303 dprintk("Buffer = <%.*s>, length = %d\n", length, buffer, length);
1304 1304
@@ -1310,22 +1310,15 @@ static int wd7000_set_info(char *buffer, int length, struct Scsi_Host *host)
1310} 1310}
1311 1311
1312 1312
1313static int wd7000_proc_info(struct Scsi_Host *host, char *buffer, char **start, off_t offset, int length, int inout) 1313static int wd7000_show_info(struct seq_file *m, struct Scsi_Host *host)
1314{ 1314{
1315 Adapter *adapter = (Adapter *)host->hostdata; 1315 Adapter *adapter = (Adapter *)host->hostdata;
1316 unsigned long flags; 1316 unsigned long flags;
1317 char *pos = buffer;
1318#ifdef WD7000_DEBUG 1317#ifdef WD7000_DEBUG
1319 Mailbox *ogmbs, *icmbs; 1318 Mailbox *ogmbs, *icmbs;
1320 short count; 1319 short count;
1321#endif 1320#endif
1322 1321
1323 /*
1324 * Has data been written to the file ?
1325 */
1326 if (inout)
1327 return (wd7000_set_info(buffer, length, host));
1328
1329 spin_lock_irqsave(host->host_lock, flags); 1322 spin_lock_irqsave(host->host_lock, flags);
1330 SPRINTF("Host scsi%d: Western Digital WD-7000 (rev %d.%d)\n", host->host_no, adapter->rev1, adapter->rev2); 1323 SPRINTF("Host scsi%d: Western Digital WD-7000 (rev %d.%d)\n", host->host_no, adapter->rev1, adapter->rev2);
1331 SPRINTF(" IO base: 0x%x\n", adapter->iobase); 1324 SPRINTF(" IO base: 0x%x\n", adapter->iobase);
@@ -1368,17 +1361,7 @@ static int wd7000_proc_info(struct Scsi_Host *host, char *buffer, char **start,
1368 1361
1369 spin_unlock_irqrestore(host->host_lock, flags); 1362 spin_unlock_irqrestore(host->host_lock, flags);
1370 1363
1371 /* 1364 return 0;
1372 * Calculate start of next buffer, and return value.
1373 */
1374 *start = buffer + offset;
1375
1376 if ((pos - buffer) < offset)
1377 return (0);
1378 else if ((pos - buffer - offset) < length)
1379 return (pos - buffer - offset);
1380 else
1381 return (length);
1382} 1365}
1383 1366
1384 1367
@@ -1413,7 +1396,8 @@ static __init int wd7000_detect(struct scsi_host_template *tpnt)
1413 for (i = 0; i < NUM_CONFIGS; biosptr[i++] = -1); 1396 for (i = 0; i < NUM_CONFIGS; biosptr[i++] = -1);
1414 1397
1415 tpnt->proc_name = "wd7000"; 1398 tpnt->proc_name = "wd7000";
1416 tpnt->proc_info = &wd7000_proc_info; 1399 tpnt->show_info = &wd7000_show_info;
1400 tpnt->write_info = wd7000_set_info;
1417 1401
1418 /* 1402 /*
1419 * Set up SCB free list, which is shared by all adapters 1403 * Set up SCB free list, which is shared by all adapters
@@ -1658,7 +1642,8 @@ MODULE_LICENSE("GPL");
1658 1642
1659static struct scsi_host_template driver_template = { 1643static struct scsi_host_template driver_template = {
1660 .proc_name = "wd7000", 1644 .proc_name = "wd7000",
1661 .proc_info = wd7000_proc_info, 1645 .show_info = wd7000_show_info,
1646 .write_info = wd7000_set_info,
1662 .name = "Western Digital WD-7000", 1647 .name = "Western Digital WD-7000",
1663 .detect = wd7000_detect, 1648 .detect = wd7000_detect,
1664 .release = wd7000_release, 1649 .release = wd7000_release,
diff --git a/drivers/staging/comedi/proc.c b/drivers/staging/comedi/proc.c
index 362c214bcc0b..db790f9fc9db 100644
--- a/drivers/staging/comedi/proc.c
+++ b/drivers/staging/comedi/proc.c
@@ -31,17 +31,15 @@
31#include "comedidev.h" 31#include "comedidev.h"
32#include "comedi_internal.h" 32#include "comedi_internal.h"
33#include <linux/proc_fs.h> 33#include <linux/proc_fs.h>
34#include <linux/string.h> 34#include <linux/seq_file.h>
35 35
36static int comedi_read(char *buf, char **start, off_t offset, int len, 36static int comedi_read(struct seq_file *m, void *v)
37 int *eof, void *data)
38{ 37{
39 int i; 38 int i;
40 int devices_q = 0; 39 int devices_q = 0;
41 int l = 0;
42 struct comedi_driver *driv; 40 struct comedi_driver *driv;
43 41
44 l += sprintf(buf + l, 42 seq_printf(m,
45 "comedi version " COMEDI_RELEASE "\n" 43 "comedi version " COMEDI_RELEASE "\n"
46 "format string: %s\n", 44 "format string: %s\n",
47 "\"%2d: %-20s %-20s %4d\", i, " 45 "\"%2d: %-20s %-20s %4d\", i, "
@@ -49,42 +47,51 @@ static int comedi_read(char *buf, char **start, off_t offset, int len,
49 47
50 for (i = 0; i < COMEDI_NUM_BOARD_MINORS; i++) { 48 for (i = 0; i < COMEDI_NUM_BOARD_MINORS; i++) {
51 struct comedi_device *dev = comedi_dev_from_minor(i); 49 struct comedi_device *dev = comedi_dev_from_minor(i);
52
53 if (!dev) 50 if (!dev)
54 continue; 51 continue;
55 52
56 if (dev->attached) { 53 if (dev->attached) {
57 devices_q = 1; 54 devices_q = 1;
58 l += sprintf(buf + l, "%2d: %-20s %-20s %4d\n", 55 seq_printf(m, "%2d: %-20s %-20s %4d\n",
59 i, 56 i, dev->driver->driver_name,
60 dev->driver->driver_name, 57 dev->board_name, dev->n_subdevices);
61 dev->board_name, dev->n_subdevices);
62 } 58 }
63 } 59 }
64 if (!devices_q) 60 if (!devices_q)
65 l += sprintf(buf + l, "no devices\n"); 61 seq_puts(m, "no devices\n");
66 62
67 for (driv = comedi_drivers; driv; driv = driv->next) { 63 for (driv = comedi_drivers; driv; driv = driv->next) {
68 l += sprintf(buf + l, "%s:\n", driv->driver_name); 64 seq_printf(m, "%s:\n", driv->driver_name);
69 for (i = 0; i < driv->num_names; i++) { 65 for (i = 0; i < driv->num_names; i++)
70 l += sprintf(buf + l, " %s\n", 66 seq_printf(m, " %s\n",
71 *(char **)((char *)driv->board_name + 67 *(char **)((char *)driv->board_name +
72 i * driv->offset)); 68 i * driv->offset));
73 } 69
74 if (!driv->num_names) 70 if (!driv->num_names)
75 l += sprintf(buf + l, " %s\n", driv->driver_name); 71 seq_printf(m, " %s\n", driv->driver_name);
76 } 72 }
77 73
78 return l; 74 return 0;
79} 75}
80 76
81void comedi_proc_init(void) 77/*
78 * seq_file wrappers for procfile show routines.
79 */
80static int comedi_proc_open(struct inode *inode, struct file *file)
82{ 81{
83 struct proc_dir_entry *comedi_proc; 82 return single_open(file, comedi_read, NULL);
83}
84
85static const struct file_operations comedi_proc_fops = {
86 .open = comedi_proc_open,
87 .read = seq_read,
88 .llseek = seq_lseek,
89 .release = seq_release,
90};
84 91
85 comedi_proc = create_proc_entry("comedi", S_IFREG | S_IRUGO, NULL); 92void comedi_proc_init(void)
86 if (comedi_proc) 93{
87 comedi_proc->read_proc = comedi_read; 94 proc_create("comedi", 0644, NULL, &comedi_proc_fops);
88} 95}
89 96
90void comedi_proc_cleanup(void) 97void comedi_proc_cleanup(void)
diff --git a/drivers/staging/csr/csr_wifi_hip_udi.c b/drivers/staging/csr/csr_wifi_hip_udi.c
index a65b822db698..a6b006b0e983 100644
--- a/drivers/staging/csr/csr_wifi_hip_udi.c
+++ b/drivers/staging/csr/csr_wifi_hip_udi.c
@@ -24,10 +24,50 @@
24 * 24 *
25 * --------------------------------------------------------------------------- 25 * ---------------------------------------------------------------------------
26 */ 26 */
27#include <linux/seq_file.h>
27#include "csr_wifi_hip_unifi.h" 28#include "csr_wifi_hip_unifi.h"
28#include "csr_wifi_hip_card.h" 29#include "csr_wifi_hip_card.h"
29 30
30 31
32static void unifi_print_unsafe_sdio_status(card_t *card, struct seq_file *m)
33{
34#ifdef CSR_UNSAFE_SDIO_ACCESS
35 s32 iostate;
36 CsrResult r;
37 static const char *const states[] = {
38 "AWAKE", "DROWSY", "TORPID"
39 };
40#define SHARED_READ_RETRY_LIMIT 10
41 u8 b;
42
43 seq_printf(m, "Host State: %s\n", states[card->host_state]);
44
45 r = unifi_check_io_status(card, &iostate);
46 if (iostate == 1) {
47 seq_puts(m, remaining, "I/O Check: F1 disabled\n");
48 } else {
49 if (iostate == 1) {
50 seq_puts(m, "I/O Check: pending interrupt\n");
51
52 seq_printf(m, "BH reason interrupt = %d\n", card->bh_reason_unifi);
53 seq_printf(m, "BH reason host = %d\n", card->bh_reason_host);
54
55 for (i = 0; i < SHARED_READ_RETRY_LIMIT; i++) {
56 r = unifi_read_8_or_16(card, card->sdio_ctrl_addr + 2, &b);
57 if (r == CSR_RESULT_SUCCESS && !(b & 0x80)) {
58 seq_printf(m, "fhsr: %u (driver thinks is %u)\n",
59 b, card->from_host_signals_r);
60 break;
61 }
62 }
63
64 iostate = unifi_read_shared_count(card, card->sdio_ctrl_addr + 4);
65 seq_printf(m, "thsw: %u (driver thinks is %u)\n",
66 iostate, card->to_host_signals_w);
67 }
68#endif
69}
70
31/* 71/*
32 * --------------------------------------------------------------------------- 72 * ---------------------------------------------------------------------------
33 * unifi_print_status 73 * unifi_print_status
@@ -41,228 +81,93 @@
41 * None. 81 * None.
42 * --------------------------------------------------------------------------- 82 * ---------------------------------------------------------------------------
43 */ 83 */
44s32 unifi_print_status(card_t *card, char *str, s32 *remain) 84s32 unifi_print_status(card_t *card, struct seq_file *m)
45{ 85{
46 char *p = str; 86 sdio_config_data_t *cfg;
47 sdio_config_data_t *cfg; 87 u16 i, n;
48 u16 i, n; 88
49 s32 remaining = *remain; 89 i = n = 0;
50 s32 written; 90 seq_printf(m, "Chip ID %u\n", card->chip_id);
51#ifdef CSR_UNSAFE_SDIO_ACCESS 91 seq_printf(m, "Chip Version %04X\n", card->chip_version);
52 s32 iostate; 92 seq_printf(m, "HIP v%u.%u\n",
53 CsrResult r; 93 (card->config_data.version >> 8) & 0xFF,
54 static const char *const states[] = { 94 card->config_data.version & 0xFF);
55 "AWAKE", "DROWSY", "TORPID" 95 seq_printf(m, "Build %u: %s\n", card->build_id, card->build_id_string);
56 }; 96
57 #define SHARED_READ_RETRY_LIMIT 10 97 cfg = &card->config_data;
58 u8 b; 98
59#endif 99 seq_printf(m, "sdio ctrl offset %u\n", cfg->sdio_ctrl_offset);
60 100 seq_printf(m, "fromhost sigbuf handle %u\n", cfg->fromhost_sigbuf_handle);
61 if (remaining <= 0) 101 seq_printf(m, "tohost_sigbuf_handle %u\n", cfg->tohost_sigbuf_handle);
62 { 102 seq_printf(m, "num_fromhost_sig_frags %u\n", cfg->num_fromhost_sig_frags);
63 return 0; 103 seq_printf(m, "num_tohost_sig_frags %u\n", cfg->num_tohost_sig_frags);
64 } 104 seq_printf(m, "num_fromhost_data_slots %u\n", cfg->num_fromhost_data_slots);
65 105 seq_printf(m, "num_tohost_data_slots %u\n", cfg->num_tohost_data_slots);
66 i = n = 0; 106 seq_printf(m, "data_slot_size %u\n", cfg->data_slot_size);
67 written = scnprintf(p, remaining, "Chip ID %u\n", 107
68 (u16)card->chip_id); 108 /* Added by protocol version 0x0001 */
69 UNIFI_SNPRINTF_RET(p, remaining, written); 109 seq_printf(m, "overlay_size %u\n", cfg->overlay_size);
70 written = scnprintf(p, remaining, "Chip Version %04X\n", 110
71 card->chip_version); 111 /* Added by protocol version 0x0300 */
72 UNIFI_SNPRINTF_RET(p, remaining, written); 112 seq_printf(m, "data_slot_round %u\n", cfg->data_slot_round);
73 written = scnprintf(p, remaining, "HIP v%u.%u\n", 113 seq_printf(m, "sig_frag_size %u\n", cfg->sig_frag_size);
74 (card->config_data.version >> 8) & 0xFF, 114
75 card->config_data.version & 0xFF); 115 /* Added by protocol version 0x0300 */
76 UNIFI_SNPRINTF_RET(p, remaining, written); 116 seq_printf(m, "tohost_sig_pad %u\n", cfg->tohost_signal_padding);
77 written = scnprintf(p, remaining, "Build %u: %s\n", 117
78 card->build_id, card->build_id_string); 118 seq_puts(m, "\nInternal state:\n");
79 UNIFI_SNPRINTF_RET(p, remaining, written); 119
80 120 seq_printf(m, "Last PHY PANIC: %04x:%04x\n",
81 cfg = &card->config_data; 121 card->last_phy_panic_code, card->last_phy_panic_arg);
82 122 seq_printf(m, "Last MAC PANIC: %04x:%04x\n",
83 written = scnprintf(p, remaining, "sdio ctrl offset %u\n", 123 card->last_mac_panic_code, card->last_mac_panic_arg);
84 cfg->sdio_ctrl_offset); 124
85 UNIFI_SNPRINTF_RET(p, remaining, written); 125 seq_printf(m, "fhsr: %hu\n", (u16)card->from_host_signals_r);
86 written = scnprintf(p, remaining, "fromhost sigbuf handle %u\n", 126 seq_printf(m, "fhsw: %hu\n", (u16)card->from_host_signals_w);
87 cfg->fromhost_sigbuf_handle); 127 seq_printf(m, "thsr: %hu\n", (u16)card->to_host_signals_r);
88 UNIFI_SNPRINTF_RET(p, remaining, written); 128 seq_printf(m, "thsw: %hu\n", (u16)card->to_host_signals_w);
89 written = scnprintf(p, remaining, "tohost_sigbuf_handle %u\n", 129 seq_printf(m, "fh buffer contains: %d signals, %td bytes\n",
90 cfg->tohost_sigbuf_handle); 130 card->fh_buffer.count,
91 UNIFI_SNPRINTF_RET(p, remaining, written); 131 card->fh_buffer.ptr - card->fh_buffer.buf);
92 written = scnprintf(p, remaining, "num_fromhost_sig_frags %u\n", 132
93 cfg->num_fromhost_sig_frags); 133 seq_puts(m, "paused: ");
94 UNIFI_SNPRINTF_RET(p, remaining, written); 134 for (i = 0; i < ARRAY_SIZE(card->tx_q_paused_flag); i++)
95 written = scnprintf(p, remaining, "num_tohost_sig_frags %u\n", 135 seq_printf(m, card->tx_q_paused_flag[i] ? "1" : "0");
96 cfg->num_tohost_sig_frags); 136 seq_putc(m, '\n');
97 UNIFI_SNPRINTF_RET(p, remaining, written); 137
98 written = scnprintf(p, remaining, "num_fromhost_data_slots %u\n", 138 seq_printf(m, "fh command q: %u waiting, %u free of %u:\n",
99 cfg->num_fromhost_data_slots); 139 CSR_WIFI_HIP_Q_SLOTS_USED(&card->fh_command_queue),
100 UNIFI_SNPRINTF_RET(p, remaining, written); 140 CSR_WIFI_HIP_Q_SLOTS_FREE(&card->fh_command_queue),
101 written = scnprintf(p, remaining, "num_tohost_data_slots %u\n", 141 UNIFI_SOFT_COMMAND_Q_LENGTH);
102 cfg->num_tohost_data_slots); 142
103 UNIFI_SNPRINTF_RET(p, remaining, written); 143 for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
104 written = scnprintf(p, remaining, "data_slot_size %u\n", 144 seq_printf(m, "fh traffic q[%u]: %u waiting, %u free of %u:\n",
105 cfg->data_slot_size); 145 i,
106 UNIFI_SNPRINTF_RET(p, remaining, written); 146 CSR_WIFI_HIP_Q_SLOTS_USED(&card->fh_traffic_queue[i]),
107 147 CSR_WIFI_HIP_Q_SLOTS_FREE(&card->fh_traffic_queue[i]),
108 /* Added by protocol version 0x0001 */ 148 UNIFI_SOFT_TRAFFIC_Q_LENGTH);
109 written = scnprintf(p, remaining, "overlay_size %u\n", 149
110 (u16)cfg->overlay_size); 150 seq_printf(m, "fh data slots free: %u\n",
111 UNIFI_SNPRINTF_RET(p, remaining, written); 151 card->from_host_data ? CardGetFreeFromHostDataSlots(card) : 0);
112 152
113 /* Added by protocol version 0x0300 */ 153 seq_puts(m, "From host data slots:");
114 written = scnprintf(p, remaining, "data_slot_round %u\n", 154 n = card->config_data.num_fromhost_data_slots;
115 cfg->data_slot_round); 155 for (i = 0; i < n && card->from_host_data; i++)
116 UNIFI_SNPRINTF_RET(p, remaining, written); 156 seq_printf(m, " %hu", (u16)card->from_host_data[i].bd.data_length);
117 written = scnprintf(p, remaining, "sig_frag_size %u\n", 157 seq_putc(m, '\n');
118 cfg->sig_frag_size); 158
119 UNIFI_SNPRINTF_RET(p, remaining, written); 159 seq_puts(m, "To host data slots:");
120 160 n = card->config_data.num_tohost_data_slots;
121 /* Added by protocol version 0x0300 */ 161 for (i = 0; i < n && card->to_host_data; i++)
122 written = scnprintf(p, remaining, "tohost_sig_pad %u\n", 162 seq_printf(m, " %hu", (u16)card->to_host_data[i].data_length);
123 cfg->tohost_signal_padding); 163 seq_putc(m, '\n');
124 UNIFI_SNPRINTF_RET(p, remaining, written); 164
125 165 unifi_print_unsafe_sdio_status(card, m);
126 written = scnprintf(p, remaining, "\nInternal state:\n"); 166
127 UNIFI_SNPRINTF_RET(p, remaining, written); 167 seq_puts(m, "\nStats:\n");
128 168 seq_printf(m, "Total SDIO bytes: R=%u W=%u\n",
129 written = scnprintf(p, remaining, "Last PHY PANIC: %04x:%04x\n", 169 card->sdio_bytes_read, card->sdio_bytes_written);
130 card->last_phy_panic_code, card->last_phy_panic_arg); 170
131 UNIFI_SNPRINTF_RET(p, remaining, written); 171 seq_printf(m, "Interrupts generated on card: %u\n", card->unifi_interrupt_seq);
132 written = scnprintf(p, remaining, "Last MAC PANIC: %04x:%04x\n", 172 return 0;
133 card->last_mac_panic_code, card->last_mac_panic_arg); 173}
134 UNIFI_SNPRINTF_RET(p, remaining, written);
135
136 written = scnprintf(p, remaining, "fhsr: %u\n",
137 (u16)card->from_host_signals_r);
138 UNIFI_SNPRINTF_RET(p, remaining, written);
139 written = scnprintf(p, remaining, "fhsw: %u\n",
140 (u16)card->from_host_signals_w);
141 UNIFI_SNPRINTF_RET(p, remaining, written);
142 written = scnprintf(p, remaining, "thsr: %u\n",
143 (u16)card->to_host_signals_r);
144 UNIFI_SNPRINTF_RET(p, remaining, written);
145 written = scnprintf(p, remaining, "thsw: %u\n",
146 (u16)card->to_host_signals_w);
147 UNIFI_SNPRINTF_RET(p, remaining, written);
148 written = scnprintf(p, remaining,
149 "fh buffer contains: %d signals, %td bytes\n",
150 card->fh_buffer.count,
151 card->fh_buffer.ptr - card->fh_buffer.buf);
152 UNIFI_SNPRINTF_RET(p, remaining, written);
153
154 written = scnprintf(p, remaining, "paused: ");
155 UNIFI_SNPRINTF_RET(p, remaining, written);
156 for (i = 0; i < sizeof(card->tx_q_paused_flag) / sizeof(card->tx_q_paused_flag[0]); i++)
157 {
158 written = scnprintf(p, remaining, card->tx_q_paused_flag[i]?"1" : "0");
159 UNIFI_SNPRINTF_RET(p, remaining, written);
160 }
161 written = scnprintf(p, remaining, "\n");
162 UNIFI_SNPRINTF_RET(p, remaining, written);
163
164 written = scnprintf(p, remaining,
165 "fh command q: %u waiting, %u free of %u:\n",
166 CSR_WIFI_HIP_Q_SLOTS_USED(&card->fh_command_queue),
167 CSR_WIFI_HIP_Q_SLOTS_FREE(&card->fh_command_queue),
168 UNIFI_SOFT_COMMAND_Q_LENGTH);
169 UNIFI_SNPRINTF_RET(p, remaining, written);
170 for (i = 0; i < UNIFI_NO_OF_TX_QS; i++)
171 {
172 written = scnprintf(p, remaining,
173 "fh traffic q[%u]: %u waiting, %u free of %u:\n",
174 i,
175 CSR_WIFI_HIP_Q_SLOTS_USED(&card->fh_traffic_queue[i]),
176 CSR_WIFI_HIP_Q_SLOTS_FREE(&card->fh_traffic_queue[i]),
177 UNIFI_SOFT_TRAFFIC_Q_LENGTH);
178 UNIFI_SNPRINTF_RET(p, remaining, written);
179 }
180
181 written = scnprintf(p, remaining, "fh data slots free: %u\n",
182 card->from_host_data?CardGetFreeFromHostDataSlots(card) : 0);
183 UNIFI_SNPRINTF_RET(p, remaining, written);
184
185
186 written = scnprintf(p, remaining, "From host data slots:");
187 UNIFI_SNPRINTF_RET(p, remaining, written);
188 n = card->config_data.num_fromhost_data_slots;
189 for (i = 0; i < n && card->from_host_data; i++)
190 {
191 written = scnprintf(p, remaining, " %u",
192 (u16)card->from_host_data[i].bd.data_length);
193 UNIFI_SNPRINTF_RET(p, remaining, written);
194 }
195 written = scnprintf(p, remaining, "\n");
196 UNIFI_SNPRINTF_RET(p, remaining, written);
197
198 written = scnprintf(p, remaining, "To host data slots:");
199 UNIFI_SNPRINTF_RET(p, remaining, written);
200 n = card->config_data.num_tohost_data_slots;
201 for (i = 0; i < n && card->to_host_data; i++)
202 {
203 written = scnprintf(p, remaining, " %u",
204 (u16)card->to_host_data[i].data_length);
205 UNIFI_SNPRINTF_RET(p, remaining, written);
206 }
207
208 written = scnprintf(p, remaining, "\n");
209 UNIFI_SNPRINTF_RET(p, remaining, written);
210
211#ifdef CSR_UNSAFE_SDIO_ACCESS
212 written = scnprintf(p, remaining, "Host State: %s\n", states[card->host_state]);
213 UNIFI_SNPRINTF_RET(p, remaining, written);
214
215 r = unifi_check_io_status(card, &iostate);
216 if (iostate == 1)
217 {
218 written = scnprintf(p, remaining, "I/O Check: F1 disabled\n");
219 UNIFI_SNPRINTF_RET(p, remaining, written);
220 }
221 else
222 {
223 if (iostate == 1)
224 {
225 written = scnprintf(p, remaining, "I/O Check: pending interrupt\n");
226 UNIFI_SNPRINTF_RET(p, remaining, written);
227 }
228
229 written = scnprintf(p, remaining, "BH reason interrupt = %d\n",
230 card->bh_reason_unifi);
231 UNIFI_SNPRINTF_RET(p, remaining, written);
232 written = scnprintf(p, remaining, "BH reason host = %d\n",
233 card->bh_reason_host);
234 UNIFI_SNPRINTF_RET(p, remaining, written);
235
236 for (i = 0; i < SHARED_READ_RETRY_LIMIT; i++)
237 {
238 r = unifi_read_8_or_16(card, card->sdio_ctrl_addr + 2, &b);
239 if ((r == CSR_RESULT_SUCCESS) && (!(b & 0x80)))
240 {
241 written = scnprintf(p, remaining, "fhsr: %u (driver thinks is %u)\n",
242 b, card->from_host_signals_r);
243 UNIFI_SNPRINTF_RET(p, remaining, written);
244 break;
245 }
246 }
247 iostate = unifi_read_shared_count(card, card->sdio_ctrl_addr + 4);
248 written = scnprintf(p, remaining, "thsw: %u (driver thinks is %u)\n",
249 iostate, card->to_host_signals_w);
250 UNIFI_SNPRINTF_RET(p, remaining, written);
251 }
252#endif
253
254 written = scnprintf(p, remaining, "\nStats:\n");
255 UNIFI_SNPRINTF_RET(p, remaining, written);
256 written = scnprintf(p, remaining, "Total SDIO bytes: R=%u W=%u\n",
257 card->sdio_bytes_read, card->sdio_bytes_written);
258
259 UNIFI_SNPRINTF_RET(p, remaining, written);
260 written = scnprintf(p, remaining, "Interrupts generated on card: %u\n",
261 card->unifi_interrupt_seq);
262 UNIFI_SNPRINTF_RET(p, remaining, written);
263
264 *remain = remaining;
265 return (p - str);
266} /* unifi_print_status() */
267
268
diff --git a/drivers/staging/csr/csr_wifi_hip_unifi_udi.h b/drivers/staging/csr/csr_wifi_hip_unifi_udi.h
index 9d85cfd57616..4126e85bfe9b 100644
--- a/drivers/staging/csr/csr_wifi_hip_unifi_udi.h
+++ b/drivers/staging/csr/csr_wifi_hip_unifi_udi.h
@@ -47,21 +47,6 @@ CsrResult unifi_remove_udi_hook(card_t *card, udi_func_t udi_fn);
47 * This is used in the linux /proc interface and might be useful 47 * This is used in the linux /proc interface and might be useful
48 * in other systems. 48 * in other systems.
49 */ 49 */
50s32 unifi_print_status(card_t *card, char *str, s32 *remain); 50s32 unifi_print_status(card_t *card, struct seq_file *m);
51
52#define UNIFI_SNPRINTF_RET(buf_p, remain, written) \
53 do { \
54 if (written >= remain) { \
55 if (remain >= 2) { \
56 buf_p[remain - 2] = '\n'; \
57 buf_p[remain - 1] = 0; \
58 } \
59 buf_p += remain; \
60 remain = 0; \
61 } else if (written > 0) { \
62 buf_p += written; \
63 remain -= written; \
64 } \
65 } while (0)
66 51
67#endif /* __CSR_WIFI_HIP_UNIFI_UDI_H__ */ 52#endif /* __CSR_WIFI_HIP_UNIFI_UDI_H__ */
diff --git a/drivers/staging/csr/drv.c b/drivers/staging/csr/drv.c
index 5520d6539f77..bdc25236ab00 100644
--- a/drivers/staging/csr/drv.c
+++ b/drivers/staging/csr/drv.c
@@ -1941,7 +1941,7 @@ uf_sme_queue_message(unifi_priv_t *priv, u8 *buffer, int length)
1941 * 1941 *
1942 **************************************************************************** 1942 ****************************************************************************
1943 */ 1943 */
1944static struct file_operations unifi_fops = { 1944static const struct file_operations unifi_fops = {
1945 .owner = THIS_MODULE, 1945 .owner = THIS_MODULE,
1946 .open = unifi_open, 1946 .open = unifi_open,
1947 .release = unifi_release, 1947 .release = unifi_release,
@@ -2041,7 +2041,7 @@ void uf_destroy_device_nodes(unifi_priv_t *priv)
2041 * ---------------------------------------------------------------- 2041 * ----------------------------------------------------------------
2042 */ 2042 */
2043static int 2043static int
2044uf_create_debug_device(struct file_operations *fops) 2044uf_create_debug_device(const struct file_operations *fops)
2045{ 2045{
2046 int ret; 2046 int ret;
2047 2047
diff --git a/drivers/staging/csr/io.c b/drivers/staging/csr/io.c
index af9c28f073b9..f9b5c22c00b8 100644
--- a/drivers/staging/csr/io.c
+++ b/drivers/staging/csr/io.c
@@ -31,6 +31,7 @@
31 * --------------------------------------------------------------------------- 31 * ---------------------------------------------------------------------------
32 */ 32 */
33#include <linux/proc_fs.h> 33#include <linux/proc_fs.h>
34#include <linux/seq_file.h>
34 35
35#include "csr_wifi_hip_unifi.h" 36#include "csr_wifi_hip_unifi.h"
36#include "csr_wifi_hip_unifiversion.h" 37#include "csr_wifi_hip_unifiversion.h"
@@ -76,9 +77,28 @@ DEFINE_SEMAPHORE(Unifi_instance_mutex);
76 */ 77 */
77DECLARE_WAIT_QUEUE_HEAD(Unifi_cleanup_wq); 78DECLARE_WAIT_QUEUE_HEAD(Unifi_cleanup_wq);
78 79
80#ifdef CONFIG_PROC_FS
81/*
82 * seq_file wrappers for procfile show routines.
83 */
84static int uf_proc_show(struct seq_file *m, void *v);
85
86#define UNIFI_DEBUG_TXT_BUFFER (8 * 1024)
87
88static int uf_proc_open(struct inode *inode, struct file *file)
89{
90 return single_open_size(file, uf_proc_show, PDE_DATA(inode),
91 UNIFI_DEBUG_TXT_BUFFER);
92}
93
94static const struct file_operations uf_proc_fops = {
95 .open = uf_proc_open,
96 .read = seq_read,
97 .llseek = seq_lseek,
98 .release = seq_release,
99};
79 100
80static int uf_read_proc(char *page, char **start, off_t offset, int count, 101#endif /* CONFIG_PROC_FS */
81 int *eof, void *data);
82 102
83#ifdef CSR_WIFI_RX_PATH_SPLIT 103#ifdef CSR_WIFI_RX_PATH_SPLIT
84 104
@@ -327,8 +347,8 @@ register_unifi_sdio(CsrSdioFunction *sdio_dev, int bus_id, struct device *dev)
327 * The following complex casting is in place in order to eliminate 64-bit compilation warning 347 * The following complex casting is in place in order to eliminate 64-bit compilation warning
328 * "cast to/from pointer from/to integer of different size" 348 * "cast to/from pointer from/to integer of different size"
329 */ 349 */
330 if (!create_proc_read_entry(priv->proc_entry_name, 0, 0, 350 if (!proc_create_data(priv->proc_entry_name, 0, NULL,
331 uf_read_proc, (void *)(long)priv->instance)) 351 &uf_proc_fops, (void *)(long)priv->instance))
332 { 352 {
333 unifi_error(priv, "unifi: can't create /proc/driver/unifi\n"); 353 unifi_error(priv, "unifi: can't create /proc/driver/unifi\n");
334 } 354 }
@@ -827,7 +847,7 @@ uf_put_instance(int inst)
827 847
828/* 848/*
829 * --------------------------------------------------------------------------- 849 * ---------------------------------------------------------------------------
830 * uf_read_proc 850 * uf_proc_show
831 * 851 *
832 * Read method for driver node in /proc/driver/unifi0 852 * Read method for driver node in /proc/driver/unifi0
833 * 853 *
@@ -844,107 +864,54 @@ uf_put_instance(int inst)
844 * --------------------------------------------------------------------------- 864 * ---------------------------------------------------------------------------
845 */ 865 */
846#ifdef CONFIG_PROC_FS 866#ifdef CONFIG_PROC_FS
847static int 867static int uf_proc_show(struct seq_file *m, void *v)
848uf_read_proc(char *page, char **start, off_t offset, int count,
849 int *eof, void *data)
850{ 868{
851#define UNIFI_DEBUG_TXT_BUFFER 8*1024 869 unifi_priv_t *priv;
852 unifi_priv_t *priv; 870 int i;
853 int actual_amount_to_copy; 871
854 char *p, *orig_p; 872 /*
855 s32 remain = UNIFI_DEBUG_TXT_BUFFER; 873 * The following complex casting is in place in order to eliminate
856 s32 written; 874 * 64-bit compilation warning "cast to/from pointer from/to integer of
857 int i; 875 * different size"
858 876 */
859 /* 877 priv = uf_find_instance((long)m->private);
860 * The following complex casting is in place in order to eliminate 64-bit compilation warning 878 if (!priv)
861 * "cast to/from pointer from/to integer of different size" 879 return 0;
862 */ 880
863 priv = uf_find_instance((int)(long)data); 881 seq_printf(m, "UniFi SDIO Driver: %s %s %s\n",
864 if (!priv) { 882 CSR_WIFI_VERSION, __DATE__, __TIME__);
865 return 0;
866 }
867
868 p = kmalloc( UNIFI_DEBUG_TXT_BUFFER, GFP_KERNEL );
869
870 orig_p = p;
871
872 written = scnprintf(p, remain, "UniFi SDIO Driver: %s %s %s\n",
873 CSR_WIFI_VERSION, __DATE__, __TIME__);
874 UNIFI_SNPRINTF_RET(p, remain, written);
875#ifdef CSR_SME_USERSPACE 883#ifdef CSR_SME_USERSPACE
876 written = scnprintf(p, remain, "SME: CSR userspace "); 884 seq_puts(m, "SME: CSR userspace ");
877 UNIFI_SNPRINTF_RET(p, remain, written);
878#ifdef CSR_SUPPORT_WEXT 885#ifdef CSR_SUPPORT_WEXT
879 written = scnprintf(p, remain, "with WEXT support\n"); 886 seq_puts(m, "with WEXT support\n");
880#else 887#else
881 written = scnprintf(p, remain, "\n"); 888 seq_putc(m, '\n');
882#endif /* CSR_SUPPORT_WEXT */ 889#endif /* CSR_SUPPORT_WEXT */
883 UNIFI_SNPRINTF_RET(p, remain, written);
884#endif /* CSR_SME_USERSPACE */ 890#endif /* CSR_SME_USERSPACE */
885#ifdef CSR_NATIVE_LINUX 891#ifdef CSR_NATIVE_LINUX
886 written = scnprintf(p, remain, "SME: native\n"); 892 seq_puts(m, "SME: native\n");
887 UNIFI_SNPRINTF_RET(p, remain, written);
888#endif 893#endif
889 894
890#ifdef CSR_SUPPORT_SME 895#ifdef CSR_SUPPORT_SME
891 written = scnprintf(p, remain, 896 seq_printf(m, "Firmware (ROM) build:%u, Patch:%u\n",
892 "Firmware (ROM) build:%u, Patch:%u\n", 897 priv->card_info.fw_build,
893 priv->card_info.fw_build, 898 priv->sme_versions.firmwarePatch);
894 priv->sme_versions.firmwarePatch);
895 UNIFI_SNPRINTF_RET(p, remain, written);
896#endif 899#endif
897 p += unifi_print_status(priv->card, p, &remain);
898
899 written = scnprintf(p, remain, "Last dbg str: %s\n",
900 priv->last_debug_string);
901 UNIFI_SNPRINTF_RET(p, remain, written);
902
903 written = scnprintf(p, remain, "Last dbg16:");
904 UNIFI_SNPRINTF_RET(p, remain, written);
905 for (i = 0; i < 8; i++) {
906 written = scnprintf(p, remain, " %04X",
907 priv->last_debug_word16[i]);
908 UNIFI_SNPRINTF_RET(p, remain, written);
909 }
910 written = scnprintf(p, remain, "\n");
911 UNIFI_SNPRINTF_RET(p, remain, written);
912 written = scnprintf(p, remain, " ");
913 UNIFI_SNPRINTF_RET(p, remain, written);
914 for (; i < 16; i++) {
915 written = scnprintf(p, remain, " %04X",
916 priv->last_debug_word16[i]);
917 UNIFI_SNPRINTF_RET(p, remain, written);
918 }
919 written = scnprintf(p, remain, "\n");
920 UNIFI_SNPRINTF_RET(p, remain, written);
921 *start = page;
922
923 written = UNIFI_DEBUG_TXT_BUFFER - remain;
924
925 if( offset >= written )
926 {
927 *eof = 1;
928 kfree( orig_p );
929 return(0);
930 }
931
932 if( offset + count > written )
933 {
934 actual_amount_to_copy = written - offset;
935 *eof = 1;
936 }
937 else
938 {
939 actual_amount_to_copy = count;
940 }
941 900
942 memcpy( page, &(orig_p[offset]), actual_amount_to_copy ); 901 unifi_print_status(priv->card, m);
943 902
944 kfree( orig_p ); 903 seq_printf(m, "Last dbg str: %s\n", priv->last_debug_string);
945 904
946 return( actual_amount_to_copy ); 905 seq_puts(m, "Last dbg16:");
947} /* uf_read_proc() */ 906 for (i = 0; i < 8; i++)
907 seq_printf(m, " %04X", priv->last_debug_word16[i]);
908 seq_putc(m, '\n');
909 seq_puts(m, " ");
910 for (; i < 16; i++)
911 seq_printf(m, " %04X", priv->last_debug_word16[i]);
912 seq_putc(m, '\n');
913 return 0;
914}
948#endif 915#endif
949 916
950 917
diff --git a/drivers/staging/cxt1e1/Makefile b/drivers/staging/cxt1e1/Makefile
index e99b82311823..b9ccb7650251 100644
--- a/drivers/staging/cxt1e1/Makefile
+++ b/drivers/staging/cxt1e1/Makefile
@@ -12,8 +12,9 @@ cxt1e1-y := \
12 linux.o \ 12 linux.o \
13 functions.o \ 13 functions.o \
14 hwprobe.o \ 14 hwprobe.o \
15 sbeproc.o \
16 pmc93x6_eeprom.o \ 15 pmc93x6_eeprom.o \
17 sbecrc.o \ 16 sbecrc.o \
18 comet_tables.o \ 17 comet_tables.o \
19 sbeid.o 18 sbeid.o
19
20cxt1e1-$(CONFIG_PROC_FS) += sbeproc.o
diff --git a/drivers/staging/cxt1e1/sbeproc.c b/drivers/staging/cxt1e1/sbeproc.c
index f42531c3d8da..49f10f0b7d29 100644
--- a/drivers/staging/cxt1e1/sbeproc.c
+++ b/drivers/staging/cxt1e1/sbeproc.c
@@ -19,6 +19,7 @@
19#include <linux/kernel.h> 19#include <linux/kernel.h>
20#include <linux/init.h> 20#include <linux/init.h>
21#include <linux/proc_fs.h> 21#include <linux/proc_fs.h>
22#include <linux/seq_file.h>
22#include <linux/sched.h> 23#include <linux/sched.h>
23#include <asm/uaccess.h> 24#include <asm/uaccess.h>
24#include "pmcc4_sysdep.h" 25#include "pmcc4_sysdep.h"
@@ -26,332 +27,193 @@
26#include "pmcc4_private.h" 27#include "pmcc4_private.h"
27#include "sbeproc.h" 28#include "sbeproc.h"
28 29
29/* forwards */ 30extern void sbecom_get_brdinfo(ci_t *, struct sbe_brd_info *, u_int8_t *);
30void sbecom_get_brdinfo (ci_t *, struct sbe_brd_info *, u_int8_t *);
31extern struct s_hdw_info hdw_info[MAX_BOARDS]; 31extern struct s_hdw_info hdw_info[MAX_BOARDS];
32 32
33#ifdef CONFIG_PROC_FS 33void sbecom_proc_brd_cleanup(ci_t *ci)
34
35/********************************************************************/
36/* procfs stuff */
37/********************************************************************/
38
39
40void
41sbecom_proc_brd_cleanup (ci_t * ci)
42{ 34{
43 if (ci->dir_dev) 35 if (ci->dir_dev) {
44 { 36 char dir[7 + SBE_IFACETMPL_SIZE + 1];
45 char dir[7 + SBE_IFACETMPL_SIZE + 1]; 37 snprintf(dir, sizeof(dir), "driver/%s", ci->devname);
46 snprintf(dir, sizeof(dir), "driver/%s", ci->devname); 38 remove_proc_entry("info", ci->dir_dev);
47 remove_proc_entry("info", ci->dir_dev); 39 remove_proc_entry(dir, NULL);
48 remove_proc_entry(dir, NULL); 40 ci->dir_dev = NULL;
49 ci->dir_dev = NULL; 41 }
50 }
51} 42}
52 43
53 44static void sbecom_proc_get_brdinfo(ci_t *ci, struct sbe_brd_info *bip)
54static int
55sbecom_proc_get_sbe_info (char *buffer, char **start, off_t offset,
56 int length, int *eof, void *priv)
57{ 45{
58 ci_t *ci = (ci_t *) priv; 46 hdw_info_t *hi = &hdw_info[ci->brdno];
59 int len = 0; 47 u_int8_t *bsn = 0;
60 char *spd; 48
61 struct sbe_brd_info *bip; 49 switch (hi->promfmt)
62 50 {
63 if (!(bip = OS_kmalloc (sizeof (struct sbe_brd_info)))) 51 case PROM_FORMAT_TYPE1:
64 { 52 bsn = (u_int8_t *) hi->mfg_info.pft1.Serial;
65 return -ENOMEM; 53 break;
66 } 54 case PROM_FORMAT_TYPE2:
67#if 0 55 bsn = (u_int8_t *) hi->mfg_info.pft2.Serial;
68 /** RLD DEBUG **/ 56 break;
69 pr_info(">> sbecom_proc_get_sbe_info: entered, offset %d. length %d.\n", 57 }
70 (int) offset, (int) length); 58
71#endif 59 sbecom_get_brdinfo (ci, bip, bsn);
72 60
73 { 61 pr_devel(">> sbecom_get_brdinfo: returned, first_if %p <%s> last_if %p <%s>\n",
74 hdw_info_t *hi = &hdw_info[ci->brdno]; 62 bip->first_iname, bip->first_iname,
75 63 bip->last_iname, bip->last_iname);
76 u_int8_t *bsn = 0; 64}
77
78 switch (hi->promfmt)
79 {
80 case PROM_FORMAT_TYPE1:
81 bsn = (u_int8_t *) hi->mfg_info.pft1.Serial;
82 break;
83 case PROM_FORMAT_TYPE2:
84 bsn = (u_int8_t *) hi->mfg_info.pft2.Serial;
85 break;
86 }
87
88 sbecom_get_brdinfo (ci, bip, bsn);
89 }
90
91#if 0
92 /** RLD DEBUG **/
93 pr_info(">> sbecom_get_brdinfo: returned, first_if %p <%s> last_if %p <%s>\n",
94 (char *) &bip->first_iname, (char *) &bip->first_iname,
95 (char *) &bip->last_iname, (char *) &bip->last_iname);
96#endif
97 len += sprintf (buffer + len, "Board Type: ");
98 switch (bip->brd_id)
99 {
100 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C1T3):
101 len += sprintf (buffer + len, "wanPMC-C1T3");
102 break;
103 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPTMC_256T3_E1):
104 len += sprintf (buffer + len, "wanPTMC-256T3 <E1>");
105 break;
106 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPTMC_256T3_T1):
107 len += sprintf (buffer + len, "wanPTMC-256T3 <T1>");
108 break;
109 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPTMC_C24TE1):
110 len += sprintf (buffer + len, "wanPTMC-C24TE1");
111 break;
112
113 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C4T1E1):
114 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C4T1E1_L):
115 len += sprintf (buffer + len, "wanPMC-C4T1E1");
116 break;
117 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C2T1E1):
118 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C2T1E1_L):
119 len += sprintf (buffer + len, "wanPMC-C2T1E1");
120 break;
121 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C1T1E1):
122 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C1T1E1_L):
123 len += sprintf (buffer + len, "wanPMC-C1T1E1");
124 break;
125
126 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPCI_C4T1E1):
127 len += sprintf (buffer + len, "wanPCI-C4T1E1");
128 break;
129 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPCI_C2T1E1):
130 len += sprintf (buffer + len, "wanPCI-C2T1E1");
131 break;
132 case SBE_BOARD_ID (PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPCI_C1T1E1):
133 len += sprintf (buffer + len, "wanPCI-C1T1E1");
134 break;
135
136 default:
137 len += sprintf (buffer + len, "unknown");
138 break;
139 }
140 len += sprintf (buffer + len, " [%08X]\n", bip->brd_id);
141 65
142 len += sprintf (buffer + len, "Board Number: %d\n", bip->brdno); 66/*
143 len += sprintf (buffer + len, "Hardware ID: 0x%02X\n", ci->hdw_bid); 67 * Describe the driver state through /proc
144 len += sprintf (buffer + len, "Board SN: %06X\n", bip->brd_sn); 68 */
145 len += sprintf(buffer + len, "Board MAC: %pMF\n", 69static int sbecom_proc_get_sbe_info(struct seq_file *m, void *v)
146 bip->brd_mac_addr); 70{
147 len += sprintf (buffer + len, "Ports: %d\n", ci->max_port); 71 ci_t *ci = m->private;
148 len += sprintf (buffer + len, "Channels: %d\n", bip->brd_chan_cnt); 72 char *spd;
73 struct sbe_brd_info *bip;
74
75 if (!(bip = OS_kmalloc(sizeof(struct sbe_brd_info))))
76 return -ENOMEM;
77
78 pr_devel(">> sbecom_proc_get_sbe_info: entered\n");
79
80 sbecom_proc_get_brdinfo(ci, bip);
81
82 seq_puts(m, "Board Type: ");
83 switch (bip->brd_id) {
84 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C1T3):
85 seq_puts(m, "wanPMC-C1T3");
86 break;
87 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPTMC_256T3_E1):
88 seq_puts(m, "wanPTMC-256T3 <E1>");
89 break;
90 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPTMC_256T3_T1):
91 seq_puts(m, "wanPTMC-256T3 <T1>");
92 break;
93 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPTMC_C24TE1):
94 seq_puts(m, "wanPTMC-C24TE1");
95 break;
96
97 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C4T1E1):
98 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C4T1E1_L):
99 seq_puts(m, "wanPMC-C4T1E1");
100 break;
101 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C2T1E1):
102 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C2T1E1_L):
103 seq_puts(m, "wanPMC-C2T1E1");
104 break;
105 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C1T1E1):
106 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPMC_C1T1E1_L):
107 seq_puts(m, "wanPMC-C1T1E1");
108 break;
109
110 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPCI_C4T1E1):
111 seq_puts(m, "wanPCI-C4T1E1");
112 break;
113 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPCI_C2T1E1):
114 seq_puts(m, "wanPCI-C2T1E1");
115 break;
116 case SBE_BOARD_ID(PCI_VENDOR_ID_SBE, PCI_DEVICE_ID_WANPCI_C1T1E1):
117 seq_puts(m, "wanPCI-C1T1E1");
118 break;
119
120 default:
121 seq_puts(m, "unknown");
122 break;
123 }
124
125 seq_printf(m, " [%08X]\n", bip->brd_id);
126
127 seq_printf(m, "Board Number: %d\n", bip->brdno);
128 seq_printf(m, "Hardware ID: 0x%02X\n", ci->hdw_bid);
129 seq_printf(m, "Board SN: %06X\n", bip->brd_sn);
130 seq_printf(m, "Board MAC: %pMF\n", bip->brd_mac_addr);
131 seq_printf(m, "Ports: %d\n", ci->max_port);
132 seq_printf(m, "Channels: %d\n", bip->brd_chan_cnt);
149#if 1 133#if 1
150 len += sprintf (buffer + len, "Interface: %s -> %s\n", 134 seq_printf(m, "Interface: %s -> %s\n",
151 (char *) &bip->first_iname, (char *) &bip->last_iname); 135 bip->first_iname, bip->last_iname);
152#else 136#else
153 len += sprintf (buffer + len, "Interface: <not available> 1st %p lst %p\n", 137 seq_printf(m, "Interface: <not available> 1st %p lst %p\n",
154 (char *) &bip->first_iname, (char *) &bip->last_iname); 138 bip->first_iname, bip->last_iname);
155#endif 139#endif
156 140
157 switch (bip->brd_pci_speed) 141 switch (bip->brd_pci_speed) {
158 { 142 case BINFO_PCI_SPEED_33:
159 case BINFO_PCI_SPEED_33: 143 spd = "33Mhz";
160 spd = "33Mhz"; 144 break;
161 break; 145 case BINFO_PCI_SPEED_66:
162 case BINFO_PCI_SPEED_66: 146 spd = "66Mhz";
163 spd = "66Mhz"; 147 break;
164 break; 148 default:
165 default: 149 spd = "<not available>";
166 spd = "<not available>"; 150 break;
167 break; 151 }
168 } 152 seq_printf(m, "PCI Bus Speed: %s\n", spd);
169 len += sprintf (buffer + len, "PCI Bus Speed: %s\n", spd); 153 seq_printf(m, "Release: %s\n", ci->release);
170 len += sprintf (buffer + len, "Release: %s\n", ci->release);
171 154
172#ifdef SBE_PMCC4_ENABLE 155#ifdef SBE_PMCC4_ENABLE
173 { 156 {
174 extern int cxt1e1_max_mru; 157 extern int cxt1e1_max_mru;
175#if 0
176 extern int max_chans_used;
177 extern int cxt1e1_max_mtu;
178#endif
179 extern int max_rxdesc_used, max_txdesc_used;
180
181 len += sprintf (buffer + len, "\ncxt1e1_max_mru: %d\n", cxt1e1_max_mru);
182#if 0 158#if 0
183 len += sprintf (buffer + len, "\nmax_chans_used: %d\n", max_chans_used); 159 extern int max_chans_used;
184 len += sprintf (buffer + len, "cxt1e1_max_mtu: %d\n", cxt1e1_max_mtu); 160 extern int cxt1e1_max_mtu;
185#endif
186 len += sprintf (buffer + len, "max_rxdesc_used: %d\n", max_rxdesc_used);
187 len += sprintf (buffer + len, "max_txdesc_used: %d\n", max_txdesc_used);
188 }
189#endif
190
191 OS_kfree (bip); /* cleanup */
192
193 /***
194 * How to be a proc read function
195 * ------------------------------
196 * Prototype:
197 * int f(char *buffer, char **start, off_t offset,
198 * int count, int *peof, void *dat)
199 *
200 * Assume that the buffer is "count" bytes in size.
201 *
202 * If you know you have supplied all the data you
203 * have, set *peof.
204 *
205 * You have three ways to return data:
206 * 0) Leave *start = NULL. (This is the default.)
207 * Put the data of the requested offset at that
208 * offset within the buffer. Return the number (n)
209 * of bytes there are from the beginning of the
210 * buffer up to the last byte of data. If the
211 * number of supplied bytes (= n - offset) is
212 * greater than zero and you didn't signal eof
213 * and the reader is prepared to take more data
214 * you will be called again with the requested
215 * offset advanced by the number of bytes
216 * absorbed. This interface is useful for files
217 * no larger than the buffer.
218 * 1) Set *start = an unsigned long value less than
219 * the buffer address but greater than zero.
220 * Put the data of the requested offset at the
221 * beginning of the buffer. Return the number of
222 * bytes of data placed there. If this number is
223 * greater than zero and you didn't signal eof
224 * and the reader is prepared to take more data
225 * you will be called again with the requested
226 * offset advanced by *start. This interface is
227 * useful when you have a large file consisting
228 * of a series of blocks which you want to count
229 * and return as wholes.
230 * (Hack by Paul.Russell@rustcorp.com.au)
231 * 2) Set *start = an address within the buffer.
232 * Put the data of the requested offset at *start.
233 * Return the number of bytes of data placed there.
234 * If this number is greater than zero and you
235 * didn't signal eof and the reader is prepared to
236 * take more data you will be called again with the
237 * requested offset advanced by the number of bytes
238 * absorbed.
239 */
240
241#if 1
242 /* #4 - interpretation of above = set EOF, return len */
243 *eof = 1;
244#endif 161#endif
162 extern int max_rxdesc_used, max_txdesc_used;
245 163
164 seq_printf(m, "\ncxt1e1_max_mru: %d\n", cxt1e1_max_mru);
246#if 0 165#if 0
247 /* 166 seq_printf(m, "\nmax_chans_used: %d\n", max_chans_used);
248 * #1 - from net/wireless/atmel.c RLD NOTE -there's something wrong with 167 seq_printf(m, "cxt1e1_max_mtu: %d\n", cxt1e1_max_mtu);
249 * this plagarized code which results in this routine being called TWICE.
250 * The second call returns ZERO, resulting in hidden failure, but at
251 * least only a single message set is being displayed.
252 */
253 if (len <= offset + length)
254 *eof = 1;
255 *start = buffer + offset;
256 len -= offset;
257 if (len > length)
258 len = length;
259 if (len < 0)
260 len = 0;
261#endif
262
263#if 0 /* #2 from net/tokenring/olympic.c +
264 * lanstreamer.c */
265 {
266 off_t begin = 0;
267 int size = 0;
268 off_t pos = 0;
269
270 size = len;
271 pos = begin + size;
272 if (pos < offset)
273 {
274 len = 0;
275 begin = pos;
276 }
277 *start = buffer + (offset - begin); /* Start of wanted data */
278 len -= (offset - begin); /* Start slop */
279 if (len > length)
280 len = length; /* Ending slop */
281 }
282#endif 168#endif
283 169 seq_printf(m, "max_rxdesc_used: %d\n", max_rxdesc_used);
284#if 0 /* #3 from 170 seq_printf(m, "max_txdesc_used: %d\n", max_txdesc_used);
285 * char/ftape/lowlevel/ftape-proc.c */ 171 }
286 len = strlen (buffer);
287 *start = NULL;
288 if (offset + length >= len)
289 *eof = 1;
290 else
291 *eof = 0;
292#endif
293
294#if 0
295 pr_info(">> proc_fs: returned len = %d., start %p\n", len, start); /* RLD DEBUG */
296#endif 172#endif
297 173
298/*** 174 kfree(bip);
299 using NONE: returns = 314.314.314.
300 using #1 : returns = 314, 0.
301 using #2 : returns = 314, 0, 0.
302 using #3 : returns = 314, 314.
303 using #4 : returns = 314, 314.
304***/
305 175
306 return len; 176 pr_devel(">> proc_fs: finished\n");
177 return 0;
307} 178}
308 179
309/* initialize the /proc subsystem for the specific SBE driver */ 180/*
310 181 * seq_file wrappers for procfile show routines.
311int __init 182 */
312sbecom_proc_brd_init (ci_t * ci) 183static int sbecom_proc_open(struct inode *inode, struct file *file)
313{ 184{
314 struct proc_dir_entry *e; 185 return single_open(file, sbecom_proc_get_sbe_info, PDE_DATA(inode));
315 char dir[7 + SBE_IFACETMPL_SIZE + 1];
316
317 /* create a directory in the root procfs */
318 snprintf(dir, sizeof(dir), "driver/%s", ci->devname);
319 ci->dir_dev = proc_mkdir(dir, NULL);
320 if (!ci->dir_dev)
321 {
322 pr_err("Unable to create directory /proc/driver/%s\n", ci->devname);
323 goto fail;
324 }
325 e = create_proc_read_entry ("info", S_IFREG | S_IRUGO,
326 ci->dir_dev, sbecom_proc_get_sbe_info, ci);
327 if (!e)
328 {
329 pr_err("Unable to create entry /proc/driver/%s/info\n", ci->devname);
330 goto fail;
331 }
332 return 0;
333
334fail:
335 sbecom_proc_brd_cleanup (ci);
336 return 1;
337} 186}
338 187
339#else /*** ! CONFIG_PROC_FS ***/ 188static const struct file_operations sbecom_proc_fops = {
189 .open = sbecom_proc_open,
190 .read = seq_read,
191 .llseek = seq_lseek,
192 .release = seq_release,
193};
340 194
341/* stubbed off dummy routines */ 195/*
342 196 * Initialize the /proc subsystem for the specific SBE driver
343void 197 */
344sbecom_proc_brd_cleanup (ci_t * ci) 198int __init sbecom_proc_brd_init(ci_t *ci)
345{
346}
347
348int __init
349sbecom_proc_brd_init (ci_t * ci)
350{ 199{
351 return 0; 200 char dir[7 + SBE_IFACETMPL_SIZE + 1];
352}
353
354#endif /*** CONFIG_PROC_FS ***/
355 201
202 snprintf(dir, sizeof(dir), "driver/%s", ci->devname);
203 ci->dir_dev = proc_mkdir(dir, NULL);
204 if (!ci->dir_dev) {
205 pr_err("Unable to create directory /proc/driver/%s\n", ci->devname);
206 goto fail;
207 }
208
209 if (!proc_create_data("info", S_IFREG | S_IRUGO, ci->dir_dev,
210 &sbecom_proc_fops, ci)) {
211 pr_err("Unable to create entry /proc/driver/%s/info\n", ci->devname);
212 goto fail;
213 }
214 return 0;
356 215
357/*** End-of-File ***/ 216fail:
217 sbecom_proc_brd_cleanup(ci);
218 return 1;
219}
diff --git a/drivers/staging/cxt1e1/sbeproc.h b/drivers/staging/cxt1e1/sbeproc.h
index e82be6afd1e8..e5c072cf1952 100644
--- a/drivers/staging/cxt1e1/sbeproc.h
+++ b/drivers/staging/cxt1e1/sbeproc.h
@@ -23,10 +23,20 @@
23 23
24 24
25#ifdef CONFIG_PROC_FS 25#ifdef CONFIG_PROC_FS
26#ifdef __KERNEL__
27void sbecom_proc_brd_cleanup (ci_t *); 26void sbecom_proc_brd_cleanup (ci_t *);
28int __init sbecom_proc_brd_init (ci_t *); 27int __init sbecom_proc_brd_init (ci_t *);
29 28
30#endif /*** __KERNEL__ ***/ 29#else
30
31static inline void sbecom_proc_brd_cleanup(ci_t * ci)
32{
33}
34
35static inline int __init sbecom_proc_brd_init(ci_t * ci)
36{
37 return 0;
38}
39
31#endif /*** CONFIG_PROC_FS ***/ 40#endif /*** CONFIG_PROC_FS ***/
41
32#endif /*** _INC_SBEPROC_H_ ***/ 42#endif /*** _INC_SBEPROC_H_ ***/
diff --git a/drivers/staging/dgrp/dgrp_common.c b/drivers/staging/dgrp/dgrp_common.c
index 3553998b72bc..9a9b45624ba9 100644
--- a/drivers/staging/dgrp/dgrp_common.c
+++ b/drivers/staging/dgrp/dgrp_common.c
@@ -167,34 +167,3 @@ void dgrp_carrier(struct ch_struct *ch)
167 ch->ch_flag &= ~CH_PHYS_CD; 167 ch->ch_flag &= ~CH_PHYS_CD;
168 168
169} 169}
170
171/**
172 * dgrp_chk_perm() -- check permissions for net device
173 * @inode: pointer to inode structure for the net communication device
174 * @op: operation to be tested
175 *
176 * The file permissions and ownerships are tested to determine whether
177 * the operation "op" is permitted on the file pointed to by the inode.
178 * Returns 0 if the operation is permitted, -EACCESS otherwise
179 */
180int dgrp_chk_perm(int mode, int op)
181{
182 if (!uid_eq(GLOBAL_ROOT_UID, current_euid()))
183 mode >>= 6;
184 else if (in_egroup_p(GLOBAL_ROOT_GID))
185 mode >>= 3;
186
187 if ((mode & op & 0007) == op)
188 return 0;
189
190 if (capable(CAP_SYS_ADMIN))
191 return 0;
192
193 return -EACCES;
194}
195
196/* dgrp_chk_perm wrapper for permission call in struct inode_operations */
197int dgrp_inode_permission(struct inode *inode, int op)
198{
199 return dgrp_chk_perm(inode->i_mode, op);
200}
diff --git a/drivers/staging/dgrp/dgrp_common.h b/drivers/staging/dgrp/dgrp_common.h
index 2832b8e26c4b..23aba6c4d22c 100644
--- a/drivers/staging/dgrp/dgrp_common.h
+++ b/drivers/staging/dgrp/dgrp_common.h
@@ -49,20 +49,20 @@ extern struct dgrp_poll_data dgrp_poll_data;
49extern void dgrp_poll_handler(unsigned long arg); 49extern void dgrp_poll_handler(unsigned long arg);
50 50
51/* from dgrp_mon_ops.c */ 51/* from dgrp_mon_ops.c */
52extern void dgrp_register_mon_hook(struct proc_dir_entry *de); 52extern const struct file_operations dgrp_mon_ops;
53 53
54/* from dgrp_tty.c */ 54/* from dgrp_tty.c */
55extern int dgrp_tty_init(struct nd_struct *nd); 55extern int dgrp_tty_init(struct nd_struct *nd);
56extern void dgrp_tty_uninit(struct nd_struct *nd); 56extern void dgrp_tty_uninit(struct nd_struct *nd);
57 57
58/* from dgrp_ports_ops.c */ 58/* from dgrp_ports_ops.c */
59extern void dgrp_register_ports_hook(struct proc_dir_entry *de); 59extern const struct file_operations dgrp_ports_ops;
60 60
61/* from dgrp_net_ops.c */ 61/* from dgrp_net_ops.c */
62extern void dgrp_register_net_hook(struct proc_dir_entry *de); 62extern const struct file_operations dgrp_net_ops;
63 63
64/* from dgrp_dpa_ops.c */ 64/* from dgrp_dpa_ops.c */
65extern void dgrp_register_dpa_hook(struct proc_dir_entry *de); 65extern const struct file_operations dgrp_dpa_ops;
66extern void dgrp_dpa_data(struct nd_struct *, int, u8 *, int); 66extern void dgrp_dpa_data(struct nd_struct *, int, u8 *, int);
67 67
68/* from dgrp_sysfs.c */ 68/* from dgrp_sysfs.c */
@@ -76,61 +76,6 @@ extern void dgrp_create_tty_sysfs(struct un_struct *un, struct device *c);
76extern void dgrp_remove_tty_sysfs(struct device *c); 76extern void dgrp_remove_tty_sysfs(struct device *c);
77 77
78/* from dgrp_specproc.c */ 78/* from dgrp_specproc.c */
79/*
80 * The list of DGRP entries with r/w capabilities. These
81 * magic numbers are used for identification purposes.
82 */
83enum {
84 DGRP_CONFIG = 1, /* Configure portservers */
85 DGRP_NETDIR = 2, /* Directory for "net" devices */
86 DGRP_MONDIR = 3, /* Directory for "mon" devices */
87 DGRP_PORTSDIR = 4, /* Directory for "ports" devices */
88 DGRP_INFO = 5, /* Get info. about the running module */
89 DGRP_NODEINFO = 6, /* Get info. about the configured nodes */
90 DGRP_DPADIR = 7, /* Directory for the "dpa" devices */
91};
92
93/*
94 * Directions for proc handlers
95 */
96enum {
97 INBOUND = 1, /* Data being written to kernel */
98 OUTBOUND = 2, /* Data being read from the kernel */
99};
100
101/**
102 * dgrp_proc_entry: structure for dgrp proc dirs
103 * @id: ID number associated with this particular entry. Should be
104 * unique across all of DGRP.
105 * @name: text name associated with the /proc entry
106 * @mode: file access permisssions for the /proc entry
107 * @child: pointer to table describing a subdirectory for this entry
108 * @de: pointer to directory entry for this object once registered. Used
109 * to grab the handle of the object for unregistration
110 * @excl_sem: semaphore to provide exclusive to struct
111 * @excl_cnt: counter of current accesses
112 *
113 * Each entry in a DGRP proc directory is described with a
114 * dgrp_proc_entry structure. A collection of these
115 * entries (in an array) represents the members associated
116 * with a particular /proc directory, and is referred to
117 * as a table. All tables are terminated by an entry with
118 * zeros for every member.
119 */
120struct dgrp_proc_entry {
121 int id; /* Integer identifier */
122 const char *name; /* ASCII identifier */
123 mode_t mode; /* File access permissions */
124 struct dgrp_proc_entry *child; /* Child pointer */
125
126 /* file ops to use, pass NULL to use default */
127 struct file_operations *proc_file_ops;
128
129 struct proc_dir_entry *de; /* proc entry pointer */
130 struct semaphore excl_sem; /* Protects exclusive access var */
131 int excl_cnt; /* Counts number of curr accesses */
132};
133
134extern void dgrp_unregister_proc(void); 79extern void dgrp_unregister_proc(void);
135extern void dgrp_register_proc(void); 80extern void dgrp_register_proc(void);
136 81
@@ -144,8 +89,6 @@ extern void dgrp_register_proc(void);
144 *-----------------------------------------------------------------------*/ 89 *-----------------------------------------------------------------------*/
145 90
146void dgrp_carrier(struct ch_struct *ch); 91void dgrp_carrier(struct ch_struct *ch);
147extern int dgrp_inode_permission(struct inode *inode, int op);
148extern int dgrp_chk_perm(int mode, int op);
149 92
150 93
151/* 94/*
diff --git a/drivers/staging/dgrp/dgrp_dpa_ops.c b/drivers/staging/dgrp/dgrp_dpa_ops.c
index ca10a3362e29..114799cddd85 100644
--- a/drivers/staging/dgrp/dgrp_dpa_ops.c
+++ b/drivers/staging/dgrp/dgrp_dpa_ops.c
@@ -40,6 +40,7 @@
40#include <linux/cred.h> 40#include <linux/cred.h>
41#include <linux/sched.h> 41#include <linux/sched.h>
42#include <linux/ratelimit.h> 42#include <linux/ratelimit.h>
43#include <linux/slab.h>
43#include <asm/unaligned.h> 44#include <asm/unaligned.h>
44 45
45#include "dgrp_common.h" 46#include "dgrp_common.h"
@@ -52,7 +53,7 @@ static long dgrp_dpa_ioctl(struct file *file, unsigned int cmd,
52 unsigned long arg); 53 unsigned long arg);
53static unsigned int dgrp_dpa_select(struct file *, struct poll_table_struct *); 54static unsigned int dgrp_dpa_select(struct file *, struct poll_table_struct *);
54 55
55static const struct file_operations dpa_ops = { 56const struct file_operations dgrp_dpa_ops = {
56 .owner = THIS_MODULE, 57 .owner = THIS_MODULE,
57 .read = dgrp_dpa_read, 58 .read = dgrp_dpa_read,
58 .poll = dgrp_dpa_select, 59 .poll = dgrp_dpa_select,
@@ -61,12 +62,6 @@ static const struct file_operations dpa_ops = {
61 .release = dgrp_dpa_release, 62 .release = dgrp_dpa_release,
62}; 63};
63 64
64static struct inode_operations dpa_inode_ops = {
65 .permission = dgrp_inode_permission
66};
67
68
69
70struct digi_node { 65struct digi_node {
71 uint nd_state; /* Node state: 1 = up, 0 = down. */ 66 uint nd_state; /* Node state: 1 = up, 0 = down. */
72 uint nd_chan_count; /* Number of channels found */ 67 uint nd_chan_count; /* Number of channels found */
@@ -111,17 +106,6 @@ struct digi_debug {
111#define DIGI_SETDEBUG (('d'<<8) | 247) /* set debug info */ 106#define DIGI_SETDEBUG (('d'<<8) | 247) /* set debug info */
112 107
113 108
114void dgrp_register_dpa_hook(struct proc_dir_entry *de)
115{
116 struct nd_struct *node = de->data;
117
118 de->proc_iops = &dpa_inode_ops;
119 rcu_assign_pointer(de->proc_fops, &dpa_ops);
120
121 node->nd_dpa_de = de;
122 spin_lock_init(&node->nd_dpa_lock);
123}
124
125/* 109/*
126 * dgrp_dpa_open -- open the DPA device for a particular PortServer 110 * dgrp_dpa_open -- open the DPA device for a particular PortServer
127 */ 111 */
@@ -130,8 +114,6 @@ static int dgrp_dpa_open(struct inode *inode, struct file *file)
130 struct nd_struct *nd; 114 struct nd_struct *nd;
131 int rtn = 0; 115 int rtn = 0;
132 116
133 struct proc_dir_entry *de;
134
135 rtn = try_module_get(THIS_MODULE); 117 rtn = try_module_get(THIS_MODULE);
136 if (!rtn) 118 if (!rtn)
137 return -ENXIO; 119 return -ENXIO;
@@ -154,12 +136,7 @@ static int dgrp_dpa_open(struct inode *inode, struct file *file)
154 /* 136 /*
155 * Get the node pointer, and fail if it doesn't exist. 137 * Get the node pointer, and fail if it doesn't exist.
156 */ 138 */
157 de = PDE(inode); 139 nd = PDE_DATA(inode);
158 if (!de) {
159 rtn = -ENXIO;
160 goto done;
161 }
162 nd = (struct nd_struct *)de->data;
163 if (!nd) { 140 if (!nd) {
164 rtn = -ENXIO; 141 rtn = -ENXIO;
165 goto done; 142 goto done;
diff --git a/drivers/staging/dgrp/dgrp_mon_ops.c b/drivers/staging/dgrp/dgrp_mon_ops.c
index b484fccb494e..d18be4180e3b 100644
--- a/drivers/staging/dgrp/dgrp_mon_ops.c
+++ b/drivers/staging/dgrp/dgrp_mon_ops.c
@@ -37,6 +37,7 @@
37#include <linux/tty.h> 37#include <linux/tty.h>
38#include <linux/sched.h> 38#include <linux/sched.h>
39#include <asm/unaligned.h> 39#include <asm/unaligned.h>
40#include <linux/slab.h>
40#include <linux/proc_fs.h> 41#include <linux/proc_fs.h>
41#include <linux/uaccess.h> 42#include <linux/uaccess.h>
42 43
@@ -49,7 +50,7 @@ static ssize_t dgrp_mon_read(struct file *, char __user *, size_t, loff_t *);
49static long dgrp_mon_ioctl(struct file *file, unsigned int cmd, 50static long dgrp_mon_ioctl(struct file *file, unsigned int cmd,
50 unsigned long arg); 51 unsigned long arg);
51 52
52static const struct file_operations mon_ops = { 53const struct file_operations dgrp_mon_ops = {
53 .owner = THIS_MODULE, 54 .owner = THIS_MODULE,
54 .read = dgrp_mon_read, 55 .read = dgrp_mon_read,
55 .unlocked_ioctl = dgrp_mon_ioctl, 56 .unlocked_ioctl = dgrp_mon_ioctl,
@@ -57,20 +58,6 @@ static const struct file_operations mon_ops = {
57 .release = dgrp_mon_release, 58 .release = dgrp_mon_release,
58}; 59};
59 60
60static struct inode_operations mon_inode_ops = {
61 .permission = dgrp_inode_permission
62};
63
64void dgrp_register_mon_hook(struct proc_dir_entry *de)
65{
66 struct nd_struct *node = de->data;
67
68 de->proc_iops = &mon_inode_ops;
69 rcu_assign_pointer(de->proc_fops, &mon_ops);
70 node->nd_mon_de = de;
71 sema_init(&node->nd_mon_semaphore, 1);
72}
73
74/** 61/**
75 * dgrp_mon_open() -- open /proc/dgrp/ports device for a PortServer 62 * dgrp_mon_open() -- open /proc/dgrp/ports device for a PortServer
76 * @inode: struct inode * 63 * @inode: struct inode *
@@ -81,7 +68,6 @@ void dgrp_register_mon_hook(struct proc_dir_entry *de)
81static int dgrp_mon_open(struct inode *inode, struct file *file) 68static int dgrp_mon_open(struct inode *inode, struct file *file)
82{ 69{
83 struct nd_struct *nd; 70 struct nd_struct *nd;
84 struct proc_dir_entry *de;
85 struct timeval tv; 71 struct timeval tv;
86 uint32_t time; 72 uint32_t time;
87 u8 *buf; 73 u8 *buf;
@@ -109,13 +95,7 @@ static int dgrp_mon_open(struct inode *inode, struct file *file)
109 /* 95 /*
110 * Get the node pointer, and fail if it doesn't exist. 96 * Get the node pointer, and fail if it doesn't exist.
111 */ 97 */
112 de = PDE(inode); 98 nd = PDE_DATA(inode);
113 if (!de) {
114 rtn = -ENXIO;
115 goto done;
116 }
117
118 nd = (struct nd_struct *)de->data;
119 if (!nd) { 99 if (!nd) {
120 rtn = -ENXIO; 100 rtn = -ENXIO;
121 goto done; 101 goto done;
diff --git a/drivers/staging/dgrp/dgrp_net_ops.c b/drivers/staging/dgrp/dgrp_net_ops.c
index 64f48ffb9d4e..5b7833f593ff 100644
--- a/drivers/staging/dgrp/dgrp_net_ops.c
+++ b/drivers/staging/dgrp/dgrp_net_ops.c
@@ -35,7 +35,7 @@
35 35
36#include <linux/module.h> 36#include <linux/module.h>
37#include <linux/proc_fs.h> 37#include <linux/proc_fs.h>
38#include <linux/types.h> 38#include <linux/slab.h>
39#include <linux/string.h> 39#include <linux/string.h>
40#include <linux/device.h> 40#include <linux/device.h>
41#include <linux/tty.h> 41#include <linux/tty.h>
@@ -72,7 +72,7 @@ static long dgrp_net_ioctl(struct file *file, unsigned int cmd,
72static unsigned int dgrp_net_select(struct file *file, 72static unsigned int dgrp_net_select(struct file *file,
73 struct poll_table_struct *table); 73 struct poll_table_struct *table);
74 74
75static const struct file_operations net_ops = { 75const struct file_operations dgrp_net_ops = {
76 .owner = THIS_MODULE, 76 .owner = THIS_MODULE,
77 .read = dgrp_net_read, 77 .read = dgrp_net_read,
78 .write = dgrp_net_write, 78 .write = dgrp_net_write,
@@ -82,23 +82,6 @@ static const struct file_operations net_ops = {
82 .release = dgrp_net_release, 82 .release = dgrp_net_release,
83}; 83};
84 84
85static struct inode_operations net_inode_ops = {
86 .permission = dgrp_inode_permission
87};
88
89void dgrp_register_net_hook(struct proc_dir_entry *de)
90{
91 struct nd_struct *node = de->data;
92
93 de->proc_iops = &net_inode_ops;
94 rcu_assign_pointer(de->proc_fops, &net_ops);
95 node->nd_net_de = de;
96 sema_init(&node->nd_net_semaphore, 1);
97 node->nd_state = NS_CLOSED;
98 dgrp_create_node_class_sysfs_files(node);
99}
100
101
102/** 85/**
103 * dgrp_dump() -- prints memory for debugging purposes. 86 * dgrp_dump() -- prints memory for debugging purposes.
104 * @mem: Memory location which should be printed to the console 87 * @mem: Memory location which should be printed to the console
@@ -801,7 +784,6 @@ out_err:
801static int dgrp_net_open(struct inode *inode, struct file *file) 784static int dgrp_net_open(struct inode *inode, struct file *file)
802{ 785{
803 struct nd_struct *nd; 786 struct nd_struct *nd;
804 struct proc_dir_entry *de;
805 ulong lock_flags; 787 ulong lock_flags;
806 int rtn; 788 int rtn;
807 789
@@ -825,13 +807,7 @@ static int dgrp_net_open(struct inode *inode, struct file *file)
825 /* 807 /*
826 * Get the node pointer, and fail if it doesn't exist. 808 * Get the node pointer, and fail if it doesn't exist.
827 */ 809 */
828 de = PDE(inode); 810 nd = PDE_DATA(inode);
829 if (!de) {
830 rtn = -ENXIO;
831 goto done;
832 }
833
834 nd = (struct nd_struct *) de->data;
835 if (!nd) { 811 if (!nd) {
836 rtn = -ENXIO; 812 rtn = -ENXIO;
837 goto done; 813 goto done;
diff --git a/drivers/staging/dgrp/dgrp_ports_ops.c b/drivers/staging/dgrp/dgrp_ports_ops.c
index f93dc1f262f5..4ce030815f27 100644
--- a/drivers/staging/dgrp/dgrp_ports_ops.c
+++ b/drivers/staging/dgrp/dgrp_ports_ops.c
@@ -47,7 +47,7 @@
47/* File operation declarations */ 47/* File operation declarations */
48static int dgrp_ports_open(struct inode *, struct file *); 48static int dgrp_ports_open(struct inode *, struct file *);
49 49
50static const struct file_operations ports_ops = { 50const struct file_operations dgrp_ports_ops = {
51 .owner = THIS_MODULE, 51 .owner = THIS_MODULE,
52 .open = dgrp_ports_open, 52 .open = dgrp_ports_open,
53 .read = seq_read, 53 .read = seq_read,
@@ -55,20 +55,6 @@ static const struct file_operations ports_ops = {
55 .release = seq_release 55 .release = seq_release
56}; 56};
57 57
58static struct inode_operations ports_inode_ops = {
59 .permission = dgrp_inode_permission
60};
61
62
63void dgrp_register_ports_hook(struct proc_dir_entry *de)
64{
65 struct nd_struct *node = de->data;
66
67 de->proc_iops = &ports_inode_ops;
68 rcu_assign_pointer(de->proc_fops, &ports_ops);
69 node->nd_ports_de = de;
70}
71
72static void *dgrp_ports_seq_start(struct seq_file *seq, loff_t *pos) 58static void *dgrp_ports_seq_start(struct seq_file *seq, loff_t *pos)
73{ 59{
74 if (*pos == 0) 60 if (*pos == 0)
@@ -163,7 +149,7 @@ static int dgrp_ports_open(struct inode *inode, struct file *file)
163 rtn = seq_open(file, &ports_seq_ops); 149 rtn = seq_open(file, &ports_seq_ops);
164 if (!rtn) { 150 if (!rtn) {
165 seq = file->private_data; 151 seq = file->private_data;
166 seq->private = PDE(inode)->data; 152 seq->private = PDE_DATA(inode);
167 } 153 }
168 154
169 return rtn; 155 return rtn;
diff --git a/drivers/staging/dgrp/dgrp_specproc.c b/drivers/staging/dgrp/dgrp_specproc.c
index d66712c8aa94..205d80ef4455 100644
--- a/drivers/staging/dgrp/dgrp_specproc.c
+++ b/drivers/staging/dgrp/dgrp_specproc.c
@@ -37,6 +37,7 @@
37#include <linux/sched.h> 37#include <linux/sched.h>
38#include <linux/cred.h> 38#include <linux/cred.h>
39#include <linux/proc_fs.h> 39#include <linux/proc_fs.h>
40#include <linux/slab.h>
40#include <linux/ctype.h> 41#include <linux/ctype.h>
41#include <linux/seq_file.h> 42#include <linux/seq_file.h>
42#include <linux/uaccess.h> 43#include <linux/uaccess.h>
@@ -44,43 +45,17 @@
44 45
45#include "dgrp_common.h" 46#include "dgrp_common.h"
46 47
47static struct dgrp_proc_entry dgrp_table[];
48static struct proc_dir_entry *dgrp_proc_dir_entry; 48static struct proc_dir_entry *dgrp_proc_dir_entry;
49 49
50static int dgrp_add_id(long id); 50static int dgrp_add_id(long id);
51static int dgrp_remove_nd(struct nd_struct *nd); 51static int dgrp_remove_nd(struct nd_struct *nd);
52static void unregister_dgrp_device(struct proc_dir_entry *de); 52static struct proc_dir_entry *add_proc_file(struct nd_struct *node,
53static void register_dgrp_device(struct nd_struct *node,
54 struct proc_dir_entry *root, 53 struct proc_dir_entry *root,
55 void (*register_hook)(struct proc_dir_entry *de)); 54 const struct file_operations *fops);
56 55
57/* File operation declarations */ 56/* File operation declarations */
58static int dgrp_gen_proc_open(struct inode *, struct file *);
59static int dgrp_gen_proc_close(struct inode *, struct file *);
60static int parse_write_config(char *); 57static int parse_write_config(char *);
61 58
62
63static const struct file_operations dgrp_proc_file_ops = {
64 .owner = THIS_MODULE,
65 .open = dgrp_gen_proc_open,
66 .release = dgrp_gen_proc_close,
67};
68
69static struct inode_operations proc_inode_ops = {
70 .permission = dgrp_inode_permission
71};
72
73
74static void register_proc_table(struct dgrp_proc_entry *,
75 struct proc_dir_entry *);
76static void unregister_proc_table(struct dgrp_proc_entry *,
77 struct proc_dir_entry *);
78
79static struct dgrp_proc_entry dgrp_net_table[];
80static struct dgrp_proc_entry dgrp_mon_table[];
81static struct dgrp_proc_entry dgrp_ports_table[];
82static struct dgrp_proc_entry dgrp_dpa_table[];
83
84static ssize_t dgrp_config_proc_write(struct file *file, 59static ssize_t dgrp_config_proc_write(struct file *file,
85 const char __user *buffer, 60 const char __user *buffer,
86 size_t count, loff_t *pos); 61 size_t count, loff_t *pos);
@@ -89,7 +64,7 @@ static int dgrp_nodeinfo_proc_open(struct inode *inode, struct file *file);
89static int dgrp_info_proc_open(struct inode *inode, struct file *file); 64static int dgrp_info_proc_open(struct inode *inode, struct file *file);
90static int dgrp_config_proc_open(struct inode *inode, struct file *file); 65static int dgrp_config_proc_open(struct inode *inode, struct file *file);
91 66
92static struct file_operations config_proc_file_ops = { 67static const struct file_operations config_proc_file_ops = {
93 .owner = THIS_MODULE, 68 .owner = THIS_MODULE,
94 .open = dgrp_config_proc_open, 69 .open = dgrp_config_proc_open,
95 .read = seq_read, 70 .read = seq_read,
@@ -98,7 +73,7 @@ static struct file_operations config_proc_file_ops = {
98 .write = dgrp_config_proc_write, 73 .write = dgrp_config_proc_write,
99}; 74};
100 75
101static struct file_operations info_proc_file_ops = { 76static const struct file_operations info_proc_file_ops = {
102 .owner = THIS_MODULE, 77 .owner = THIS_MODULE,
103 .open = dgrp_info_proc_open, 78 .open = dgrp_info_proc_open,
104 .read = seq_read, 79 .read = seq_read,
@@ -106,7 +81,7 @@ static struct file_operations info_proc_file_ops = {
106 .release = single_release, 81 .release = single_release,
107}; 82};
108 83
109static struct file_operations nodeinfo_proc_file_ops = { 84static const struct file_operations nodeinfo_proc_file_ops = {
110 .owner = THIS_MODULE, 85 .owner = THIS_MODULE,
111 .open = dgrp_nodeinfo_proc_open, 86 .open = dgrp_nodeinfo_proc_open,
112 .read = seq_read, 87 .read = seq_read,
@@ -114,71 +89,25 @@ static struct file_operations nodeinfo_proc_file_ops = {
114 .release = seq_release, 89 .release = seq_release,
115}; 90};
116 91
117static struct dgrp_proc_entry dgrp_table[] = {
118 {
119 .id = DGRP_CONFIG,
120 .name = "config",
121 .mode = 0644,
122 .proc_file_ops = &config_proc_file_ops,
123 },
124 {
125 .id = DGRP_INFO,
126 .name = "info",
127 .mode = 0644,
128 .proc_file_ops = &info_proc_file_ops,
129 },
130 {
131 .id = DGRP_NODEINFO,
132 .name = "nodeinfo",
133 .mode = 0644,
134 .proc_file_ops = &nodeinfo_proc_file_ops,
135 },
136 {
137 .id = DGRP_NETDIR,
138 .name = "net",
139 .mode = 0500,
140 .child = dgrp_net_table
141 },
142 {
143 .id = DGRP_MONDIR,
144 .name = "mon",
145 .mode = 0500,
146 .child = dgrp_mon_table
147 },
148 {
149 .id = DGRP_PORTSDIR,
150 .name = "ports",
151 .mode = 0500,
152 .child = dgrp_ports_table
153 },
154 {
155 .id = DGRP_DPADIR,
156 .name = "dpa",
157 .mode = 0500,
158 .child = dgrp_dpa_table
159 }
160};
161
162static struct proc_dir_entry *net_entry_pointer; 92static struct proc_dir_entry *net_entry_pointer;
163static struct proc_dir_entry *mon_entry_pointer; 93static struct proc_dir_entry *mon_entry_pointer;
164static struct proc_dir_entry *dpa_entry_pointer; 94static struct proc_dir_entry *dpa_entry_pointer;
165static struct proc_dir_entry *ports_entry_pointer; 95static struct proc_dir_entry *ports_entry_pointer;
166 96
167static struct dgrp_proc_entry dgrp_net_table[] = { 97static void remove_files(struct nd_struct *nd)
168 {0} 98{
169}; 99 char buf[3];
170 100 ID_TO_CHAR(nd->nd_ID, buf);
171static struct dgrp_proc_entry dgrp_mon_table[] = { 101 dgrp_remove_node_class_sysfs_files(nd);
172 {0} 102 if (nd->nd_net_de)
173}; 103 remove_proc_entry(buf, net_entry_pointer);
174 104 if (nd->nd_mon_de)
175static struct dgrp_proc_entry dgrp_ports_table[] = { 105 remove_proc_entry(buf, mon_entry_pointer);
176 {0} 106 if (nd->nd_dpa_de)
177}; 107 remove_proc_entry(buf, dpa_entry_pointer);
178 108 if (nd->nd_ports_de)
179static struct dgrp_proc_entry dgrp_dpa_table[] = { 109 remove_proc_entry(buf, ports_entry_pointer);
180 {0} 110}
181};
182 111
183void dgrp_unregister_proc(void) 112void dgrp_unregister_proc(void)
184{ 113{
@@ -188,12 +117,19 @@ void dgrp_unregister_proc(void)
188 ports_entry_pointer = NULL; 117 ports_entry_pointer = NULL;
189 118
190 if (dgrp_proc_dir_entry) { 119 if (dgrp_proc_dir_entry) {
191 unregister_proc_table(dgrp_table, dgrp_proc_dir_entry); 120 struct nd_struct *nd;
192 remove_proc_entry(dgrp_proc_dir_entry->name, 121 list_for_each_entry(nd, &nd_struct_list, list)
193 dgrp_proc_dir_entry->parent); 122 remove_files(nd);
123 remove_proc_entry("dgrp/config", NULL);
124 remove_proc_entry("dgrp/info", NULL);
125 remove_proc_entry("dgrp/nodeinfo", NULL);
126 remove_proc_entry("dgrp/net", NULL);
127 remove_proc_entry("dgrp/mon", NULL);
128 remove_proc_entry("dgrp/dpa", NULL);
129 remove_proc_entry("dgrp/ports", NULL);
130 remove_proc_entry("dgrp", NULL);
194 dgrp_proc_dir_entry = NULL; 131 dgrp_proc_dir_entry = NULL;
195 } 132 }
196
197} 133}
198 134
199void dgrp_register_proc(void) 135void dgrp_register_proc(void)
@@ -201,211 +137,16 @@ void dgrp_register_proc(void)
201 /* 137 /*
202 * Register /proc/dgrp 138 * Register /proc/dgrp
203 */ 139 */
204 dgrp_proc_dir_entry = proc_create("dgrp", S_IFDIR, NULL, 140 dgrp_proc_dir_entry = proc_mkdir("dgrp", NULL);
205 &dgrp_proc_file_ops); 141 if (!dgrp_proc_dir_entry)
206 register_proc_table(dgrp_table, dgrp_proc_dir_entry);
207}
208
209/*
210 * /proc/sys support
211 */
212static int dgrp_proc_match(int len, const char *name, struct proc_dir_entry *de)
213{
214 if (!de || !de->low_ino)
215 return 0;
216 if (de->namelen != len)
217 return 0;
218 return !memcmp(name, de->name, len);
219}
220
221
222/*
223 * Scan the entries in table and add them all to /proc at the position
224 * referred to by "root"
225 */
226static void register_proc_table(struct dgrp_proc_entry *table,
227 struct proc_dir_entry *root)
228{
229 struct proc_dir_entry *de;
230 int len;
231 mode_t mode;
232
233 if (table == NULL)
234 return; 142 return;
235 if (root == NULL) 143 proc_create("dgrp/config", 0644, NULL, &config_proc_file_ops);
236 return; 144 proc_create("dgrp/info", 0644, NULL, &info_proc_file_ops);
237 145 proc_create("dgrp/nodeinfo", 0644, NULL, &nodeinfo_proc_file_ops);
238 for (; table->id; table++) { 146 net_entry_pointer = proc_mkdir_mode("dgrp/net", 0500, NULL);
239 /* Can't do anything without a proc name. */ 147 mon_entry_pointer = proc_mkdir_mode("dgrp/mon", 0500, NULL);
240 if (!table->name) 148 dpa_entry_pointer = proc_mkdir_mode("dgrp/dpa", 0500, NULL);
241 continue; 149 ports_entry_pointer = proc_mkdir_mode("dgrp/ports", 0500, NULL);
242
243 /* Maybe we can't do anything with it... */
244 if (!table->proc_file_ops &&
245 !table->child) {
246 pr_warn("dgrp: Can't register %s\n",
247 table->name);
248 continue;
249 }
250
251 len = strlen(table->name);
252 mode = table->mode;
253
254 de = NULL;
255 if (!table->child)
256 mode |= S_IFREG;
257 else {
258 mode |= S_IFDIR;
259 for (de = root->subdir; de; de = de->next) {
260 if (dgrp_proc_match(len, table->name, de))
261 break;
262 }
263 /* If the subdir exists already, de is non-NULL */
264 }
265
266 if (!de) {
267 de = create_proc_entry(table->name, mode, root);
268 if (!de)
269 continue;
270 de->data = (void *) table;
271 if (!table->child) {
272 de->proc_iops = &proc_inode_ops;
273 if (table->proc_file_ops)
274 rcu_assign_pointer(de->proc_fops,
275 table->proc_file_ops);
276 else
277 rcu_assign_pointer(de->proc_fops,
278 &dgrp_proc_file_ops);
279 }
280 }
281 table->de = de;
282 if (de->mode & S_IFDIR)
283 register_proc_table(table->child, de);
284
285 if (table->id == DGRP_NETDIR)
286 net_entry_pointer = de;
287
288 if (table->id == DGRP_MONDIR)
289 mon_entry_pointer = de;
290
291 if (table->id == DGRP_DPADIR)
292 dpa_entry_pointer = de;
293
294 if (table->id == DGRP_PORTSDIR)
295 ports_entry_pointer = de;
296 }
297}
298
299/*
300 * Unregister a /proc sysctl table and any subdirectories.
301 */
302static void unregister_proc_table(struct dgrp_proc_entry *table,
303 struct proc_dir_entry *root)
304{
305 struct proc_dir_entry *de;
306 struct nd_struct *tmp;
307
308 if (table == NULL)
309 return;
310
311 list_for_each_entry(tmp, &nd_struct_list, list) {
312 if ((table == dgrp_net_table) && (tmp->nd_net_de)) {
313 unregister_dgrp_device(tmp->nd_net_de);
314 dgrp_remove_node_class_sysfs_files(tmp);
315 }
316
317 if ((table == dgrp_mon_table) && (tmp->nd_mon_de))
318 unregister_dgrp_device(tmp->nd_mon_de);
319
320 if ((table == dgrp_dpa_table) && (tmp->nd_dpa_de))
321 unregister_dgrp_device(tmp->nd_dpa_de);
322
323 if ((table == dgrp_ports_table) && (tmp->nd_ports_de))
324 unregister_dgrp_device(tmp->nd_ports_de);
325 }
326
327 for (; table->id; table++) {
328 de = table->de;
329
330 if (!de)
331 continue;
332 if (de->mode & S_IFDIR) {
333 if (!table->child) {
334 pr_alert("dgrp: malformed sysctl tree on free\n");
335 continue;
336 }
337 unregister_proc_table(table->child, de);
338
339 /* Don't unregister directories which still have entries */
340 if (de->subdir)
341 continue;
342 }
343
344 /* Don't unregister proc entries that are still being used.. */
345 if ((atomic_read(&de->count)) != 1) {
346 pr_alert("proc entry %s in use, not removing\n",
347 de->name);
348 continue;
349 }
350
351 remove_proc_entry(de->name, de->parent);
352 table->de = NULL;
353 }
354}
355
356static int dgrp_gen_proc_open(struct inode *inode, struct file *file)
357{
358 struct proc_dir_entry *de;
359 struct dgrp_proc_entry *entry;
360 int ret = 0;
361
362 de = (struct proc_dir_entry *) PDE(file_inode(file));
363 if (!de || !de->data) {
364 ret = -ENXIO;
365 goto done;
366 }
367
368 entry = (struct dgrp_proc_entry *) de->data;
369 if (!entry) {
370 ret = -ENXIO;
371 goto done;
372 }
373
374 down(&entry->excl_sem);
375
376 if (entry->excl_cnt)
377 ret = -EBUSY;
378 else
379 entry->excl_cnt++;
380
381 up(&entry->excl_sem);
382
383done:
384 return ret;
385}
386
387static int dgrp_gen_proc_close(struct inode *inode, struct file *file)
388{
389 struct proc_dir_entry *de;
390 struct dgrp_proc_entry *entry;
391
392 de = (struct proc_dir_entry *) PDE(file_inode(file));
393 if (!de || !de->data)
394 goto done;
395
396 entry = (struct dgrp_proc_entry *) de->data;
397 if (!entry)
398 goto done;
399
400 down(&entry->excl_sem);
401
402 if (entry->excl_cnt)
403 entry->excl_cnt = 0;
404
405 up(&entry->excl_sem);
406
407done:
408 return 0;
409} 150}
410 151
411static void *dgrp_config_proc_start(struct seq_file *m, loff_t *pos) 152static void *dgrp_config_proc_start(struct seq_file *m, loff_t *pos)
@@ -736,6 +477,10 @@ static int dgrp_add_id(long id)
736 init_waitqueue_head(&nd->nd_tx_waitq); 477 init_waitqueue_head(&nd->nd_tx_waitq);
737 init_waitqueue_head(&nd->nd_mon_wqueue); 478 init_waitqueue_head(&nd->nd_mon_wqueue);
738 init_waitqueue_head(&nd->nd_dpa_wqueue); 479 init_waitqueue_head(&nd->nd_dpa_wqueue);
480 sema_init(&nd->nd_mon_semaphore, 1);
481 sema_init(&nd->nd_net_semaphore, 1);
482 spin_lock_init(&nd->nd_dpa_lock);
483 nd->nd_state = NS_CLOSED;
739 for (i = 0; i < SEQ_MAX; i++) 484 for (i = 0; i < SEQ_MAX; i++)
740 init_waitqueue_head(&nd->nd_seq_wque[i]); 485 init_waitqueue_head(&nd->nd_seq_wque[i]);
741 486
@@ -750,12 +495,12 @@ static int dgrp_add_id(long id)
750 if (ret) 495 if (ret)
751 goto error_out; 496 goto error_out;
752 497
753 register_dgrp_device(nd, net_entry_pointer, dgrp_register_net_hook); 498 dgrp_create_node_class_sysfs_files(nd);
754 register_dgrp_device(nd, mon_entry_pointer, dgrp_register_mon_hook); 499 nd->nd_net_de = add_proc_file(nd, net_entry_pointer, &dgrp_net_ops);
755 register_dgrp_device(nd, dpa_entry_pointer, dgrp_register_dpa_hook); 500 nd->nd_mon_de = add_proc_file(nd, mon_entry_pointer, &dgrp_mon_ops);
756 register_dgrp_device(nd, ports_entry_pointer, 501 nd->nd_dpa_de = add_proc_file(nd, dpa_entry_pointer, &dgrp_dpa_ops);
757 dgrp_register_ports_hook); 502 nd->nd_ports_de = add_proc_file(nd, ports_entry_pointer,
758 503 &dgrp_ports_ops);
759 return 0; 504 return 0;
760 505
761 /* FIXME this guy should free the tty driver stored in nd and destroy 506 /* FIXME this guy should free the tty driver stored in nd and destroy
@@ -774,16 +519,7 @@ static int dgrp_remove_nd(struct nd_struct *nd)
774 if (nd->nd_tty_ref_cnt) 519 if (nd->nd_tty_ref_cnt)
775 return -EBUSY; 520 return -EBUSY;
776 521
777 if (nd->nd_net_de) { 522 remove_files(nd);
778 unregister_dgrp_device(nd->nd_net_de);
779 dgrp_remove_node_class_sysfs_files(nd);
780 }
781
782 unregister_dgrp_device(nd->nd_mon_de);
783
784 unregister_dgrp_device(nd->nd_ports_de);
785
786 unregister_dgrp_device(nd->nd_dpa_de);
787 523
788 dgrp_tty_uninit(nd); 524 dgrp_tty_uninit(nd);
789 525
@@ -795,38 +531,11 @@ static int dgrp_remove_nd(struct nd_struct *nd)
795 return 0; 531 return 0;
796} 532}
797 533
798static void register_dgrp_device(struct nd_struct *node, 534static struct proc_dir_entry *add_proc_file(struct nd_struct *node,
799 struct proc_dir_entry *root, 535 struct proc_dir_entry *root,
800 void (*register_hook)(struct proc_dir_entry *de)) 536 const struct file_operations *fops)
801{ 537{
802 char buf[3]; 538 char buf[3];
803 struct proc_dir_entry *de;
804
805 ID_TO_CHAR(node->nd_ID, buf); 539 ID_TO_CHAR(node->nd_ID, buf);
806 540 return proc_create_data(buf, 0600, root, fops, node);
807 de = create_proc_entry(buf, 0600 | S_IFREG, root);
808 if (!de)
809 return;
810
811 de->data = (void *) node;
812
813 if (register_hook)
814 register_hook(de);
815
816}
817
818static void unregister_dgrp_device(struct proc_dir_entry *de)
819{
820 if (!de)
821 return;
822
823 /* Don't unregister proc entries that are still being used.. */
824 if ((atomic_read(&de->count)) != 1) {
825 pr_alert("%s - proc entry %s in use. Not removing.\n",
826 __func__, de->name);
827 return;
828 }
829
830 remove_proc_entry(de->name, de->parent);
831 de = NULL;
832} 541}
diff --git a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c
index 5337b415d450..21b369e0150f 100644
--- a/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c
+++ b/drivers/staging/ft1000/ft1000-pcmcia/ft1000_proc.c
@@ -19,6 +19,7 @@
19#include <linux/module.h> 19#include <linux/module.h>
20#include <linux/kernel.h> 20#include <linux/kernel.h>
21#include <linux/proc_fs.h> 21#include <linux/proc_fs.h>
22#include <linux/seq_file.h>
22#include <linux/string.h> 23#include <linux/string.h>
23#include <linux/vmalloc.h> 24#include <linux/vmalloc.h>
24#include <linux/netdevice.h> 25#include <linux/netdevice.h>
@@ -29,70 +30,55 @@
29#define FT1000_PROC "ft1000" 30#define FT1000_PROC "ft1000"
30#define MAX_FILE_LEN 255 31#define MAX_FILE_LEN 255
31 32
32#define PUTM_TO_PAGE(len, page, args...) \ 33#define seq_putx(m, message, size, var) \
33 len += snprintf(page+len, PAGE_SIZE - len, args) 34 seq_printf(m, message); \
34
35#define PUTX_TO_PAGE(len, page, message, size, var) \
36 len += snprintf(page+len, PAGE_SIZE - len, message); \
37 for(i = 0; i < (size - 1); i++) { \ 35 for(i = 0; i < (size - 1); i++) { \
38 len += snprintf(page+len, PAGE_SIZE - len, "%02x:", var[i]); \ 36 seq_printf(m, "%02x:", var[i]); \
39 } \ 37 } \
40 len += snprintf(page+len, PAGE_SIZE - len, "%02x\n", var[i]) 38 seq_printf(m, "%02x\n", var[i])
41 39
42#define PUTD_TO_PAGE(len, page, message, size, var) \ 40#define seq_putd(m, message, size, var) \
43 len += snprintf(page+len, PAGE_SIZE - len, message); \ 41 seq_printf(m, message); \
44 for(i = 0; i < (size - 1); i++) { \ 42 for(i = 0; i < (size - 1); i++) { \
45 len += snprintf(page+len, PAGE_SIZE - len, "%d.", var[i]); \ 43 seq_printf(m, "%d.", var[i]); \
46 } \ 44 } \
47 len += snprintf(page+len, PAGE_SIZE - len, "%d\n", var[i]) 45 seq_printf(m, "%d\n", var[i])
48 46
49static int ft1000ReadProc(char *page, char **start, off_t off, 47static int ft1000ReadProc(struct seq_file *m, void *v)
50 int count, int *eof, void *data)
51{ 48{
52 struct net_device *dev; 49 static const char *status[] = {
53 int len;
54 int i;
55 struct ft1000_info *info;
56 char *status[] = {
57 "Idle (Disconnect)", "Searching", "Active (Connected)", 50 "Idle (Disconnect)", "Searching", "Active (Connected)",
58 "Waiting for L2", "Sleep", "No Coverage", "", "" 51 "Waiting for L2", "Sleep", "No Coverage", "", ""
59 }; 52 };
60 char *signal[] = { "", "*", "**", "***", "****" }; 53 static const char *signal[] = { "", "*", "**", "***", "****" };
54
55 struct net_device *dev = m->private;
56 struct ft1000_info *info = netdev_priv(dev);
57 int i;
61 int strength; 58 int strength;
62 int quality; 59 int quality;
63 struct timeval tv; 60 struct timeval tv;
64 time_t delta; 61 time_t delta;
65 62
66 dev = (struct net_device *)data;
67 info = netdev_priv(dev);
68
69 if (off > 0) {
70 *eof = 1;
71 return 0;
72 }
73
74 /* Wrap-around */
75
76 if (info->AsicID == ELECTRABUZZ_ID) { 63 if (info->AsicID == ELECTRABUZZ_ID) {
77 if (info->ProgConStat != 0xFF) { 64 if (info->ProgConStat != 0xFF) {
78 info->LedStat = 65 info->LedStat =
79 ft1000_read_dpram(dev, FT1000_DSP_LED); 66 ft1000_read_dpram(dev, FT1000_DSP_LED);
80 info->ConStat = 67 info->ConStat =
81 ft1000_read_dpram(dev, 68 ft1000_read_dpram(dev, FT1000_DSP_CON_STATE);
82 FT1000_DSP_CON_STATE);
83 } else { 69 } else {
84 info->ConStat = 0xf; 70 info->ConStat = 0xf;
85 } 71 }
86 } else { 72 } else {
87 if (info->ProgConStat != 0xFF) { 73 if (info->ProgConStat != 0xFF) {
88 info->LedStat = 74 info->LedStat =
89 ntohs(ft1000_read_dpram_mag_16 75 ntohs(ft1000_read_dpram_mag_16(
90 (dev, FT1000_MAG_DSP_LED, 76 dev, FT1000_MAG_DSP_LED,
91 FT1000_MAG_DSP_LED_INDX)); 77 FT1000_MAG_DSP_LED_INDX));
92 info->ConStat = 78 info->ConStat =
93 ntohs(ft1000_read_dpram_mag_16 79 ntohs(ft1000_read_dpram_mag_16(
94 (dev, FT1000_MAG_DSP_CON_STATE, 80 dev, FT1000_MAG_DSP_CON_STATE,
95 FT1000_MAG_DSP_CON_STATE_INDX)); 81 FT1000_MAG_DSP_CON_STATE_INDX));
96 } else { 82 } else {
97 info->ConStat = 0xf; 83 info->ConStat = 0xf;
98 } 84 }
@@ -135,36 +121,46 @@ static int ft1000ReadProc(char *page, char **start, off_t off,
135 } 121 }
136 122
137 do_gettimeofday(&tv); 123 do_gettimeofday(&tv);
138 delta = (tv.tv_sec - info->ConTm); 124 delta = tv.tv_sec - info->ConTm;
139 len = 0; 125 seq_printf(m, "Connection Time: %02ld:%02ld:%02ld\n",
140 PUTM_TO_PAGE(len, page, "Connection Time: %02ld:%02ld:%02ld\n",
141 ((delta / 3600) % 24), ((delta / 60) % 60), (delta % 60)); 126 ((delta / 3600) % 24), ((delta / 60) % 60), (delta % 60));
142 PUTM_TO_PAGE(len, page, "Connection Time[s]: %ld\n", delta); 127 seq_printf(m, "Connection Time[s]: %ld\n", delta);
143 PUTM_TO_PAGE(len, page, "Asic ID: %s\n", 128 seq_printf(m, "Asic ID: %s\n",
144 (info->AsicID) == 129 info->AsicID ==
145 ELECTRABUZZ_ID ? "ELECTRABUZZ ASIC" : "MAGNEMITE ASIC"); 130 ELECTRABUZZ_ID ? "ELECTRABUZZ ASIC" : "MAGNEMITE ASIC");
146 PUTX_TO_PAGE(len, page, "SKU: ", SKUSZ, info->Sku); 131 seq_putx(m, "SKU: ", SKUSZ, info->Sku);
147 PUTX_TO_PAGE(len, page, "EUI64: ", EUISZ, info->eui64); 132 seq_putx(m, "EUI64: ", EUISZ, info->eui64);
148 PUTD_TO_PAGE(len, page, "DSP version number: ", DSPVERSZ, info->DspVer); 133 seq_putd(m, "DSP version number: ", DSPVERSZ, info->DspVer);
149 PUTX_TO_PAGE(len, page, "Hardware Serial Number: ", HWSERNUMSZ, 134 seq_putx(m, "Hardware Serial Number: ", HWSERNUMSZ, info->HwSerNum);
150 info->HwSerNum); 135 seq_putx(m, "Caliberation Version: ", CALVERSZ, info->RfCalVer);
151 PUTX_TO_PAGE(len, page, "Caliberation Version: ", CALVERSZ, 136 seq_putd(m, "Caliberation Date: ", CALDATESZ, info->RfCalDate);
152 info->RfCalVer); 137 seq_printf(m, "Media State: %s\n",
153 PUTD_TO_PAGE(len, page, "Caliberation Date: ", CALDATESZ,
154 info->RfCalDate);
155 PUTM_TO_PAGE(len, page, "Media State: %s\n",
156 (info->mediastate) ? "link" : "no link"); 138 (info->mediastate) ? "link" : "no link");
157 PUTM_TO_PAGE(len, page, "Connection Status: %s\n", 139 seq_printf(m, "Connection Status: %s\n", status[info->ConStat & 0x7]);
158 status[((info->ConStat) & 0x7)]); 140 seq_printf(m, "RX packets: %ld\n", info->stats.rx_packets);
159 PUTM_TO_PAGE(len, page, "RX packets: %ld\n", info->stats.rx_packets); 141 seq_printf(m, "TX packets: %ld\n", info->stats.tx_packets);
160 PUTM_TO_PAGE(len, page, "TX packets: %ld\n", info->stats.tx_packets); 142 seq_printf(m, "RX bytes: %ld\n", info->stats.rx_bytes);
161 PUTM_TO_PAGE(len, page, "RX bytes: %ld\n", info->stats.rx_bytes); 143 seq_printf(m, "TX bytes: %ld\n", info->stats.tx_bytes);
162 PUTM_TO_PAGE(len, page, "TX bytes: %ld\n", info->stats.tx_bytes); 144 seq_printf(m, "Signal Strength: %s\n", signal[strength]);
163 PUTM_TO_PAGE(len, page, "Signal Strength: %s\n", signal[strength]); 145 seq_printf(m, "Signal Quality: %s\n", signal[quality]);
164 PUTM_TO_PAGE(len, page, "Signal Quality: %s\n", signal[quality]); 146 return 0;
165 return len; 147}
148
149/*
150 * seq_file wrappers for procfile show routines.
151 */
152static int ft1000_proc_open(struct inode *inode, struct file *file)
153{
154 return single_open(file, ft1000ReadProc, PDE_DATA(inode));
166} 155}
167 156
157static const struct file_operations ft1000_proc_fops = {
158 .open = ft1000_proc_open,
159 .read = seq_read,
160 .llseek = seq_lseek,
161 .release = seq_release,
162};
163
168static int ft1000NotifyProc(struct notifier_block *this, unsigned long event, 164static int ft1000NotifyProc(struct notifier_block *this, unsigned long event,
169 void *ptr) 165 void *ptr)
170{ 166{
@@ -176,8 +172,8 @@ static int ft1000NotifyProc(struct notifier_block *this, unsigned long event,
176 switch (event) { 172 switch (event) {
177 case NETDEV_CHANGENAME: 173 case NETDEV_CHANGENAME:
178 remove_proc_entry(info->netdevname, info->ft1000_proc_dir); 174 remove_proc_entry(info->netdevname, info->ft1000_proc_dir);
179 create_proc_read_entry(dev->name, 0644, info->ft1000_proc_dir, 175 proc_create_data(dev->name, 0644, info->ft1000_proc_dir,
180 ft1000ReadProc, dev); 176 &ft1000_proc_fops, dev);
181 snprintf(info->netdevname, IFNAMSIZ, "%s", dev->name); 177 snprintf(info->netdevname, IFNAMSIZ, "%s", dev->name);
182 break; 178 break;
183 } 179 }
@@ -195,8 +191,10 @@ void ft1000InitProc(struct net_device *dev)
195 info = netdev_priv(dev); 191 info = netdev_priv(dev);
196 192
197 info->ft1000_proc_dir = proc_mkdir(FT1000_PROC, init_net.proc_net); 193 info->ft1000_proc_dir = proc_mkdir(FT1000_PROC, init_net.proc_net);
198 create_proc_read_entry(dev->name, 0644, info->ft1000_proc_dir, 194
199 ft1000ReadProc, dev); 195 proc_create_data(dev->name, 0644, info->ft1000_proc_dir,
196 &ft1000_proc_fops, dev);
197
200 snprintf(info->netdevname, IFNAMSIZ, "%s", dev->name); 198 snprintf(info->netdevname, IFNAMSIZ, "%s", dev->name);
201 register_netdevice_notifier(&ft1000_netdev_notifier); 199 register_netdevice_notifier(&ft1000_netdev_notifier);
202} 200}
diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_debug.c b/drivers/staging/ft1000/ft1000-usb/ft1000_debug.c
index 297389e8c608..3251d2e073b5 100644
--- a/drivers/staging/ft1000/ft1000-usb/ft1000_debug.c
+++ b/drivers/staging/ft1000/ft1000-usb/ft1000_debug.c
@@ -55,7 +55,7 @@ int numofmsgbuf = 0;
55// 55//
56// Table of entry-point routines for char device 56// Table of entry-point routines for char device
57// 57//
58static struct file_operations ft1000fops = 58static const struct file_operations ft1000fops =
59{ 59{
60 .unlocked_ioctl = ft1000_ioctl, 60 .unlocked_ioctl = ft1000_ioctl,
61 .poll = ft1000_poll_dev, 61 .poll = ft1000_poll_dev,
diff --git a/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c b/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c
index b99640637fe0..d8294d6c9560 100644
--- a/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c
+++ b/drivers/staging/ft1000/ft1000-usb/ft1000_proc.c
@@ -22,6 +22,7 @@
22#include <linux/module.h> 22#include <linux/module.h>
23#include <linux/kernel.h> 23#include <linux/kernel.h>
24#include <linux/proc_fs.h> 24#include <linux/proc_fs.h>
25#include <linux/seq_file.h>
25#include <linux/netdevice.h> 26#include <linux/netdevice.h>
26 27
27 28
@@ -30,22 +31,17 @@
30#define FT1000_PROC_DIR "ft1000" 31#define FT1000_PROC_DIR "ft1000"
31 32
32 33
33#define PUTM_TO_PAGE(len,page,args...) \ 34#define seq_putx(m, message, size, var) \
34 len += snprintf(page+len, PAGE_SIZE - len, args) 35 seq_printf(m, message); \
36 for(i = 0; i < (size - 1); i++) \
37 seq_printf(m, "%02x:", var[i]); \
38 seq_printf(m, "%02x\n", var[i])
35 39
36#define PUTX_TO_PAGE(len,page,message,size,var) \ 40#define seq_putd(m, message, size, var) \
37 len += snprintf(page+len, PAGE_SIZE - len, message); \ 41 seq_printf(m, message); \
38 for (i = 0; i < (size - 1); i++) {\ 42 for(i = 0; i < (size - 1); i++) \
39 len += snprintf(page+len, PAGE_SIZE - len, "%02x:", var[i]); \ 43 seq_printf(m, "%d.", var[i]); \
40 } \ 44 seq_printf(m, "%d\n", var[i])
41 len += snprintf(page+len, PAGE_SIZE - len, "%02x\n", var[i])
42
43#define PUTD_TO_PAGE(len,page,message,size,var) \
44 len += snprintf(page+len, PAGE_SIZE - len, message); \
45 for (i = 0; i < (size - 1); i++) {\
46 len += snprintf(page+len, PAGE_SIZE - len, "%d.", var[i]); \
47 } \
48 len += snprintf(page+len, PAGE_SIZE - len, "%d\n", var[i])
49 45
50 46
51#define FTNET_PROC init_net.proc_net 47#define FTNET_PROC init_net.proc_net
@@ -55,19 +51,9 @@ int ft1000_read_dpram16 (struct ft1000_usb *ft1000dev, u16 indx,
55 u8 *buffer, u8 highlow); 51 u8 *buffer, u8 highlow);
56 52
57 53
58static int 54static int ft1000ReadProc(struct seq_file *m, void *v)
59ft1000ReadProc(char *page, char **start, off_t off, int count, int *eof,
60 void *data)
61{ 55{
62 struct net_device *dev; 56 static const char *status[] = {
63 int len;
64 int i;
65 unsigned short ledStat;
66 unsigned short conStat;
67
68 struct ft1000_info *info;
69
70 char *status[] = {
71 "Idle (Disconnect)", 57 "Idle (Disconnect)",
72 "Searching", 58 "Searching",
73 "Active (Connected)", 59 "Active (Connected)",
@@ -77,22 +63,18 @@ ft1000ReadProc(char *page, char **start, off_t off, int count, int *eof,
77 "", 63 "",
78 "", 64 "",
79 }; 65 };
66 static const char *signal[] = { "", "*", "**", "***", "****" };
80 67
81 char *signal[] = { "", "*", "**", "***", "****" }; 68 struct net_device *dev = m->private;
69 struct ft1000_info *info = netdev_priv(dev);
70 int i;
71 unsigned short ledStat;
72 unsigned short conStat;
82 int strength; 73 int strength;
83 int quality; 74 int quality;
84 struct timeval tv; 75 struct timeval tv;
85 time_t delta; 76 time_t delta;
86 77
87 dev = (struct net_device *) data;
88 info = netdev_priv(dev);
89
90 if (off > 0) {
91 *eof = 1;
92 return 0;
93 }
94
95
96 if (info->ProgConStat != 0xFF) { 78 if (info->ProgConStat != 0xFF) {
97 ft1000_read_dpram16(info->priv, FT1000_MAG_DSP_LED, 79 ft1000_read_dpram16(info->priv, FT1000_MAG_DSP_LED,
98 (u8 *)&ledStat, FT1000_MAG_DSP_LED_INDX); 80 (u8 *)&ledStat, FT1000_MAG_DSP_LED_INDX);
@@ -144,36 +126,43 @@ ft1000ReadProc(char *page, char **start, off_t off, int count, int *eof,
144 quality = 0; 126 quality = 0;
145 } 127 }
146 128
147 len = 0; 129 seq_printf(m, "Connection Time: %02ld:%02ld:%02ld\n",
148 PUTM_TO_PAGE(len, page, "Connection Time: %02ld:%02ld:%02ld\n",
149 ((delta / 3600) % 24), ((delta / 60) % 60), (delta % 60)); 130 ((delta / 3600) % 24), ((delta / 60) % 60), (delta % 60));
150 PUTM_TO_PAGE(len, page, "Connection Time[s]: %ld\n", delta); 131 seq_printf(m, "Connection Time[s]: %ld\n", delta);
151 PUTM_TO_PAGE(len, page, "Asic ID: %s\n", 132 seq_printf(m, "Asic ID: %s\n",
152 (info->AsicID) == 133 (info->AsicID) == ELECTRABUZZ_ID ? "ELECTRABUZZ ASIC" : "MAGNEMITE ASIC");
153 ELECTRABUZZ_ID ? "ELECTRABUZZ ASIC" : "MAGNEMITE ASIC"); 134 seq_putx(m, "SKU: ", SKUSZ, info->Sku);
154 PUTX_TO_PAGE(len, page, "SKU: ", SKUSZ, info->Sku); 135 seq_putx(m, "EUI64: ", EUISZ, info->eui64);
155 PUTX_TO_PAGE(len, page, "EUI64: ", EUISZ, info->eui64); 136 seq_putd(m, "DSP version number: ", DSPVERSZ, info->DspVer);
156 PUTD_TO_PAGE(len, page, "DSP version number: ", DSPVERSZ, info->DspVer); 137 seq_putx(m, "Hardware Serial Number: ", HWSERNUMSZ, info->HwSerNum);
157 PUTX_TO_PAGE(len, page, "Hardware Serial Number: ", HWSERNUMSZ, 138 seq_putx(m, "Caliberation Version: ", CALVERSZ, info->RfCalVer);
158 info->HwSerNum); 139 seq_putd(m, "Caliberation Date: ", CALDATESZ, info->RfCalDate);
159 PUTX_TO_PAGE(len, page, "Caliberation Version: ", CALVERSZ, 140 seq_printf(m, "Media State: %s\n", (info->mediastate) ? "link" : "no link");
160 info->RfCalVer); 141 seq_printf(m, "Connection Status: %s\n", status[info->ConStat & 0x7]);
161 PUTD_TO_PAGE(len, page, "Caliberation Date: ", CALDATESZ, 142 seq_printf(m, "RX packets: %ld\n", info->stats.rx_packets);
162 info->RfCalDate); 143 seq_printf(m, "TX packets: %ld\n", info->stats.tx_packets);
163 PUTM_TO_PAGE(len, page, "Media State: %s\n", 144 seq_printf(m, "RX bytes: %ld\n", info->stats.rx_bytes);
164 (info->mediastate) ? "link" : "no link"); 145 seq_printf(m, "TX bytes: %ld\n", info->stats.tx_bytes);
165 PUTM_TO_PAGE(len, page, "Connection Status: %s\n", 146 seq_printf(m, "Signal Strength: %s\n", signal[strength]);
166 status[((info->ConStat) & 0x7)]); 147 seq_printf(m, "Signal Quality: %s\n", signal[quality]);
167 PUTM_TO_PAGE(len, page, "RX packets: %ld\n", info->stats.rx_packets); 148 return 0;
168 PUTM_TO_PAGE(len, page, "TX packets: %ld\n", info->stats.tx_packets); 149}
169 PUTM_TO_PAGE(len, page, "RX bytes: %ld\n", info->stats.rx_bytes); 150
170 PUTM_TO_PAGE(len, page, "TX bytes: %ld\n", info->stats.tx_bytes); 151/*
171 PUTM_TO_PAGE(len, page, "Signal Strength: %s\n", signal[strength]); 152 * seq_file wrappers for procfile show routines.
172 PUTM_TO_PAGE(len, page, "Signal Quality: %s\n", signal[quality]); 153 */
173 154static int ft1000_proc_open(struct inode *inode, struct file *file)
174 return len; 155{
156 return single_open(file, ft1000ReadProc, PDE_DATA(inode));
175} 157}
176 158
159static const struct file_operations ft1000_proc_fops = {
160 .open = ft1000_proc_open,
161 .read = seq_read,
162 .llseek = seq_lseek,
163 .release = seq_release,
164};
165
177static int 166static int
178ft1000NotifyProc(struct notifier_block *this, unsigned long event, void *ptr) 167ft1000NotifyProc(struct notifier_block *this, unsigned long event, void *ptr)
179{ 168{
@@ -186,9 +175,9 @@ ft1000NotifyProc(struct notifier_block *this, unsigned long event, void *ptr)
186 switch (event) { 175 switch (event) {
187 case NETDEV_CHANGENAME: 176 case NETDEV_CHANGENAME:
188 remove_proc_entry(info->netdevname, info->ft1000_proc_dir); 177 remove_proc_entry(info->netdevname, info->ft1000_proc_dir);
189 ft1000_proc_file = create_proc_read_entry(dev->name, 0644, 178 ft1000_proc_file =
190 info->ft1000_proc_dir, 179 proc_create_data(dev->name, 0644, info->ft1000_proc_dir,
191 ft1000ReadProc, dev); 180 &ft1000_proc_fops, dev);
192 snprintf(info->netdevname, IFNAMSIZ, "%s", dev->name); 181 snprintf(info->netdevname, IFNAMSIZ, "%s", dev->name);
193 break; 182 break;
194 } 183 }
@@ -217,10 +206,10 @@ int ft1000_init_proc(struct net_device *dev)
217 } 206 }
218 207
219 ft1000_proc_file = 208 ft1000_proc_file =
220 create_proc_read_entry(dev->name, 0644, 209 proc_create_data(dev->name, 0644, info->ft1000_proc_dir,
221 info->ft1000_proc_dir, ft1000ReadProc, dev); 210 &ft1000_proc_fops, dev);
222 211
223 if (ft1000_proc_file == NULL) { 212 if (!ft1000_proc_file) {
224 printk(KERN_WARNING "Unable to create /proc entry.\n"); 213 printk(KERN_WARNING "Unable to create /proc entry.\n");
225 goto fail_entry; 214 goto fail_entry;
226 } 215 }
diff --git a/drivers/staging/keucr/scsiglue.c b/drivers/staging/keucr/scsiglue.c
index 083b20e6253e..48e1005349da 100644
--- a/drivers/staging/keucr/scsiglue.c
+++ b/drivers/staging/keucr/scsiglue.c
@@ -229,26 +229,18 @@ void usb_stor_report_bus_reset(struct us_data *us)
229 229
230/* we use this macro to help us write into the buffer */ 230/* we use this macro to help us write into the buffer */
231#undef SPRINTF 231#undef SPRINTF
232#define SPRINTF(args...) \ 232#define SPRINTF(args...) seq_printf(m, ##args)
233 do { \
234 if (pos < buffer+length) \
235 pos += sprintf(pos, ## args); \
236 } while (0)
237 233
238/* 234static int write_info(struct Scsi_Host *host, char *buffer, int length)
239 * proc_info() 235{
240 */ 236 return length;
241static int proc_info(struct Scsi_Host *host, char *buffer, char **start, 237}
242 off_t offset, int length, int inout) 238
239static int show_info(struct seq_file *m, struct Scsi_Host *host)
243{ 240{
244 struct us_data *us = host_to_us(host); 241 struct us_data *us = host_to_us(host);
245 char *pos = buffer;
246 const char *string; 242 const char *string;
247 243
248 /* pr_info("scsiglue --- proc_info\n"); */
249 if (inout)
250 return length;
251
252 /* print the controller name */ 244 /* print the controller name */
253 SPRINTF(" Host scsi%d: usb-storage\n", host->host_no); 245 SPRINTF(" Host scsi%d: usb-storage\n", host->host_no);
254 246
@@ -278,29 +270,17 @@ static int proc_info(struct Scsi_Host *host, char *buffer, char **start,
278 SPRINTF(" Transport: %s\n", us->transport_name); 270 SPRINTF(" Transport: %s\n", us->transport_name);
279 271
280 /* show the device flags */ 272 /* show the device flags */
281 if (pos < buffer + length) { 273 SPRINTF(" Quirks:");
282 pos += sprintf(pos, " Quirks:");
283 274
284#define US_FLAG(name, value) \ 275#define US_FLAG(name, value) \
285 do { \ 276 do { \
286 if (us->fflags & value) \ 277 if (us->fflags & value) \
287 pos += sprintf(pos, " " #name); \ 278 SPRINTF(" " #name); \
288 } while (0); 279 } while (0);
289US_DO_ALL_FLAGS 280US_DO_ALL_FLAGS
290#undef US_FLAG 281#undef US_FLAG
291 282 seq_putc(m, '\n');
292 *(pos++) = '\n'; 283 return 0;
293 }
294
295 /* Calculate start of next buffer, and return value. */
296 *start = buffer + offset;
297
298 if ((pos - buffer) < offset)
299 return 0;
300 else if ((pos - buffer - offset) < length)
301 return pos - buffer - offset;
302 else
303 return length;
304} 284}
305 285
306/*********************************************************************** 286/***********************************************************************
@@ -351,7 +331,8 @@ struct scsi_host_template usb_stor_host_template = {
351 /* basic userland interface stuff */ 331 /* basic userland interface stuff */
352 .name = "eucr-storage", 332 .name = "eucr-storage",
353 .proc_name = "eucr-storage", 333 .proc_name = "eucr-storage",
354 .proc_info = proc_info, 334 .write_info = write_info,
335 .show_info = show_info,
355 .info = host_info, 336 .info = host_info,
356 337
357 /* command interface -- queued only */ 338 /* command interface -- queued only */
diff --git a/drivers/staging/rtl8187se/r8180.h b/drivers/staging/rtl8187se/r8180.h
index 70ea4145b4c8..edacc8001640 100644
--- a/drivers/staging/rtl8187se/r8180.h
+++ b/drivers/staging/rtl8187se/r8180.h
@@ -372,7 +372,6 @@ typedef struct r8180_priv
372 struct Stats stats; 372 struct Stats stats;
373 struct _link_detect_t link_detect; //YJ,add,080828 373 struct _link_detect_t link_detect; //YJ,add,080828
374 struct iw_statistics wstats; 374 struct iw_statistics wstats;
375 struct proc_dir_entry *dir_dev;
376 375
377 /*RX stuff*/ 376 /*RX stuff*/
378 u32 *rxring; 377 u32 *rxring;
diff --git a/drivers/staging/rtl8187se/r8180_core.c b/drivers/staging/rtl8187se/r8180_core.c
index d10d75e8a33f..f7c1d9905ec6 100644
--- a/drivers/staging/rtl8187se/r8180_core.c
+++ b/drivers/staging/rtl8187se/r8180_core.c
@@ -36,6 +36,8 @@
36#include <linux/syscalls.h> 36#include <linux/syscalls.h>
37#include <linux/eeprom_93cx6.h> 37#include <linux/eeprom_93cx6.h>
38#include <linux/interrupt.h> 38#include <linux/interrupt.h>
39#include <linux/proc_fs.h>
40#include <linux/seq_file.h>
39 41
40#include "r8180_hw.h" 42#include "r8180_hw.h"
41#include "r8180.h" 43#include "r8180.h"
@@ -204,51 +206,35 @@ void rtl8180_start_tx_beacon(struct net_device *dev);
204 206
205static struct proc_dir_entry *rtl8180_proc; 207static struct proc_dir_entry *rtl8180_proc;
206 208
207static int proc_get_registers(char *page, char **start, 209static int proc_get_registers(struct seq_file *m, void *v)
208 off_t offset, int count,
209 int *eof, void *data)
210{ 210{
211 struct net_device *dev = data; 211 struct net_device *dev = m->private;
212 int len = 0; 212 int i, n, max = 0xff;
213 int i, n;
214 int max = 0xff;
215 213
216 /* This dump the current register page */ 214 /* This dump the current register page */
217 for (n = 0; n <= max;) { 215 for (n = 0; n <= max;) {
218 len += snprintf(page + len, count - len, "\nD: %2x > ", n); 216 seq_printf(m, "\nD: %2x > ", n);
219 217
220 for (i = 0; i < 16 && n <= max; i++, n++) 218 for (i = 0; i < 16 && n <= max; i++, n++)
221 len += snprintf(page + len, count - len, "%2x ", 219 seq_printf(m, "%2x ", read_nic_byte(dev, n));
222 read_nic_byte(dev, n));
223 } 220 }
224 len += snprintf(page + len, count - len, "\n"); 221 seq_putc(m, '\n');
225 222 return 0;
226 *eof = 1;
227 return len;
228} 223}
229 224
230int get_curr_tx_free_desc(struct net_device *dev, int priority); 225int get_curr_tx_free_desc(struct net_device *dev, int priority);
231 226
232static int proc_get_stats_hw(char *page, char **start, 227static int proc_get_stats_hw(struct seq_file *m, void *v)
233 off_t offset, int count,
234 int *eof, void *data)
235{ 228{
236 int len = 0; 229 return 0;
237
238 *eof = 1;
239 return len;
240} 230}
241 231
242static int proc_get_stats_rx(char *page, char **start, 232static int proc_get_stats_rx(struct seq_file *m, void *v)
243 off_t offset, int count,
244 int *eof, void *data)
245{ 233{
246 struct net_device *dev = data; 234 struct net_device *dev = m->private;
247 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); 235 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
248 236
249 int len = 0; 237 seq_printf(m,
250
251 len += snprintf(page + len, count - len,
252 "RX OK: %lu\n" 238 "RX OK: %lu\n"
253 "RX Retry: %lu\n" 239 "RX Retry: %lu\n"
254 "RX CRC Error(0-500): %lu\n" 240 "RX CRC Error(0-500): %lu\n"
@@ -263,22 +249,17 @@ static int proc_get_stats_rx(char *page, char **start,
263 priv->stats.rxicverr 249 priv->stats.rxicverr
264 ); 250 );
265 251
266 *eof = 1; 252 return 0;
267 return len;
268} 253}
269 254
270static int proc_get_stats_tx(char *page, char **start, 255static int proc_get_stats_tx(struct seq_file *m, void *v)
271 off_t offset, int count,
272 int *eof, void *data)
273{ 256{
274 struct net_device *dev = data; 257 struct net_device *dev = m->private;
275 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); 258 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev);
276
277 int len = 0;
278 unsigned long totalOK; 259 unsigned long totalOK;
279 260
280 totalOK = priv->stats.txnpokint+priv->stats.txhpokint+priv->stats.txlpokint; 261 totalOK = priv->stats.txnpokint+priv->stats.txhpokint+priv->stats.txlpokint;
281 len += snprintf(page + len, count - len, 262 seq_printf(m,
282 "TX OK: %lu\n" 263 "TX OK: %lu\n"
283 "TX Error: %lu\n" 264 "TX Error: %lu\n"
284 "TX Retry: %lu\n" 265 "TX Retry: %lu\n"
@@ -291,8 +272,7 @@ static int proc_get_stats_tx(char *page, char **start,
291 priv->stats.txbeaconerr 272 priv->stats.txbeaconerr
292 ); 273 );
293 274
294 *eof = 1; 275 return 0;
295 return len;
296} 276}
297 277
298void rtl8180_proc_module_init(void) 278void rtl8180_proc_module_init(void)
@@ -308,59 +288,61 @@ void rtl8180_proc_module_remove(void)
308 288
309void rtl8180_proc_remove_one(struct net_device *dev) 289void rtl8180_proc_remove_one(struct net_device *dev)
310{ 290{
311 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); 291 remove_proc_subtree(dev->name, rtl8180_proc);
312 if (priv->dir_dev) {
313 remove_proc_entry("stats-hw", priv->dir_dev);
314 remove_proc_entry("stats-tx", priv->dir_dev);
315 remove_proc_entry("stats-rx", priv->dir_dev);
316 remove_proc_entry("registers", priv->dir_dev);
317 priv->dir_dev = NULL;
318 }
319} 292}
320 293
321void rtl8180_proc_init_one(struct net_device *dev) 294/*
295 * seq_file wrappers for procfile show routines.
296 */
297static int rtl8180_proc_open(struct inode *inode, struct file *file)
322{ 298{
323 struct proc_dir_entry *e; 299 struct net_device *dev = proc_get_parent_data(inode);
324 struct r8180_priv *priv = (struct r8180_priv *)ieee80211_priv(dev); 300 int (*show)(struct seq_file *, void *) = PDE_DATA(inode);
325 301
326 priv->dir_dev = rtl8180_proc; 302 return single_open(file, show, dev);
327 if (!priv->dir_dev) { 303}
328 DMESGE("Unable to initialize /proc/net/r8180/%s\n",
329 dev->name);
330 return;
331 }
332 304
333 e = create_proc_read_entry("stats-hw", S_IFREG | S_IRUGO, 305static const struct file_operations rtl8180_proc_fops = {
334 priv->dir_dev, proc_get_stats_hw, dev); 306 .open = rtl8180_proc_open,
335 if (!e) { 307 .read = seq_read,
336 DMESGE("Unable to initialize " 308 .llseek = seq_lseek,
337 "/proc/net/r8180/%s/stats-hw\n", 309 .release = seq_release,
338 dev->name); 310};
339 }
340 311
341 e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO, 312/*
342 priv->dir_dev, proc_get_stats_rx, dev); 313 * Table of proc files we need to create.
343 if (!e) { 314 */
344 DMESGE("Unable to initialize " 315struct rtl8180_proc_file {
345 "/proc/net/r8180/%s/stats-rx\n", 316 char name[12];
346 dev->name); 317 int (*show)(struct seq_file *, void *);
347 } 318};
348 319
320static const struct rtl8180_proc_file rtl8180_proc_files[] = {
321 { "stats-hw", &proc_get_stats_hw },
322 { "stats-rx", &proc_get_stats_rx },
323 { "stats-tx", &proc_get_stats_tx },
324 { "registers", &proc_get_registers },
325 { "" }
326};
327
328void rtl8180_proc_init_one(struct net_device *dev)
329{
330 const struct rtl8180_proc_file *f;
331 struct proc_dir_entry *dir;
349 332
350 e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, 333 dir = proc_mkdir_data(dev->name, 0, rtl8180_proc, dev);
351 priv->dir_dev, proc_get_stats_tx, dev); 334 if (!dir) {
352 if (!e) { 335 DMESGE("Unable to initialize /proc/net/r8180/%s\n", dev->name);
353 DMESGE("Unable to initialize " 336 return;
354 "/proc/net/r8180/%s/stats-tx\n",
355 dev->name);
356 } 337 }
357 338
358 e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, 339 for (f = rtl8180_proc_files; f->name[0]; f++) {
359 priv->dir_dev, proc_get_registers, dev); 340 if (!proc_create_data(f->name, S_IFREG | S_IRUGO, dir,
360 if (!e) { 341 &rtl8180_proc_fops, f->show)) {
361 DMESGE("Unable to initialize " 342 DMESGE("Unable to initialize /proc/net/r8180/%s/%s\n",
362 "/proc/net/r8180/%s/registers\n", 343 dev->name, f->name);
363 dev->name); 344 return;
345 }
364 } 346 }
365} 347}
366 348
diff --git a/drivers/staging/rtl8192e/rtl8192e/Makefile b/drivers/staging/rtl8192e/rtl8192e/Makefile
index 313a92ec6833..a2c4fb4ba1af 100644
--- a/drivers/staging/rtl8192e/rtl8192e/Makefile
+++ b/drivers/staging/rtl8192e/rtl8192e/Makefile
@@ -7,7 +7,6 @@ r8192e_pci-objs := \
7 r8190P_rtl8256.o \ 7 r8190P_rtl8256.o \
8 rtl_cam.o \ 8 rtl_cam.o \
9 rtl_core.o \ 9 rtl_core.o \
10 rtl_debug.o \
11 rtl_dm.o \ 10 rtl_dm.o \
12 rtl_eeprom.o \ 11 rtl_eeprom.o \
13 rtl_ethtool.o \ 12 rtl_ethtool.o \
diff --git a/drivers/staging/rtl8192e/rtl8192e/rtl_core.c b/drivers/staging/rtl8192e/rtl8192e/rtl_core.c
index 4ebf99b30975..2b6c61c5d3d8 100644
--- a/drivers/staging/rtl8192e/rtl8192e/rtl_core.c
+++ b/drivers/staging/rtl8192e/rtl8192e/rtl_core.c
@@ -2966,8 +2966,6 @@ static int rtl8192_pci_probe(struct pci_dev *pdev,
2966 goto err_free_irq; 2966 goto err_free_irq;
2967 RT_TRACE(COMP_INIT, "dev name: %s\n", dev->name); 2967 RT_TRACE(COMP_INIT, "dev name: %s\n", dev->name);
2968 2968
2969 rtl8192_proc_init_one(dev);
2970
2971 if (priv->polling_timer_on == 0) 2969 if (priv->polling_timer_on == 0)
2972 check_rfctrl_gpio_timer((unsigned long)dev); 2970 check_rfctrl_gpio_timer((unsigned long)dev);
2973 2971
@@ -3003,7 +3001,6 @@ static void rtl8192_pci_disconnect(struct pci_dev *pdev)
3003 del_timer_sync(&priv->gpio_polling_timer); 3001 del_timer_sync(&priv->gpio_polling_timer);
3004 cancel_delayed_work(&priv->gpio_change_rf_wq); 3002 cancel_delayed_work(&priv->gpio_change_rf_wq);
3005 priv->polling_timer_on = 0; 3003 priv->polling_timer_on = 0;
3006 rtl8192_proc_remove_one(dev);
3007 rtl8192_down(dev, true); 3004 rtl8192_down(dev, true);
3008 deinit_hal_dm(dev); 3005 deinit_hal_dm(dev);
3009 if (priv->pFirmware) { 3006 if (priv->pFirmware) {
@@ -3093,7 +3090,6 @@ static int __init rtl8192_pci_module_init(void)
3093 printk(KERN_INFO "\nLinux kernel driver for RTL8192E WLAN cards\n"); 3090 printk(KERN_INFO "\nLinux kernel driver for RTL8192E WLAN cards\n");
3094 printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan Driver\n"); 3091 printk(KERN_INFO "Copyright (c) 2007-2008, Realsil Wlan Driver\n");
3095 3092
3096 rtl8192_proc_module_init();
3097 if (0 != pci_register_driver(&rtl8192_pci_driver)) { 3093 if (0 != pci_register_driver(&rtl8192_pci_driver)) {
3098 DMESG("No device found"); 3094 DMESG("No device found");
3099 /*pci_unregister_driver (&rtl8192_pci_driver);*/ 3095 /*pci_unregister_driver (&rtl8192_pci_driver);*/
@@ -3107,7 +3103,6 @@ static void __exit rtl8192_pci_module_exit(void)
3107 pci_unregister_driver(&rtl8192_pci_driver); 3103 pci_unregister_driver(&rtl8192_pci_driver);
3108 3104
3109 RT_TRACE(COMP_DOWN, "Exiting"); 3105 RT_TRACE(COMP_DOWN, "Exiting");
3110 rtl8192_proc_module_remove();
3111} 3106}
3112 3107
3113void check_rfctrl_gpio_timer(unsigned long data) 3108void check_rfctrl_gpio_timer(unsigned long data)
diff --git a/drivers/staging/rtl8192e/rtl8192e/rtl_core.h b/drivers/staging/rtl8192e/rtl8192e/rtl_core.h
index 320d5fc026b4..87d4d349c890 100644
--- a/drivers/staging/rtl8192e/rtl8192e/rtl_core.h
+++ b/drivers/staging/rtl8192e/rtl8192e/rtl_core.h
@@ -1085,10 +1085,4 @@ void ActUpdateChannelAccessSetting(struct net_device *dev,
1085 enum wireless_mode WirelessMode, 1085 enum wireless_mode WirelessMode,
1086 struct channel_access_setting *ChnlAccessSetting); 1086 struct channel_access_setting *ChnlAccessSetting);
1087 1087
1088/* proc stuff from rtl_debug.c */
1089void rtl8192_proc_init_one(struct net_device *dev);
1090void rtl8192_proc_remove_one(struct net_device *dev);
1091void rtl8192_proc_module_init(void);
1092void rtl8192_proc_module_remove(void);
1093
1094#endif 1088#endif
diff --git a/drivers/staging/rtl8192e/rtl8192e/rtl_debug.c b/drivers/staging/rtl8192e/rtl8192e/rtl_debug.c
deleted file mode 100644
index c19b14cd6f77..000000000000
--- a/drivers/staging/rtl8192e/rtl8192e/rtl_debug.c
+++ /dev/null
@@ -1,1029 +0,0 @@
1/******************************************************************************
2 * Copyright(c) 2008 - 2010 Realtek Corporation. All rights reserved.
3 *
4 * Based on the r8180 driver, which is:
5 * Copyright 2004-2005 Andrea Merello <andreamrl@tiscali.it>, et al.
6 * This program is free software; you can redistribute it and/or modify it
7 * under the terms of version 2 of the GNU General Public License as
8 * published by the Free Software Foundation.
9 *
10 * This program is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
13 * more details.
14 *
15 * You should have received a copy of the GNU General Public License along with
16 * this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
18 *
19 * The full GNU General Public License is included in this distribution in the
20 * file called LICENSE.
21 *
22 * Contact Information:
23 * wlanfae <wlanfae@realtek.com>
24******************************************************************************/
25#include "rtl_core.h"
26#include "r8192E_phy.h"
27#include "r8192E_phyreg.h"
28#include "r8190P_rtl8256.h" /* RTL8225 Radio frontend */
29#include "r8192E_cmdpkt.h"
30
31/****************************************************************************
32 -----------------------------PROCFS STUFF-------------------------
33*****************************************************************************/
34/*This part is related to PROC, which will record some statistics. */
35static struct proc_dir_entry *rtl8192_proc;
36
37static int proc_get_stats_ap(char *page, char **start,
38 off_t offset, int count,
39 int *eof, void *data)
40{
41 struct net_device *dev = data;
42 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
43 struct rtllib_device *ieee = priv->rtllib;
44 struct rtllib_network *target;
45 int len = 0;
46
47 list_for_each_entry(target, &ieee->network_list, list) {
48
49 len += snprintf(page + len, count - len,
50 "%s ", target->ssid);
51
52 if (target->wpa_ie_len > 0 || target->rsn_ie_len > 0)
53 len += snprintf(page + len, count - len,
54 "WPA\n");
55 else
56 len += snprintf(page + len, count - len,
57 "non_WPA\n");
58
59 }
60
61 *eof = 1;
62 return len;
63}
64
65static int proc_get_registers_0(char *page, char **start,
66 off_t offset, int count,
67 int *eof, void *data)
68{
69 struct net_device *dev = data;
70
71 int len = 0;
72 int i, n, page0;
73
74 int max = 0xff;
75 page0 = 0x000;
76
77 len += snprintf(page + len, count - len,
78 "\n####################page %x##################\n ",
79 (page0>>8));
80 len += snprintf(page + len, count - len,
81 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
82 "0C 0D 0E 0F");
83 for (n = 0; n <= max;) {
84 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
85 for (i = 0; i < 16 && n <= max; n++, i++)
86 len += snprintf(page + len, count - len,
87 "%2.2x ", read_nic_byte(dev,
88 (page0 | n)));
89 }
90 len += snprintf(page + len, count - len, "\n");
91 *eof = 1;
92 return len;
93
94}
95static int proc_get_registers_1(char *page, char **start,
96 off_t offset, int count,
97 int *eof, void *data)
98{
99 struct net_device *dev = data;
100
101 int len = 0;
102 int i, n, page0;
103
104 int max = 0xff;
105 page0 = 0x100;
106
107 /* This dump the current register page */
108 len += snprintf(page + len, count - len,
109 "\n####################page %x##################\n ",
110 (page0>>8));
111 len += snprintf(page + len, count - len,
112 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
113 "0C 0D 0E 0F");
114 for (n = 0; n <= max;) {
115 len += snprintf(page + len, count - len,
116 "\nD: %2x > ", n);
117 for (i = 0; i < 16 && n <= max; i++, n++)
118 len += snprintf(page + len, count - len,
119 "%2.2x ", read_nic_byte(dev,
120 (page0 | n)));
121 }
122 len += snprintf(page + len, count - len, "\n");
123 *eof = 1;
124 return len;
125
126}
127static int proc_get_registers_2(char *page, char **start,
128 off_t offset, int count,
129 int *eof, void *data)
130{
131 struct net_device *dev = data;
132
133 int len = 0;
134 int i, n, page0;
135
136 int max = 0xff;
137 page0 = 0x200;
138
139 /* This dump the current register page */
140 len += snprintf(page + len, count - len,
141 "\n####################page %x##################\n ",
142 (page0 >> 8));
143 len += snprintf(page + len, count - len,
144 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C "
145 "0D 0E 0F");
146 for (n = 0; n <= max;) {
147 len += snprintf(page + len, count - len,
148 "\nD: %2x > ", n);
149 for (i = 0; i < 16 && n <= max; i++, n++)
150 len += snprintf(page + len, count - len,
151 "%2.2x ", read_nic_byte(dev,
152 (page0 | n)));
153 }
154 len += snprintf(page + len, count - len, "\n");
155 *eof = 1;
156 return len;
157
158}
159static int proc_get_registers_3(char *page, char **start,
160 off_t offset, int count,
161 int *eof, void *data)
162{
163 struct net_device *dev = data;
164
165 int len = 0;
166 int i, n, page0;
167
168 int max = 0xff;
169 page0 = 0x300;
170
171 /* This dump the current register page */
172 len += snprintf(page + len, count - len,
173 "\n####################page %x##################\n ",
174 (page0>>8));
175 len += snprintf(page + len, count - len,
176 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
177 "0C 0D 0E 0F");
178 for (n = 0; n <= max;) {
179 len += snprintf(page + len, count - len,
180 "\nD: %2x > ", n);
181 for (i = 0; i < 16 && n <= max; i++, n++)
182 len += snprintf(page + len, count - len,
183 "%2.2x ", read_nic_byte(dev,
184 (page0 | n)));
185 }
186 len += snprintf(page + len, count - len, "\n");
187 *eof = 1;
188 return len;
189
190}
191static int proc_get_registers_4(char *page, char **start,
192 off_t offset, int count,
193 int *eof, void *data)
194{
195 struct net_device *dev = data;
196
197 int len = 0;
198 int i, n, page0;
199
200 int max = 0xff;
201 page0 = 0x400;
202
203 /* This dump the current register page */
204 len += snprintf(page + len, count - len,
205 "\n####################page %x##################\n ",
206 (page0>>8));
207 len += snprintf(page + len, count - len,
208 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
209 "0C 0D 0E 0F");
210 for (n = 0; n <= max;) {
211 len += snprintf(page + len, count - len,
212 "\nD: %2x > ", n);
213 for (i = 0; i < 16 && n <= max; i++, n++)
214 len += snprintf(page + len, count - len,
215 "%2.2x ", read_nic_byte(dev,
216 (page0 | n)));
217 }
218 len += snprintf(page + len, count - len, "\n");
219 *eof = 1;
220 return len;
221
222}
223static int proc_get_registers_5(char *page, char **start,
224 off_t offset, int count,
225 int *eof, void *data)
226{
227 struct net_device *dev = data;
228
229 int len = 0;
230 int i, n, page0;
231
232 int max = 0xff;
233 page0 = 0x500;
234
235 /* This dump the current register page */
236 len += snprintf(page + len, count - len,
237 "\n####################page %x##################\n ",
238 (page0 >> 8));
239 len += snprintf(page + len, count - len,
240 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
241 "0C 0D 0E 0F");
242 for (n = 0; n <= max;) {
243 len += snprintf(page + len, count - len,
244 "\nD: %2x > ", n);
245 for (i = 0; i < 16 && n <= max; i++, n++)
246 len += snprintf(page + len, count - len,
247 "%2.2x ", read_nic_byte(dev,
248 (page0 | n)));
249 }
250 len += snprintf(page + len, count - len, "\n");
251 *eof = 1;
252 return len;
253
254}
255static int proc_get_registers_6(char *page, char **start,
256 off_t offset, int count,
257 int *eof, void *data)
258{
259 struct net_device *dev = data;
260
261 int len = 0;
262 int i, n, page0;
263
264 int max = 0xff;
265 page0 = 0x600;
266
267 /* This dump the current register page */
268 len += snprintf(page + len, count - len,
269 "\n####################page %x##################\n ",
270 (page0>>8));
271 len += snprintf(page + len, count - len,
272 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B "
273 "0C 0D 0E 0F");
274 for (n = 0; n <= max;) {
275 len += snprintf(page + len, count - len,
276 "\nD: %2x > ", n);
277 for (i = 0; i < 16 && n <= max; i++, n++)
278 len += snprintf(page + len, count - len,
279 "%2.2x ", read_nic_byte(dev,
280 (page0 | n)));
281 }
282 len += snprintf(page + len, count - len, "\n");
283 *eof = 1;
284 return len;
285
286}
287static int proc_get_registers_7(char *page, char **start,
288 off_t offset, int count,
289 int *eof, void *data)
290{
291 struct net_device *dev = data;
292
293 int len = 0;
294 int i, n, page0;
295
296 int max = 0xff;
297 page0 = 0x700;
298
299 /* This dump the current register page */
300 len += snprintf(page + len, count - len,
301 "\n####################page %x##################\n ",
302 (page0 >> 8));
303 len += snprintf(page + len, count - len,
304 "\nD: OF > 00 01 02 03 04 05 06 07 08 09 0A 0B 0C "
305 "0D 0E 0F");
306 for (n = 0; n <= max;) {
307 len += snprintf(page + len, count - len,
308 "\nD: %2x > ", n);
309 for (i = 0; i < 16 && n <= max; i++, n++)
310 len += snprintf(page + len, count - len,
311 "%2.2x ", read_nic_byte(dev,
312 (page0 | n)));
313 }
314 len += snprintf(page + len, count - len, "\n");
315 *eof = 1;
316 return len;
317
318}
319static int proc_get_registers_8(char *page, char **start,
320 off_t offset, int count,
321 int *eof, void *data)
322{
323 struct net_device *dev = data;
324
325 int len = 0;
326 int i, n, page0;
327
328 int max = 0xff;
329 page0 = 0x800;
330
331 /* This dump the current register page */
332 len += snprintf(page + len, count - len,
333 "\n####################page %x##################\n",
334 (page0 >> 8));
335 for (n = 0; n <= max;) {
336 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
337 for (i = 0; i < 4 && n <= max; n += 4, i++)
338 len += snprintf(page + len, count - len,
339 "%8.8x ", rtl8192_QueryBBReg(dev,
340 (page0 | n), bMaskDWord));
341 }
342 len += snprintf(page + len, count - len, "\n");
343 *eof = 1;
344 return len;
345
346}
347static int proc_get_registers_9(char *page, char **start,
348 off_t offset, int count,
349 int *eof, void *data)
350{
351 struct net_device *dev = data;
352
353 int len = 0;
354 int i, n, page0;
355
356 int max = 0xff;
357 page0 = 0x900;
358
359 /* This dump the current register page */
360 len += snprintf(page + len, count - len,
361 "\n####################page %x##################\n",
362 (page0>>8));
363 for (n = 0; n <= max;) {
364 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
365 for (i = 0; i < 4 && n <= max; n += 4, i++)
366 len += snprintf(page + len, count - len,
367 "%8.8x ", rtl8192_QueryBBReg(dev,
368 (page0 | n), bMaskDWord));
369 }
370 len += snprintf(page + len, count - len, "\n");
371 *eof = 1;
372 return len;
373}
374static int proc_get_registers_a(char *page, char **start,
375 off_t offset, int count,
376 int *eof, void *data)
377{
378 struct net_device *dev = data;
379
380 int len = 0;
381 int i, n, page0;
382
383 int max = 0xff;
384 page0 = 0xa00;
385
386 /* This dump the current register page */
387 len += snprintf(page + len, count - len,
388 "\n####################page %x##################\n",
389 (page0>>8));
390 for (n = 0; n <= max;) {
391 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
392 for (i = 0; i < 4 && n <= max; n += 4, i++)
393 len += snprintf(page + len, count - len,
394 "%8.8x ", rtl8192_QueryBBReg(dev,
395 (page0 | n), bMaskDWord));
396 }
397 len += snprintf(page + len, count - len, "\n");
398 *eof = 1;
399 return len;
400}
401static int proc_get_registers_b(char *page, char **start,
402 off_t offset, int count,
403 int *eof, void *data)
404{
405 struct net_device *dev = data;
406
407 int len = 0;
408 int i, n, page0;
409
410 int max = 0xff;
411 page0 = 0xb00;
412
413 /* This dump the current register page */
414 len += snprintf(page + len, count - len,
415 "\n####################page %x##################\n",
416 (page0 >> 8));
417 for (n = 0; n <= max;) {
418 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
419 for (i = 0; i < 4 && n <= max; n += 4, i++)
420 len += snprintf(page + len, count - len,
421 "%8.8x ", rtl8192_QueryBBReg(dev,
422 (page0 | n), bMaskDWord));
423 }
424 len += snprintf(page + len, count - len, "\n");
425 *eof = 1;
426 return len;
427}
428static int proc_get_registers_c(char *page, char **start,
429 off_t offset, int count,
430 int *eof, void *data)
431{
432 struct net_device *dev = data;
433
434 int len = 0;
435 int i, n, page0;
436
437 int max = 0xff;
438 page0 = 0xc00;
439
440 /* This dump the current register page */
441 len += snprintf(page + len, count - len,
442 "\n####################page %x##################\n",
443 (page0>>8));
444 for (n = 0; n <= max;) {
445 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
446 for (i = 0; i < 4 && n <= max; n += 4, i++)
447 len += snprintf(page + len, count - len,
448 "%8.8x ", rtl8192_QueryBBReg(dev,
449 (page0 | n), bMaskDWord));
450 }
451 len += snprintf(page + len, count - len, "\n");
452 *eof = 1;
453 return len;
454}
455static int proc_get_registers_d(char *page, char **start,
456 off_t offset, int count,
457 int *eof, void *data)
458{
459 struct net_device *dev = data;
460
461 int len = 0;
462 int i, n, page0;
463
464 int max = 0xff;
465 page0 = 0xd00;
466
467 /* This dump the current register page */
468 len += snprintf(page + len, count - len,
469 "\n####################page %x##################\n",
470 (page0>>8));
471 for (n = 0; n <= max;) {
472 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
473 for (i = 0; i < 4 && n <= max; n += 4, i++)
474 len += snprintf(page + len, count - len,
475 "%8.8x ", rtl8192_QueryBBReg(dev,
476 (page0 | n), bMaskDWord));
477 }
478 len += snprintf(page + len, count - len, "\n");
479 *eof = 1;
480 return len;
481}
482static int proc_get_registers_e(char *page, char **start,
483 off_t offset, int count,
484 int *eof, void *data)
485{
486 struct net_device *dev = data;
487
488 int len = 0;
489 int i, n, page0;
490
491 int max = 0xff;
492 page0 = 0xe00;
493
494 /* This dump the current register page */
495 len += snprintf(page + len, count - len,
496 "\n####################page %x##################\n",
497 (page0>>8));
498 for (n = 0; n <= max;) {
499 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
500 for (i = 0; i < 4 && n <= max; n += 4, i++)
501 len += snprintf(page + len, count - len,
502 "%8.8x ", rtl8192_QueryBBReg(dev,
503 (page0 | n), bMaskDWord));
504 }
505 len += snprintf(page + len, count - len, "\n");
506 *eof = 1;
507 return len;
508}
509
510static int proc_get_reg_rf_a(char *page, char **start,
511 off_t offset, int count,
512 int *eof, void *data)
513{
514 struct net_device *dev = data;
515
516 int len = 0;
517 int i, n;
518
519 int max = 0xff;
520
521 /* This dump the current register page */
522 len += snprintf(page + len, count - len,
523 "\n#################### RF-A ##################\n ");
524 for (n = 0; n <= max;) {
525 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
526 for (i = 0; i < 4 && n <= max; n += 4, i++)
527 len += snprintf(page + len, count - len,
528 "%8.8x ", rtl8192_phy_QueryRFReg(dev,
529 (enum rf90_radio_path)RF90_PATH_A, n,
530 bMaskDWord));
531 }
532 len += snprintf(page + len, count - len, "\n");
533 *eof = 1;
534 return len;
535}
536
537static int proc_get_reg_rf_b(char *page, char **start,
538 off_t offset, int count,
539 int *eof, void *data)
540{
541 struct net_device *dev = data;
542
543 int len = 0;
544 int i, n;
545
546 int max = 0xff;
547
548 /* This dump the current register page */
549 len += snprintf(page + len, count - len,
550 "\n#################### RF-B ##################\n ");
551 for (n = 0; n <= max;) {
552 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
553 for (i = 0; i < 4 && n <= max; n += 4, i++)
554 len += snprintf(page + len, count - len,
555 "%8.8x ", rtl8192_phy_QueryRFReg(dev,
556 (enum rf90_radio_path)RF90_PATH_B, n,
557 bMaskDWord));
558 }
559 len += snprintf(page + len, count - len, "\n");
560 *eof = 1;
561 return len;
562}
563
564static int proc_get_reg_rf_c(char *page, char **start,
565 off_t offset, int count,
566 int *eof, void *data)
567{
568 struct net_device *dev = data;
569
570 int len = 0;
571 int i, n;
572
573 int max = 0xff;
574
575 /* This dump the current register page */
576 len += snprintf(page + len, count - len,
577 "\n#################### RF-C ##################\n");
578 for (n = 0; n <= max;) {
579 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
580 for (i = 0; i < 4 && n <= max; n += 4, i++)
581 len += snprintf(page + len, count - len,
582 "%8.8x ", rtl8192_phy_QueryRFReg(dev,
583 (enum rf90_radio_path)RF90_PATH_C, n,
584 bMaskDWord));
585 }
586 len += snprintf(page + len, count - len, "\n");
587 *eof = 1;
588 return len;
589}
590
591static int proc_get_reg_rf_d(char *page, char **start,
592 off_t offset, int count,
593 int *eof, void *data)
594{
595 struct net_device *dev = data;
596
597 int len = 0;
598 int i, n;
599
600 int max = 0xff;
601
602 /* This dump the current register page */
603 len += snprintf(page + len, count - len,
604 "\n#################### RF-D ##################\n ");
605 for (n = 0; n <= max;) {
606 len += snprintf(page + len, count - len, "\nD: %2x > ", n);
607 for (i = 0; i < 4 && n <= max; n += 4, i++)
608 len += snprintf(page + len, count - len,
609 "%8.8x ", rtl8192_phy_QueryRFReg(dev,
610 (enum rf90_radio_path)RF90_PATH_D, n,
611 bMaskDWord));
612 }
613 len += snprintf(page + len, count - len, "\n");
614 *eof = 1;
615 return len;
616}
617
618static int proc_get_cam_register_1(char *page, char **start,
619 off_t offset, int count,
620 int *eof, void *data)
621{
622 struct net_device *dev = data;
623 u32 target_command = 0;
624 u32 target_content = 0;
625 u8 entry_i = 0;
626 u32 ulStatus;
627 int len = 0;
628 int i = 100, j = 0;
629
630 /* This dump the current register page */
631 len += snprintf(page + len, count - len,
632 "\n#################### SECURITY CAM (0-10) ######"
633 "############\n ");
634 for (j = 0; j < 11; j++) {
635 len += snprintf(page + len, count - len, "\nD: %2x > ", j);
636 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) {
637 target_command = entry_i+CAM_CONTENT_COUNT*j;
638 target_command = target_command | BIT31;
639
640 while ((i--) >= 0) {
641 ulStatus = read_nic_dword(dev, RWCAM);
642 if (ulStatus & BIT31)
643 continue;
644 else
645 break;
646 }
647 write_nic_dword(dev, RWCAM, target_command);
648 target_content = read_nic_dword(dev, RCAMO);
649 len += snprintf(page + len, count - len, "%8.8x ",
650 target_content);
651 }
652 }
653
654 len += snprintf(page + len, count - len, "\n");
655 *eof = 1;
656 return len;
657}
658
659static int proc_get_cam_register_2(char *page, char **start,
660 off_t offset, int count,
661 int *eof, void *data)
662{
663 struct net_device *dev = data;
664 u32 target_command = 0;
665 u32 target_content = 0;
666 u8 entry_i = 0;
667 u32 ulStatus;
668 int len = 0;
669 int i = 100, j = 0;
670
671 /* This dump the current register page */
672 len += snprintf(page + len, count - len,
673 "\n#################### SECURITY CAM (11-21) "
674 "##################\n ");
675 for (j = 11; j < 22; j++) {
676 len += snprintf(page + len, count - len, "\nD: %2x > ", j);
677 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) {
678 target_command = entry_i + CAM_CONTENT_COUNT * j;
679 target_command = target_command | BIT31;
680
681 while ((i--) >= 0) {
682 ulStatus = read_nic_dword(dev, RWCAM);
683 if (ulStatus & BIT31)
684 continue;
685 else
686 break;
687 }
688 write_nic_dword(dev, RWCAM, target_command);
689 target_content = read_nic_dword(dev, RCAMO);
690 len += snprintf(page + len, count - len, "%8.8x ",
691 target_content);
692 }
693 }
694
695 len += snprintf(page + len, count - len, "\n");
696 *eof = 1;
697 return len;
698}
699
700static int proc_get_cam_register_3(char *page, char **start,
701 off_t offset, int count,
702 int *eof, void *data)
703{
704 struct net_device *dev = data;
705 u32 target_command = 0;
706 u32 target_content = 0;
707 u8 entry_i = 0;
708 u32 ulStatus;
709 int len = 0;
710 int i = 100, j = 0;
711
712 /* This dump the current register page */
713 len += snprintf(page + len, count - len,
714 "\n#################### SECURITY CAM (22-31) ######"
715 "############\n ");
716 for (j = 22; j < TOTAL_CAM_ENTRY; j++) {
717 len += snprintf(page + len, count - len, "\nD: %2x > ", j);
718 for (entry_i = 0; entry_i < CAM_CONTENT_COUNT; entry_i++) {
719 target_command = entry_i + CAM_CONTENT_COUNT * j;
720 target_command = target_command | BIT31;
721
722 while ((i--) >= 0) {
723 ulStatus = read_nic_dword(dev, RWCAM);
724 if (ulStatus & BIT31)
725 continue;
726 else
727 break;
728 }
729 write_nic_dword(dev, RWCAM, target_command);
730 target_content = read_nic_dword(dev, RCAMO);
731 len += snprintf(page + len, count - len, "%8.8x ",
732 target_content);
733 }
734 }
735
736 len += snprintf(page + len, count - len, "\n");
737 *eof = 1;
738 return len;
739}
740static int proc_get_stats_tx(char *page, char **start,
741 off_t offset, int count,
742 int *eof, void *data)
743{
744 struct net_device *dev = data;
745 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
746
747 int len = 0;
748
749 len += snprintf(page + len, count - len,
750 "TX VI priority ok int: %lu\n"
751 "TX VO priority ok int: %lu\n"
752 "TX BE priority ok int: %lu\n"
753 "TX BK priority ok int: %lu\n"
754 "TX MANAGE priority ok int: %lu\n"
755 "TX BEACON priority ok int: %lu\n"
756 "TX BEACON priority error int: %lu\n"
757 "TX CMDPKT priority ok int: %lu\n"
758 "TX queue stopped?: %d\n"
759 "TX fifo overflow: %lu\n"
760 "TX total data packets %lu\n"
761 "TX total data bytes :%lu\n",
762 priv->stats.txviokint,
763 priv->stats.txvookint,
764 priv->stats.txbeokint,
765 priv->stats.txbkokint,
766 priv->stats.txmanageokint,
767 priv->stats.txbeaconokint,
768 priv->stats.txbeaconerr,
769 priv->stats.txcmdpktokint,
770 netif_queue_stopped(dev),
771 priv->stats.txoverflow,
772 priv->rtllib->stats.tx_packets,
773 priv->rtllib->stats.tx_bytes
774
775
776 );
777
778 *eof = 1;
779 return len;
780}
781
782
783
784static int proc_get_stats_rx(char *page, char **start,
785 off_t offset, int count,
786 int *eof, void *data)
787{
788 struct net_device *dev = data;
789 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
790
791 int len = 0;
792
793 len += snprintf(page + len, count - len,
794 "RX packets: %lu\n"
795 "RX data crc err: %lu\n"
796 "RX mgmt crc err: %lu\n"
797 "RX desc err: %lu\n"
798 "RX rx overflow error: %lu\n",
799 priv->stats.rxint,
800 priv->stats.rxdatacrcerr,
801 priv->stats.rxmgmtcrcerr,
802 priv->stats.rxrdu,
803 priv->stats.rxoverflow);
804
805 *eof = 1;
806 return len;
807}
808
809void rtl8192_proc_module_init(void)
810{
811 RT_TRACE(COMP_INIT, "Initializing proc filesystem");
812 rtl8192_proc = create_proc_entry(DRV_NAME, S_IFDIR, init_net.proc_net);
813}
814
815
816void rtl8192_proc_module_remove(void)
817{
818 remove_proc_entry(DRV_NAME, init_net.proc_net);
819}
820
821
822void rtl8192_proc_remove_one(struct net_device *dev)
823{
824 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
825
826 printk(KERN_INFO "dev name %s\n", dev->name);
827
828 if (priv->dir_dev) {
829 remove_proc_entry("stats-tx", priv->dir_dev);
830 remove_proc_entry("stats-rx", priv->dir_dev);
831 remove_proc_entry("stats-ap", priv->dir_dev);
832 remove_proc_entry("registers-0", priv->dir_dev);
833 remove_proc_entry("registers-1", priv->dir_dev);
834 remove_proc_entry("registers-2", priv->dir_dev);
835 remove_proc_entry("registers-3", priv->dir_dev);
836 remove_proc_entry("registers-4", priv->dir_dev);
837 remove_proc_entry("registers-5", priv->dir_dev);
838 remove_proc_entry("registers-6", priv->dir_dev);
839 remove_proc_entry("registers-7", priv->dir_dev);
840 remove_proc_entry("registers-8", priv->dir_dev);
841 remove_proc_entry("registers-9", priv->dir_dev);
842 remove_proc_entry("registers-a", priv->dir_dev);
843 remove_proc_entry("registers-b", priv->dir_dev);
844 remove_proc_entry("registers-c", priv->dir_dev);
845 remove_proc_entry("registers-d", priv->dir_dev);
846 remove_proc_entry("registers-e", priv->dir_dev);
847 remove_proc_entry("RF-A", priv->dir_dev);
848 remove_proc_entry("RF-B", priv->dir_dev);
849 remove_proc_entry("RF-C", priv->dir_dev);
850 remove_proc_entry("RF-D", priv->dir_dev);
851 remove_proc_entry("SEC-CAM-1", priv->dir_dev);
852 remove_proc_entry("SEC-CAM-2", priv->dir_dev);
853 remove_proc_entry("SEC-CAM-3", priv->dir_dev);
854 remove_proc_entry("wlan0", rtl8192_proc);
855 priv->dir_dev = NULL;
856 }
857}
858
859
860void rtl8192_proc_init_one(struct net_device *dev)
861{
862 struct proc_dir_entry *e;
863 struct r8192_priv *priv = (struct r8192_priv *)rtllib_priv(dev);
864
865 priv->dir_dev = create_proc_entry(dev->name,
866 S_IFDIR | S_IRUGO | S_IXUGO,
867 rtl8192_proc);
868 if (!priv->dir_dev) {
869 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192"
870 "/%s\n", dev->name);
871 return;
872 }
873 e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
874 priv->dir_dev, proc_get_stats_rx, dev);
875
876 if (!e)
877 RT_TRACE(COMP_ERR, "Unable to initialize "
878 "/proc/net/rtl8192/%s/stats-rx\n",
879 dev->name);
880
881 e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO,
882 priv->dir_dev, proc_get_stats_tx, dev);
883
884 if (!e)
885 RT_TRACE(COMP_ERR, "Unable to initialize "
886 "/proc/net/rtl8192/%s/stats-tx\n",
887 dev->name);
888
889 e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO,
890 priv->dir_dev, proc_get_stats_ap, dev);
891
892 if (!e)
893 RT_TRACE(COMP_ERR, "Unable to initialize "
894 "/proc/net/rtl8192/%s/stats-ap\n",
895 dev->name);
896
897 e = create_proc_read_entry("registers-0", S_IFREG | S_IRUGO,
898 priv->dir_dev, proc_get_registers_0, dev);
899 if (!e)
900 RT_TRACE(COMP_ERR, "Unable to initialize "
901 "/proc/net/rtl8192/%s/registers-0\n",
902 dev->name);
903 e = create_proc_read_entry("registers-1", S_IFREG | S_IRUGO,
904 priv->dir_dev, proc_get_registers_1, dev);
905 if (!e)
906 RT_TRACE(COMP_ERR, "Unable to initialize "
907 "/proc/net/rtl8192/%s/registers-1\n",
908 dev->name);
909 e = create_proc_read_entry("registers-2", S_IFREG | S_IRUGO,
910 priv->dir_dev, proc_get_registers_2, dev);
911 if (!e)
912 RT_TRACE(COMP_ERR, "Unable to initialize "
913 "/proc/net/rtl8192/%s/registers-2\n",
914 dev->name);
915 e = create_proc_read_entry("registers-3", S_IFREG | S_IRUGO,
916 priv->dir_dev, proc_get_registers_3, dev);
917 if (!e)
918 RT_TRACE(COMP_ERR, "Unable to initialize "
919 "/proc/net/rtl8192/%s/registers-3\n",
920 dev->name);
921 e = create_proc_read_entry("registers-4", S_IFREG | S_IRUGO,
922 priv->dir_dev, proc_get_registers_4, dev);
923 if (!e)
924 RT_TRACE(COMP_ERR, "Unable to initialize "
925 "/proc/net/rtl8192/%s/registers-4\n",
926 dev->name);
927 e = create_proc_read_entry("registers-5", S_IFREG | S_IRUGO,
928 priv->dir_dev, proc_get_registers_5, dev);
929 if (!e)
930 RT_TRACE(COMP_ERR, "Unable to initialize "
931 "/proc/net/rtl8192/%s/registers-5\n",
932 dev->name);
933 e = create_proc_read_entry("registers-6", S_IFREG | S_IRUGO,
934 priv->dir_dev, proc_get_registers_6, dev);
935 if (!e)
936 RT_TRACE(COMP_ERR, "Unable to initialize "
937 "/proc/net/rtl8192/%s/registers-6\n",
938 dev->name);
939 e = create_proc_read_entry("registers-7", S_IFREG | S_IRUGO,
940 priv->dir_dev, proc_get_registers_7, dev);
941 if (!e)
942 RT_TRACE(COMP_ERR, "Unable to initialize "
943 "/proc/net/rtl8192/%s/registers-7\n",
944 dev->name);
945 e = create_proc_read_entry("registers-8", S_IFREG | S_IRUGO,
946 priv->dir_dev, proc_get_registers_8, dev);
947 if (!e)
948 RT_TRACE(COMP_ERR, "Unable to initialize "
949 "/proc/net/rtl8192/%s/registers-8\n",
950 dev->name);
951 e = create_proc_read_entry("registers-9", S_IFREG | S_IRUGO,
952 priv->dir_dev, proc_get_registers_9, dev);
953 if (!e)
954 RT_TRACE(COMP_ERR, "Unable to initialize "
955 "/proc/net/rtl8192/%s/registers-9\n",
956 dev->name);
957 e = create_proc_read_entry("registers-a", S_IFREG | S_IRUGO,
958 priv->dir_dev, proc_get_registers_a, dev);
959 if (!e)
960 RT_TRACE(COMP_ERR, "Unable to initialize "
961 "/proc/net/rtl8192/%s/registers-a\n",
962 dev->name);
963 e = create_proc_read_entry("registers-b", S_IFREG | S_IRUGO,
964 priv->dir_dev, proc_get_registers_b, dev);
965 if (!e)
966 RT_TRACE(COMP_ERR, "Unable to initialize "
967 "/proc/net/rtl8192/%s/registers-b\n",
968 dev->name);
969 e = create_proc_read_entry("registers-c", S_IFREG | S_IRUGO,
970 priv->dir_dev, proc_get_registers_c, dev);
971 if (!e)
972 RT_TRACE(COMP_ERR, "Unable to initialize "
973 "/proc/net/rtl8192/%s/registers-c\n",
974 dev->name);
975 e = create_proc_read_entry("registers-d", S_IFREG | S_IRUGO,
976 priv->dir_dev, proc_get_registers_d, dev);
977 if (!e)
978 RT_TRACE(COMP_ERR, "Unable to initialize "
979 "/proc/net/rtl8192/%s/registers-d\n",
980 dev->name);
981 e = create_proc_read_entry("registers-e", S_IFREG | S_IRUGO,
982 priv->dir_dev, proc_get_registers_e, dev);
983 if (!e)
984 RT_TRACE(COMP_ERR, "Unable to initialize "
985 "/proc/net/rtl8192/%s/registers-e\n",
986 dev->name);
987 e = create_proc_read_entry("RF-A", S_IFREG | S_IRUGO,
988 priv->dir_dev, proc_get_reg_rf_a, dev);
989 if (!e)
990 RT_TRACE(COMP_ERR, "Unable to initialize "
991 "/proc/net/rtl8192/%s/RF-A\n",
992 dev->name);
993 e = create_proc_read_entry("RF-B", S_IFREG | S_IRUGO,
994 priv->dir_dev, proc_get_reg_rf_b, dev);
995 if (!e)
996 RT_TRACE(COMP_ERR, "Unable to initialize "
997 "/proc/net/rtl8192/%s/RF-B\n",
998 dev->name);
999 e = create_proc_read_entry("RF-C", S_IFREG | S_IRUGO,
1000 priv->dir_dev, proc_get_reg_rf_c, dev);
1001 if (!e)
1002 RT_TRACE(COMP_ERR, "Unable to initialize "
1003 "/proc/net/rtl8192/%s/RF-C\n",
1004 dev->name);
1005 e = create_proc_read_entry("RF-D", S_IFREG | S_IRUGO,
1006 priv->dir_dev, proc_get_reg_rf_d, dev);
1007 if (!e)
1008 RT_TRACE(COMP_ERR, "Unable to initialize "
1009 "/proc/net/rtl8192/%s/RF-D\n",
1010 dev->name);
1011 e = create_proc_read_entry("SEC-CAM-1", S_IFREG | S_IRUGO,
1012 priv->dir_dev, proc_get_cam_register_1, dev);
1013 if (!e)
1014 RT_TRACE(COMP_ERR, "Unable to initialize "
1015 "/proc/net/rtl8192/%s/SEC-CAM-1\n",
1016 dev->name);
1017 e = create_proc_read_entry("SEC-CAM-2", S_IFREG | S_IRUGO,
1018 priv->dir_dev, proc_get_cam_register_2, dev);
1019 if (!e)
1020 RT_TRACE(COMP_ERR, "Unable to initialize "
1021 "/proc/net/rtl8192/%s/SEC-CAM-2\n",
1022 dev->name);
1023 e = create_proc_read_entry("SEC-CAM-3", S_IFREG | S_IRUGO,
1024 priv->dir_dev, proc_get_cam_register_3, dev);
1025 if (!e)
1026 RT_TRACE(COMP_ERR, "Unable to initialize "
1027 "/proc/net/rtl8192/%s/SEC-CAM-3\n",
1028 dev->name);
1029}
diff --git a/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c b/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c
index 4217b88e6fc3..e51cb49ce10e 100644
--- a/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c
+++ b/drivers/staging/rtl8192e/rtllib_crypt_ccmp.c
@@ -412,19 +412,18 @@ static int rtllib_ccmp_get_key(void *key, int len, u8 *seq, void *priv)
412} 412}
413 413
414 414
415static char *rtllib_ccmp_print_stats(char *p, void *priv) 415static void rtllib_ccmp_print_stats(struct seq_file *m, void *priv)
416{ 416{
417 struct rtllib_ccmp_data *ccmp = priv; 417 struct rtllib_ccmp_data *ccmp = priv;
418 p += sprintf(p, "key[%d] alg=CCMP key_set=%d " 418 seq_printf(m,
419 "tx_pn=%pM rx_pn=%pM " 419 "key[%d] alg=CCMP key_set=%d "
420 "format_errors=%d replays=%d decrypt_errors=%d\n", 420 "tx_pn=%pM rx_pn=%pM "
421 ccmp->key_idx, ccmp->key_set, 421 "format_errors=%d replays=%d decrypt_errors=%d\n",
422 ccmp->tx_pn, ccmp->rx_pn, 422 ccmp->key_idx, ccmp->key_set,
423 ccmp->dot11RSNAStatsCCMPFormatErrors, 423 ccmp->tx_pn, ccmp->rx_pn,
424 ccmp->dot11RSNAStatsCCMPReplays, 424 ccmp->dot11RSNAStatsCCMPFormatErrors,
425 ccmp->dot11RSNAStatsCCMPDecryptErrors); 425 ccmp->dot11RSNAStatsCCMPReplays,
426 426 ccmp->dot11RSNAStatsCCMPDecryptErrors);
427 return p;
428} 427}
429 428
430static struct lib80211_crypto_ops rtllib_crypt_ccmp = { 429static struct lib80211_crypto_ops rtllib_crypt_ccmp = {
diff --git a/drivers/staging/rtl8192e/rtllib_crypt_tkip.c b/drivers/staging/rtl8192e/rtllib_crypt_tkip.c
index 800925053fb0..5cfd73baf1cc 100644
--- a/drivers/staging/rtl8192e/rtllib_crypt_tkip.c
+++ b/drivers/staging/rtl8192e/rtllib_crypt_tkip.c
@@ -708,30 +708,30 @@ static int rtllib_tkip_get_key(void *key, int len, u8 *seq, void *priv)
708} 708}
709 709
710 710
711static char *rtllib_tkip_print_stats(char *p, void *priv) 711static void rtllib_tkip_print_stats(struct seq_file *m, void *priv)
712{ 712{
713 struct rtllib_tkip_data *tkip = priv; 713 struct rtllib_tkip_data *tkip = priv;
714 p += sprintf(p, "key[%d] alg=TKIP key_set=%d " 714 seq_printf(m,
715 "tx_pn=%02x%02x%02x%02x%02x%02x " 715 "key[%d] alg=TKIP key_set=%d "
716 "rx_pn=%02x%02x%02x%02x%02x%02x " 716 "tx_pn=%02x%02x%02x%02x%02x%02x "
717 "replays=%d icv_errors=%d local_mic_failures=%d\n", 717 "rx_pn=%02x%02x%02x%02x%02x%02x "
718 tkip->key_idx, tkip->key_set, 718 "replays=%d icv_errors=%d local_mic_failures=%d\n",
719 (tkip->tx_iv32 >> 24) & 0xff, 719 tkip->key_idx, tkip->key_set,
720 (tkip->tx_iv32 >> 16) & 0xff, 720 (tkip->tx_iv32 >> 24) & 0xff,
721 (tkip->tx_iv32 >> 8) & 0xff, 721 (tkip->tx_iv32 >> 16) & 0xff,
722 tkip->tx_iv32 & 0xff, 722 (tkip->tx_iv32 >> 8) & 0xff,
723 (tkip->tx_iv16 >> 8) & 0xff, 723 tkip->tx_iv32 & 0xff,
724 tkip->tx_iv16 & 0xff, 724 (tkip->tx_iv16 >> 8) & 0xff,
725 (tkip->rx_iv32 >> 24) & 0xff, 725 tkip->tx_iv16 & 0xff,
726 (tkip->rx_iv32 >> 16) & 0xff, 726 (tkip->rx_iv32 >> 24) & 0xff,
727 (tkip->rx_iv32 >> 8) & 0xff, 727 (tkip->rx_iv32 >> 16) & 0xff,
728 tkip->rx_iv32 & 0xff, 728 (tkip->rx_iv32 >> 8) & 0xff,
729 (tkip->rx_iv16 >> 8) & 0xff, 729 tkip->rx_iv32 & 0xff,
730 tkip->rx_iv16 & 0xff, 730 (tkip->rx_iv16 >> 8) & 0xff,
731 tkip->dot11RSNAStatsTKIPReplays, 731 tkip->rx_iv16 & 0xff,
732 tkip->dot11RSNAStatsTKIPICVErrors, 732 tkip->dot11RSNAStatsTKIPReplays,
733 tkip->dot11RSNAStatsTKIPLocalMICFailures); 733 tkip->dot11RSNAStatsTKIPICVErrors,
734 return p; 734 tkip->dot11RSNAStatsTKIPLocalMICFailures);
735} 735}
736 736
737static struct lib80211_crypto_ops rtllib_crypt_tkip = { 737static struct lib80211_crypto_ops rtllib_crypt_tkip = {
diff --git a/drivers/staging/rtl8192e/rtllib_crypt_wep.c b/drivers/staging/rtl8192e/rtllib_crypt_wep.c
index 8cdf38913a33..c4df6e01ef74 100644
--- a/drivers/staging/rtl8192e/rtllib_crypt_wep.c
+++ b/drivers/staging/rtl8192e/rtllib_crypt_wep.c
@@ -247,12 +247,10 @@ static int prism2_wep_get_key(void *key, int len, u8 *seq, void *priv)
247} 247}
248 248
249 249
250static char *prism2_wep_print_stats(char *p, void *priv) 250static void prism2_wep_print_stats(struct seq_file *m, void *priv)
251{ 251{
252 struct prism2_wep_data *wep = priv; 252 struct prism2_wep_data *wep = priv;
253 p += sprintf(p, "key[%d] alg=WEP len=%d\n", 253 seq_printf(m, "key[%d] alg=WEP len=%d\n", wep->key_idx, wep->key_len);
254 wep->key_idx, wep->key_len);
255 return p;
256} 254}
257 255
258static struct lib80211_crypto_ops rtllib_crypt_wep = { 256static struct lib80211_crypto_ops rtllib_crypt_wep = {
diff --git a/drivers/staging/rtl8192e/rtllib_module.c b/drivers/staging/rtl8192e/rtllib_module.c
index f9dae958a5d4..84ea721d5d8e 100644
--- a/drivers/staging/rtl8192e/rtllib_module.c
+++ b/drivers/staging/rtl8192e/rtllib_module.c
@@ -208,61 +208,51 @@ static int debug = \
208 ; 208 ;
209static struct proc_dir_entry *rtllib_proc; 209static struct proc_dir_entry *rtllib_proc;
210 210
211static int show_debug_level(char *page, char **start, off_t offset, 211static int show_debug_level(struct seq_file *m, void *v)
212 int count, int *eof, void *data)
213{ 212{
214 return snprintf(page, count, "0x%08X\n", rtllib_debug_level); 213 return seq_printf(m, "0x%08X\n", rtllib_debug_level);
215} 214}
216 215
217static int store_debug_level(struct file *file, const char __user *buffer, 216static ssize_t write_debug_level(struct file *file, const char __user *buffer,
218 unsigned long count, void *data) 217 size_t count, loff_t *ppos)
219{ 218{
220 char buf[] = "0x00000000";
221 unsigned long len = min((unsigned long)sizeof(buf) - 1, count);
222 char *p = (char *)buf;
223 unsigned long val; 219 unsigned long val;
220 int err = kstrtoul_from_user(buffer, count, 0, &val);
221 if (err)
222 return err;
223 rtllib_debug_level = val;
224 return count;
225}
224 226
225 if (copy_from_user(buf, buffer, len)) 227static int open_debug_level(struct inode *inode, struct file *file)
226 return count; 228{
227 buf[len] = 0; 229 return single_open(file, show_debug_level, NULL);
228 if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
229 p++;
230 if (p[0] == 'x' || p[0] == 'X')
231 p++;
232 val = simple_strtoul(p, &p, 16);
233 } else
234 val = simple_strtoul(p, &p, 10);
235 if (p == buf)
236 printk(KERN_INFO DRV_NAME
237 ": %s is not in hex or decimal form.\n", buf);
238 else
239 rtllib_debug_level = val;
240
241 return strnlen(buf, count);
242} 230}
243 231
232static const struct file_operations fops = {
233 .open = open_debug_level,
234 .read = seq_read,
235 .llseek = seq_lseek,
236 .write = write_debug_level
237};
238
244int __init rtllib_init(void) 239int __init rtllib_init(void)
245{ 240{
246 struct proc_dir_entry *e; 241 struct proc_dir_entry *e;
247 242
248 rtllib_debug_level = debug; 243 rtllib_debug_level = debug;
249 rtllib_proc = create_proc_entry(DRV_NAME, S_IFDIR, init_net.proc_net); 244 rtllib_proc = proc_mkdir(DRV_NAME, init_net.proc_net);
250 if (rtllib_proc == NULL) { 245 if (rtllib_proc == NULL) {
251 RTLLIB_ERROR("Unable to create " DRV_NAME 246 RTLLIB_ERROR("Unable to create " DRV_NAME
252 " proc directory\n"); 247 " proc directory\n");
253 return -EIO; 248 return -EIO;
254 } 249 }
255 e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR, 250 e = proc_create("debug_level", S_IRUGO | S_IWUSR, rtllib_proc, &fops);
256 rtllib_proc);
257 if (!e) { 251 if (!e) {
258 remove_proc_entry(DRV_NAME, init_net.proc_net); 252 remove_proc_entry(DRV_NAME, init_net.proc_net);
259 rtllib_proc = NULL; 253 rtllib_proc = NULL;
260 return -EIO; 254 return -EIO;
261 } 255 }
262 e->read_proc = show_debug_level;
263 e->write_proc = store_debug_level;
264 e->data = NULL;
265
266 return 0; 256 return 0;
267} 257}
268 258
diff --git a/drivers/staging/rtl8192u/ieee80211/ieee80211_module.c b/drivers/staging/rtl8192u/ieee80211/ieee80211_module.c
index 76c56e5aed79..e0870c05a5e0 100644
--- a/drivers/staging/rtl8192u/ieee80211/ieee80211_module.c
+++ b/drivers/staging/rtl8192u/ieee80211/ieee80211_module.c
@@ -243,39 +243,34 @@ static int debug = \
243 ; 243 ;
244struct proc_dir_entry *ieee80211_proc; 244struct proc_dir_entry *ieee80211_proc;
245 245
246static int show_debug_level(char *page, char **start, off_t offset, 246static int show_debug_level(struct seq_file *m, void *v)
247 int count, int *eof, void *data)
248{ 247{
249 return snprintf(page, count, "0x%08X\n", ieee80211_debug_level); 248 return seq_printf(m, "0x%08X\n", ieee80211_debug_level);
250} 249}
251 250
252static int store_debug_level(struct file *file, const char *buffer, 251static ssize_t write_debug_level(struct file *file, const char __user *buffer,
253 unsigned long count, void *data) 252 size_t count, loff_t *ppos)
254{ 253{
255 char buf[] = "0x00000000";
256 unsigned long len = min_t(unsigned long, sizeof(buf) - 1, count);
257 char *p = (char *)buf;
258 unsigned long val; 254 unsigned long val;
255 int err = kstrtoul_from_user(buffer, count, 0, &val);
256 if (err)
257 return err;
258 ieee80211_debug_level = val;
259 return count;
260}
259 261
260 if (copy_from_user(buf, buffer, len)) 262static int open_debug_level(struct inode *inode, struct file *file)
261 return count; 263{
262 buf[len] = 0; 264 return single_open(file, show_debug_level, NULL);
263 if (p[1] == 'x' || p[1] == 'X' || p[0] == 'x' || p[0] == 'X') {
264 p++;
265 if (p[0] == 'x' || p[0] == 'X')
266 p++;
267 val = simple_strtoul(p, &p, 16);
268 } else
269 val = simple_strtoul(p, &p, 10);
270 if (p == buf)
271 printk(KERN_INFO DRV_NAME
272 ": %s is not in hex or decimal form.\n", buf);
273 else
274 ieee80211_debug_level = val;
275
276 return strnlen(buf, count);
277} 265}
278 266
267static const struct file_operations fops = {
268 .open = open_debug_level,
269 .read = seq_read,
270 .llseek = seq_lseek,
271 .write = write_debug_level
272};
273
279int __init ieee80211_debug_init(void) 274int __init ieee80211_debug_init(void)
280{ 275{
281 struct proc_dir_entry *e; 276 struct proc_dir_entry *e;
@@ -288,17 +283,13 @@ int __init ieee80211_debug_init(void)
288 " proc directory\n"); 283 " proc directory\n");
289 return -EIO; 284 return -EIO;
290 } 285 }
291 e = create_proc_entry("debug_level", S_IFREG | S_IRUGO | S_IWUSR, 286 e = proc_create("debug_level", S_IRUGO | S_IWUSR,
292 ieee80211_proc); 287 ieee80211_proc, &fops);
293 if (!e) { 288 if (!e) {
294 remove_proc_entry(DRV_NAME, init_net.proc_net); 289 remove_proc_entry(DRV_NAME, init_net.proc_net);
295 ieee80211_proc = NULL; 290 ieee80211_proc = NULL;
296 return -EIO; 291 return -EIO;
297 } 292 }
298 e->read_proc = show_debug_level;
299 e->write_proc = store_debug_level;
300 e->data = NULL;
301
302 return 0; 293 return 0;
303} 294}
304 295
diff --git a/drivers/staging/rtl8192u/ieee80211/proc.c b/drivers/staging/rtl8192u/ieee80211/proc.c
index 6eda928e4090..c426dfdd9fdd 100644
--- a/drivers/staging/rtl8192u/ieee80211/proc.c
+++ b/drivers/staging/rtl8192u/ieee80211/proc.c
@@ -99,7 +99,7 @@ static int crypto_info_open(struct inode *inode, struct file *file)
99 return seq_open(file, &crypto_seq_ops); 99 return seq_open(file, &crypto_seq_ops);
100} 100}
101 101
102static struct file_operations proc_crypto_ops = { 102static const struct file_operations proc_crypto_ops = {
103 .open = crypto_info_open, 103 .open = crypto_info_open,
104 .read = seq_read, 104 .read = seq_read,
105 .llseek = seq_lseek, 105 .llseek = seq_lseek,
@@ -108,9 +108,5 @@ static struct file_operations proc_crypto_ops = {
108 108
109void __init crypto_init_proc(void) 109void __init crypto_init_proc(void)
110{ 110{
111 struct proc_dir_entry *proc; 111 proc_create("crypto", 0, NULL, &proc_crypto_ops);
112
113 proc = create_proc_entry("crypto", 0, NULL);
114 if (proc)
115 proc->proc_fops = &proc_crypto_ops;
116} 112}
diff --git a/drivers/staging/rtl8192u/r8192U.h b/drivers/staging/rtl8192u/r8192U.h
index e538e026b512..bedeb330ad4f 100644
--- a/drivers/staging/rtl8192u/r8192U.h
+++ b/drivers/staging/rtl8192u/r8192U.h
@@ -946,7 +946,6 @@ typedef struct r8192_priv {
946 /*stats*/ 946 /*stats*/
947 struct Stats stats; 947 struct Stats stats;
948 struct iw_statistics wstats; 948 struct iw_statistics wstats;
949 struct proc_dir_entry *dir_dev;
950 949
951 /*RX stuff*/ 950 /*RX stuff*/
952// u32 *rxring; 951// u32 *rxring;
diff --git a/drivers/staging/rtl8192u/r8192U_core.c b/drivers/staging/rtl8192u/r8192U_core.c
index f7de2f6d49a5..145923397556 100644
--- a/drivers/staging/rtl8192u/r8192U_core.c
+++ b/drivers/staging/rtl8192u/r8192U_core.c
@@ -71,6 +71,8 @@ double __extendsfdf2(float a) {return a;}
71//#include "r8192xU_phyreg.h" 71//#include "r8192xU_phyreg.h"
72#include <linux/usb.h> 72#include <linux/usb.h>
73#include <linux/slab.h> 73#include <linux/slab.h>
74#include <linux/proc_fs.h>
75#include <linux/seq_file.h>
74// FIXME: check if 2.6.7 is ok 76// FIXME: check if 2.6.7 is ok
75 77
76#ifdef CONFIG_RTL8192_PM 78#ifdef CONFIG_RTL8192_PM
@@ -472,103 +474,73 @@ void watch_dog_timer_callback(unsigned long data);
472 474
473static struct proc_dir_entry *rtl8192_proc; 475static struct proc_dir_entry *rtl8192_proc;
474 476
475static int proc_get_stats_ap(char *page, char **start, off_t offset, int count, 477static int proc_get_stats_ap(struct seq_file *m, void *v)
476 int *eof, void *data)
477{ 478{
478 struct net_device *dev = data; 479 struct net_device *dev = m->private;
479 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev); 480 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
480 struct ieee80211_device *ieee = priv->ieee80211; 481 struct ieee80211_device *ieee = priv->ieee80211;
481 struct ieee80211_network *target; 482 struct ieee80211_network *target;
482 483
483 int len = 0;
484
485 list_for_each_entry(target, &ieee->network_list, list) { 484 list_for_each_entry(target, &ieee->network_list, list) {
486 485 const char *wpa = "non_WPA";
487 len += snprintf(page + len, count - len, "%s ", target->ssid);
488
489 if (target->wpa_ie_len > 0 || target->rsn_ie_len > 0) 486 if (target->wpa_ie_len > 0 || target->rsn_ie_len > 0)
490 len += snprintf(page + len, count - len, "WPA\n"); 487 wpa = "WPA";
491 else 488
492 len += snprintf(page + len, count - len, "non_WPA\n"); 489 seq_printf(m, "%s %s\n", target->ssid, wpa);
493 } 490 }
494 491
495 *eof = 1; 492 return 0;
496 return len;
497} 493}
498 494
499static int proc_get_registers(char *page, char **start, 495static int proc_get_registers(struct seq_file *m, void *v)
500 off_t offset, int count,
501 int *eof, void *data)
502{ 496{
503 struct net_device *dev = data; 497 struct net_device *dev = m->private;
504// struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev); 498 int i,n, max = 0xff;
505 499
506 int len = 0; 500 seq_puts(m, "\n####################page 0##################\n ");
507 int i,n;
508
509 int max=0xff;
510
511 /* This dump the current register page */
512 len += snprintf(page + len, count - len,
513 "\n####################page 0##################\n ");
514 501
515 for (n=0;n<=max;) { 502 for (n=0;n<=max;) {
516 //printk( "\nD: %2x> ", n); 503 //printk( "\nD: %2x> ", n);
517 len += snprintf(page + len, count - len, 504 seq_printf(m, "\nD: %2x > ",n);
518 "\nD: %2x > ",n);
519 505
520 for (i=0;i<16 && n<=max;i++,n++) 506 for (i=0;i<16 && n<=max;i++,n++)
521 len += snprintf(page + len, count - len, 507 seq_printf(m, "%2x ",read_nic_byte(dev,0x000|n));
522 "%2x ",read_nic_byte(dev,0x000|n));
523 508
524 // printk("%2x ",read_nic_byte(dev,n)); 509 // printk("%2x ",read_nic_byte(dev,n));
525 } 510 }
526 len += snprintf(page + len, count - len, 511
527 "\n####################page 1##################\n "); 512 seq_puts(m, "\n####################page 1##################\n ");
528 for (n=0;n<=max;) { 513 for (n=0;n<=max;) {
529 //printk( "\nD: %2x> ", n); 514 //printk( "\nD: %2x> ", n);
530 len += snprintf(page + len, count - len, 515 seq_printf(m, "\nD: %2x > ",n);
531 "\nD: %2x > ",n);
532 516
533 for (i=0;i<16 && n<=max;i++,n++) 517 for (i=0;i<16 && n<=max;i++,n++)
534 len += snprintf(page + len, count - len, 518 seq_printf(m, "%2x ",read_nic_byte(dev,0x100|n));
535 "%2x ",read_nic_byte(dev,0x100|n));
536 519
537 // printk("%2x ",read_nic_byte(dev,n)); 520 // printk("%2x ",read_nic_byte(dev,n));
538 } 521 }
539 len += snprintf(page + len, count - len, 522
540 "\n####################page 3##################\n "); 523 seq_puts(m, "\n####################page 3##################\n ");
541 for (n=0;n<=max;) { 524 for (n=0;n<=max;) {
542 //printk( "\nD: %2x> ", n); 525 //printk( "\nD: %2x> ", n);
543 len += snprintf(page + len, count - len, 526 seq_printf(m, "\nD: %2x > ",n);
544 "\nD: %2x > ",n);
545 527
546 for(i=0;i<16 && n<=max;i++,n++) 528 for(i=0;i<16 && n<=max;i++,n++)
547 len += snprintf(page + len, count - len, 529 seq_printf(m, "%2x ",read_nic_byte(dev,0x300|n));
548 "%2x ",read_nic_byte(dev,0x300|n));
549 530
550 // printk("%2x ",read_nic_byte(dev,n)); 531 // printk("%2x ",read_nic_byte(dev,n));
551 } 532 }
552 533
553 len += snprintf(page + len, count - len,"\n"); 534 seq_putc(m, '\n');
554 *eof = 1; 535 return 0;
555 return len;
556} 536}
557 537
558 538static int proc_get_stats_tx(struct seq_file *m, void *v)
559
560
561
562static int proc_get_stats_tx(char *page, char **start,
563 off_t offset, int count,
564 int *eof, void *data)
565{ 539{
566 struct net_device *dev = data; 540 struct net_device *dev = m->private;
567 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev); 541 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
568 542
569 int len = 0; 543 seq_printf(m,
570
571 len += snprintf(page + len, count - len,
572 "TX VI priority ok int: %lu\n" 544 "TX VI priority ok int: %lu\n"
573 "TX VI priority error int: %lu\n" 545 "TX VI priority error int: %lu\n"
574 "TX VO priority ok int: %lu\n" 546 "TX VO priority ok int: %lu\n"
@@ -629,22 +601,15 @@ static int proc_get_stats_tx(char *page, char **start,
629// priv->stats.txbeaconerr 601// priv->stats.txbeaconerr
630 ); 602 );
631 603
632 *eof = 1; 604 return 0;
633 return len;
634} 605}
635 606
636 607static int proc_get_stats_rx(struct seq_file *m, void *v)
637
638static int proc_get_stats_rx(char *page, char **start,
639 off_t offset, int count,
640 int *eof, void *data)
641{ 608{
642 struct net_device *dev = data; 609 struct net_device *dev = m->private;
643 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev); 610 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev);
644 611
645 int len = 0; 612 seq_printf(m,
646
647 len += snprintf(page + len, count - len,
648 "RX packets: %lu\n" 613 "RX packets: %lu\n"
649 "RX urb status error: %lu\n" 614 "RX urb status error: %lu\n"
650 "RX invalid urb error: %lu\n", 615 "RX invalid urb error: %lu\n",
@@ -652,9 +617,9 @@ static int proc_get_stats_rx(char *page, char **start,
652 priv->stats.rxstaterr, 617 priv->stats.rxstaterr,
653 priv->stats.rxurberr); 618 priv->stats.rxurberr);
654 619
655 *eof = 1; 620 return 0;
656 return len;
657} 621}
622
658void rtl8192_proc_module_init(void) 623void rtl8192_proc_module_init(void)
659{ 624{
660 RT_TRACE(COMP_INIT, "Initializing proc filesystem"); 625 RT_TRACE(COMP_INIT, "Initializing proc filesystem");
@@ -667,74 +632,70 @@ void rtl8192_proc_module_remove(void)
667 remove_proc_entry(RTL819xU_MODULE_NAME, init_net.proc_net); 632 remove_proc_entry(RTL819xU_MODULE_NAME, init_net.proc_net);
668} 633}
669 634
670 635/*
671void rtl8192_proc_remove_one(struct net_device *dev) 636 * seq_file wrappers for procfile show routines.
637 */
638static int rtl8192_proc_open(struct inode *inode, struct file *file)
672{ 639{
673 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev); 640 struct net_device *dev = proc_get_parent_data(inode);
641 int (*show)(struct seq_file *, void *) = PDE_DATA(inode);
674 642
675 643 return single_open(file, show, dev);
676 if (priv->dir_dev) {
677 // remove_proc_entry("stats-hw", priv->dir_dev);
678 remove_proc_entry("stats-tx", priv->dir_dev);
679 remove_proc_entry("stats-rx", priv->dir_dev);
680 // remove_proc_entry("stats-ieee", priv->dir_dev);
681 remove_proc_entry("stats-ap", priv->dir_dev);
682 remove_proc_entry("registers", priv->dir_dev);
683 // remove_proc_entry("cck-registers",priv->dir_dev);
684 // remove_proc_entry("ofdm-registers",priv->dir_dev);
685 //remove_proc_entry(dev->name, rtl8192_proc);
686 remove_proc_entry("wlan0", rtl8192_proc);
687 priv->dir_dev = NULL;
688 }
689} 644}
690 645
646static const struct file_operations rtl8192_proc_fops = {
647 .open = rtl8192_proc_open,
648 .read = seq_read,
649 .llseek = seq_lseek,
650 .release = seq_release,
651};
691 652
692void rtl8192_proc_init_one(struct net_device *dev) 653/*
693{ 654 * Table of proc files we need to create.
694 struct proc_dir_entry *e; 655 */
695 struct r8192_priv *priv = (struct r8192_priv *)ieee80211_priv(dev); 656struct rtl8192_proc_file {
696 priv->dir_dev = proc_mkdir(dev->name, rtl8192_proc); 657 char name[12];
697 if (!priv->dir_dev) { 658 int (*show)(struct seq_file *, void *);
698 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n", 659};
699 dev->name);
700 return;
701 }
702 e = create_proc_read_entry("stats-rx", S_IFREG | S_IRUGO,
703 priv->dir_dev, proc_get_stats_rx, dev);
704
705 if (!e) {
706 RT_TRACE(COMP_ERR,"Unable to initialize "
707 "/proc/net/rtl8192/%s/stats-rx\n",
708 dev->name);
709 }
710
711 660
712 e = create_proc_read_entry("stats-tx", S_IFREG | S_IRUGO, 661static const struct rtl8192_proc_file rtl8192_proc_files[] = {
713 priv->dir_dev, proc_get_stats_tx, dev); 662 { "stats-rx", &proc_get_stats_rx },
663 { "stats-tx", &proc_get_stats_tx },
664 { "stats-ap", &proc_get_stats_ap },
665 { "registers", &proc_get_registers },
666 { "" }
667};
714 668
715 if (!e) { 669void rtl8192_proc_init_one(struct net_device *dev)
716 RT_TRACE(COMP_ERR, "Unable to initialize " 670{
717 "/proc/net/rtl8192/%s/stats-tx\n", 671 const struct rtl8192_proc_file *f;
718 dev->name); 672 struct proc_dir_entry *dir;
719 }
720 673
721 e = create_proc_read_entry("stats-ap", S_IFREG | S_IRUGO, 674 if (rtl8192_proc) {
722 priv->dir_dev, proc_get_stats_ap, dev); 675 dir = proc_mkdir_data(dev->name, 0, rtl8192_proc, dev);
676 if (!dir) {
677 RT_TRACE(COMP_ERR, "Unable to initialize /proc/net/rtl8192/%s\n",
678 dev->name);
679 return;
680 }
723 681
724 if (!e) { 682 for (f = rtl8192_proc_files; f->name[0]; f++) {
725 RT_TRACE(COMP_ERR, "Unable to initialize " 683 if (!proc_create_data(f->name, S_IFREG | S_IRUGO, dir,
726 "/proc/net/rtl8192/%s/stats-ap\n", 684 &rtl8192_proc_fops, f->show)) {
727 dev->name); 685 RT_TRACE(COMP_ERR, "Unable to initialize "
686 "/proc/net/rtl8192/%s/%s\n",
687 dev->name, f->name);
688 return;
689 }
690 }
728 } 691 }
692}
729 693
730 e = create_proc_read_entry("registers", S_IFREG | S_IRUGO, 694void rtl8192_proc_remove_one(struct net_device *dev)
731 priv->dir_dev, proc_get_registers, dev); 695{
732 if (!e) { 696 remove_proc_subtree(dev->name, rtl8192_proc);
733 RT_TRACE(COMP_ERR, "Unable to initialize "
734 "/proc/net/rtl8192/%s/registers\n",
735 dev->name);
736 }
737} 697}
698
738/**************************************************************************** 699/****************************************************************************
739 -----------------------------MISC STUFF------------------------- 700 -----------------------------MISC STUFF-------------------------
740*****************************************************************************/ 701*****************************************************************************/
diff --git a/drivers/staging/rts5139/rts51x_scsi.c b/drivers/staging/rts5139/rts51x_scsi.c
index b58f1dfe006d..610870546406 100644
--- a/drivers/staging/rts5139/rts51x_scsi.c
+++ b/drivers/staging/rts5139/rts51x_scsi.c
@@ -1968,18 +1968,16 @@ int slave_configure(struct scsi_device *sdev)
1968 1968
1969/* we use this macro to help us write into the buffer */ 1969/* we use this macro to help us write into the buffer */
1970#undef SPRINTF 1970#undef SPRINTF
1971#define SPRINTF(args...) \ 1971#define SPRINTF(args...) seq_printf(m, ##args)
1972 do { if (pos < buffer+length) pos += sprintf(pos, ## args); } while (0)
1973 1972
1974int proc_info(struct Scsi_Host *host, char *buffer, 1973static int write_info(struct Scsi_Host *host, char *buffer, int length)
1975 char **start, off_t offset, int length, int inout)
1976{ 1974{
1977 char *pos = buffer;
1978
1979 /* if someone is sending us data, just throw it away */ 1975 /* if someone is sending us data, just throw it away */
1980 if (inout) 1976 return length;
1981 return length; 1977}
1982 1978
1979static int show_info(struct seq_file *m, struct Scsi_Host *host)
1980{
1983 /* print the controller name */ 1981 /* print the controller name */
1984 SPRINTF(" Host scsi%d: %s\n", host->host_no, RTS51X_NAME); 1982 SPRINTF(" Host scsi%d: %s\n", host->host_no, RTS51X_NAME);
1985 1983
@@ -1988,18 +1986,7 @@ int proc_info(struct Scsi_Host *host, char *buffer,
1988 SPRINTF(" Product: RTS51xx USB Card Reader\n"); 1986 SPRINTF(" Product: RTS51xx USB Card Reader\n");
1989 SPRINTF(" Version: %s\n", DRIVER_VERSION); 1987 SPRINTF(" Version: %s\n", DRIVER_VERSION);
1990 SPRINTF(" Build: %s\n", __TIME__); 1988 SPRINTF(" Build: %s\n", __TIME__);
1991 1989 return 0;
1992 /*
1993 * Calculate start of next buffer, and return value.
1994 */
1995 *start = buffer + offset;
1996
1997 if ((pos - buffer) < offset)
1998 return 0;
1999 else if ((pos - buffer - offset) < length)
2000 return pos - buffer - offset;
2001 else
2002 return length;
2003} 1990}
2004 1991
2005/* queue a command */ 1992/* queue a command */
@@ -2100,7 +2087,8 @@ struct scsi_host_template rts51x_host_template = {
2100 /* basic userland interface stuff */ 2087 /* basic userland interface stuff */
2101 .name = RTS51X_NAME, 2088 .name = RTS51X_NAME,
2102 .proc_name = RTS51X_NAME, 2089 .proc_name = RTS51X_NAME,
2103 .proc_info = proc_info, 2090 .show_info = show_info,
2091 .write_info = write_info,
2104 .info = rts5139_info, 2092 .info = rts5139_info,
2105 2093
2106 /* command interface -- queued only */ 2094 /* command interface -- queued only */
diff --git a/drivers/staging/rts5139/rts51x_scsi.h b/drivers/staging/rts5139/rts51x_scsi.h
index 3a5213611d21..1a0d70566186 100644
--- a/drivers/staging/rts5139/rts51x_scsi.h
+++ b/drivers/staging/rts5139/rts51x_scsi.h
@@ -147,8 +147,6 @@ struct scsi_cmnd;
147 147
148int slave_alloc(struct scsi_device *sdev); 148int slave_alloc(struct scsi_device *sdev);
149int slave_configure(struct scsi_device *sdev); 149int slave_configure(struct scsi_device *sdev);
150int proc_info(struct Scsi_Host *host, char *buffer,
151 char **start, off_t offset, int length, int inout);
152int queuecommand(struct Scsi_Host *, struct scsi_cmnd *); 150int queuecommand(struct Scsi_Host *, struct scsi_cmnd *);
153int command_abort(struct scsi_cmnd *srb); 151int command_abort(struct scsi_cmnd *srb);
154int bus_reset(struct scsi_cmnd *srb); 152int bus_reset(struct scsi_cmnd *srb);
diff --git a/drivers/staging/silicom/Makefile b/drivers/staging/silicom/Makefile
index 80e6d12d156b..ca8359481c48 100644
--- a/drivers/staging/silicom/Makefile
+++ b/drivers/staging/silicom/Makefile
@@ -4,6 +4,3 @@
4 4
5obj-$(CONFIG_BPCTL) += bpctl_mod.o 5obj-$(CONFIG_BPCTL) += bpctl_mod.o
6obj-$(CONFIG_SBYPASS) += bypasslib/ 6obj-$(CONFIG_SBYPASS) += bypasslib/
7
8
9bpctl_mod-objs := bp_mod.o bp_proc.o
diff --git a/drivers/staging/silicom/bp_proc.c b/drivers/staging/silicom/bp_proc.c
deleted file mode 100644
index a01ca97b7665..000000000000
--- a/drivers/staging/silicom/bp_proc.c
+++ /dev/null
@@ -1,1327 +0,0 @@
1/******************************************************************************/
2/* */
3/* Copyright (c) 2004-2006 Silicom, Ltd */
4/* All rights reserved. */
5/* */
6/* This program is free software; you can redistribute it and/or modify */
7/* it under the terms of the GNU General Public License as published by */
8/* the Free Software Foundation, located in the file LICENSE. */
9/* */
10/* */
11/******************************************************************************/
12
13#if defined(CONFIG_SMP) && !defined(__SMP__)
14#define __SMP__
15#endif
16
17#include <linux/proc_fs.h>
18#include <linux/netdevice.h>
19#include <asm/uaccess.h>
20/* #include <linux/smp_lock.h> */
21#include "bp_mod.h"
22
23#define BP_PROC_DIR "bypass"
24/* #define BYPASS_SUPPORT "bypass" */
25
26#ifdef BYPASS_SUPPORT
27
28#define GPIO6_SET_ENTRY_SD "gpio6_set"
29#define GPIO6_CLEAR_ENTRY_SD "gpio6_clear"
30
31#define GPIO7_SET_ENTRY_SD "gpio7_set"
32#define GPIO7_CLEAR_ENTRY_SD "gpio7_clear"
33
34#define PULSE_SET_ENTRY_SD "pulse_set"
35#define ZERO_SET_ENTRY_SD "zero_set"
36#define PULSE_GET1_ENTRY_SD "pulse_get1"
37#define PULSE_GET2_ENTRY_SD "pulse_get2"
38
39#define CMND_ON_ENTRY_SD "cmnd_on"
40#define CMND_OFF_ENTRY_SD "cmnd_off"
41#define RESET_CONT_ENTRY_SD "reset_cont"
42
43 /*COMMANDS*/
44#define BYPASS_INFO_ENTRY_SD "bypass_info"
45#define BYPASS_SLAVE_ENTRY_SD "bypass_slave"
46#define BYPASS_CAPS_ENTRY_SD "bypass_caps"
47#define WD_SET_CAPS_ENTRY_SD "wd_set_caps"
48#define BYPASS_ENTRY_SD "bypass"
49#define BYPASS_CHANGE_ENTRY_SD "bypass_change"
50#define BYPASS_WD_ENTRY_SD "bypass_wd"
51#define WD_EXPIRE_TIME_ENTRY_SD "wd_expire_time"
52#define RESET_BYPASS_WD_ENTRY_SD "reset_bypass_wd"
53#define DIS_BYPASS_ENTRY_SD "dis_bypass"
54#define BYPASS_PWUP_ENTRY_SD "bypass_pwup"
55#define BYPASS_PWOFF_ENTRY_SD "bypass_pwoff"
56#define STD_NIC_ENTRY_SD "std_nic"
57#define STD_NIC_ENTRY_SD "std_nic"
58#define TAP_ENTRY_SD "tap"
59#define TAP_CHANGE_ENTRY_SD "tap_change"
60#define DIS_TAP_ENTRY_SD "dis_tap"
61#define TAP_PWUP_ENTRY_SD "tap_pwup"
62#define TWO_PORT_LINK_ENTRY_SD "two_port_link"
63#define WD_EXP_MODE_ENTRY_SD "wd_exp_mode"
64#define WD_AUTORESET_ENTRY_SD "wd_autoreset"
65#define TPL_ENTRY_SD "tpl"
66#define WAIT_AT_PWUP_ENTRY_SD "wait_at_pwup"
67#define HW_RESET_ENTRY_SD "hw_reset"
68#define DISC_ENTRY_SD "disc"
69#define DISC_CHANGE_ENTRY_SD "disc_change"
70#define DIS_DISC_ENTRY_SD "dis_disc"
71#define DISC_PWUP_ENTRY_SD "disc_pwup"
72
73static struct proc_dir_entry *bp_procfs_dir;
74
75static struct proc_dir_entry *proc_getdir(char *name,
76 struct proc_dir_entry *proc_dir)
77{
78 struct proc_dir_entry *pde = proc_dir;
79 for (pde = pde->subdir; pde; pde = pde->next) {
80 if (pde->namelen && (strcmp(name, pde->name) == 0)) {
81 /* directory exists */
82 break;
83 }
84 }
85 if (pde == (struct proc_dir_entry *)0) {
86 /* create the directory */
87 pde = create_proc_entry(name, S_IFDIR, proc_dir);
88 if (pde == (struct proc_dir_entry *)0)
89 return pde;
90 }
91 return pde;
92}
93
94int
95bypass_proc_create_entry_sd(struct pfs_unit *pfs_unit_curr,
96 char *proc_name,
97 write_proc_t *write_proc,
98 read_proc_t *read_proc,
99 struct proc_dir_entry *parent_pfs, void *data)
100{
101 strcpy(pfs_unit_curr->proc_name, proc_name);
102 pfs_unit_curr->proc_entry = create_proc_entry(pfs_unit_curr->proc_name,
103 S_IFREG | S_IRUSR |
104 S_IWUSR | S_IRGRP |
105 S_IROTH, parent_pfs);
106 if (pfs_unit_curr->proc_entry == 0)
107 return -1;
108
109 pfs_unit_curr->proc_entry->read_proc = read_proc;
110 pfs_unit_curr->proc_entry->write_proc = write_proc;
111 pfs_unit_curr->proc_entry->data = data;
112
113 return 0;
114
115}
116
117int
118get_bypass_info_pfs(char *page, char **start, off_t off, int count,
119 int *eof, void *data)
120{
121 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
122 int len = 0;
123
124 len += sprintf(page, "Name\t\t\t%s\n", pbp_device_block->bp_name);
125 len +=
126 sprintf(page + len, "Firmware version\t0x%x\n",
127 pbp_device_block->bp_fw_ver);
128
129 *eof = 1;
130 return len;
131}
132
133int
134get_bypass_slave_pfs(char *page, char **start, off_t off, int count,
135 int *eof, void *data)
136{
137 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
138
139 struct pci_dev *pci_slave_dev = pbp_device_block->bp_slave;
140 struct net_device *net_slave_dev;
141 int len = 0;
142
143 if (is_bypass_fn(pbp_device_block)) {
144 net_slave_dev = pci_get_drvdata(pci_slave_dev);
145 if (net_slave_dev)
146 len = sprintf(page, "%s\n", net_slave_dev->name);
147 else
148 len = sprintf(page, "fail\n");
149 } else
150 len = sprintf(page, "fail\n");
151
152 *eof = 1;
153 return len;
154}
155
156int
157get_bypass_caps_pfs(char *page, char **start, off_t off, int count,
158 int *eof, void *data)
159{
160 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
161
162 int len = 0, ret = 0;
163
164 ret = get_bypass_caps_fn(pbp_device_block);
165 if (ret == BP_NOT_CAP)
166 len = sprintf(page, "-1\n");
167 else
168 len = sprintf(page, "0x%x\n", ret);
169 *eof = 1;
170 return len;
171
172}
173
174int
175get_wd_set_caps_pfs(char *page, char **start, off_t off, int count,
176 int *eof, void *data)
177{
178 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
179
180 int len = 0, ret = 0;
181
182 ret = get_wd_set_caps_fn(pbp_device_block);
183 if (ret == BP_NOT_CAP)
184 len = sprintf(page, "-1\n");
185 else
186 len = sprintf(page, "0x%x\n", ret);
187 *eof = 1;
188 return len;
189}
190
191int
192set_bypass_pfs(struct file *file, const char *buffer,
193 unsigned long count, void *data)
194{
195
196 char kbuf[256];
197 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
198
199 int bypass_param = 0, length = 0;
200
201 if (count > (sizeof(kbuf) - 1))
202 return -1;
203
204 if (copy_from_user(&kbuf, buffer, count))
205 return -1;
206
207 kbuf[count] = '\0';
208 length = strlen(kbuf);
209 if (kbuf[length - 1] == '\n')
210 kbuf[--length] = '\0';
211
212 if (strcmp(kbuf, "on") == 0)
213 bypass_param = 1;
214 else if (strcmp(kbuf, "off") == 0)
215 bypass_param = 0;
216
217 set_bypass_fn(pbp_device_block, bypass_param);
218
219 return count;
220}
221
222int
223set_tap_pfs(struct file *file, const char *buffer,
224 unsigned long count, void *data)
225{
226
227 char kbuf[256];
228 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
229
230 int tap_param = 0, length = 0;
231
232 if (count > (sizeof(kbuf) - 1))
233 return -1;
234
235 if (copy_from_user(&kbuf, buffer, count))
236 return -1;
237
238 kbuf[count] = '\0';
239 length = strlen(kbuf);
240 if (kbuf[length - 1] == '\n')
241 kbuf[--length] = '\0';
242
243 if (strcmp(kbuf, "on") == 0)
244 tap_param = 1;
245 else if (strcmp(kbuf, "off") == 0)
246 tap_param = 0;
247
248 set_tap_fn(pbp_device_block, tap_param);
249
250 return count;
251}
252
253int
254set_disc_pfs(struct file *file, const char *buffer,
255 unsigned long count, void *data)
256{
257
258 char kbuf[256];
259 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
260
261 int tap_param = 0, length = 0;
262
263 if (count > (sizeof(kbuf) - 1))
264 return -1;
265
266 if (copy_from_user(&kbuf, buffer, count))
267 return -1;
268
269 kbuf[count] = '\0';
270 length = strlen(kbuf);
271 if (kbuf[length - 1] == '\n')
272 kbuf[--length] = '\0';
273
274 if (strcmp(kbuf, "on") == 0)
275 tap_param = 1;
276 else if (strcmp(kbuf, "off") == 0)
277 tap_param = 0;
278
279 set_disc_fn(pbp_device_block, tap_param);
280
281 return count;
282}
283
284int
285get_bypass_pfs(char *page, char **start, off_t off, int count,
286 int *eof, void *data)
287{
288 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
289
290 int len = 0, ret = 0;
291
292 ret = get_bypass_fn(pbp_device_block);
293 if (ret == BP_NOT_CAP)
294 len = sprintf(page, "fail\n");
295 else if (ret == 1)
296 len = sprintf(page, "on\n");
297 else if (ret == 0)
298 len = sprintf(page, "off\n");
299
300 *eof = 1;
301 return len;
302}
303
304int
305get_tap_pfs(char *page, char **start, off_t off, int count,
306 int *eof, void *data)
307{
308 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
309
310 int len = 0, ret = 0;
311
312 ret = get_tap_fn(pbp_device_block);
313 if (ret == BP_NOT_CAP)
314 len = sprintf(page, "fail\n");
315 else if (ret == 1)
316 len = sprintf(page, "on\n");
317 else if (ret == 0)
318 len = sprintf(page, "off\n");
319
320 *eof = 1;
321 return len;
322}
323
324int
325get_disc_pfs(char *page, char **start, off_t off, int count,
326 int *eof, void *data)
327{
328 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
329
330 int len = 0, ret = 0;
331
332 ret = get_disc_fn(pbp_device_block);
333 if (ret == BP_NOT_CAP)
334 len = sprintf(page, "fail\n");
335 else if (ret == 1)
336 len = sprintf(page, "on\n");
337 else if (ret == 0)
338 len = sprintf(page, "off\n");
339
340 *eof = 1;
341 return len;
342}
343
344int
345get_bypass_change_pfs(char *page, char **start, off_t off, int count,
346 int *eof, void *data)
347{
348 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
349
350 int len = 0, ret = 0;
351
352 ret = get_bypass_change_fn(pbp_device_block);
353 if (ret == 1)
354 len = sprintf(page, "on\n");
355 else if (ret == 0)
356 len = sprintf(page, "off\n");
357 else
358 len = sprintf(page, "fail\n");
359
360 *eof = 1;
361 return len;
362}
363
364int
365get_tap_change_pfs(char *page, char **start, off_t off, int count,
366 int *eof, void *data)
367{
368 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
369
370 int len = 0, ret = 0;
371
372 ret = get_tap_change_fn(pbp_device_block);
373 if (ret == 1)
374 len = sprintf(page, "on\n");
375 else if (ret == 0)
376 len = sprintf(page, "off\n");
377 else
378 len = sprintf(page, "fail\n");
379
380 *eof = 1;
381 return len;
382}
383
384int
385get_disc_change_pfs(char *page, char **start, off_t off, int count,
386 int *eof, void *data)
387{
388 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
389
390 int len = 0, ret = 0;
391
392 ret = get_disc_change_fn(pbp_device_block);
393 if (ret == 1)
394 len = sprintf(page, "on\n");
395 else if (ret == 0)
396 len = sprintf(page, "off\n");
397 else
398 len = sprintf(page, "fail\n");
399
400 *eof = 1;
401 return len;
402}
403
404int
405set_bypass_wd_pfs(struct file *file, const char *buffer,
406 unsigned long count, void *data)
407{
408
409 char kbuf[256];
410 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
411
412 unsigned int timeout = 0;
413 char *timeout_ptr = kbuf;
414
415 if (copy_from_user(&kbuf, buffer, count))
416 return -1;
417
418 timeout_ptr = kbuf;
419 timeout = atoi(&timeout_ptr);
420
421 set_bypass_wd_fn(pbp_device_block, timeout);
422
423 return count;
424}
425
426int
427get_bypass_wd_pfs(char *page, char **start, off_t off, int count,
428 int *eof, void *data)
429{
430 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
431
432 int len = 0, ret = 0, timeout = 0;
433
434 ret = get_bypass_wd_fn(pbp_device_block, &timeout);
435 if (ret == BP_NOT_CAP)
436 len = sprintf(page, "fail\n");
437 else if (timeout == -1)
438 len = sprintf(page, "unknown\n");
439 else if (timeout == 0)
440 len = sprintf(page, "disable\n");
441 else
442 len = sprintf(page, "%d\n", timeout);
443
444 *eof = 1;
445 return len;
446}
447
448int
449get_wd_expire_time_pfs(char *page, char **start, off_t off, int count,
450 int *eof, void *data)
451{
452 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
453
454 int len = 0, ret = 0, timeout = 0;
455
456 ret = get_wd_expire_time_fn(pbp_device_block, &timeout);
457 if (ret == BP_NOT_CAP)
458 len = sprintf(page, "fail\n");
459 else if (timeout == -1)
460 len = sprintf(page, "expire\n");
461 else if (timeout == 0)
462 len = sprintf(page, "disable\n");
463
464 else
465 len = sprintf(page, "%d\n", timeout);
466 *eof = 1;
467 return len;
468}
469
470int
471get_tpl_pfs(char *page, char **start, off_t off, int count,
472 int *eof, void *data)
473{
474 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
475
476 int len = 0, ret = 0;
477
478 ret = get_tpl_fn(pbp_device_block);
479 if (ret == BP_NOT_CAP)
480 len = sprintf(page, "fail\n");
481 else if (ret == 1)
482 len = sprintf(page, "on\n");
483 else if (ret == 0)
484 len = sprintf(page, "off\n");
485
486 *eof = 1;
487 return len;
488}
489
490#ifdef PMC_FIX_FLAG
491int
492get_wait_at_pwup_pfs(char *page, char **start, off_t off, int count,
493 int *eof, void *data)
494{
495 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
496
497 int len = 0, ret = 0;
498
499 ret = get_bp_wait_at_pwup_fn(pbp_device_block);
500 if (ret == BP_NOT_CAP)
501 len = sprintf(page, "fail\n");
502 else if (ret == 1)
503 len = sprintf(page, "on\n");
504 else if (ret == 0)
505 len = sprintf(page, "off\n");
506
507 *eof = 1;
508 return len;
509}
510
511int
512get_hw_reset_pfs(char *page, char **start, off_t off, int count,
513 int *eof, void *data)
514{
515 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
516
517 int len = 0, ret = 0;
518
519 ret = get_bp_hw_reset_fn(pbp_device_block);
520 if (ret == BP_NOT_CAP)
521 len = sprintf(page, "fail\n");
522 else if (ret == 1)
523 len = sprintf(page, "on\n");
524 else if (ret == 0)
525 len = sprintf(page, "off\n");
526
527 *eof = 1;
528 return len;
529}
530
531#endif /*PMC_WAIT_FLAG */
532
533int
534reset_bypass_wd_pfs(char *page, char **start, off_t off, int count,
535 int *eof, void *data)
536{
537 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
538
539 int len = 0, ret = 0;
540
541 ret = reset_bypass_wd_timer_fn(pbp_device_block);
542 if (ret == BP_NOT_CAP)
543 len = sprintf(page, "fail\n");
544 else if (ret == 0)
545 len = sprintf(page, "disable\n");
546 else if (ret == 1)
547 len = sprintf(page, "success\n");
548
549 *eof = 1;
550 return len;
551}
552
553int
554set_dis_bypass_pfs(struct file *file, const char *buffer,
555 unsigned long count, void *data)
556{
557
558 char kbuf[256];
559 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
560
561 int bypass_param = 0, length = 0;
562
563 if (copy_from_user(&kbuf, buffer, count))
564 return -1;
565
566 kbuf[count] = '\0';
567 length = strlen(kbuf);
568 if (kbuf[length - 1] == '\n')
569 kbuf[--length] = '\0';
570
571 if (strcmp(kbuf, "on") == 0)
572 bypass_param = 1;
573 else if (strcmp(kbuf, "off") == 0)
574 bypass_param = 0;
575
576 set_dis_bypass_fn(pbp_device_block, bypass_param);
577
578 return count;
579}
580
581int
582set_dis_tap_pfs(struct file *file, const char *buffer,
583 unsigned long count, void *data)
584{
585
586 char kbuf[256];
587 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
588
589 int tap_param = 0, length = 0;
590
591 if (copy_from_user(&kbuf, buffer, count))
592 return -1;
593
594 kbuf[count] = '\0';
595 length = strlen(kbuf);
596 if (kbuf[length - 1] == '\n')
597 kbuf[--length] = '\0';
598
599 if (strcmp(kbuf, "on") == 0)
600 tap_param = 1;
601 else if (strcmp(kbuf, "off") == 0)
602 tap_param = 0;
603
604 set_dis_tap_fn(pbp_device_block, tap_param);
605
606 return count;
607}
608
609int
610set_dis_disc_pfs(struct file *file, const char *buffer,
611 unsigned long count, void *data)
612{
613
614 char kbuf[256];
615 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
616
617 int tap_param = 0, length = 0;
618
619 if (copy_from_user(&kbuf, buffer, count))
620 return -1;
621
622 kbuf[count] = '\0';
623 length = strlen(kbuf);
624 if (kbuf[length - 1] == '\n')
625 kbuf[--length] = '\0';
626
627 if (strcmp(kbuf, "on") == 0)
628 tap_param = 1;
629 else if (strcmp(kbuf, "off") == 0)
630 tap_param = 0;
631
632 set_dis_disc_fn(pbp_device_block, tap_param);
633
634 return count;
635}
636
637int
638get_dis_bypass_pfs(char *page, char **start, off_t off, int count,
639 int *eof, void *data)
640{
641 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
642
643 int len = 0, ret = 0;
644
645 ret = get_dis_bypass_fn(pbp_device_block);
646 if (ret == BP_NOT_CAP)
647 len = sprintf(page, "fail\n");
648 else if (ret == 0)
649 len = sprintf(page, "off\n");
650 else
651 len = sprintf(page, "on\n");
652
653 *eof = 1;
654 return len;
655}
656
657int
658get_dis_tap_pfs(char *page, char **start, off_t off, int count,
659 int *eof, void *data)
660{
661 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
662
663 int len = 0, ret = 0;
664
665 ret = get_dis_tap_fn(pbp_device_block);
666 if (ret == BP_NOT_CAP)
667 len = sprintf(page, "fail\n");
668 else if (ret == 0)
669 len = sprintf(page, "off\n");
670 else
671 len = sprintf(page, "on\n");
672
673 *eof = 1;
674 return len;
675}
676
677int
678get_dis_disc_pfs(char *page, char **start, off_t off, int count,
679 int *eof, void *data)
680{
681 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
682
683 int len = 0, ret = 0;
684
685 ret = get_dis_disc_fn(pbp_device_block);
686 if (ret == BP_NOT_CAP)
687 len = sprintf(page, "fail\n");
688 else if (ret == 0)
689 len = sprintf(page, "off\n");
690 else
691 len = sprintf(page, "on\n");
692
693 *eof = 1;
694 return len;
695}
696
697int
698set_bypass_pwup_pfs(struct file *file, const char *buffer,
699 unsigned long count, void *data)
700{
701
702 char kbuf[256];
703 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
704
705 int bypass_param = 0, length = 0;
706
707 if (copy_from_user(&kbuf, buffer, count))
708 return -1;
709
710 kbuf[count] = '\0';
711 length = strlen(kbuf);
712 if (kbuf[length - 1] == '\n')
713 kbuf[--length] = '\0';
714
715 if (strcmp(kbuf, "on") == 0)
716 bypass_param = 1;
717 else if (strcmp(kbuf, "off") == 0)
718 bypass_param = 0;
719
720 set_bypass_pwup_fn(pbp_device_block, bypass_param);
721
722 return count;
723}
724
725int
726set_bypass_pwoff_pfs(struct file *file, const char *buffer,
727 unsigned long count, void *data)
728{
729
730 char kbuf[256];
731 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
732
733 int bypass_param = 0, length = 0;
734
735 if (copy_from_user(&kbuf, buffer, count))
736 return -1;
737
738 kbuf[count] = '\0';
739 length = strlen(kbuf);
740 if (kbuf[length - 1] == '\n')
741 kbuf[--length] = '\0';
742
743 if (strcmp(kbuf, "on") == 0)
744 bypass_param = 1;
745 else if (strcmp(kbuf, "off") == 0)
746 bypass_param = 0;
747
748 set_bypass_pwoff_fn(pbp_device_block, bypass_param);
749
750 return count;
751}
752
753int
754set_tap_pwup_pfs(struct file *file, const char *buffer,
755 unsigned long count, void *data)
756{
757
758 char kbuf[256];
759 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
760
761 int tap_param = 0, length = 0;
762
763 if (copy_from_user(&kbuf, buffer, count))
764 return -1;
765
766 kbuf[count] = '\0';
767 length = strlen(kbuf);
768 if (kbuf[length - 1] == '\n')
769 kbuf[--length] = '\0';
770
771 if (strcmp(kbuf, "on") == 0)
772 tap_param = 1;
773 else if (strcmp(kbuf, "off") == 0)
774 tap_param = 0;
775
776 set_tap_pwup_fn(pbp_device_block, tap_param);
777
778 return count;
779}
780
781int
782set_disc_pwup_pfs(struct file *file, const char *buffer,
783 unsigned long count, void *data)
784{
785
786 char kbuf[256];
787 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
788
789 int tap_param = 0, length = 0;
790
791 if (copy_from_user(&kbuf, buffer, count))
792 return -1;
793
794 kbuf[count] = '\0';
795 length = strlen(kbuf);
796 if (kbuf[length - 1] == '\n')
797 kbuf[--length] = '\0';
798
799 if (strcmp(kbuf, "on") == 0)
800 tap_param = 1;
801 else if (strcmp(kbuf, "off") == 0)
802 tap_param = 0;
803
804 set_disc_pwup_fn(pbp_device_block, tap_param);
805
806 return count;
807}
808
809int
810get_bypass_pwup_pfs(char *page, char **start, off_t off, int count,
811 int *eof, void *data)
812{
813 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
814
815 int len = 0, ret = 0;
816
817 ret = get_bypass_pwup_fn(pbp_device_block);
818 if (ret == BP_NOT_CAP)
819 len = sprintf(page, "fail\n");
820 else if (ret == 0)
821 len = sprintf(page, "off\n");
822 else
823 len = sprintf(page, "on\n");
824
825 *eof = 1;
826 return len;
827}
828
829int
830get_bypass_pwoff_pfs(char *page, char **start, off_t off, int count,
831 int *eof, void *data)
832{
833 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
834
835 int len = 0, ret = 0;
836
837 ret = get_bypass_pwoff_fn(pbp_device_block);
838 if (ret == BP_NOT_CAP)
839 len = sprintf(page, "fail\n");
840 else if (ret == 0)
841 len = sprintf(page, "off\n");
842 else
843 len = sprintf(page, "on\n");
844
845 *eof = 1;
846 return len;
847}
848
849int
850get_tap_pwup_pfs(char *page, char **start, off_t off, int count,
851 int *eof, void *data)
852{
853 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
854
855 int len = 0, ret = 0;
856
857 ret = get_tap_pwup_fn(pbp_device_block);
858 if (ret == BP_NOT_CAP)
859 len = sprintf(page, "fail\n");
860 else if (ret == 0)
861 len = sprintf(page, "off\n");
862 else
863 len = sprintf(page, "on\n");
864
865 *eof = 1;
866 return len;
867}
868
869int
870get_disc_pwup_pfs(char *page, char **start, off_t off, int count,
871 int *eof, void *data)
872{
873 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
874
875 int len = 0, ret = 0;
876
877 ret = get_disc_pwup_fn(pbp_device_block);
878 if (ret == BP_NOT_CAP)
879 len = sprintf(page, "fail\n");
880 else if (ret == 0)
881 len = sprintf(page, "off\n");
882 else
883 len = sprintf(page, "on\n");
884
885 *eof = 1;
886 return len;
887}
888
889int
890set_std_nic_pfs(struct file *file, const char *buffer,
891 unsigned long count, void *data)
892{
893
894 char kbuf[256];
895 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
896
897 int bypass_param = 0, length = 0;
898
899 if (copy_from_user(&kbuf, buffer, count))
900 return -1;
901
902 kbuf[count] = '\0';
903 length = strlen(kbuf);
904 if (kbuf[length - 1] == '\n')
905 kbuf[--length] = '\0';
906
907 if (strcmp(kbuf, "on") == 0)
908 bypass_param = 1;
909 else if (strcmp(kbuf, "off") == 0)
910 bypass_param = 0;
911
912 set_std_nic_fn(pbp_device_block, bypass_param);
913
914 return count;
915}
916
917int
918get_std_nic_pfs(char *page, char **start, off_t off, int count,
919 int *eof, void *data)
920{
921 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
922
923 int len = 0, ret = 0;
924
925 ret = get_std_nic_fn(pbp_device_block);
926 if (ret == BP_NOT_CAP)
927 len = sprintf(page, "fail\n");
928 else if (ret == 0)
929 len = sprintf(page, "off\n");
930 else
931 len = sprintf(page, "on\n");
932
933 *eof = 1;
934 return len;
935}
936
937int
938get_wd_exp_mode_pfs(char *page, char **start, off_t off, int count,
939 int *eof, void *data)
940{
941 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
942
943 int len = 0, ret = 0;
944
945 ret = get_wd_exp_mode_fn(pbp_device_block);
946 if (ret == 1)
947 len = sprintf(page, "tap\n");
948 else if (ret == 0)
949 len = sprintf(page, "bypass\n");
950 else if (ret == 2)
951 len = sprintf(page, "disc\n");
952
953 else
954 len = sprintf(page, "fail\n");
955
956 *eof = 1;
957 return len;
958}
959
960int
961set_wd_exp_mode_pfs(struct file *file, const char *buffer,
962 unsigned long count, void *data)
963{
964
965 char kbuf[256];
966 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
967
968 int bypass_param = 0, length = 0;
969
970 if (count > (sizeof(kbuf) - 1))
971 return -1;
972
973 if (copy_from_user(&kbuf, buffer, count))
974 return -1;
975
976 kbuf[count] = '\0';
977 length = strlen(kbuf);
978 if (kbuf[length - 1] == '\n')
979 kbuf[--length] = '\0';
980
981 if (strcmp(kbuf, "tap") == 0)
982 bypass_param = 1;
983 else if (strcmp(kbuf, "bypass") == 0)
984 bypass_param = 0;
985 else if (strcmp(kbuf, "disc") == 0)
986 bypass_param = 2;
987
988 set_wd_exp_mode_fn(pbp_device_block, bypass_param);
989
990 return count;
991}
992
993int
994get_wd_autoreset_pfs(char *page, char **start, off_t off, int count,
995 int *eof, void *data)
996{
997 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
998
999 int len = 0, ret = 0;
1000
1001 ret = get_wd_autoreset_fn(pbp_device_block);
1002 if (ret >= 0)
1003 len = sprintf(page, "%d\n", ret);
1004 else
1005 len = sprintf(page, "fail\n");
1006
1007 *eof = 1;
1008 return len;
1009}
1010
1011int
1012set_wd_autoreset_pfs(struct file *file, const char *buffer,
1013 unsigned long count, void *data)
1014{
1015 char kbuf[256];
1016 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
1017 u32 timeout = 0;
1018 char *timeout_ptr = kbuf;
1019
1020 if (copy_from_user(&kbuf, buffer, count))
1021 return -1;
1022
1023 timeout_ptr = kbuf;
1024 timeout = atoi(&timeout_ptr);
1025
1026 set_wd_autoreset_fn(pbp_device_block, timeout);
1027
1028 return count;
1029}
1030
1031int
1032set_tpl_pfs(struct file *file, const char *buffer,
1033 unsigned long count, void *data)
1034{
1035
1036 char kbuf[256];
1037 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
1038
1039 int tpl_param = 0, length = 0;
1040
1041 if (count > (sizeof(kbuf) - 1))
1042 return -1;
1043
1044 if (copy_from_user(&kbuf, buffer, count))
1045 return -1;
1046
1047 kbuf[count] = '\0';
1048 length = strlen(kbuf);
1049 if (kbuf[length - 1] == '\n')
1050 kbuf[--length] = '\0';
1051
1052 if (strcmp(kbuf, "on") == 0)
1053 tpl_param = 1;
1054 else if (strcmp(kbuf, "off") == 0)
1055 tpl_param = 0;
1056
1057 set_tpl_fn(pbp_device_block, tpl_param);
1058
1059 return count;
1060}
1061
1062#ifdef PMC_FIX_FLAG
1063int
1064set_wait_at_pwup_pfs(struct file *file, const char *buffer,
1065 unsigned long count, void *data)
1066{
1067
1068 char kbuf[256];
1069 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
1070
1071 int tpl_param = 0, length = 0;
1072
1073 if (count > (sizeof(kbuf) - 1))
1074 return -1;
1075
1076 if (copy_from_user(&kbuf, buffer, count))
1077 return -1;
1078
1079 kbuf[count] = '\0';
1080 length = strlen(kbuf);
1081 if (kbuf[length - 1] == '\n')
1082 kbuf[--length] = '\0';
1083
1084 if (strcmp(kbuf, "on") == 0)
1085 tpl_param = 1;
1086 else if (strcmp(kbuf, "off") == 0)
1087 tpl_param = 0;
1088
1089 set_bp_wait_at_pwup_fn(pbp_device_block, tpl_param);
1090
1091 return count;
1092}
1093
1094int
1095set_hw_reset_pfs(struct file *file, const char *buffer,
1096 unsigned long count, void *data)
1097{
1098
1099 char kbuf[256];
1100 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
1101
1102 int tpl_param = 0, length = 0;
1103
1104 if (count > (sizeof(kbuf) - 1))
1105 return -1;
1106
1107 if (copy_from_user(&kbuf, buffer, count))
1108 return -1;
1109
1110 kbuf[count] = '\0';
1111 length = strlen(kbuf);
1112 if (kbuf[length - 1] == '\n')
1113 kbuf[--length] = '\0';
1114
1115 if (strcmp(kbuf, "on") == 0)
1116 tpl_param = 1;
1117 else if (strcmp(kbuf, "off") == 0)
1118 tpl_param = 0;
1119
1120 set_bp_hw_reset_fn(pbp_device_block, tpl_param);
1121
1122 return count;
1123}
1124
1125#endif /*PMC_FIX_FLAG */
1126
1127int bypass_proc_create_dev_sd(bpctl_dev_t *pbp_device_block)
1128{
1129 struct bypass_pfs_sd *current_pfs = &(pbp_device_block->bypass_pfs_set);
1130 static struct proc_dir_entry *procfs_dir;
1131 int ret = 0;
1132
1133 sprintf(current_pfs->dir_name, "bypass_%s", dev->name);
1134
1135 if (!bp_procfs_dir)
1136 return -1;
1137
1138 /* create device proc dir */
1139 procfs_dir = proc_getdir(current_pfs->dir_name, bp_procfs_dir);
1140 if (procfs_dir == 0) {
1141 printk(KERN_DEBUG "Could not create procfs directory %s\n",
1142 current_pfs->dir_name);
1143 return -1;
1144 }
1145 current_pfs->bypass_entry = procfs_dir;
1146
1147 if (bypass_proc_create_entry(&(current_pfs->bypass_info), BYPASS_INFO_ENTRY_SD, NULL, /* write */
1148 get_bypass_info_pfs, /* read */
1149 procfs_dir, pbp_device_block))
1150 ret = -1;
1151
1152 if (pbp_device_block->bp_caps & SW_CTL_CAP) {
1153
1154 /* Create set param proc's */
1155 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_slave), BYPASS_SLAVE_ENTRY_SD, NULL, /* write */
1156 get_bypass_slave_pfs, /* read */
1157 procfs_dir, pbp_device_block))
1158 ret = -1;
1159
1160 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_caps), BYPASS_CAPS_ENTRY_SD, NULL, /* write */
1161 get_bypass_caps_pfs, /* read */
1162 procfs_dir, pbp_device_block))
1163 ret = -1;
1164
1165 if (bypass_proc_create_entry_sd(&(current_pfs->wd_set_caps), WD_SET_CAPS_ENTRY_SD, NULL, /* write */
1166 get_wd_set_caps_pfs, /* read */
1167 procfs_dir, pbp_device_block))
1168 ret = -1;
1169 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_wd), BYPASS_WD_ENTRY_SD, set_bypass_wd_pfs, /* write */
1170 get_bypass_wd_pfs, /* read */
1171 procfs_dir, pbp_device_block))
1172 ret = -1;
1173
1174 if (bypass_proc_create_entry_sd(&(current_pfs->wd_expire_time), WD_EXPIRE_TIME_ENTRY_SD, NULL, /* write */
1175 get_wd_expire_time_pfs, /* read */
1176 procfs_dir, pbp_device_block))
1177 ret = -1;
1178
1179 if (bypass_proc_create_entry_sd(&(current_pfs->reset_bypass_wd), RESET_BYPASS_WD_ENTRY_SD, NULL, /* write */
1180 reset_bypass_wd_pfs, /* read */
1181 procfs_dir, pbp_device_block))
1182 ret = -1;
1183
1184 if (bypass_proc_create_entry_sd(&(current_pfs->std_nic), STD_NIC_ENTRY_SD, set_std_nic_pfs, /* write */
1185 get_std_nic_pfs, /* read */
1186 procfs_dir, pbp_device_block))
1187 ret = -1;
1188
1189 if (pbp_device_block->bp_caps & BP_CAP) {
1190 if (bypass_proc_create_entry_sd(&(current_pfs->bypass), BYPASS_ENTRY_SD, set_bypass_pfs, /* write */
1191 get_bypass_pfs, /* read */
1192 procfs_dir,
1193 pbp_device_block))
1194 ret = -1;
1195
1196 if (bypass_proc_create_entry_sd(&(current_pfs->dis_bypass), DIS_BYPASS_ENTRY_SD, set_dis_bypass_pfs, /* write */
1197 get_dis_bypass_pfs, /* read */
1198 procfs_dir,
1199 pbp_device_block))
1200 ret = -1;
1201
1202 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_pwup), BYPASS_PWUP_ENTRY_SD, set_bypass_pwup_pfs, /* write */
1203 get_bypass_pwup_pfs, /* read */
1204 procfs_dir,
1205 pbp_device_block))
1206 ret = -1;
1207 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_pwoff), BYPASS_PWOFF_ENTRY_SD, set_bypass_pwoff_pfs, /* write */
1208 get_bypass_pwoff_pfs, /* read */
1209 procfs_dir,
1210 pbp_device_block))
1211 ret = -1;
1212
1213 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_change), BYPASS_CHANGE_ENTRY_SD, NULL, /* write */
1214 get_bypass_change_pfs, /* read */
1215 procfs_dir,
1216 pbp_device_block))
1217 ret = -1;
1218 }
1219
1220 if (pbp_device_block->bp_caps & TAP_CAP) {
1221
1222 if (bypass_proc_create_entry_sd(&(current_pfs->tap), TAP_ENTRY_SD, set_tap_pfs, /* write */
1223 get_tap_pfs, /* read */
1224 procfs_dir,
1225 pbp_device_block))
1226 ret = -1;
1227
1228 if (bypass_proc_create_entry_sd(&(current_pfs->dis_tap), DIS_TAP_ENTRY_SD, set_dis_tap_pfs, /* write */
1229 get_dis_tap_pfs, /* read */
1230 procfs_dir,
1231 pbp_device_block))
1232 ret = -1;
1233
1234 if (bypass_proc_create_entry_sd(&(current_pfs->tap_pwup), TAP_PWUP_ENTRY_SD, set_tap_pwup_pfs, /* write */
1235 get_tap_pwup_pfs, /* read */
1236 procfs_dir,
1237 pbp_device_block))
1238 ret = -1;
1239
1240 if (bypass_proc_create_entry_sd(&(current_pfs->tap_change), TAP_CHANGE_ENTRY_SD, NULL, /* write */
1241 get_tap_change_pfs, /* read */
1242 procfs_dir,
1243 pbp_device_block))
1244 ret = -1;
1245 }
1246 if (pbp_device_block->bp_caps & DISC_CAP) {
1247
1248 if (bypass_proc_create_entry_sd(&(current_pfs->tap), DISC_ENTRY_SD, set_disc_pfs, /* write */
1249 get_disc_pfs, /* read */
1250 procfs_dir,
1251 pbp_device_block))
1252 ret = -1;
1253#if 1
1254
1255 if (bypass_proc_create_entry_sd(&(current_pfs->dis_tap), DIS_DISC_ENTRY_SD, set_dis_disc_pfs, /* write */
1256 get_dis_disc_pfs, /* read */
1257 procfs_dir,
1258 pbp_device_block))
1259 ret = -1;
1260#endif
1261
1262 if (bypass_proc_create_entry_sd(&(current_pfs->tap_pwup), DISC_PWUP_ENTRY_SD, set_disc_pwup_pfs, /* write */
1263 get_disc_pwup_pfs, /* read */
1264 procfs_dir,
1265 pbp_device_block))
1266 ret = -1;
1267
1268 if (bypass_proc_create_entry_sd(&(current_pfs->tap_change), DISC_CHANGE_ENTRY_SD, NULL, /* write */
1269 get_disc_change_pfs, /* read */
1270 procfs_dir,
1271 pbp_device_block))
1272 ret = -1;
1273 }
1274
1275 if (bypass_proc_create_entry_sd(&(current_pfs->wd_exp_mode), WD_EXP_MODE_ENTRY_SD, set_wd_exp_mode_pfs, /* write */
1276 get_wd_exp_mode_pfs, /* read */
1277 procfs_dir, pbp_device_block))
1278 ret = -1;
1279
1280 if (bypass_proc_create_entry_sd(&(current_pfs->wd_autoreset), WD_AUTORESET_ENTRY_SD, set_wd_autoreset_pfs, /* write */
1281 get_wd_autoreset_pfs, /* read */
1282 procfs_dir, pbp_device_block))
1283 ret = -1;
1284 if (bypass_proc_create_entry_sd(&(current_pfs->tpl), TPL_ENTRY_SD, set_tpl_pfs, /* write */
1285 get_tpl_pfs, /* read */
1286 procfs_dir, pbp_device_block))
1287 ret = -1;
1288#ifdef PMC_FIX_FLAG
1289 if (bypass_proc_create_entry_sd(&(current_pfs->tpl), WAIT_AT_PWUP_ENTRY_SD, set_wait_at_pwup_pfs, /* write */
1290 get_wait_at_pwup_pfs, /* read */
1291 procfs_dir, pbp_device_block))
1292 ret = -1;
1293 if (bypass_proc_create_entry_sd(&(current_pfs->tpl), HW_RESET_ENTRY_SD, set_hw_reset_pfs, /* write */
1294 get_hw_reset_pfs, /* read */
1295 procfs_dir, pbp_device_block))
1296 ret = -1;
1297
1298#endif
1299
1300 }
1301 if (ret < 0)
1302 printk(KERN_DEBUG "Create proc entry failed\n");
1303
1304 return ret;
1305}
1306
1307int bypass_proc_remove_dev_sd(bpctl_dev_t *pbp_device_block)
1308{
1309
1310 struct bypass_pfs_sd *current_pfs = &pbp_device_block->bypass_pfs_set;
1311 struct proc_dir_entry *pde = current_pfs->bypass_entry, *pde_curr =
1312 NULL;
1313 char name[256];
1314
1315 for (pde = pde->subdir; pde;) {
1316 strcpy(name, pde->name);
1317 pde_curr = pde;
1318 pde = pde->next;
1319 remove_proc_entry(name, current_pfs->bypass_entry);
1320 }
1321 if (!pde)
1322 remove_proc_entry(current_pfs->dir_name, bp_procfs_dir);
1323
1324 return 0;
1325}
1326
1327#endif /* BYPASS_SUPPORT */
diff --git a/drivers/staging/silicom/bp_mod.c b/drivers/staging/silicom/bpctl_mod.c
index 45a222723207..b7e570ccb759 100644
--- a/drivers/staging/silicom/bp_mod.c
+++ b/drivers/staging/silicom/bpctl_mod.c
@@ -35,7 +35,6 @@
35#define BP_MOD_DESCR "Silicom Bypass-SD Control driver" 35#define BP_MOD_DESCR "Silicom Bypass-SD Control driver"
36#define BP_SYNC_FLAG 1 36#define BP_SYNC_FLAG 1
37 37
38static int Device_Open = 0;
39static int major_num = 0; 38static int major_num = 0;
40 39
41MODULE_AUTHOR("Anna Lukin, annal@silicom.co.il"); 40MODULE_AUTHOR("Anna Lukin, annal@silicom.co.il");
@@ -60,35 +59,9 @@ typedef enum {
60 bp_none, 59 bp_none,
61} bp_media_type; 60} bp_media_type;
62 61
63struct pfs_unit_sd {
64 struct proc_dir_entry *proc_entry;
65 char proc_name[32];
66};
67
68struct bypass_pfs_sd { 62struct bypass_pfs_sd {
69 char dir_name[32]; 63 char dir_name[32];
70 struct proc_dir_entry *bypass_entry; 64 struct proc_dir_entry *bypass_entry;
71 struct pfs_unit_sd bypass_info;
72 struct pfs_unit_sd bypass_slave;
73 struct pfs_unit_sd bypass_caps;
74 struct pfs_unit_sd wd_set_caps;
75 struct pfs_unit_sd bypass;
76 struct pfs_unit_sd bypass_change;
77 struct pfs_unit_sd bypass_wd;
78 struct pfs_unit_sd wd_expire_time;
79 struct pfs_unit_sd reset_bypass_wd;
80 struct pfs_unit_sd dis_bypass;
81 struct pfs_unit_sd bypass_pwup;
82 struct pfs_unit_sd bypass_pwoff;
83 struct pfs_unit_sd std_nic;
84 struct pfs_unit_sd tap;
85 struct pfs_unit_sd dis_tap;
86 struct pfs_unit_sd tap_pwup;
87 struct pfs_unit_sd tap_change;
88 struct pfs_unit_sd wd_exp_mode;
89 struct pfs_unit_sd wd_autoreset;
90 struct pfs_unit_sd tpl;
91
92}; 65};
93 66
94typedef struct _bpctl_dev { 67typedef struct _bpctl_dev {
@@ -315,27 +288,6 @@ static struct notifier_block bp_notifier_block = {
315 .notifier_call = bp_device_event, 288 .notifier_call = bp_device_event,
316}; 289};
317 290
318static int device_open(struct inode *inode, struct file *file)
319{
320#ifdef DEBUG
321 printk("device_open(%p)\n", file);
322#endif
323 Device_Open++;
324/*
325* Initialize the message
326*/
327 return SUCCESS;
328}
329
330static int device_release(struct inode *inode, struct file *file)
331{
332#ifdef DEBUG
333 printk("device_release(%p,%p)\n", inode, file);
334#endif
335 Device_Open--;
336 return SUCCESS;
337}
338
339int is_bypass_fn(bpctl_dev_t *pbpctl_dev); 291int is_bypass_fn(bpctl_dev_t *pbpctl_dev);
340int wdt_time_left(bpctl_dev_t *pbpctl_dev); 292int wdt_time_left(bpctl_dev_t *pbpctl_dev);
341 293
@@ -1728,62 +1680,33 @@ int gpio6_clear_fn(bpctl_dev_t *pbpctl_dev)
1728} 1680}
1729#endif /*BYPASS_DEBUG */ 1681#endif /*BYPASS_DEBUG */
1730 1682
1731static bpctl_dev_t *get_status_port_fn(bpctl_dev_t *pbpctl_dev) 1683static bpctl_dev_t *lookup_port(bpctl_dev_t *dev)
1732{ 1684{
1733 int idx_dev = 0; 1685 bpctl_dev_t *p;
1734 1686 int n;
1735 if (pbpctl_dev == NULL) 1687 for (n = 0, p = bpctl_dev_arr; n < device_num && p->pdev; n++) {
1736 return NULL; 1688 if (p->bus == dev->bus
1737 1689 && p->slot == dev->slot
1738 if ((pbpctl_dev->func == 0) || (pbpctl_dev->func == 2)) { 1690 && p->func == (dev->func ^ 1))
1739 for (idx_dev = 0; 1691 return p;
1740 ((bpctl_dev_arr[idx_dev].pdev != NULL) 1692 }
1741 && (idx_dev < device_num)); idx_dev++) { 1693 return NULL;
1742 if ((bpctl_dev_arr[idx_dev].bus == pbpctl_dev->bus) 1694}
1743 && (bpctl_dev_arr[idx_dev].slot == pbpctl_dev->slot)
1744 && ((bpctl_dev_arr[idx_dev].func == 1)
1745 && (pbpctl_dev->func == 0))) {
1746
1747 return &(bpctl_dev_arr[idx_dev]);
1748 }
1749 if ((bpctl_dev_arr[idx_dev].bus == pbpctl_dev->bus) &&
1750 (bpctl_dev_arr[idx_dev].slot == pbpctl_dev->slot) &&
1751 ((bpctl_dev_arr[idx_dev].func == 3)
1752 && (pbpctl_dev->func == 2))) {
1753 1695
1754 return &(bpctl_dev_arr[idx_dev]); 1696static bpctl_dev_t *get_status_port_fn(bpctl_dev_t *pbpctl_dev)
1755 } 1697{
1756 } 1698 if (pbpctl_dev) {
1699 if (pbpctl_dev->func == 0 || pbpctl_dev->func == 2)
1700 return lookup_port(pbpctl_dev);
1757 } 1701 }
1758 return NULL; 1702 return NULL;
1759} 1703}
1760 1704
1761static bpctl_dev_t *get_master_port_fn(bpctl_dev_t *pbpctl_dev) 1705static bpctl_dev_t *get_master_port_fn(bpctl_dev_t *pbpctl_dev)
1762{ 1706{
1763 int idx_dev = 0; 1707 if (pbpctl_dev) {
1764 1708 if (pbpctl_dev->func == 1 || pbpctl_dev->func == 3)
1765 if (pbpctl_dev == NULL) 1709 return lookup_port(pbpctl_dev);
1766 return NULL;
1767
1768 if ((pbpctl_dev->func == 1) || (pbpctl_dev->func == 3)) {
1769 for (idx_dev = 0;
1770 ((bpctl_dev_arr[idx_dev].pdev != NULL)
1771 && (idx_dev < device_num)); idx_dev++) {
1772 if ((bpctl_dev_arr[idx_dev].bus == pbpctl_dev->bus)
1773 && (bpctl_dev_arr[idx_dev].slot == pbpctl_dev->slot)
1774 && ((bpctl_dev_arr[idx_dev].func == 0)
1775 && (pbpctl_dev->func == 1))) {
1776
1777 return &(bpctl_dev_arr[idx_dev]);
1778 }
1779 if ((bpctl_dev_arr[idx_dev].bus == pbpctl_dev->bus) &&
1780 (bpctl_dev_arr[idx_dev].slot == pbpctl_dev->slot) &&
1781 ((bpctl_dev_arr[idx_dev].func == 2)
1782 && (pbpctl_dev->func == 3))) {
1783
1784 return &(bpctl_dev_arr[idx_dev]);
1785 }
1786 }
1787 } 1710 }
1788 return NULL; 1711 return NULL;
1789} 1712}
@@ -5858,11 +5781,9 @@ static long device_ioctl(struct file *file, /* see include/linux/fs.h */
5858 return ret; 5781 return ret;
5859} 5782}
5860 5783
5861struct file_operations Fops = { 5784static const struct file_operations Fops = {
5862 .owner = THIS_MODULE, 5785 .owner = THIS_MODULE,
5863 .unlocked_ioctl = device_ioctl, 5786 .unlocked_ioctl = device_ioctl,
5864 .open = device_open,
5865 .release = device_release, /* a.k.a. close */
5866}; 5787};
5867 5788
5868#ifndef PCI_DEVICE 5789#ifndef PCI_DEVICE
@@ -6686,6 +6607,118 @@ static bpmod_info_t tx_ctl_pci_tbl[] = {
6686 {0,} 6607 {0,}
6687}; 6608};
6688 6609
6610static void find_fw(bpctl_dev_t *dev)
6611{
6612 unsigned long mmio_start, mmio_len;
6613 struct pci_dev *pdev1 = dev->pdev;
6614
6615 if ((OLD_IF_SERIES(dev->subdevice)) ||
6616 (INTEL_IF_SERIES(dev->subdevice)))
6617 dev->bp_fw_ver = 0xff;
6618 else
6619 dev->bp_fw_ver = bypass_fw_ver(dev);
6620
6621 if (dev->bp_10gb == 1 && dev->bp_fw_ver == 0xff) {
6622 int cnt = 100;
6623 while (cnt--) {
6624 iounmap((void *)dev->mem_map);
6625 mmio_start = pci_resource_start(pdev1, 0);
6626 mmio_len = pci_resource_len(pdev1, 0);
6627
6628 dev->mem_map = (unsigned long)
6629 ioremap(mmio_start, mmio_len);
6630
6631 dev->bp_fw_ver = bypass_fw_ver(dev);
6632 if (dev-> bp_fw_ver == 0xa8)
6633 break;
6634 }
6635 }
6636 /* dev->bp_fw_ver=0xa8; */
6637 printk("firmware version: 0x%x\n", dev->bp_fw_ver);
6638}
6639
6640static int init_one(bpctl_dev_t *dev, bpmod_info_t *info, struct pci_dev *pdev1)
6641{
6642 unsigned long mmio_start, mmio_len;
6643
6644 dev->pdev = pdev1;
6645 mmio_start = pci_resource_start(pdev1, 0);
6646 mmio_len = pci_resource_len(pdev1, 0);
6647
6648 dev->desc = dev_desc[info->index].name;
6649 dev->name = info->bp_name;
6650 dev->device = info->device;
6651 dev->vendor = info->vendor;
6652 dev->subdevice = info->subdevice;
6653 dev->subvendor = info->subvendor;
6654 dev->func = PCI_FUNC(pdev1->devfn);
6655 dev->slot = PCI_SLOT(pdev1->devfn);
6656 dev->bus = pdev1->bus->number;
6657 dev->mem_map = (unsigned long)ioremap(mmio_start, mmio_len);
6658#ifdef BP_SYNC_FLAG
6659 spin_lock_init(&dev->bypass_wr_lock);
6660#endif
6661 if (BP10G9_IF_SERIES(dev->subdevice))
6662 dev->bp_10g9 = 1;
6663 if (BP10G_IF_SERIES(dev->subdevice))
6664 dev->bp_10g = 1;
6665 if (PEG540_IF_SERIES(dev->subdevice))
6666 dev->bp_540 = 1;
6667 if (PEGF5_IF_SERIES(dev->subdevice))
6668 dev->bp_fiber5 = 1;
6669 if (PEG80_IF_SERIES(dev->subdevice))
6670 dev->bp_i80 = 1;
6671 if (PEGF80_IF_SERIES(dev->subdevice))
6672 dev->bp_i80 = 1;
6673 if ((dev->subdevice & 0xa00) == 0xa00)
6674 dev->bp_i80 = 1;
6675 if (BP10GB_IF_SERIES(dev->subdevice)) {
6676 if (dev->ifindex == 0) {
6677 unregister_chrdev(major_num, DEVICE_NAME);
6678 printk("Please load network driver for %s adapter!\n",
6679 dev->name);
6680 return -1;
6681 }
6682
6683 if (dev->ndev && !(dev->ndev->flags & IFF_UP)) {
6684 unregister_chrdev(major_num, DEVICE_NAME);
6685 printk("Please bring up network interfaces for %s adapter!\n",
6686 dev->name);
6687 return -1;
6688 }
6689 dev->bp_10gb = 1;
6690 }
6691
6692 if (!dev->bp_10g9) {
6693 if (is_bypass_fn(dev)) {
6694 printk(KERN_INFO "%s found, ",
6695 dev->name);
6696 find_fw(dev);
6697 }
6698 dev->wdt_status = WDT_STATUS_UNKNOWN;
6699 dev->reset_time = 0;
6700 atomic_set(&dev->wdt_busy, 0);
6701 dev->bp_status_un = 1;
6702
6703 bypass_caps_init(dev);
6704
6705 init_bypass_wd_auto(dev);
6706 init_bypass_tpl_auto(dev);
6707 if (NOKIA_SERIES(dev->subdevice))
6708 reset_cont(dev);
6709 }
6710#ifdef BP_SELF_TEST
6711 if ((dev->bp_tx_data = kzalloc(BPTEST_DATA_LEN, GFP_KERNEL))) {
6712 memset(dev->bp_tx_data, 0xff, 6);
6713 memset(dev->bp_tx_data + 6, 0x0, 1);
6714 memset(dev->bp_tx_data + 7, 0xaa, 5);
6715 *(__be16 *)(dev->bp_tx_data + 12) = htons(ETH_P_BPTEST);
6716 } else
6717 printk("bp_ctl: Memory allocation error!\n");
6718#endif
6719 return 0;
6720}
6721
6689/* 6722/*
6690* Initialize the module - Register the character device 6723* Initialize the module - Register the character device
6691*/ 6724*/
@@ -6694,7 +6727,7 @@ static int __init bypass_init_module(void)
6694{ 6727{
6695 int ret_val, idx, idx_dev = 0; 6728 int ret_val, idx, idx_dev = 0;
6696 struct pci_dev *pdev1 = NULL; 6729 struct pci_dev *pdev1 = NULL;
6697 unsigned long mmio_start, mmio_len; 6730 bpctl_dev_t *dev;
6698 6731
6699 printk(BP_MOD_DESCR " v" BP_MOD_VER "\n"); 6732 printk(BP_MOD_DESCR " v" BP_MOD_VER "\n");
6700 ret_val = register_chrdev(major_num, DEVICE_NAME, &Fops); 6733 ret_val = register_chrdev(major_num, DEVICE_NAME, &Fops);
@@ -6729,181 +6762,16 @@ static int __init bypass_init_module(void)
6729 memset(bpctl_dev_arr, 0, ((device_num) * sizeof(bpctl_dev_t))); 6762 memset(bpctl_dev_arr, 0, ((device_num) * sizeof(bpctl_dev_t)));
6730 6763
6731 pdev1 = NULL; 6764 pdev1 = NULL;
6765 dev = bpctl_dev_arr;
6732 for (idx = 0; tx_ctl_pci_tbl[idx].vendor; idx++) { 6766 for (idx = 0; tx_ctl_pci_tbl[idx].vendor; idx++) {
6733 while ((pdev1 = pci_get_subsys(tx_ctl_pci_tbl[idx].vendor, 6767 while ((pdev1 = pci_get_subsys(tx_ctl_pci_tbl[idx].vendor,
6734 tx_ctl_pci_tbl[idx].device, 6768 tx_ctl_pci_tbl[idx].device,
6735 tx_ctl_pci_tbl[idx].subvendor, 6769 tx_ctl_pci_tbl[idx].subvendor,
6736 tx_ctl_pci_tbl[idx].subdevice, 6770 tx_ctl_pci_tbl[idx].subdevice,
6737 pdev1))) { 6771 pdev1))) {
6738 bpctl_dev_arr[idx_dev].pdev = pdev1; 6772 if (init_one(dev, &tx_ctl_pci_tbl[idx], pdev1) < 0)
6739 6773 return -1;
6740 mmio_start = pci_resource_start(pdev1, 0); 6774 dev++;
6741 mmio_len = pci_resource_len(pdev1, 0);
6742
6743 bpctl_dev_arr[idx_dev].desc =
6744 dev_desc[tx_ctl_pci_tbl[idx].index].name;
6745 bpctl_dev_arr[idx_dev].name =
6746 tx_ctl_pci_tbl[idx].bp_name;
6747 bpctl_dev_arr[idx_dev].device =
6748 tx_ctl_pci_tbl[idx].device;
6749 bpctl_dev_arr[idx_dev].vendor =
6750 tx_ctl_pci_tbl[idx].vendor;
6751 bpctl_dev_arr[idx_dev].subdevice =
6752 tx_ctl_pci_tbl[idx].subdevice;
6753 bpctl_dev_arr[idx_dev].subvendor =
6754 tx_ctl_pci_tbl[idx].subvendor;
6755 /* bpctl_dev_arr[idx_dev].pdev=pdev1; */
6756 bpctl_dev_arr[idx_dev].func = PCI_FUNC(pdev1->devfn);
6757 bpctl_dev_arr[idx_dev].slot = PCI_SLOT(pdev1->devfn);
6758 bpctl_dev_arr[idx_dev].bus = pdev1->bus->number;
6759 bpctl_dev_arr[idx_dev].mem_map =
6760 (unsigned long)ioremap(mmio_start, mmio_len);
6761#ifdef BP_SYNC_FLAG
6762 spin_lock_init(&bpctl_dev_arr[idx_dev].bypass_wr_lock);
6763#endif
6764 if (BP10G9_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice))
6765 bpctl_dev_arr[idx_dev].bp_10g9 = 1;
6766 if (BP10G_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice))
6767 bpctl_dev_arr[idx_dev].bp_10g = 1;
6768 if (PEG540_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice)) {
6769
6770 bpctl_dev_arr[idx_dev].bp_540 = 1;
6771 }
6772 if (PEGF5_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice))
6773 bpctl_dev_arr[idx_dev].bp_fiber5 = 1;
6774 if (PEG80_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice))
6775 bpctl_dev_arr[idx_dev].bp_i80 = 1;
6776 if (PEGF80_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice))
6777 bpctl_dev_arr[idx_dev].bp_i80 = 1;
6778 if ((bpctl_dev_arr[idx_dev].subdevice & 0xa00) == 0xa00)
6779 bpctl_dev_arr[idx_dev].bp_i80 = 1;
6780 if (BP10GB_IF_SERIES(bpctl_dev_arr[idx_dev].subdevice)) {
6781 if (bpctl_dev_arr[idx_dev].ifindex == 0) {
6782 unregister_chrdev(major_num,
6783 DEVICE_NAME);
6784 printk
6785 ("Please load network driver for %s adapter!\n",
6786 bpctl_dev_arr[idx_dev].name);
6787 return -1;
6788 }
6789
6790 if (bpctl_dev_arr[idx_dev].ndev) {
6791 if (!
6792 (bpctl_dev_arr[idx_dev].ndev->
6793 flags & IFF_UP)) {
6794 if (!
6795 (bpctl_dev_arr[idx_dev].
6796 ndev->flags & IFF_UP)) {
6797 unregister_chrdev
6798 (major_num,
6799 DEVICE_NAME);
6800 printk
6801 ("Please bring up network interfaces for %s adapter!\n",
6802 bpctl_dev_arr
6803 [idx_dev].name);
6804 return -1;
6805 }
6806
6807 }
6808 }
6809 bpctl_dev_arr[idx_dev].bp_10gb = 1;
6810 }
6811
6812 if (!bpctl_dev_arr[idx_dev].bp_10g9) {
6813
6814 if (is_bypass_fn(&bpctl_dev_arr[idx_dev])) {
6815 printk(KERN_INFO "%s found, ",
6816 bpctl_dev_arr[idx_dev].name);
6817 if ((OLD_IF_SERIES
6818 (bpctl_dev_arr[idx_dev].subdevice))
6819 ||
6820 (INTEL_IF_SERIES
6821 (bpctl_dev_arr[idx_dev].
6822 subdevice)))
6823 bpctl_dev_arr[idx_dev].
6824 bp_fw_ver = 0xff;
6825 else
6826 bpctl_dev_arr[idx_dev].
6827 bp_fw_ver =
6828 bypass_fw_ver(&bpctl_dev_arr
6829 [idx_dev]);
6830 if ((bpctl_dev_arr[idx_dev].bp_10gb ==
6831 1)
6832 && (bpctl_dev_arr[idx_dev].
6833 bp_fw_ver == 0xff)) {
6834 int cnt = 100;
6835 while (cnt--) {
6836 iounmap((void
6837 *)
6838 (bpctl_dev_arr
6839 [idx_dev].
6840 mem_map));
6841 mmio_start =
6842 pci_resource_start
6843 (pdev1, 0);
6844 mmio_len =
6845 pci_resource_len
6846 (pdev1, 0);
6847
6848 bpctl_dev_arr[idx_dev].
6849 mem_map =
6850 (unsigned long)
6851 ioremap(mmio_start,
6852 mmio_len);
6853
6854 bpctl_dev_arr[idx_dev].
6855 bp_fw_ver =
6856 bypass_fw_ver
6857 (&bpctl_dev_arr
6858 [idx_dev]);
6859 if (bpctl_dev_arr
6860 [idx_dev].
6861 bp_fw_ver == 0xa8)
6862 break;
6863
6864 }
6865 }
6866 /* bpctl_dev_arr[idx_dev].bp_fw_ver=0xa8; */
6867 printk("firmware version: 0x%x\n",
6868 bpctl_dev_arr[idx_dev].
6869 bp_fw_ver);
6870 }
6871 bpctl_dev_arr[idx_dev].wdt_status =
6872 WDT_STATUS_UNKNOWN;
6873 bpctl_dev_arr[idx_dev].reset_time = 0;
6874 atomic_set(&bpctl_dev_arr[idx_dev].wdt_busy, 0);
6875 bpctl_dev_arr[idx_dev].bp_status_un = 1;
6876
6877 bypass_caps_init(&bpctl_dev_arr[idx_dev]);
6878
6879 init_bypass_wd_auto(&bpctl_dev_arr[idx_dev]);
6880 init_bypass_tpl_auto(&bpctl_dev_arr[idx_dev]);
6881 if (NOKIA_SERIES
6882 (bpctl_dev_arr[idx_dev].subdevice))
6883 reset_cont(&bpctl_dev_arr[idx_dev]);
6884 }
6885#ifdef BP_SELF_TEST
6886 if ((bpctl_dev_arr[idx_dev].bp_tx_data =
6887 kmalloc(BPTEST_DATA_LEN, GFP_KERNEL))) {
6888
6889 memset(bpctl_dev_arr[idx_dev].bp_tx_data, 0x0,
6890 BPTEST_DATA_LEN);
6891
6892 memset(bpctl_dev_arr[idx_dev].bp_tx_data, 0xff,
6893 6);
6894 memset(bpctl_dev_arr[idx_dev].bp_tx_data + 6,
6895 0x0, 1);
6896 memset(bpctl_dev_arr[idx_dev].bp_tx_data + 7,
6897 0xaa, 5);
6898
6899 *(__be16 *) (bpctl_dev_arr[idx_dev].bp_tx_data +
6900 12) = htons(ETH_P_BPTEST);
6901
6902 } else
6903 printk("bp_ctl: Memory allocation error!\n");
6904#endif
6905 idx_dev++;
6906
6907 } 6775 }
6908 } 6776 }
6909 if_scan_init(); 6777 if_scan_init();
@@ -6913,33 +6781,27 @@ static int __init bypass_init_module(void)
6913 { 6781 {
6914 6782
6915 bpctl_dev_t *pbpctl_dev_c = NULL; 6783 bpctl_dev_t *pbpctl_dev_c = NULL;
6916 for (idx_dev = 0; 6784 for (idx_dev = 0, dev = bpctl_dev_arr;
6917 ((bpctl_dev_arr[idx_dev].pdev != NULL) 6785 idx_dev < device_num && dev->pdev;
6918 && (idx_dev < device_num)); idx_dev++) { 6786 idx_dev++, dev++) {
6919 if (bpctl_dev_arr[idx_dev].bp_10g9) { 6787 if (dev->bp_10g9) {
6920 pbpctl_dev_c = 6788 pbpctl_dev_c = get_status_port_fn(dev);
6921 get_status_port_fn(&bpctl_dev_arr[idx_dev]); 6789 if (is_bypass_fn(dev)) {
6922 if (is_bypass_fn(&bpctl_dev_arr[idx_dev])) {
6923 printk(KERN_INFO "%s found, ", 6790 printk(KERN_INFO "%s found, ",
6924 bpctl_dev_arr[idx_dev].name); 6791 dev->name);
6925 bpctl_dev_arr[idx_dev].bp_fw_ver = 6792 dev->bp_fw_ver = bypass_fw_ver(dev);
6926 bypass_fw_ver(&bpctl_dev_arr
6927 [idx_dev]);
6928 printk("firmware version: 0x%x\n", 6793 printk("firmware version: 0x%x\n",
6929 bpctl_dev_arr[idx_dev]. 6794 dev->bp_fw_ver);
6930 bp_fw_ver);
6931
6932 } 6795 }
6933 bpctl_dev_arr[idx_dev].wdt_status = 6796 dev->wdt_status = WDT_STATUS_UNKNOWN;
6934 WDT_STATUS_UNKNOWN; 6797 dev->reset_time = 0;
6935 bpctl_dev_arr[idx_dev].reset_time = 0; 6798 atomic_set(&dev->wdt_busy, 0);
6936 atomic_set(&bpctl_dev_arr[idx_dev].wdt_busy, 0); 6799 dev->bp_status_un = 1;
6937 bpctl_dev_arr[idx_dev].bp_status_un = 1;
6938 6800
6939 bypass_caps_init(&bpctl_dev_arr[idx_dev]); 6801 bypass_caps_init(dev);
6940 6802
6941 init_bypass_wd_auto(&bpctl_dev_arr[idx_dev]); 6803 init_bypass_wd_auto(dev);
6942 init_bypass_tpl_auto(&bpctl_dev_arr[idx_dev]); 6804 init_bypass_tpl_auto(dev);
6943 6805
6944 } 6806 }
6945 6807
@@ -7336,78 +7198,11 @@ EXPORT_SYMBOL_NOVERS(bp_if_scan_sd);
7336 7198
7337#define BP_PROC_DIR "bypass" 7199#define BP_PROC_DIR "bypass"
7338 7200
7339#define GPIO6_SET_ENTRY_SD "gpio6_set"
7340#define GPIO6_CLEAR_ENTRY_SD "gpio6_clear"
7341
7342#define GPIO7_SET_ENTRY_SD "gpio7_set"
7343#define GPIO7_CLEAR_ENTRY_SD "gpio7_clear"
7344
7345#define PULSE_SET_ENTRY_SD "pulse_set"
7346#define ZERO_SET_ENTRY_SD "zero_set"
7347#define PULSE_GET1_ENTRY_SD "pulse_get1"
7348#define PULSE_GET2_ENTRY_SD "pulse_get2"
7349
7350#define CMND_ON_ENTRY_SD "cmnd_on"
7351#define CMND_OFF_ENTRY_SD "cmnd_off"
7352#define RESET_CONT_ENTRY_SD "reset_cont"
7353
7354 /*COMMANDS*/
7355#define BYPASS_INFO_ENTRY_SD "bypass_info"
7356#define BYPASS_SLAVE_ENTRY_SD "bypass_slave"
7357#define BYPASS_CAPS_ENTRY_SD "bypass_caps"
7358#define WD_SET_CAPS_ENTRY_SD "wd_set_caps"
7359#define BYPASS_ENTRY_SD "bypass"
7360#define BYPASS_CHANGE_ENTRY_SD "bypass_change"
7361#define BYPASS_WD_ENTRY_SD "bypass_wd"
7362#define WD_EXPIRE_TIME_ENTRY_SD "wd_expire_time"
7363#define RESET_BYPASS_WD_ENTRY_SD "reset_bypass_wd"
7364#define DIS_BYPASS_ENTRY_SD "dis_bypass"
7365#define BYPASS_PWUP_ENTRY_SD "bypass_pwup"
7366#define BYPASS_PWOFF_ENTRY_SD "bypass_pwoff"
7367#define STD_NIC_ENTRY_SD "std_nic"
7368#define STD_NIC_ENTRY_SD "std_nic"
7369#define TAP_ENTRY_SD "tap"
7370#define TAP_CHANGE_ENTRY_SD "tap_change"
7371#define DIS_TAP_ENTRY_SD "dis_tap"
7372#define TAP_PWUP_ENTRY_SD "tap_pwup"
7373#define TWO_PORT_LINK_ENTRY_SD "two_port_link"
7374#define WD_EXP_MODE_ENTRY_SD "wd_exp_mode"
7375#define WD_AUTORESET_ENTRY_SD "wd_autoreset"
7376#define TPL_ENTRY_SD "tpl"
7377#define WAIT_AT_PWUP_ENTRY_SD "wait_at_pwup"
7378#define HW_RESET_ENTRY_SD "hw_reset"
7379#define DISC_ENTRY_SD "disc"
7380#define DISC_CHANGE_ENTRY_SD "disc_change"
7381#define DIS_DISC_ENTRY_SD "dis_disc"
7382#define DISC_PWUP_ENTRY_SD "disc_pwup"
7383static struct proc_dir_entry *bp_procfs_dir; 7201static struct proc_dir_entry *bp_procfs_dir;
7384 7202
7385static struct proc_dir_entry *proc_getdir(char *name,
7386 struct proc_dir_entry *proc_dir)
7387{
7388 struct proc_dir_entry *pde = proc_dir;
7389
7390 for (pde = pde->subdir; pde; pde = pde->next) {
7391 if (pde->namelen && (strcmp(name, pde->name) == 0)) {
7392 /* directory exists */
7393 break;
7394 }
7395 }
7396 if (pde == (struct proc_dir_entry *)0) {
7397 /* create the directory */
7398 pde = proc_mkdir(name, proc_dir);
7399 if (pde == (struct proc_dir_entry *)0) {
7400
7401 return pde;
7402 }
7403 }
7404
7405 return pde;
7406}
7407
7408int bp_proc_create(void) 7203int bp_proc_create(void)
7409{ 7204{
7410 bp_procfs_dir = proc_getdir(BP_PROC_DIR, init_net.proc_net); 7205 bp_procfs_dir = proc_mkdir(BP_PROC_DIR, init_net.proc_net);
7411 if (bp_procfs_dir == (struct proc_dir_entry *)0) { 7206 if (bp_procfs_dir == (struct proc_dir_entry *)0) {
7412 printk(KERN_DEBUG 7207 printk(KERN_DEBUG
7413 "Could not create procfs nicinfo directory %s\n", 7208 "Could not create procfs nicinfo directory %s\n",
@@ -7417,144 +7212,99 @@ int bp_proc_create(void)
7417 return 0; 7212 return 0;
7418} 7213}
7419 7214
7420int 7215static int procfs_add(char *proc_name, const struct file_operations *fops,
7421bypass_proc_create_entry_sd(struct pfs_unit_sd *pfs_unit_curr, 7216 bpctl_dev_t *dev)
7422 char *proc_name,
7423 write_proc_t *write_proc,
7424 read_proc_t *read_proc,
7425 struct proc_dir_entry *parent_pfs, void *data)
7426{ 7217{
7427 strcpy(pfs_unit_curr->proc_name, proc_name); 7218 struct bypass_pfs_sd *pfs = &dev->bypass_pfs_set;
7428 pfs_unit_curr->proc_entry = create_proc_entry(pfs_unit_curr->proc_name, 7219 if (!proc_create_data(proc_name, 0644, pfs->bypass_entry, fops, dev))
7429 S_IFREG | S_IRUSR |
7430 S_IWUSR | S_IRGRP |
7431 S_IROTH, parent_pfs);
7432 if (pfs_unit_curr->proc_entry == NULL)
7433 return -1; 7220 return -1;
7434
7435 pfs_unit_curr->proc_entry->read_proc = read_proc;
7436 pfs_unit_curr->proc_entry->write_proc = write_proc;
7437 pfs_unit_curr->proc_entry->data = data;
7438
7439 return 0; 7221 return 0;
7440
7441} 7222}
7442 7223
7443int 7224#define RO_FOPS(name) \
7444get_bypass_info_pfs(char *page, char **start, off_t off, int count, 7225static int name##_open(struct inode *inode, struct file *file) \
7445 int *eof, void *data) 7226{ \
7446{ 7227 return single_open(file, show_##name, PDE_DATA(inode));\
7447 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7228} \
7448 int len = 0; 7229static const struct file_operations name##_ops = { \
7449 7230 .open = name##_open, \
7450 len += sprintf(page, "Name\t\t\t%s\n", pbp_device_block->name); 7231 .read = seq_read, \
7451 len += 7232 .llseek = seq_lseek, \
7452 sprintf(page + len, "Firmware version\t0x%x\n", 7233 .release = single_release, \
7453 pbp_device_block->bp_fw_ver); 7234};
7454 7235
7455 *eof = 1; 7236#define RW_FOPS(name) \
7456 return len; 7237static int name##_open(struct inode *inode, struct file *file) \
7457} 7238{ \
7239 return single_open(file, show_##name, PDE_DATA(inode));\
7240} \
7241static const struct file_operations name##_ops = { \
7242 .open = name##_open, \
7243 .read = seq_read, \
7244 .write = name##_write, \
7245 .llseek = seq_lseek, \
7246 .release = single_release, \
7247};
7458 7248
7459int 7249static int show_bypass_info(struct seq_file *m, void *v)
7460get_bypass_slave_pfs(char *page, char **start, off_t off, int count,
7461 int *eof, void *data)
7462{ 7250{
7463 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7251 bpctl_dev_t *dev = m->private;
7464 7252
7465 int len = 0; 7253 seq_printf(m, "Name\t\t\t%s\n", dev->name);
7466 bpctl_dev_t *pbp_device_block_slave = NULL; 7254 seq_printf(m, "Firmware version\t0x%x\n", dev->bp_fw_ver);
7467 int idx_dev = 0; 7255 return 0;
7468 struct net_device *net_slave_dev = NULL;
7469
7470 if ((pbp_device_block->func == 0) || (pbp_device_block->func == 2)) {
7471 for (idx_dev = 0;
7472 ((bpctl_dev_arr[idx_dev].pdev != NULL)
7473 && (idx_dev < device_num)); idx_dev++) {
7474 if ((bpctl_dev_arr[idx_dev].bus ==
7475 pbp_device_block->bus)
7476 && (bpctl_dev_arr[idx_dev].slot ==
7477 pbp_device_block->slot)) {
7478 if ((pbp_device_block->func == 0)
7479 && (bpctl_dev_arr[idx_dev].func == 1)) {
7480 pbp_device_block_slave =
7481 &bpctl_dev_arr[idx_dev];
7482 break;
7483 }
7484 if ((pbp_device_block->func == 2) &&
7485 (bpctl_dev_arr[idx_dev].func == 3)) {
7486 pbp_device_block_slave =
7487 &bpctl_dev_arr[idx_dev];
7488 break;
7489 }
7490 }
7491 }
7492 } else
7493 pbp_device_block_slave = pbp_device_block;
7494 if (!pbp_device_block_slave) {
7495 len = sprintf(page, "fail\n");
7496 *eof = 1;
7497 return len;
7498 }
7499 net_slave_dev = pbp_device_block_slave->ndev;
7500 if (net_slave_dev)
7501 len = sprintf(page, "%s\n", net_slave_dev->name);
7502
7503 *eof = 1;
7504 return len;
7505} 7256}
7257RO_FOPS(bypass_info)
7506 7258
7507int 7259static int show_bypass_slave(struct seq_file *m, void *v)
7508get_bypass_caps_pfs(char *page, char **start, off_t off, int count,
7509 int *eof, void *data)
7510{ 7260{
7511 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7261 bpctl_dev_t *dev = m->private;
7512 7262 bpctl_dev_t *slave = get_status_port_fn(dev);
7513 int len = 0, ret = 0; 7263 if (!slave)
7264 slave = dev;
7265 if (!slave)
7266 seq_printf(m, "fail\n");
7267 else if (slave->ndev)
7268 seq_printf(m, "%s\n", slave->ndev->name);
7269 return 0;
7270}
7271RO_FOPS(bypass_slave)
7514 7272
7515 ret = get_bypass_caps_fn(pbp_device_block); 7273static int show_bypass_caps(struct seq_file *m, void *v)
7274{
7275 bpctl_dev_t *dev = m->private;
7276 int ret = get_bypass_caps_fn(dev);
7516 if (ret == BP_NOT_CAP) 7277 if (ret == BP_NOT_CAP)
7517 len = sprintf(page, "-1\n"); 7278 seq_printf(m, "-1\n");
7518 else 7279 else
7519 len = sprintf(page, "0x%x\n", ret); 7280 seq_printf(m, "0x%x\n", ret);
7520 *eof = 1; 7281 return 0;
7521 return len;
7522
7523} 7282}
7283RO_FOPS(bypass_caps)
7524 7284
7525int 7285static int show_wd_set_caps(struct seq_file *m, void *v)
7526get_wd_set_caps_pfs(char *page, char **start, off_t off, int count,
7527 int *eof, void *data)
7528{ 7286{
7529 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7287 bpctl_dev_t *dev = m->private;
7530 7288 int ret = get_wd_set_caps_fn(dev);
7531 int len = 0, ret = 0;
7532
7533 ret = get_wd_set_caps_fn(pbp_device_block);
7534 if (ret == BP_NOT_CAP) 7289 if (ret == BP_NOT_CAP)
7535 len = sprintf(page, "-1\n"); 7290 seq_printf(m, "-1\n");
7536 else 7291 else
7537 len = sprintf(page, "0x%x\n", ret); 7292 seq_printf(m, "0x%x\n", ret);
7538 *eof = 1; 7293 return 0;
7539 return len;
7540} 7294}
7295RO_FOPS(wd_set_caps)
7541 7296
7542int 7297static int user_on_off(const void __user *buffer, size_t count)
7543set_bypass_pfs(struct file *file, const char *buffer,
7544 unsigned long count, void *data)
7545{ 7298{
7546 7299
7547 char kbuf[256]; 7300 char kbuf[256];
7548 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7301 int length = 0;
7549
7550 int bypass_param = 0, length = 0;
7551 7302
7552 if (count > (sizeof(kbuf) - 1)) 7303 if (count > (sizeof(kbuf) - 1))
7553 return -1; 7304 return -1;
7554 7305
7555 if (copy_from_user(&kbuf, buffer, count)) { 7306 if (copy_from_user(&kbuf, buffer, count))
7556 return -1; 7307 return -1;
7557 }
7558 7308
7559 kbuf[count] = '\0'; 7309 kbuf[count] = '\0';
7560 length = strlen(kbuf); 7310 length = strlen(kbuf);
@@ -7562,806 +7312,467 @@ set_bypass_pfs(struct file *file, const char *buffer,
7562 kbuf[--length] = '\0'; 7312 kbuf[--length] = '\0';
7563 7313
7564 if (strcmp(kbuf, "on") == 0) 7314 if (strcmp(kbuf, "on") == 0)
7565 bypass_param = 1; 7315 return 1;
7566 else if (strcmp(kbuf, "off") == 0) 7316 if (strcmp(kbuf, "off") == 0)
7567 bypass_param = 0; 7317 return 0;
7568 7318 return 0;
7569 set_bypass_fn(pbp_device_block, bypass_param);
7570
7571 return count;
7572} 7319}
7573 7320
7574int 7321static ssize_t bypass_write(struct file *file, const char __user *buffer,
7575set_tap_pfs(struct file *file, const char *buffer, 7322 size_t count, loff_t *pos)
7576 unsigned long count, void *data)
7577{ 7323{
7578 7324 int bypass_param = user_on_off(buffer, count);
7579 char kbuf[256]; 7325 if (bypass_param < 0)
7580 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
7581
7582 int tap_param = 0, length = 0;
7583
7584 if (count > (sizeof(kbuf) - 1))
7585 return -1; 7326 return -1;
7586 7327
7587 if (copy_from_user(&kbuf, buffer, count)) { 7328 set_bypass_fn(PDE_DATA(file_inode(file)), bypass_param);
7588 return -1;
7589 }
7590
7591 kbuf[count] = '\0';
7592 length = strlen(kbuf);
7593 if (kbuf[length - 1] == '\n')
7594 kbuf[--length] = '\0';
7595
7596 if (strcmp(kbuf, "on") == 0)
7597 tap_param = 1;
7598 else if (strcmp(kbuf, "off") == 0)
7599 tap_param = 0;
7600
7601 set_tap_fn(pbp_device_block, tap_param);
7602
7603 return count; 7329 return count;
7604} 7330}
7605 7331static int show_bypass(struct seq_file *m, void *v)
7606int
7607set_disc_pfs(struct file *file, const char *buffer,
7608 unsigned long count, void *data)
7609{ 7332{
7333 bpctl_dev_t *dev = m->private;
7334 int ret = get_bypass_fn(dev);
7335 if (ret == BP_NOT_CAP)
7336 seq_printf(m, "fail\n");
7337 else if (ret == 1)
7338 seq_printf(m, "on\n");
7339 else if (ret == 0)
7340 seq_printf(m, "off\n");
7341 return 0;
7342}
7343RW_FOPS(bypass)
7610 7344
7611 char kbuf[256]; 7345static ssize_t tap_write(struct file *file, const char __user *buffer,
7612 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7346 size_t count, loff_t *pos)
7613 7347{
7614 int tap_param = 0, length = 0; 7348 int tap_param = user_on_off(buffer, count);
7615 7349 if (tap_param < 0)
7616 if (count > (sizeof(kbuf) - 1))
7617 return -1;
7618
7619 if (copy_from_user(&kbuf, buffer, count)) {
7620 return -1; 7350 return -1;
7621 }
7622
7623 kbuf[count] = '\0';
7624 length = strlen(kbuf);
7625 if (kbuf[length - 1] == '\n')
7626 kbuf[--length] = '\0';
7627
7628 if (strcmp(kbuf, "on") == 0)
7629 tap_param = 1;
7630 else if (strcmp(kbuf, "off") == 0)
7631 tap_param = 0;
7632
7633 set_disc_fn(pbp_device_block, tap_param);
7634 7351
7352 set_tap_fn(PDE_DATA(file_inode(file)), tap_param);
7635 return count; 7353 return count;
7636} 7354}
7637 7355static int show_tap(struct seq_file *m, void *v)
7638int
7639get_bypass_pfs(char *page, char **start, off_t off, int count,
7640 int *eof, void *data)
7641{ 7356{
7642 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7357 bpctl_dev_t *dev = m->private;
7643 7358 int ret = get_tap_fn(dev);
7644 int len = 0, ret = 0;
7645
7646 ret = get_bypass_fn(pbp_device_block);
7647 if (ret == BP_NOT_CAP) 7359 if (ret == BP_NOT_CAP)
7648 len = sprintf(page, "fail\n"); 7360 seq_printf(m, "fail\n");
7649 else if (ret == 1) 7361 else if (ret == 1)
7650 len = sprintf(page, "on\n"); 7362 seq_printf(m, "on\n");
7651 else if (ret == 0) 7363 else if (ret == 0)
7652 len = sprintf(page, "off\n"); 7364 seq_printf(m, "off\n");
7653 7365 return 0;
7654 *eof = 1;
7655 return len;
7656} 7366}
7367RW_FOPS(tap)
7657 7368
7658int 7369static ssize_t disc_write(struct file *file, const char __user *buffer,
7659get_tap_pfs(char *page, char **start, off_t off, int count, 7370 size_t count, loff_t *pos)
7660 int *eof, void *data)
7661{ 7371{
7662 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7372 int tap_param = user_on_off(buffer, count);
7663 7373 if (tap_param < 0)
7664 int len = 0, ret = 0; 7374 return -1;
7665
7666 ret = get_tap_fn(pbp_device_block);
7667 if (ret == BP_NOT_CAP)
7668 len = sprintf(page, "fail\n");
7669 else if (ret == 1)
7670 len = sprintf(page, "on\n");
7671 else if (ret == 0)
7672 len = sprintf(page, "off\n");
7673 7375
7674 *eof = 1; 7376 set_disc_fn(PDE_DATA(file_inode(file)), tap_param);
7675 return len; 7377 return count;
7676} 7378}
7677 7379static int show_disc(struct seq_file *m, void *v)
7678int
7679get_disc_pfs(char *page, char **start, off_t off, int count,
7680 int *eof, void *data)
7681{ 7380{
7682 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7381 bpctl_dev_t *dev = m->private;
7683 7382 int ret = get_disc_fn(dev);
7684 int len = 0, ret = 0;
7685
7686 ret = get_disc_fn(pbp_device_block);
7687 if (ret == BP_NOT_CAP) 7383 if (ret == BP_NOT_CAP)
7688 len = sprintf(page, "fail\n"); 7384 seq_printf(m, "fail\n");
7689 else if (ret == 1) 7385 else if (ret == 1)
7690 len = sprintf(page, "on\n"); 7386 seq_printf(m, "on\n");
7691 else if (ret == 0) 7387 else if (ret == 0)
7692 len = sprintf(page, "off\n"); 7388 seq_printf(m, "off\n");
7693 7389 return 0;
7694 *eof = 1;
7695 return len;
7696} 7390}
7391RW_FOPS(disc)
7697 7392
7698int 7393static int show_bypass_change(struct seq_file *m, void *v)
7699get_bypass_change_pfs(char *page, char **start, off_t off, int count,
7700 int *eof, void *data)
7701{ 7394{
7702 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7395 bpctl_dev_t *dev = m->private;
7703 7396 int ret = get_bypass_change_fn(dev);
7704 int len = 0, ret = 0;
7705
7706 ret = get_bypass_change_fn(pbp_device_block);
7707 if (ret == 1) 7397 if (ret == 1)
7708 len = sprintf(page, "on\n"); 7398 seq_printf(m, "on\n");
7709 else if (ret == 0) 7399 else if (ret == 0)
7710 len = sprintf(page, "off\n"); 7400 seq_printf(m, "off\n");
7711 else 7401 else
7712 len = sprintf(page, "fail\n"); 7402 seq_printf(m, "fail\n");
7713 7403 return 0;
7714 *eof = 1;
7715 return len;
7716} 7404}
7405RO_FOPS(bypass_change)
7717 7406
7718int 7407static int show_tap_change(struct seq_file *m, void *v)
7719get_tap_change_pfs(char *page, char **start, off_t off, int count,
7720 int *eof, void *data)
7721{ 7408{
7722 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7409 bpctl_dev_t *dev = m->private;
7723 7410 int ret = get_tap_change_fn(dev);
7724 int len = 0, ret = 0;
7725
7726 ret = get_tap_change_fn(pbp_device_block);
7727 if (ret == 1) 7411 if (ret == 1)
7728 len = sprintf(page, "on\n"); 7412 seq_printf(m, "on\n");
7729 else if (ret == 0) 7413 else if (ret == 0)
7730 len = sprintf(page, "off\n"); 7414 seq_printf(m, "off\n");
7731 else 7415 else
7732 len = sprintf(page, "fail\n"); 7416 seq_printf(m, "fail\n");
7733 7417 return 0;
7734 *eof = 1;
7735 return len;
7736} 7418}
7419RO_FOPS(tap_change)
7737 7420
7738int 7421static int show_disc_change(struct seq_file *m, void *v)
7739get_disc_change_pfs(char *page, char **start, off_t off, int count,
7740 int *eof, void *data)
7741{ 7422{
7742 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7423 bpctl_dev_t *dev = m->private;
7743 7424 int ret = get_disc_change_fn(dev);
7744 int len = 0, ret = 0;
7745
7746 ret = get_disc_change_fn(pbp_device_block);
7747 if (ret == 1) 7425 if (ret == 1)
7748 len = sprintf(page, "on\n"); 7426 seq_printf(m, "on\n");
7749 else if (ret == 0) 7427 else if (ret == 0)
7750 len = sprintf(page, "off\n"); 7428 seq_printf(m, "off\n");
7751 else 7429 else
7752 len = sprintf(page, "fail\n"); 7430 seq_printf(m, "fail\n");
7753 7431 return 0;
7754 *eof = 1;
7755 return len;
7756}
7757
7758#define isdigit(c) (c >= '0' && c <= '9')
7759__inline static int atoi(char **s)
7760{
7761 int i = 0;
7762 while (isdigit(**s))
7763 i = i * 10 + *((*s)++) - '0';
7764 return i;
7765} 7432}
7433RO_FOPS(disc_change)
7766 7434
7767int 7435static ssize_t bypass_wd_write(struct file *file, const char __user *buffer,
7768set_bypass_wd_pfs(struct file *file, const char *buffer, 7436 size_t count, loff_t *pos)
7769 unsigned long count, void *data)
7770{ 7437{
7771 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7438 bpctl_dev_t *dev = PDE_DATA(file_inode(file));
7772 int timeout; 7439 int timeout;
7773 int ret; 7440 int ret = kstrtoint_from_user(buffer, count, 10, &timeout);
7774
7775 ret = kstrtoint_from_user(buffer, count, 10, &timeout);
7776 if (ret) 7441 if (ret)
7777 return ret; 7442 return ret;
7778 set_bypass_wd_fn(pbp_device_block, timeout); 7443 set_bypass_wd_fn(dev, timeout);
7779
7780 return count; 7444 return count;
7781} 7445}
7782 7446static int show_bypass_wd(struct seq_file *m, void *v)
7783int
7784get_bypass_wd_pfs(char *page, char **start, off_t off, int count,
7785 int *eof, void *data)
7786{ 7447{
7787 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7448 bpctl_dev_t *dev = m->private;
7449 int ret = 0, timeout = 0;
7788 7450
7789 int len = 0, ret = 0, timeout = 0; 7451 ret = get_bypass_wd_fn(dev, &timeout);
7790
7791 ret = get_bypass_wd_fn(pbp_device_block, &timeout);
7792 if (ret == BP_NOT_CAP) 7452 if (ret == BP_NOT_CAP)
7793 len = sprintf(page, "fail\n"); 7453 seq_printf(m, "fail\n");
7794 else if (timeout == -1) 7454 else if (timeout == -1)
7795 len = sprintf(page, "unknown\n"); 7455 seq_printf(m, "unknown\n");
7796 else if (timeout == 0) 7456 else if (timeout == 0)
7797 len = sprintf(page, "disable\n"); 7457 seq_printf(m, "disable\n");
7798 else 7458 else
7799 len = sprintf(page, "%d\n", timeout); 7459 seq_printf(m, "%d\n", timeout);
7800 7460 return 0;
7801 *eof = 1;
7802 return len;
7803} 7461}
7462RW_FOPS(bypass_wd)
7804 7463
7805int 7464static int show_wd_expire_time(struct seq_file *m, void *v)
7806get_wd_expire_time_pfs(char *page, char **start, off_t off, int count,
7807 int *eof, void *data)
7808{ 7465{
7809 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7466 bpctl_dev_t *dev = m->private;
7810 7467 int ret = 0, timeout = 0;
7811 int len = 0, ret = 0, timeout = 0; 7468 ret = get_wd_expire_time_fn(dev, &timeout);
7812
7813 ret = get_wd_expire_time_fn(pbp_device_block, &timeout);
7814 if (ret == BP_NOT_CAP) 7469 if (ret == BP_NOT_CAP)
7815 len = sprintf(page, "fail\n"); 7470 seq_printf(m, "fail\n");
7816 else if (timeout == -1) 7471 else if (timeout == -1)
7817 len = sprintf(page, "expire\n"); 7472 seq_printf(m, "expire\n");
7818 else if (timeout == 0) 7473 else if (timeout == 0)
7819 len = sprintf(page, "disable\n"); 7474 seq_printf(m, "disable\n");
7820
7821 else 7475 else
7822 len = sprintf(page, "%d\n", timeout); 7476 seq_printf(m, "%d\n", timeout);
7823 *eof = 1; 7477 return 0;
7824 return len;
7825} 7478}
7479RO_FOPS(wd_expire_time)
7826 7480
7827int 7481static ssize_t tpl_write(struct file *file, const char __user *buffer,
7828get_tpl_pfs(char *page, char **start, off_t off, int count, 7482 size_t count, loff_t *pos)
7829 int *eof, void *data)
7830{ 7483{
7831 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7484 bpctl_dev_t *dev = PDE_DATA(file_inode(file));
7832 7485 int tpl_param = user_on_off(buffer, count);
7833 int len = 0, ret = 0; 7486 if (tpl_param < 0)
7487 return -1;
7834 7488
7835 ret = get_tpl_fn(pbp_device_block); 7489 set_tpl_fn(dev, tpl_param);
7490 return count;
7491}
7492static int show_tpl(struct seq_file *m, void *v)
7493{
7494 bpctl_dev_t *dev = m->private;
7495 int ret = get_tpl_fn(dev);
7836 if (ret == BP_NOT_CAP) 7496 if (ret == BP_NOT_CAP)
7837 len = sprintf(page, "fail\n"); 7497 seq_printf(m, "fail\n");
7838 else if (ret == 1) 7498 else if (ret == 1)
7839 len = sprintf(page, "on\n"); 7499 seq_printf(m, "on\n");
7840 else if (ret == 0) 7500 else if (ret == 0)
7841 len = sprintf(page, "off\n"); 7501 seq_printf(m, "off\n");
7842 7502 return 0;
7843 *eof = 1;
7844 return len;
7845} 7503}
7504RW_FOPS(tpl)
7846 7505
7847#ifdef PMC_FIX_FLAG 7506#ifdef PMC_FIX_FLAG
7848int 7507static ssize_t wait_at_pwup_write(struct file *file, const char __user *buffer,
7849get_wait_at_pwup_pfs(char *page, char **start, off_t off, int count, 7508 size_t count, loff_t *pos)
7850 int *eof, void *data)
7851{ 7509{
7852 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7510 bpctl_dev_t *dev = PDE_DATA(file_inode(file));
7853 7511 int tpl_param = user_on_off(buffer, count);
7854 int len = 0, ret = 0; 7512 if (tpl_param < 0)
7513 return -1;
7855 7514
7856 ret = get_bp_wait_at_pwup_fn(pbp_device_block); 7515 set_bp_wait_at_pwup_fn(dev, tpl_param);
7516 return count;
7517}
7518static int show_wait_at_pwup(struct seq_file *m, void *v)
7519{
7520 bpctl_dev_t *dev = m->private;
7521 int ret = get_bp_wait_at_pwup_fn(dev);
7857 if (ret == BP_NOT_CAP) 7522 if (ret == BP_NOT_CAP)
7858 len = sprintf(page, "fail\n"); 7523 seq_printf(m, "fail\n");
7859 else if (ret == 1) 7524 else if (ret == 1)
7860 len = sprintf(page, "on\n"); 7525 seq_printf(m, "on\n");
7861 else if (ret == 0) 7526 else if (ret == 0)
7862 len = sprintf(page, "off\n"); 7527 seq_printf(m, "off\n");
7863 7528 return 0;
7864 *eof = 1;
7865 return len;
7866} 7529}
7530RW_FOPS(wait_at_pwup)
7867 7531
7868int 7532static ssize_t hw_reset_write(struct file *file, const char __user *buffer,
7869get_hw_reset_pfs(char *page, char **start, off_t off, int count, 7533 size_t count, loff_t *pos)
7870 int *eof, void *data)
7871{ 7534{
7872 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7535 bpctl_dev_t *dev = PDE_DATA(file_inode(file));
7873 7536 int tpl_param = user_on_off(buffer, count);
7874 int len = 0, ret = 0; 7537 if (tpl_param < 0)
7538 return -1;
7875 7539
7876 ret = get_bp_hw_reset_fn(pbp_device_block); 7540 set_bp_hw_reset_fn(dev, tpl_param);
7541 return count;
7542}
7543static int show_hw_reset(struct seq_file *m, void *v)
7544{
7545 bpctl_dev_t *dev = m->private;
7546 int ret = get_bp_hw_reset_fn(dev);
7877 if (ret == BP_NOT_CAP) 7547 if (ret == BP_NOT_CAP)
7878 len = sprintf(page, "fail\n"); 7548 seq_printf(m, "fail\n");
7879 else if (ret == 1) 7549 else if (ret == 1)
7880 len = sprintf(page, "on\n"); 7550 seq_printf(m, "on\n");
7881 else if (ret == 0) 7551 else if (ret == 0)
7882 len = sprintf(page, "off\n"); 7552 seq_printf(m, "off\n");
7883 7553 return 0;
7884 *eof = 1;
7885 return len;
7886} 7554}
7555RW_FOPS(hw_reset)
7887 7556
7888#endif /*PMC_WAIT_FLAG */ 7557#endif /*PMC_WAIT_FLAG */
7889 7558
7890int 7559static int show_reset_bypass_wd(struct seq_file *m, void *v)
7891reset_bypass_wd_pfs(char *page, char **start, off_t off, int count,
7892 int *eof, void *data)
7893{ 7560{
7894 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7561 bpctl_dev_t *dev = m->private;
7895 7562 int ret = reset_bypass_wd_timer_fn(dev);
7896 int len = 0, ret = 0;
7897
7898 ret = reset_bypass_wd_timer_fn(pbp_device_block);
7899 if (ret == BP_NOT_CAP) 7563 if (ret == BP_NOT_CAP)
7900 len = sprintf(page, "fail\n"); 7564 seq_printf(m, "fail\n");
7901 else if (ret == 0) 7565 else if (ret == 0)
7902 len = sprintf(page, "disable\n"); 7566 seq_printf(m, "disable\n");
7903 else if (ret == 1) 7567 else if (ret == 1)
7904 len = sprintf(page, "success\n"); 7568 seq_printf(m, "success\n");
7905 7569 return 0;
7906 *eof = 1;
7907 return len;
7908} 7570}
7571RO_FOPS(reset_bypass_wd)
7909 7572
7910int 7573static ssize_t dis_bypass_write(struct file *file, const char __user *buffer,
7911set_dis_bypass_pfs(struct file *file, const char *buffer, 7574 size_t count, loff_t *pos)
7912 unsigned long count, void *data)
7913{ 7575{
7914 7576 int bypass_param = user_on_off(buffer, count);
7915 char kbuf[256]; 7577 if (bypass_param < 0)
7916 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
7917
7918 int bypass_param = 0, length = 0;
7919
7920 if (count >= sizeof(kbuf))
7921 return -EINVAL; 7578 return -EINVAL;
7922 7579
7923 if (copy_from_user(&kbuf, buffer, count)) { 7580 set_dis_bypass_fn(PDE_DATA(file_inode(file)), bypass_param);
7924 return -1;
7925 }
7926
7927 kbuf[count] = '\0';
7928 length = strlen(kbuf);
7929 if (kbuf[length - 1] == '\n')
7930 kbuf[--length] = '\0';
7931
7932 if (strcmp(kbuf, "on") == 0)
7933 bypass_param = 1;
7934 else if (strcmp(kbuf, "off") == 0)
7935 bypass_param = 0;
7936
7937 set_dis_bypass_fn(pbp_device_block, bypass_param);
7938
7939 return count; 7581 return count;
7940} 7582}
7941 7583static int show_dis_bypass(struct seq_file *m, void *v)
7942int
7943set_dis_tap_pfs(struct file *file, const char *buffer,
7944 unsigned long count, void *data)
7945{ 7584{
7946 7585 bpctl_dev_t *dev = m->private;
7947 char kbuf[256]; 7586 int ret = get_dis_bypass_fn(dev);
7948 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7587 if (ret == BP_NOT_CAP)
7949 7588 seq_printf(m, "fail\n");
7950 int tap_param = 0, length = 0; 7589 else if (ret == 0)
7951 7590 seq_printf(m, "off\n");
7952 if (count >= sizeof(kbuf)) 7591 else
7953 return -EINVAL; 7592 seq_printf(m, "on\n");
7954 7593 return 0;
7955 if (copy_from_user(&kbuf, buffer, count)) {
7956 return -1;
7957 }
7958
7959 kbuf[count] = '\0';
7960 length = strlen(kbuf);
7961 if (kbuf[length - 1] == '\n')
7962 kbuf[--length] = '\0';
7963
7964 if (strcmp(kbuf, "on") == 0)
7965 tap_param = 1;
7966 else if (strcmp(kbuf, "off") == 0)
7967 tap_param = 0;
7968
7969 set_dis_tap_fn(pbp_device_block, tap_param);
7970
7971 return count;
7972} 7594}
7595RW_FOPS(dis_bypass)
7973 7596
7974int 7597static ssize_t dis_tap_write(struct file *file, const char __user *buffer,
7975set_dis_disc_pfs(struct file *file, const char *buffer, 7598 size_t count, loff_t *pos)
7976 unsigned long count, void *data)
7977{ 7599{
7978 7600 int tap_param = user_on_off(buffer, count);
7979 char kbuf[256]; 7601 if (tap_param < 0)
7980 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
7981
7982 int tap_param = 0, length = 0;
7983
7984 if (count >= sizeof(kbuf))
7985 return -EINVAL; 7602 return -EINVAL;
7986 7603
7987 if (copy_from_user(&kbuf, buffer, count)) { 7604 set_dis_tap_fn(PDE_DATA(file_inode(file)), tap_param);
7988 return -1;
7989 }
7990
7991 kbuf[count] = '\0';
7992 length = strlen(kbuf);
7993 if (kbuf[length - 1] == '\n')
7994 kbuf[--length] = '\0';
7995
7996 if (strcmp(kbuf, "on") == 0)
7997 tap_param = 1;
7998 else if (strcmp(kbuf, "off") == 0)
7999 tap_param = 0;
8000
8001 set_dis_disc_fn(pbp_device_block, tap_param);
8002
8003 return count; 7605 return count;
8004} 7606}
8005 7607static int show_dis_tap(struct seq_file *m, void *v)
8006int
8007get_dis_bypass_pfs(char *page, char **start, off_t off, int count,
8008 int *eof, void *data)
8009{ 7608{
8010 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7609 bpctl_dev_t *dev = m->private;
8011 7610 int ret = get_dis_tap_fn(dev);
8012 int len = 0, ret = 0;
8013
8014 ret = get_dis_bypass_fn(pbp_device_block);
8015 if (ret == BP_NOT_CAP) 7611 if (ret == BP_NOT_CAP)
8016 len = sprintf(page, "fail\n"); 7612 seq_printf(m, "fail\n");
8017 else if (ret == 0) 7613 else if (ret == 0)
8018 len = sprintf(page, "off\n"); 7614 seq_printf(m, "off\n");
8019 else 7615 else
8020 len = sprintf(page, "on\n"); 7616 seq_printf(m, "on\n");
8021 7617 return 0;
8022 *eof = 1;
8023 return len;
8024} 7618}
7619RW_FOPS(dis_tap)
8025 7620
8026int 7621static ssize_t dis_disc_write(struct file *file, const char __user *buffer,
8027get_dis_tap_pfs(char *page, char **start, off_t off, int count, 7622 size_t count, loff_t *pos)
8028 int *eof, void *data)
8029{ 7623{
8030 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7624 int tap_param = user_on_off(buffer, count);
8031 7625 if (tap_param < 0)
8032 int len = 0, ret = 0; 7626 return -EINVAL;
8033
8034 ret = get_dis_tap_fn(pbp_device_block);
8035 if (ret == BP_NOT_CAP)
8036 len = sprintf(page, "fail\n");
8037 else if (ret == 0)
8038 len = sprintf(page, "off\n");
8039 else
8040 len = sprintf(page, "on\n");
8041 7627
8042 *eof = 1; 7628 set_dis_disc_fn(PDE_DATA(file_inode(file)), tap_param);
8043 return len; 7629 return count;
8044} 7630}
8045 7631static int show_dis_disc(struct seq_file *m, void *v)
8046int
8047get_dis_disc_pfs(char *page, char **start, off_t off, int count,
8048 int *eof, void *data)
8049{ 7632{
8050 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7633 bpctl_dev_t *dev = m->private;
8051 7634 int ret = get_dis_disc_fn(dev);
8052 int len = 0, ret = 0;
8053
8054 ret = get_dis_disc_fn(pbp_device_block);
8055 if (ret == BP_NOT_CAP) 7635 if (ret == BP_NOT_CAP)
8056 len = sprintf(page, "fail\n"); 7636 seq_printf(m, "fail\n");
8057 else if (ret == 0) 7637 else if (ret == 0)
8058 len = sprintf(page, "off\n"); 7638 seq_printf(m, "off\n");
8059 else 7639 else
8060 len = sprintf(page, "on\n"); 7640 seq_printf(m, "on\n");
8061 7641 return 0;
8062 *eof = 1;
8063 return len;
8064}
8065
8066int
8067set_bypass_pwup_pfs(struct file *file, const char *buffer,
8068 unsigned long count, void *data)
8069{
8070
8071 char kbuf[256];
8072 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
8073
8074 int bypass_param = 0, length = 0;
8075
8076 if (count >= sizeof(kbuf))
8077 return -EINVAL;
8078
8079 if (copy_from_user(&kbuf, buffer, count)) {
8080 return -1;
8081 }
8082
8083 kbuf[count] = '\0';
8084 length = strlen(kbuf);
8085 if (kbuf[length - 1] == '\n')
8086 kbuf[--length] = '\0';
8087
8088 if (strcmp(kbuf, "on") == 0)
8089 bypass_param = 1;
8090 else if (strcmp(kbuf, "off") == 0)
8091 bypass_param = 0;
8092
8093 set_bypass_pwup_fn(pbp_device_block, bypass_param);
8094
8095 return count;
8096} 7642}
7643RW_FOPS(dis_disc)
8097 7644
8098int 7645static ssize_t bypass_pwup_write(struct file *file, const char __user *buffer,
8099set_bypass_pwoff_pfs(struct file *file, const char *buffer, 7646 size_t count, loff_t *pos)
8100 unsigned long count, void *data)
8101{ 7647{
8102 7648 int bypass_param = user_on_off(buffer, count);
8103 char kbuf[256]; 7649 if (bypass_param < 0)
8104 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
8105
8106 int bypass_param = 0, length = 0;
8107
8108 if (count >= sizeof(kbuf))
8109 return -EINVAL; 7650 return -EINVAL;
8110 7651
8111 if (copy_from_user(&kbuf, buffer, count)) { 7652 set_bypass_pwup_fn(PDE_DATA(file_inode(file)), bypass_param);
8112 return -1;
8113 }
8114
8115 kbuf[count] = '\0';
8116 length = strlen(kbuf);
8117 if (kbuf[length - 1] == '\n')
8118 kbuf[--length] = '\0';
8119
8120 if (strcmp(kbuf, "on") == 0)
8121 bypass_param = 1;
8122 else if (strcmp(kbuf, "off") == 0)
8123 bypass_param = 0;
8124
8125 set_bypass_pwoff_fn(pbp_device_block, bypass_param);
8126
8127 return count; 7653 return count;
8128} 7654}
8129 7655static int show_bypass_pwup(struct seq_file *m, void *v)
8130int
8131set_tap_pwup_pfs(struct file *file, const char *buffer,
8132 unsigned long count, void *data)
8133{ 7656{
8134 7657 bpctl_dev_t *dev = m->private;
8135 char kbuf[256]; 7658 int ret = get_bypass_pwup_fn(dev);
8136 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7659 if (ret == BP_NOT_CAP)
8137 7660 seq_printf(m, "fail\n");
8138 int tap_param = 0, length = 0; 7661 else if (ret == 0)
8139 7662 seq_printf(m, "off\n");
8140 if (count >= sizeof(kbuf)) 7663 else
8141 return -EINVAL; 7664 seq_printf(m, "on\n");
8142 7665 return 0;
8143 if (copy_from_user(&kbuf, buffer, count)) {
8144 return -1;
8145 }
8146
8147 kbuf[count] = '\0';
8148 length = strlen(kbuf);
8149 if (kbuf[length - 1] == '\n')
8150 kbuf[--length] = '\0';
8151
8152 if (strcmp(kbuf, "on") == 0)
8153 tap_param = 1;
8154 else if (strcmp(kbuf, "off") == 0)
8155 tap_param = 0;
8156
8157 set_tap_pwup_fn(pbp_device_block, tap_param);
8158
8159 return count;
8160} 7666}
7667RW_FOPS(bypass_pwup)
8161 7668
8162int 7669static ssize_t bypass_pwoff_write(struct file *file, const char __user *buffer,
8163set_disc_pwup_pfs(struct file *file, const char *buffer, 7670 size_t count, loff_t *pos)
8164 unsigned long count, void *data)
8165{ 7671{
8166 7672 int bypass_param = user_on_off(buffer, count);
8167 char kbuf[256]; 7673 if (bypass_param < 0)
8168 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
8169
8170 int tap_param = 0, length = 0;
8171
8172 if (count >= sizeof(kbuf))
8173 return -EINVAL; 7674 return -EINVAL;
8174 7675
8175 if (copy_from_user(&kbuf, buffer, count)) { 7676 set_bypass_pwoff_fn(PDE_DATA(file_inode(file)), bypass_param);
8176 return -1;
8177 }
8178
8179 kbuf[count] = '\0';
8180 length = strlen(kbuf);
8181 if (kbuf[length - 1] == '\n')
8182 kbuf[--length] = '\0';
8183
8184 if (strcmp(kbuf, "on") == 0)
8185 tap_param = 1;
8186 else if (strcmp(kbuf, "off") == 0)
8187 tap_param = 0;
8188
8189 set_disc_pwup_fn(pbp_device_block, tap_param);
8190
8191 return count; 7677 return count;
8192} 7678}
8193 7679static int show_bypass_pwoff(struct seq_file *m, void *v)
8194int
8195get_bypass_pwup_pfs(char *page, char **start, off_t off, int count,
8196 int *eof, void *data)
8197{ 7680{
8198 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7681 bpctl_dev_t *dev = m->private;
8199 7682 int ret = get_bypass_pwoff_fn(dev);
8200 int len = 0, ret = 0;
8201
8202 ret = get_bypass_pwup_fn(pbp_device_block);
8203 if (ret == BP_NOT_CAP) 7683 if (ret == BP_NOT_CAP)
8204 len = sprintf(page, "fail\n"); 7684 seq_printf(m, "fail\n");
8205 else if (ret == 0) 7685 else if (ret == 0)
8206 len = sprintf(page, "off\n"); 7686 seq_printf(m, "off\n");
8207 else 7687 else
8208 len = sprintf(page, "on\n"); 7688 seq_printf(m, "on\n");
8209 7689 return 0;
8210 *eof = 1;
8211 return len;
8212} 7690}
7691RW_FOPS(bypass_pwoff)
8213 7692
8214int 7693static ssize_t tap_pwup_write(struct file *file, const char __user *buffer,
8215get_bypass_pwoff_pfs(char *page, char **start, off_t off, int count, 7694 size_t count, loff_t *pos)
8216 int *eof, void *data)
8217{ 7695{
8218 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7696 int tap_param = user_on_off(buffer, count);
8219 7697 if (tap_param < 0)
8220 int len = 0, ret = 0; 7698 return -EINVAL;
8221
8222 ret = get_bypass_pwoff_fn(pbp_device_block);
8223 if (ret == BP_NOT_CAP)
8224 len = sprintf(page, "fail\n");
8225 else if (ret == 0)
8226 len = sprintf(page, "off\n");
8227 else
8228 len = sprintf(page, "on\n");
8229 7699
8230 *eof = 1; 7700 set_tap_pwup_fn(PDE_DATA(file_inode(file)), tap_param);
8231 return len; 7701 return count;
8232} 7702}
8233 7703static int show_tap_pwup(struct seq_file *m, void *v)
8234int
8235get_tap_pwup_pfs(char *page, char **start, off_t off, int count,
8236 int *eof, void *data)
8237{ 7704{
8238 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7705 bpctl_dev_t *dev = m->private;
8239 7706 int ret = get_tap_pwup_fn(dev);
8240 int len = 0, ret = 0;
8241
8242 ret = get_tap_pwup_fn(pbp_device_block);
8243 if (ret == BP_NOT_CAP) 7707 if (ret == BP_NOT_CAP)
8244 len = sprintf(page, "fail\n"); 7708 seq_printf(m, "fail\n");
8245 else if (ret == 0) 7709 else if (ret == 0)
8246 len = sprintf(page, "off\n"); 7710 seq_printf(m, "off\n");
8247 else 7711 else
8248 len = sprintf(page, "on\n"); 7712 seq_printf(m, "on\n");
8249 7713 return 0;
8250 *eof = 1;
8251 return len;
8252} 7714}
7715RW_FOPS(tap_pwup)
8253 7716
8254int 7717static ssize_t disc_pwup_write(struct file *file, const char __user *buffer,
8255get_disc_pwup_pfs(char *page, char **start, off_t off, int count, 7718 size_t count, loff_t *pos)
8256 int *eof, void *data)
8257{ 7719{
8258 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7720 int tap_param = user_on_off(buffer, count);
8259 7721 if (tap_param < 0)
8260 int len = 0, ret = 0; 7722 return -EINVAL;
8261 7723
8262 ret = get_disc_pwup_fn(pbp_device_block); 7724 set_disc_pwup_fn(PDE_DATA(file_inode(file)), tap_param);
7725 return count;
7726}
7727static int show_disc_pwup(struct seq_file *m, void *v)
7728{
7729 bpctl_dev_t *dev = m->private;
7730 int ret = get_disc_pwup_fn(dev);
8263 if (ret == BP_NOT_CAP) 7731 if (ret == BP_NOT_CAP)
8264 len = sprintf(page, "fail\n"); 7732 seq_printf(m, "fail\n");
8265 else if (ret == 0) 7733 else if (ret == 0)
8266 len = sprintf(page, "off\n"); 7734 seq_printf(m, "off\n");
8267 else 7735 else
8268 len = sprintf(page, "on\n"); 7736 seq_printf(m, "on\n");
8269 7737 return 0;
8270 *eof = 1;
8271 return len;
8272} 7738}
7739RW_FOPS(disc_pwup)
8273 7740
8274int 7741static ssize_t std_nic_write(struct file *file, const char __user *buffer,
8275set_std_nic_pfs(struct file *file, const char *buffer, 7742 size_t count, loff_t *pos)
8276 unsigned long count, void *data)
8277{ 7743{
8278 7744 int bypass_param = user_on_off(buffer, count);
8279 char kbuf[256]; 7745 if (bypass_param < 0)
8280 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
8281
8282 int bypass_param = 0, length = 0;
8283
8284 if (count >= sizeof(kbuf))
8285 return -EINVAL; 7746 return -EINVAL;
8286 7747
8287 if (copy_from_user(&kbuf, buffer, count)) { 7748 set_std_nic_fn(PDE_DATA(file_inode(file)), bypass_param);
8288 return -1;
8289 }
8290
8291 kbuf[count] = '\0';
8292 length = strlen(kbuf);
8293 if (kbuf[length - 1] == '\n')
8294 kbuf[--length] = '\0';
8295
8296 if (strcmp(kbuf, "on") == 0)
8297 bypass_param = 1;
8298 else if (strcmp(kbuf, "off") == 0)
8299 bypass_param = 0;
8300
8301 set_std_nic_fn(pbp_device_block, bypass_param);
8302
8303 return count; 7749 return count;
8304} 7750}
8305 7751static int show_std_nic(struct seq_file *m, void *v)
8306int
8307get_std_nic_pfs(char *page, char **start, off_t off, int count,
8308 int *eof, void *data)
8309{ 7752{
8310 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7753 bpctl_dev_t *dev = m->private;
8311 7754 int ret = get_std_nic_fn(dev);
8312 int len = 0, ret = 0;
8313
8314 ret = get_std_nic_fn(pbp_device_block);
8315 if (ret == BP_NOT_CAP) 7755 if (ret == BP_NOT_CAP)
8316 len = sprintf(page, "fail\n"); 7756 seq_printf(m, "fail\n");
8317 else if (ret == 0) 7757 else if (ret == 0)
8318 len = sprintf(page, "off\n"); 7758 seq_printf(m, "off\n");
8319 else 7759 else
8320 len = sprintf(page, "on\n"); 7760 seq_printf(m, "on\n");
8321 7761 return 0;
8322 *eof = 1;
8323 return len;
8324}
8325
8326int
8327get_wd_exp_mode_pfs(char *page, char **start, off_t off, int count,
8328 int *eof, void *data)
8329{
8330 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
8331
8332 int len = 0, ret = 0;
8333
8334 ret = get_wd_exp_mode_fn(pbp_device_block);
8335 if (ret == 1)
8336 len = sprintf(page, "tap\n");
8337 else if (ret == 0)
8338 len = sprintf(page, "bypass\n");
8339 else if (ret == 2)
8340 len = sprintf(page, "disc\n");
8341
8342 else
8343 len = sprintf(page, "fail\n");
8344
8345 *eof = 1;
8346 return len;
8347} 7762}
7763RW_FOPS(std_nic)
8348 7764
8349int 7765static ssize_t wd_exp_mode_write(struct file *file, const char __user *buffer,
8350set_wd_exp_mode_pfs(struct file *file, const char *buffer, 7766 size_t count, loff_t *pos)
8351 unsigned long count, void *data)
8352{ 7767{
8353
8354 char kbuf[256]; 7768 char kbuf[256];
8355 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
8356
8357 int bypass_param = 0, length = 0; 7769 int bypass_param = 0, length = 0;
8358 7770
8359 if (count > (sizeof(kbuf) - 1)) 7771 if (count > (sizeof(kbuf) - 1))
8360 return -1; 7772 return -1;
8361 7773
8362 if (copy_from_user(&kbuf, buffer, count)) { 7774 if (copy_from_user(&kbuf, buffer, count))
8363 return -1; 7775 return -1;
8364 }
8365 7776
8366 kbuf[count] = '\0'; 7777 kbuf[count] = '\0';
8367 length = strlen(kbuf); 7778 length = strlen(kbuf);
@@ -8375,143 +7786,47 @@ set_wd_exp_mode_pfs(struct file *file, const char *buffer,
8375 else if (strcmp(kbuf, "disc") == 0) 7786 else if (strcmp(kbuf, "disc") == 0)
8376 bypass_param = 2; 7787 bypass_param = 2;
8377 7788
8378 set_wd_exp_mode_fn(pbp_device_block, bypass_param); 7789 set_wd_exp_mode_fn(PDE_DATA(file_inode(file)), bypass_param);
8379 7790
8380 return count; 7791 return count;
8381} 7792}
8382 7793static int show_wd_exp_mode(struct seq_file *m, void *v)
8383int
8384get_wd_autoreset_pfs(char *page, char **start, off_t off, int count,
8385 int *eof, void *data)
8386{ 7794{
8387 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7795 bpctl_dev_t *dev = m->private;
8388 7796 int ret = get_wd_exp_mode_fn(dev);
8389 int len = 0, ret = 0; 7797 if (ret == 1)
8390 7798 seq_printf(m, "tap\n");
8391 ret = get_wd_autoreset_fn(pbp_device_block); 7799 else if (ret == 0)
8392 if (ret >= 0) 7800 seq_printf(m, "bypass\n");
8393 len = sprintf(page, "%d\n", ret); 7801 else if (ret == 2)
7802 seq_printf(m, "disc\n");
8394 else 7803 else
8395 len = sprintf(page, "fail\n"); 7804 seq_printf(m, "fail\n");
8396 7805 return 0;
8397 *eof = 1;
8398 return len;
8399} 7806}
7807RW_FOPS(wd_exp_mode)
8400 7808
8401int 7809static ssize_t wd_autoreset_write(struct file *file, const char __user *buffer,
8402set_wd_autoreset_pfs(struct file *file, const char *buffer, 7810 size_t count, loff_t *pos)
8403 unsigned long count, void *data)
8404{ 7811{
8405 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
8406 int timeout; 7812 int timeout;
8407 int ret; 7813 int ret = kstrtoint_from_user(buffer, count, 10, &timeout);
8408
8409 ret = kstrtoint_from_user(buffer, count, 10, &timeout);
8410 if (ret) 7814 if (ret)
8411 return ret; 7815 return ret;
8412 set_wd_autoreset_fn(pbp_device_block, timeout); 7816 set_wd_autoreset_fn(PDE_DATA(file_inode(file)), timeout);
8413
8414 return count;
8415}
8416
8417int
8418set_tpl_pfs(struct file *file, const char *buffer,
8419 unsigned long count, void *data)
8420{
8421
8422 char kbuf[256];
8423 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
8424
8425 int tpl_param = 0, length = 0;
8426
8427 if (count > (sizeof(kbuf) - 1))
8428 return -1;
8429
8430 if (copy_from_user(&kbuf, buffer, count)) {
8431 return -1;
8432 }
8433
8434 kbuf[count] = '\0';
8435 length = strlen(kbuf);
8436 if (kbuf[length - 1] == '\n')
8437 kbuf[--length] = '\0';
8438
8439 if (strcmp(kbuf, "on") == 0)
8440 tpl_param = 1;
8441 else if (strcmp(kbuf, "off") == 0)
8442 tpl_param = 0;
8443
8444 set_tpl_fn(pbp_device_block, tpl_param);
8445
8446 return count; 7817 return count;
8447} 7818}
8448 7819static int show_wd_autoreset(struct seq_file *m, void *v)
8449#ifdef PMC_FIX_FLAG
8450int
8451set_wait_at_pwup_pfs(struct file *file, const char *buffer,
8452 unsigned long count, void *data)
8453{
8454
8455 char kbuf[256];
8456 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data;
8457
8458 int tpl_param = 0, length = 0;
8459
8460 if (count > (sizeof(kbuf) - 1))
8461 return -1;
8462
8463 if (copy_from_user(&kbuf, buffer, count)) {
8464 return -1;
8465 }
8466
8467 kbuf[count] = '\0';
8468 length = strlen(kbuf);
8469 if (kbuf[length - 1] == '\n')
8470 kbuf[--length] = '\0';
8471
8472 if (strcmp(kbuf, "on") == 0)
8473 tpl_param = 1;
8474 else if (strcmp(kbuf, "off") == 0)
8475 tpl_param = 0;
8476
8477 set_bp_wait_at_pwup_fn(pbp_device_block, tpl_param);
8478
8479 return count;
8480}
8481
8482int
8483set_hw_reset_pfs(struct file *file, const char *buffer,
8484 unsigned long count, void *data)
8485{ 7820{
8486 7821 bpctl_dev_t *dev = m->private;
8487 char kbuf[256]; 7822 int ret = get_wd_autoreset_fn(dev);
8488 bpctl_dev_t *pbp_device_block = (bpctl_dev_t *) data; 7823 if (ret >= 0)
8489 7824 seq_printf(m, "%d\n", ret);
8490 int tpl_param = 0, length = 0; 7825 else
8491 7826 seq_printf(m, "fail\n");
8492 if (count > (sizeof(kbuf) - 1)) 7827 return 0;
8493 return -1;
8494
8495 if (copy_from_user(&kbuf, buffer, count)) {
8496 return -1;
8497 }
8498
8499 kbuf[count] = '\0';
8500 length = strlen(kbuf);
8501 if (kbuf[length - 1] == '\n')
8502 kbuf[--length] = '\0';
8503
8504 if (strcmp(kbuf, "on") == 0)
8505 tpl_param = 1;
8506 else if (strcmp(kbuf, "off") == 0)
8507 tpl_param = 0;
8508
8509 set_bp_hw_reset_fn(pbp_device_block, tpl_param);
8510
8511 return count;
8512} 7828}
8513 7829RW_FOPS(wd_autoreset)
8514#endif /*PMC_FIX_FLAG */
8515 7830
8516int bypass_proc_create_dev_sd(bpctl_dev_t *pbp_device_block) 7831int bypass_proc_create_dev_sd(bpctl_dev_t *pbp_device_block)
8517{ 7832{
@@ -8528,168 +7843,54 @@ int bypass_proc_create_dev_sd(bpctl_dev_t *pbp_device_block)
8528 return -1; 7843 return -1;
8529 7844
8530 /* create device proc dir */ 7845 /* create device proc dir */
8531 procfs_dir = proc_getdir(current_pfs->dir_name, bp_procfs_dir); 7846 procfs_dir = proc_mkdir(current_pfs->dir_name, bp_procfs_dir);
8532 if (procfs_dir == 0) { 7847 if (!procfs_dir) {
8533 printk(KERN_DEBUG "Could not create procfs directory %s\n", 7848 printk(KERN_DEBUG "Could not create procfs directory %s\n",
8534 current_pfs->dir_name); 7849 current_pfs->dir_name);
8535 return -1; 7850 return -1;
8536 } 7851 }
8537 current_pfs->bypass_entry = procfs_dir; 7852 current_pfs->bypass_entry = procfs_dir;
8538 7853
8539 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_info), BYPASS_INFO_ENTRY_SD, NULL, /* write */ 7854#define ENTRY(x) ret |= procfs_add(#x, &x##_ops, pbp_device_block)
8540 get_bypass_info_pfs, /* read */ 7855 ENTRY(bypass_info);
8541 procfs_dir, pbp_device_block))
8542 ret = -1;
8543
8544 if (pbp_device_block->bp_caps & SW_CTL_CAP) { 7856 if (pbp_device_block->bp_caps & SW_CTL_CAP) {
8545
8546 /* Create set param proc's */ 7857 /* Create set param proc's */
8547 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_slave), BYPASS_SLAVE_ENTRY_SD, NULL, /* write */ 7858 ENTRY(bypass_slave);
8548 get_bypass_slave_pfs, /* read */ 7859 ENTRY(bypass_caps);
8549 procfs_dir, pbp_device_block)) 7860 ENTRY(wd_set_caps);
8550 ret = -1; 7861 ENTRY(bypass_wd);
8551 7862 ENTRY(wd_expire_time);
8552 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_caps), BYPASS_CAPS_ENTRY_SD, NULL, /* write */ 7863 ENTRY(reset_bypass_wd);
8553 get_bypass_caps_pfs, /* read */ 7864 ENTRY(std_nic);
8554 procfs_dir, pbp_device_block))
8555 ret = -1;
8556
8557 if (bypass_proc_create_entry_sd(&(current_pfs->wd_set_caps), WD_SET_CAPS_ENTRY_SD, NULL, /* write */
8558 get_wd_set_caps_pfs, /* read */
8559 procfs_dir, pbp_device_block))
8560 ret = -1;
8561 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_wd), BYPASS_WD_ENTRY_SD, set_bypass_wd_pfs, /* write */
8562 get_bypass_wd_pfs, /* read */
8563 procfs_dir, pbp_device_block))
8564 ret = -1;
8565
8566 if (bypass_proc_create_entry_sd(&(current_pfs->wd_expire_time), WD_EXPIRE_TIME_ENTRY_SD, NULL, /* write */
8567 get_wd_expire_time_pfs, /* read */
8568 procfs_dir, pbp_device_block))
8569 ret = -1;
8570
8571 if (bypass_proc_create_entry_sd(&(current_pfs->reset_bypass_wd), RESET_BYPASS_WD_ENTRY_SD, NULL, /* write */
8572 reset_bypass_wd_pfs, /* read */
8573 procfs_dir, pbp_device_block))
8574 ret = -1;
8575
8576 if (bypass_proc_create_entry_sd(&(current_pfs->std_nic), STD_NIC_ENTRY_SD, set_std_nic_pfs, /* write */
8577 get_std_nic_pfs, /* read */
8578 procfs_dir, pbp_device_block))
8579 ret = -1;
8580
8581 if (pbp_device_block->bp_caps & BP_CAP) { 7865 if (pbp_device_block->bp_caps & BP_CAP) {
8582 if (bypass_proc_create_entry_sd(&(current_pfs->bypass), BYPASS_ENTRY_SD, set_bypass_pfs, /* write */ 7866 ENTRY(bypass);
8583 get_bypass_pfs, /* read */ 7867 ENTRY(dis_bypass);
8584 procfs_dir, 7868 ENTRY(bypass_pwup);
8585 pbp_device_block)) 7869 ENTRY(bypass_pwoff);
8586 ret = -1; 7870 ENTRY(bypass_change);
8587
8588 if (bypass_proc_create_entry_sd(&(current_pfs->dis_bypass), DIS_BYPASS_ENTRY_SD, set_dis_bypass_pfs, /* write */
8589 get_dis_bypass_pfs, /* read */
8590 procfs_dir,
8591 pbp_device_block))
8592 ret = -1;
8593
8594 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_pwup), BYPASS_PWUP_ENTRY_SD, set_bypass_pwup_pfs, /* write */
8595 get_bypass_pwup_pfs, /* read */
8596 procfs_dir,
8597 pbp_device_block))
8598 ret = -1;
8599 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_pwoff), BYPASS_PWOFF_ENTRY_SD, set_bypass_pwoff_pfs, /* write */
8600 get_bypass_pwoff_pfs, /* read */
8601 procfs_dir,
8602 pbp_device_block))
8603 ret = -1;
8604
8605 if (bypass_proc_create_entry_sd(&(current_pfs->bypass_change), BYPASS_CHANGE_ENTRY_SD, NULL, /* write */
8606 get_bypass_change_pfs, /* read */
8607 procfs_dir,
8608 pbp_device_block))
8609 ret = -1;
8610 } 7871 }
8611
8612 if (pbp_device_block->bp_caps & TAP_CAP) { 7872 if (pbp_device_block->bp_caps & TAP_CAP) {
8613 7873 ENTRY(tap);
8614 if (bypass_proc_create_entry_sd(&(current_pfs->tap), TAP_ENTRY_SD, set_tap_pfs, /* write */ 7874 ENTRY(dis_tap);
8615 get_tap_pfs, /* read */ 7875 ENTRY(tap_pwup);
8616 procfs_dir, 7876 ENTRY(tap_change);
8617 pbp_device_block))
8618 ret = -1;
8619
8620 if (bypass_proc_create_entry_sd(&(current_pfs->dis_tap), DIS_TAP_ENTRY_SD, set_dis_tap_pfs, /* write */
8621 get_dis_tap_pfs, /* read */
8622 procfs_dir,
8623 pbp_device_block))
8624 ret = -1;
8625
8626 if (bypass_proc_create_entry_sd(&(current_pfs->tap_pwup), TAP_PWUP_ENTRY_SD, set_tap_pwup_pfs, /* write */
8627 get_tap_pwup_pfs, /* read */
8628 procfs_dir,
8629 pbp_device_block))
8630 ret = -1;
8631
8632 if (bypass_proc_create_entry_sd(&(current_pfs->tap_change), TAP_CHANGE_ENTRY_SD, NULL, /* write */
8633 get_tap_change_pfs, /* read */
8634 procfs_dir,
8635 pbp_device_block))
8636 ret = -1;
8637 } 7877 }
8638 if (pbp_device_block->bp_caps & DISC_CAP) { 7878 if (pbp_device_block->bp_caps & DISC_CAP) {
8639 7879 ENTRY(disc);
8640 if (bypass_proc_create_entry_sd(&(current_pfs->tap), DISC_ENTRY_SD, set_disc_pfs, /* write */ 7880 ENTRY(dis_disc);
8641 get_disc_pfs, /* read */ 7881 ENTRY(disc_pwup);
8642 procfs_dir, 7882 ENTRY(disc_change);
8643 pbp_device_block))
8644 ret = -1;
8645#if 1
8646
8647 if (bypass_proc_create_entry_sd(&(current_pfs->dis_tap), DIS_DISC_ENTRY_SD, set_dis_disc_pfs, /* write */
8648 get_dis_disc_pfs, /* read */
8649 procfs_dir,
8650 pbp_device_block))
8651 ret = -1;
8652#endif
8653
8654 if (bypass_proc_create_entry_sd(&(current_pfs->tap_pwup), DISC_PWUP_ENTRY_SD, set_disc_pwup_pfs, /* write */
8655 get_disc_pwup_pfs, /* read */
8656 procfs_dir,
8657 pbp_device_block))
8658 ret = -1;
8659
8660 if (bypass_proc_create_entry_sd(&(current_pfs->tap_change), DISC_CHANGE_ENTRY_SD, NULL, /* write */
8661 get_disc_change_pfs, /* read */
8662 procfs_dir,
8663 pbp_device_block))
8664 ret = -1;
8665 } 7883 }
8666 7884
8667 if (bypass_proc_create_entry_sd(&(current_pfs->wd_exp_mode), WD_EXP_MODE_ENTRY_SD, set_wd_exp_mode_pfs, /* write */ 7885 ENTRY(wd_exp_mode);
8668 get_wd_exp_mode_pfs, /* read */ 7886 ENTRY(wd_autoreset);
8669 procfs_dir, pbp_device_block)) 7887 ENTRY(tpl);
8670 ret = -1;
8671
8672 if (bypass_proc_create_entry_sd(&(current_pfs->wd_autoreset), WD_AUTORESET_ENTRY_SD, set_wd_autoreset_pfs, /* write */
8673 get_wd_autoreset_pfs, /* read */
8674 procfs_dir, pbp_device_block))
8675 ret = -1;
8676 if (bypass_proc_create_entry_sd(&(current_pfs->tpl), TPL_ENTRY_SD, set_tpl_pfs, /* write */
8677 get_tpl_pfs, /* read */
8678 procfs_dir, pbp_device_block))
8679 ret = -1;
8680#ifdef PMC_FIX_FLAG 7888#ifdef PMC_FIX_FLAG
8681 if (bypass_proc_create_entry_sd(&(current_pfs->tpl), WAIT_AT_PWUP_ENTRY_SD, set_wait_at_pwup_pfs, /* write */ 7889 ENTRY(wait_at_pwup);
8682 get_wait_at_pwup_pfs, /* read */ 7890 ENTRY(hw_reset);
8683 procfs_dir, pbp_device_block))
8684 ret = -1;
8685 if (bypass_proc_create_entry_sd(&(current_pfs->tpl), HW_RESET_ENTRY_SD, set_hw_reset_pfs, /* write */
8686 get_hw_reset_pfs, /* read */
8687 procfs_dir, pbp_device_block))
8688 ret = -1;
8689
8690#endif 7891#endif
8691
8692 } 7892 }
7893#undef ENTRY
8693 if (ret < 0) 7894 if (ret < 0)
8694 printk(KERN_DEBUG "Create proc entry failed\n"); 7895 printk(KERN_DEBUG "Create proc entry failed\n");
8695 7896
@@ -8700,21 +7901,7 @@ int bypass_proc_remove_dev_sd(bpctl_dev_t *pbp_device_block)
8700{ 7901{
8701 7902
8702 struct bypass_pfs_sd *current_pfs = &pbp_device_block->bypass_pfs_set; 7903 struct bypass_pfs_sd *current_pfs = &pbp_device_block->bypass_pfs_set;
8703 struct proc_dir_entry *pde = current_pfs->bypass_entry, *pde_curr = 7904 remove_proc_subtree(current_pfs->dir_name, bp_procfs_dir);
8704 NULL;
8705 char name[256];
8706
8707 if (!pde)
8708 return 0;
8709 for (pde = pde->subdir; pde;) {
8710 strcpy(name, pde->name);
8711 pde_curr = pde;
8712 pde = pde->next;
8713 remove_proc_entry(name, current_pfs->bypass_entry);
8714 }
8715 if (!pde)
8716 remove_proc_entry(current_pfs->dir_name, bp_procfs_dir);
8717 current_pfs->bypass_entry = NULL; 7905 current_pfs->bypass_entry = NULL;
8718
8719 return 0; 7906 return 0;
8720} 7907}
diff --git a/drivers/staging/vt6655/device_main.c b/drivers/staging/vt6655/device_main.c
index be4f6c2ca3ff..08b250f01dae 100644
--- a/drivers/staging/vt6655/device_main.c
+++ b/drivers/staging/vt6655/device_main.c
@@ -60,6 +60,7 @@
60 */ 60 */
61#undef __NO_VERSION__ 61#undef __NO_VERSION__
62 62
63#include <linux/file.h>
63#include "device.h" 64#include "device.h"
64#include "card.h" 65#include "card.h"
65#include "channel.h" 66#include "channel.h"
@@ -2737,83 +2738,50 @@ static int Config_FileGetParameter(unsigned char *string,
2737 return true; 2738 return true;
2738} 2739}
2739 2740
2740int Config_FileOperation(PSDevice pDevice, bool fwrite, unsigned char *Parameter) { 2741int Config_FileOperation(PSDevice pDevice,bool fwrite,unsigned char *Parameter)
2741 unsigned char *config_path = CONFIG_PATH; 2742{
2742 unsigned char *buffer = NULL; 2743 unsigned char *buffer = kmalloc(1024, GFP_KERNEL);
2743 unsigned char tmpbuffer[20]; 2744 unsigned char tmpbuffer[20];
2744 struct file *filp = NULL; 2745 struct file *file;
2745 mm_segment_t old_fs = get_fs(); 2746 int result=0;
2746 //int oldfsuid=0,oldfsgid=0;
2747 int result = 0;
2748
2749 set_fs(KERNEL_DS);
2750
2751 /* Can't do this anymore, so we rely on correct filesystem permissions:
2752 //Make sure a caller can read or write power as root
2753 oldfsuid=current->cred->fsuid;
2754 oldfsgid=current->cred->fsgid;
2755 current->cred->fsuid = 0;
2756 current->cred->fsgid = 0;
2757 */
2758
2759 //open file
2760 filp = filp_open(config_path, O_RDWR, 0);
2761 if (IS_ERR(filp)) {
2762 printk("Config_FileOperation:open file fail?\n");
2763 result = -1;
2764 goto error2;
2765 }
2766 2747
2767 if (!(filp->f_op) || !(filp->f_op->read) || !(filp->f_op->write)) { 2748 if (!buffer) {
2768 printk("file %s cann't readable or writable?\n", config_path);
2769 result = -1;
2770 goto error1;
2771 }
2772
2773 buffer = kmalloc(1024, GFP_KERNEL);
2774 if (buffer == NULL) {
2775 printk("allocate mem for file fail?\n"); 2749 printk("allocate mem for file fail?\n");
2776 result = -1; 2750 return -1;
2777 goto error1; 2751 }
2752 file = filp_open(CONFIG_PATH, O_RDONLY, 0);
2753 if (IS_ERR(file)) {
2754 kfree(buffer);
2755 printk("Config_FileOperation:open file fail?\n");
2756 return -1;
2778 } 2757 }
2779 2758
2780 if (filp->f_op->read(filp, buffer, 1024, &filp->f_pos) < 0) { 2759 if (kernel_read(file, 0, buffer, 1024) < 0) {
2781 printk("read file error?\n"); 2760 printk("read file error?\n");
2782 result = -1; 2761 result = -1;
2783 goto error1; 2762 goto error1;
2784 } 2763 }
2785 2764
2786 if (Config_FileGetParameter("ZONETYPE", tmpbuffer, buffer) != true) { 2765 if (Config_FileGetParameter("ZONETYPE",tmpbuffer,buffer)!=true) {
2787 printk("get parameter error?\n"); 2766 printk("get parameter error?\n");
2788 result = -1; 2767 result = -1;
2789 goto error1; 2768 goto error1;
2790 } 2769 }
2791 2770
2792 if (memcmp(tmpbuffer, "USA", 3) == 0) { 2771 if (memcmp(tmpbuffer,"USA",3)==0) {
2793 result = ZoneType_USA; 2772 result = ZoneType_USA;
2794 } else if (memcmp(tmpbuffer, "JAPAN", 5) == 0) { 2773 } else if(memcmp(tmpbuffer,"JAPAN",5)==0) {
2795 result = ZoneType_Japan; 2774 result = ZoneType_Japan;
2796 } else if (memcmp(tmpbuffer, "EUROPE", 5) == 0) { 2775 } else if(memcmp(tmpbuffer,"EUROPE",5)==0) {
2797 result = ZoneType_Europe; 2776 result = ZoneType_Europe;
2798 } else { 2777 } else {
2799 result = -1; 2778 result = -1;
2800 printk("Unknown Zonetype[%s]?\n", tmpbuffer); 2779 printk("Unknown Zonetype[%s]?\n",tmpbuffer);
2801 } 2780 }
2802 2781
2803error1: 2782error1:
2804 kfree(buffer); 2783 kfree(buffer);
2805 2784 fput(file);
2806 if (filp_close(filp, NULL))
2807 printk("Config_FileOperation:close file fail\n");
2808
2809error2:
2810 set_fs(old_fs);
2811
2812 /*
2813 current->cred->fsuid=oldfsuid;
2814 current->cred->fsgid=oldfsgid;
2815 */
2816
2817 return result; 2785 return result;
2818} 2786}
2819 2787
diff --git a/drivers/staging/vt6656/main_usb.c b/drivers/staging/vt6656/main_usb.c
index 2161af83eaa0..3a3fdc58b6da 100644
--- a/drivers/staging/vt6656/main_usb.c
+++ b/drivers/staging/vt6656/main_usb.c
@@ -46,6 +46,7 @@
46 */ 46 */
47#undef __NO_VERSION__ 47#undef __NO_VERSION__
48 48
49#include <linux/file.h>
49#include "device.h" 50#include "device.h"
50#include "card.h" 51#include "card.h"
51#include "baseband.h" 52#include "baseband.h"
@@ -1273,53 +1274,29 @@ static int Config_FileGetParameter(unsigned char *string,
1273/* if read fails, return NULL, or return data pointer */ 1274/* if read fails, return NULL, or return data pointer */
1274static unsigned char *Config_FileOperation(struct vnt_private *pDevice) 1275static unsigned char *Config_FileOperation(struct vnt_private *pDevice)
1275{ 1276{
1276 unsigned char *config_path = CONFIG_PATH; 1277 unsigned char *buffer = kmalloc(1024, GFP_KERNEL);
1277 unsigned char *buffer = NULL; 1278 struct file *file;
1278 struct file *filp=NULL;
1279 mm_segment_t old_fs = get_fs();
1280 1279
1281 int result = 0; 1280 if (!buffer) {
1282 1281 printk("allocate mem for file fail?\n");
1283 set_fs (KERNEL_DS); 1282 return NULL;
1284 1283 }
1285 /* open file */
1286 filp = filp_open(config_path, O_RDWR, 0);
1287 if (IS_ERR(filp)) {
1288 printk("Config_FileOperation file Not exist\n");
1289 result=-1;
1290 goto error2;
1291 }
1292
1293 if(!(filp->f_op) || !(filp->f_op->read) ||!(filp->f_op->write)) {
1294 printk("file %s is not read or writeable?\n",config_path);
1295 result = -1;
1296 goto error1;
1297 }
1298
1299 buffer = kmalloc(1024, GFP_KERNEL);
1300 if(buffer==NULL) {
1301 printk("allocate mem for file fail?\n");
1302 result = -1;
1303 goto error1;
1304 }
1305
1306 if(filp->f_op->read(filp, buffer, 1024, &filp->f_pos)<0) {
1307 printk("read file error?\n");
1308 result = -1;
1309 }
1310 1284
1311error1: 1285 file = filp_open(CONFIG_PATH, O_RDONLY, 0);
1312 if(filp_close(filp,NULL)) 1286 if (IS_ERR(file)) {
1313 printk("Config_FileOperation:close file fail\n"); 1287 kfree(buffer);
1288 printk("Config_FileOperation file Not exist\n");
1289 return NULL;
1290 }
1314 1291
1315error2: 1292 if (kernel_read(file, 0, buffer, 1024) < 0) {
1316 set_fs (old_fs); 1293 printk("read file error?\n");
1294 kfree(buffer);
1295 buffer = NULL;
1296 }
1317 1297
1318if(result!=0) { 1298 fput(file);
1319 kfree(buffer); 1299 return buffer;
1320 buffer=NULL;
1321}
1322 return buffer;
1323} 1300}
1324 1301
1325/* return --->-1:fail; >=0:successful */ 1302/* return --->-1:fail; >=0:successful */
diff --git a/drivers/staging/wlags49_h2/wl_main.c b/drivers/staging/wlags49_h2/wl_main.c
index f5f120a62460..c4264e8c877d 100644
--- a/drivers/staging/wlags49_h2/wl_main.c
+++ b/drivers/staging/wlags49_h2/wl_main.c
@@ -73,6 +73,7 @@
73 73
74#include <linux/module.h> 74#include <linux/module.h>
75#include <linux/proc_fs.h> 75#include <linux/proc_fs.h>
76#include <linux/seq_file.h>
76#include <linux/types.h> 77#include <linux/types.h>
77#include <linux/kernel.h> 78#include <linux/kernel.h>
78// #include <linux/sched.h> 79// #include <linux/sched.h>
@@ -144,10 +145,23 @@
144void wl_isr_handler( unsigned long p ); 145void wl_isr_handler( unsigned long p );
145 146
146#if 0 //SCULL_USE_PROC /* don't waste space if unused */ 147#if 0 //SCULL_USE_PROC /* don't waste space if unused */
147//int scull_read_procmem(char *buf, char **start, off_t offset, int len, int unused); 148static int scull_read_procmem(struct seq_file *m, void *v);
148int scull_read_procmem(char *buf, char **start, off_t offset, int len, int *eof, void *data );
149static int write_int(struct file *file, const char *buffer, unsigned long count, void *data); 149static int write_int(struct file *file, const char *buffer, unsigned long count, void *data);
150static void proc_write(const char *name, write_proc_t *w, void *data); 150
151/*
152 * seq_file wrappers for procfile show routines.
153 */
154static int scull_read_procmem_open(struct inode *inode, struct file *file)
155{
156 return single_open(file, scull_read_procmem, PDE_DATA(inode));
157}
158
159static const struct file_operations scull_read_procmem_fops = {
160 .open = scull_read_procmem_open,
161 .read = seq_read,
162 .llseek = seq_lseek,
163 .release = seq_release,
164};
151 165
152#endif /* SCULL_USE_PROC */ 166#endif /* SCULL_USE_PROC */
153 167
@@ -908,9 +922,8 @@ int wl_insert( struct net_device *dev )
908 } 922 }
909 923
910#if 0 //SCULL_USE_PROC /* don't waste space if unused */ 924#if 0 //SCULL_USE_PROC /* don't waste space if unused */
911 create_proc_read_entry( "wlags", 0, NULL, scull_read_procmem, dev ); 925 proc_create_data( "wlags", 0, NULL, &scull_read_procmem_fops, dev );
912 proc_mkdir("driver/wlags49", 0); 926 proc_mkdir("driver/wlags49", 0);
913 proc_write("driver/wlags49/wlags49_type", write_int, &lp->wlags49_type);
914#endif /* SCULL_USE_PROC */ 927#endif /* SCULL_USE_PROC */
915 928
916 DBG_LEAVE( DbgInfo ); 929 DBG_LEAVE( DbgInfo );
@@ -2097,7 +2110,7 @@ static void __exit wl_module_exit( void )
2097 2110
2098 wl_adapter_cleanup_module( ); 2111 wl_adapter_cleanup_module( );
2099#if 0 //SCULL_USE_PROC /* don't waste space if unused */ 2112#if 0 //SCULL_USE_PROC /* don't waste space if unused */
2100 remove_proc_entry( "wlags", NULL ); //;?why so a-symmetric compared to location of create_proc_read_entry 2113 remove_proc_entry( "wlags", NULL ); //;?why so a-symmetric compared to location of proc_create_data
2101#endif 2114#endif
2102 2115
2103 DBG_LEAVE( DbgInfo ); 2116 DBG_LEAVE( DbgInfo );
@@ -3531,229 +3544,215 @@ void wl_wds_netdev_deregister( struct wl_private *lp )
3531/* 3544/*
3532 * The proc filesystem: function to read and entry 3545 * The proc filesystem: function to read and entry
3533 */ 3546 */
3534int printf_hcf_16( char *s, char *buf, hcf_16* p, int n ); 3547static void printf_hcf_16(struct seq_file *m, const char *s, hcf_16 *p, int n)
3535int printf_hcf_16( char *s, char *buf, hcf_16* p, int n ) { 3548{
3549 int i, len;
3536 3550
3537int i, len; 3551 seq_printf(m, "%-20.20s: ", s);
3552 len = 22;
3538 3553
3539 len = sprintf(buf, "%s", s ); 3554 for (i = 0; i < n; i++) {
3540 while ( len < 20 ) len += sprintf(buf+len, " " ); 3555 if (len % 80 > 75)
3541 len += sprintf(buf+len,": " ); 3556 seq_putc(m, '\n');
3542 for ( i = 0; i < n; i++ ) { 3557 seq_printf(m, "%04X ", p[i]);
3543 if ( len % 80 > 75 ) {
3544 len += sprintf(buf+len,"\n" );
3545 }
3546 len += sprintf(buf+len,"%04X ", p[i] );
3547 } 3558 }
3548 len += sprintf(buf+len,"\n" ); 3559 seq_putc(m, '\n');
3549 return len; 3560}
3550} // printf_hcf_16
3551 3561
3552int printf_hcf_8( char *s, char *buf, hcf_8* p, int n ); 3562static void printf_hcf_8(struct seq_file *m, const char *s, hcf_8 *p, int n)
3553int printf_hcf_8( char *s, char *buf, hcf_8* p, int n ) { 3563{
3564 int i, len;
3554 3565
3555int i, len; 3566 seq_printf(m, "%-20.20s: ", s);
3567 len = 22;
3556 3568
3557 len = sprintf(buf, "%s", s ); 3569 for (i = 0; i <= n; i++) {
3558 while ( len < 20 ) len += sprintf(buf+len, " " ); 3570 if (len % 80 > 77)
3559 len += sprintf(buf+len,": " ); 3571 seq_putc(m, '\n');
3560 for ( i = 0; i <= n; i++ ) { 3572 seq_printf(m, "%02X ", p[i]);
3561 if ( len % 80 > 77 ) {
3562 len += sprintf(buf+len,"\n" );
3563 }
3564 len += sprintf(buf+len,"%02X ", p[i] );
3565 } 3573 }
3566 len += sprintf(buf+len,"\n" ); 3574 seq_putc(m, '\n');
3567 return len; 3575}
3568} // printf_hcf8
3569 3576
3570int printf_strct( char *s, char *buf, hcf_16* p ); 3577static void printf_strct(struct seq_file *m, const char *s, hcf_16 *p)
3571int printf_strct( char *s, char *buf, hcf_16* p ) { 3578{
3579 int i, len;
3572 3580
3573int i, len; 3581 seq_printf(m, "%-20.20s: ", s);
3582 len = 22;
3574 3583
3575 len = sprintf(buf, "%s", s );
3576 while ( len < 20 ) len += sprintf(buf+len, " " );
3577 len += sprintf(buf+len,": " );
3578 for ( i = 0; i <= *p; i++ ) { 3584 for ( i = 0; i <= *p; i++ ) {
3579 if ( len % 80 > 75 ) { 3585 if (len % 80 > 75)
3580 len += sprintf(buf+len,"\n" ); 3586 seq_putc(m, '\n');
3581 } 3587 seq_printf(m,"%04X ", p[i]);
3582 len += sprintf(buf+len,"%04X ", p[i] );
3583 } 3588 }
3584 len += sprintf(buf+len,"\n" ); 3589 seq_putc(m, '\n');
3585 return len; 3590}
3586} // printf_strct
3587 3591
3588int scull_read_procmem(char *buf, char **start, off_t offset, int len, int *eof, void *data ) 3592int scull_read_procmem(struct seq_file *m, void *v)
3589{ 3593{
3590 struct wl_private *lp = NULL; 3594 struct wl_private *lp = m->private;
3591 IFBP ifbp; 3595 IFBP ifbp;
3592 CFG_HERMES_TALLIES_STRCT *p; 3596 CFG_HERMES_TALLIES_STRCT *p;
3593 3597
3594 #define LIMIT (PAGE_SIZE-80) /* don't print any more after this size */
3595
3596 len=0;
3597
3598 lp = ((struct net_device *)data)->priv;
3599 if (lp == NULL) { 3598 if (lp == NULL) {
3600 len += sprintf(buf+len,"No wl_private in scull_read_procmem\n" ); 3599 seq_puts(m, "No wl_private in scull_read_procmem\n" );
3601 } else if ( lp->wlags49_type == 0 ){ 3600 } else if ( lp->wlags49_type == 0 ){
3602 ifbp = &lp->hcfCtx; 3601 ifbp = &lp->hcfCtx;
3603 len += sprintf(buf+len,"Magic: 0x%04X\n", ifbp->IFB_Magic ); 3602 seq_printf(m, "Magic: 0x%04X\n", ifbp->IFB_Magic );
3604 len += sprintf(buf+len,"IOBase: 0x%04X\n", ifbp->IFB_IOBase ); 3603 seq_printf(m, "IOBase: 0x%04X\n", ifbp->IFB_IOBase );
3605 len += sprintf(buf+len,"LinkStat: 0x%04X\n", ifbp->IFB_LinkStat ); 3604 seq_printf(m, "LinkStat: 0x%04X\n", ifbp->IFB_LinkStat );
3606 len += sprintf(buf+len,"DSLinkStat: 0x%04X\n", ifbp->IFB_DSLinkStat ); 3605 seq_printf(m, "DSLinkStat: 0x%04X\n", ifbp->IFB_DSLinkStat );
3607 len += sprintf(buf+len,"TickIni: 0x%08lX\n", ifbp->IFB_TickIni ); 3606 seq_printf(m, "TickIni: 0x%08lX\n", ifbp->IFB_TickIni );
3608 len += sprintf(buf+len,"TickCnt: 0x%04X\n", ifbp->IFB_TickCnt ); 3607 seq_printf(m, "TickCnt: 0x%04X\n", ifbp->IFB_TickCnt );
3609 len += sprintf(buf+len,"IntOffCnt: 0x%04X\n", ifbp->IFB_IntOffCnt ); 3608 seq_printf(m, "IntOffCnt: 0x%04X\n", ifbp->IFB_IntOffCnt );
3610 len += printf_hcf_16( "IFB_FWIdentity", &buf[len], 3609 printf_hcf_16(m, "IFB_FWIdentity",
3611 &ifbp->IFB_FWIdentity.len, ifbp->IFB_FWIdentity.len + 1 ); 3610 &ifbp->IFB_FWIdentity.len, ifbp->IFB_FWIdentity.len + 1 );
3612 } else if ( lp->wlags49_type == 1 ) { 3611 } else if ( lp->wlags49_type == 1 ) {
3613 len += sprintf(buf+len,"Channel: 0x%04X\n", lp->Channel ); 3612 seq_printf(m, "Channel: 0x%04X\n", lp->Channel );
3614/****** len += sprintf(buf+len,"slock: %d\n", lp->slock ); */ 3613/****** seq_printf(m, "slock: %d\n", lp->slock ); */
3615//x struct tq_struct "task: 0x%04X\n", lp->task ); 3614//x struct tq_struct "task: 0x%04X\n", lp->task );
3616//x struct net_device_stats "stats: 0x%04X\n", lp->stats ); 3615//x struct net_device_stats "stats: 0x%04X\n", lp->stats );
3617#ifdef WIRELESS_EXT 3616#ifdef WIRELESS_EXT
3618//x struct iw_statistics "wstats: 0x%04X\n", lp->wstats ); 3617//x struct iw_statistics "wstats: 0x%04X\n", lp->wstats );
3619//x len += sprintf(buf+len,"spy_number: 0x%04X\n", lp->spy_number ); 3618//x seq_printf(m, "spy_number: 0x%04X\n", lp->spy_number );
3620//x u_char spy_address[IW_MAX_SPY][ETH_ALEN]; 3619//x u_char spy_address[IW_MAX_SPY][ETH_ALEN];
3621//x struct iw_quality spy_stat[IW_MAX_SPY]; 3620//x struct iw_quality spy_stat[IW_MAX_SPY];
3622#endif // WIRELESS_EXT 3621#endif // WIRELESS_EXT
3623 len += sprintf(buf+len,"IFB: 0x%p\n", &lp->hcfCtx ); 3622 seq_printf(m, "IFB: 0x%p\n", &lp->hcfCtx );
3624 len += sprintf(buf+len,"flags: %#.8lX\n", lp->flags ); //;?use this format from now on 3623 seq_printf(m, "flags: %#.8lX\n", lp->flags ); //;?use this format from now on
3625 len += sprintf(buf+len,"DebugFlag(wl_private) 0x%04X\n", lp->DebugFlag ); 3624 seq_printf(m, "DebugFlag(wl_private) 0x%04X\n", lp->DebugFlag );
3626#if DBG 3625#if DBG
3627 len += sprintf(buf+len,"DebugFlag (DbgInfo): 0x%08lX\n", DbgInfo->DebugFlag ); 3626 seq_printf(m, "DebugFlag (DbgInfo): 0x%08lX\n", DbgInfo->DebugFlag );
3628#endif // DBG 3627#endif // DBG
3629 len += sprintf(buf+len,"is_registered: 0x%04X\n", lp->is_registered ); 3628 seq_printf(m, "is_registered: 0x%04X\n", lp->is_registered );
3630//x CFG_DRV_INFO_STRCT "driverInfo: 0x%04X\n", lp->driverInfo ); 3629//x CFG_DRV_INFO_STRCT "driverInfo: 0x%04X\n", lp->driverInfo );
3631 len += printf_strct( "driverInfo", &buf[len], (hcf_16*)&lp->driverInfo ); 3630 printf_strct( m, "driverInfo", (hcf_16*)&lp->driverInfo );
3632//x CFG_IDENTITY_STRCT "driverIdentity: 0x%04X\n", lp->driverIdentity ); 3631//x CFG_IDENTITY_STRCT "driverIdentity: 0x%04X\n", lp->driverIdentity );
3633 len += printf_strct( "driverIdentity", &buf[len], (hcf_16*)&lp->driverIdentity ); 3632 printf_strct( m, "driverIdentity", (hcf_16*)&lp->driverIdentity );
3634//x CFG_FW_IDENTITY_STRCT "StationIdentity: 0x%04X\n", lp->StationIdentity ); 3633//x CFG_FW_IDENTITY_STRCT "StationIdentity: 0x%04X\n", lp->StationIdentity );
3635 len += printf_strct( "StationIdentity", &buf[len], (hcf_16*)&lp->StationIdentity ); 3634 printf_strct( m, "StationIdentity", (hcf_16*)&lp->StationIdentity );
3636//x CFG_PRI_IDENTITY_STRCT "PrimaryIdentity: 0x%04X\n", lp->PrimaryIdentity ); 3635//x CFG_PRI_IDENTITY_STRCT "PrimaryIdentity: 0x%04X\n", lp->PrimaryIdentity );
3637 len += printf_strct( "PrimaryIdentity", &buf[len], (hcf_16*)&lp->hcfCtx.IFB_PRIIdentity ); 3636 printf_strct( m, "PrimaryIdentity", (hcf_16*)&lp->hcfCtx.IFB_PRIIdentity );
3638 len += printf_strct( "PrimarySupplier", &buf[len], (hcf_16*)&lp->hcfCtx.IFB_PRISup ); 3637 printf_strct( m, "PrimarySupplier", (hcf_16*)&lp->hcfCtx.IFB_PRISup );
3639//x CFG_PRI_IDENTITY_STRCT "NICIdentity: 0x%04X\n", lp->NICIdentity ); 3638//x CFG_PRI_IDENTITY_STRCT "NICIdentity: 0x%04X\n", lp->NICIdentity );
3640 len += printf_strct( "NICIdentity", &buf[len], (hcf_16*)&lp->NICIdentity ); 3639 printf_strct( m, "NICIdentity", (hcf_16*)&lp->NICIdentity );
3641//x ltv_t "ltvRecord: 0x%04X\n", lp->ltvRecord ); 3640//x ltv_t "ltvRecord: 0x%04X\n", lp->ltvRecord );
3642 len += sprintf(buf+len,"txBytes: 0x%08lX\n", lp->txBytes ); 3641 seq_printf(m, "txBytes: 0x%08lX\n", lp->txBytes );
3643 len += sprintf(buf+len,"maxPort: 0x%04X\n", lp->maxPort ); /* 0 for STA, 6 for AP */ 3642 seq_printf(m, "maxPort: 0x%04X\n", lp->maxPort ); /* 0 for STA, 6 for AP */
3644 /* Elements used for async notification from hardware */ 3643 /* Elements used for async notification from hardware */
3645//x RID_LOG_STRCT RidList[10]; 3644//x RID_LOG_STRCT RidList[10];
3646//x ltv_t "updatedRecord: 0x%04X\n", lp->updatedRecord ); 3645//x ltv_t "updatedRecord: 0x%04X\n", lp->updatedRecord );
3647//x PROBE_RESP "ProbeResp: 0x%04X\n", lp->ProbeResp ); 3646//x PROBE_RESP "ProbeResp: 0x%04X\n", lp->ProbeResp );
3648//x ASSOC_STATUS_STRCT "assoc_stat: 0x%04X\n", lp->assoc_stat ); 3647//x ASSOC_STATUS_STRCT "assoc_stat: 0x%04X\n", lp->assoc_stat );
3649//x SECURITY_STATUS_STRCT "sec_stat: 0x%04X\n", lp->sec_stat ); 3648//x SECURITY_STATUS_STRCT "sec_stat: 0x%04X\n", lp->sec_stat );
3650//x u_char lookAheadBuf[WVLAN_MAX_LOOKAHEAD]; 3649//x u_char lookAheadBuf[WVLAN_MAX_LOOKAHEAD];
3651 len += sprintf(buf+len,"PortType: 0x%04X\n", lp->PortType ); // 1 - 3 (1 [Normal] | 3 [AdHoc]) 3650 seq_printf(m, "PortType: 0x%04X\n", lp->PortType ); // 1 - 3 (1 [Normal] | 3 [AdHoc])
3652 len += sprintf(buf+len,"Channel: 0x%04X\n", lp->Channel ); // 0 - 14 (0) 3651 seq_printf(m, "Channel: 0x%04X\n", lp->Channel ); // 0 - 14 (0)
3653//x hcf_16 TxRateControl[2]; 3652//x hcf_16 TxRateControl[2];
3654 len += sprintf(buf+len,"TxRateControl[2]: 0x%04X 0x%04X\n", 3653 seq_printf(m, "TxRateControl[2]: 0x%04X 0x%04X\n",
3655 lp->TxRateControl[0], lp->TxRateControl[1] ); 3654 lp->TxRateControl[0], lp->TxRateControl[1] );
3656 len += sprintf(buf+len,"DistanceBetweenAPs: 0x%04X\n", lp->DistanceBetweenAPs ); // 1 - 3 (1) 3655 seq_printf(m, "DistanceBetweenAPs: 0x%04X\n", lp->DistanceBetweenAPs ); // 1 - 3 (1)
3657 len += sprintf(buf+len,"RTSThreshold: 0x%04X\n", lp->RTSThreshold ); // 0 - 2347 (2347) 3656 seq_printf(m, "RTSThreshold: 0x%04X\n", lp->RTSThreshold ); // 0 - 2347 (2347)
3658 len += sprintf(buf+len,"PMEnabled: 0x%04X\n", lp->PMEnabled ); // 0 - 2, 8001 - 8002 (0) 3657 seq_printf(m, "PMEnabled: 0x%04X\n", lp->PMEnabled ); // 0 - 2, 8001 - 8002 (0)
3659 len += sprintf(buf+len,"MicrowaveRobustness: 0x%04X\n", lp->MicrowaveRobustness );// 0 - 1 (0) 3658 seq_printf(m, "MicrowaveRobustness: 0x%04X\n", lp->MicrowaveRobustness );// 0 - 1 (0)
3660 len += sprintf(buf+len,"CreateIBSS: 0x%04X\n", lp->CreateIBSS ); // 0 - 1 (0) 3659 seq_printf(m, "CreateIBSS: 0x%04X\n", lp->CreateIBSS ); // 0 - 1 (0)
3661 len += sprintf(buf+len,"MulticastReceive: 0x%04X\n", lp->MulticastReceive ); // 0 - 1 (1) 3660 seq_printf(m, "MulticastReceive: 0x%04X\n", lp->MulticastReceive ); // 0 - 1 (1)
3662 len += sprintf(buf+len,"MaxSleepDuration: 0x%04X\n", lp->MaxSleepDuration ); // 0 - 65535 (100) 3661 seq_printf(m, "MaxSleepDuration: 0x%04X\n", lp->MaxSleepDuration ); // 0 - 65535 (100)
3663//x hcf_8 MACAddress[ETH_ALEN]; 3662//x hcf_8 MACAddress[ETH_ALEN];
3664 len += printf_hcf_8( "MACAddress", &buf[len], lp->MACAddress, ETH_ALEN ); 3663 printf_hcf_8(m, "MACAddress", lp->MACAddress, ETH_ALEN );
3665//x char NetworkName[HCF_MAX_NAME_LEN+1]; 3664//x char NetworkName[HCF_MAX_NAME_LEN+1];
3666 len += sprintf(buf+len,"NetworkName: %.32s\n", lp->NetworkName ); 3665 seq_printf(m, "NetworkName: %.32s\n", lp->NetworkName );
3667//x char StationName[HCF_MAX_NAME_LEN+1]; 3666//x char StationName[HCF_MAX_NAME_LEN+1];
3668 len += sprintf(buf+len,"EnableEncryption: 0x%04X\n", lp->EnableEncryption ); // 0 - 1 (0) 3667 seq_printf(m, "EnableEncryption: 0x%04X\n", lp->EnableEncryption ); // 0 - 1 (0)
3669//x char Key1[MAX_KEY_LEN+1]; 3668//x char Key1[MAX_KEY_LEN+1];
3670 len += printf_hcf_8( "Key1", &buf[len], lp->Key1, MAX_KEY_LEN ); 3669 printf_hcf_8( m, "Key1", lp->Key1, MAX_KEY_LEN );
3671//x char Key2[MAX_KEY_LEN+1]; 3670//x char Key2[MAX_KEY_LEN+1];
3672//x char Key3[MAX_KEY_LEN+1]; 3671//x char Key3[MAX_KEY_LEN+1];
3673//x char Key4[MAX_KEY_LEN+1]; 3672//x char Key4[MAX_KEY_LEN+1];
3674 len += sprintf(buf+len,"TransmitKeyID: 0x%04X\n", lp->TransmitKeyID ); // 1 - 4 (1) 3673 seq_printf(m, "TransmitKeyID: 0x%04X\n", lp->TransmitKeyID ); // 1 - 4 (1)
3675//x CFG_DEFAULT_KEYS_STRCT "DefaultKeys: 0x%04X\n", lp->DefaultKeys ); 3674//x CFG_DEFAULT_KEYS_STRCT "DefaultKeys: 0x%04X\n", lp->DefaultKeys );
3676//x u_char mailbox[MB_SIZE]; 3675//x u_char mailbox[MB_SIZE];
3677//x char szEncryption[MAX_ENC_LEN]; 3676//x char szEncryption[MAX_ENC_LEN];
3678 len += sprintf(buf+len,"driverEnable: 0x%04X\n", lp->driverEnable ); 3677 seq_printf(m, "driverEnable: 0x%04X\n", lp->driverEnable );
3679 len += sprintf(buf+len,"wolasEnable: 0x%04X\n", lp->wolasEnable ); 3678 seq_printf(m, "wolasEnable: 0x%04X\n", lp->wolasEnable );
3680 len += sprintf(buf+len,"atimWindow: 0x%04X\n", lp->atimWindow ); 3679 seq_printf(m, "atimWindow: 0x%04X\n", lp->atimWindow );
3681 len += sprintf(buf+len,"holdoverDuration: 0x%04X\n", lp->holdoverDuration ); 3680 seq_printf(m, "holdoverDuration: 0x%04X\n", lp->holdoverDuration );
3682//x hcf_16 MulticastRate[2]; 3681//x hcf_16 MulticastRate[2];
3683 len += sprintf(buf+len,"authentication: 0x%04X\n", lp->authentication ); // is this AP specific? 3682 seq_printf(m, "authentication: 0x%04X\n", lp->authentication ); // is this AP specific?
3684 len += sprintf(buf+len,"promiscuousMode: 0x%04X\n", lp->promiscuousMode ); 3683 seq_printf(m, "promiscuousMode: 0x%04X\n", lp->promiscuousMode );
3685 len += sprintf(buf+len,"DownloadFirmware: 0x%04X\n", lp->DownloadFirmware ); // 0 - 2 (0 [None] | 1 [STA] | 2 [AP]) 3684 seq_printf(m, "DownloadFirmware: 0x%04X\n", lp->DownloadFirmware ); // 0 - 2 (0 [None] | 1 [STA] | 2 [AP])
3686 len += sprintf(buf+len,"AuthKeyMgmtSuite: 0x%04X\n", lp->AuthKeyMgmtSuite ); 3685 seq_printf(m, "AuthKeyMgmtSuite: 0x%04X\n", lp->AuthKeyMgmtSuite );
3687 len += sprintf(buf+len,"loadBalancing: 0x%04X\n", lp->loadBalancing ); 3686 seq_printf(m, "loadBalancing: 0x%04X\n", lp->loadBalancing );
3688 len += sprintf(buf+len,"mediumDistribution: 0x%04X\n", lp->mediumDistribution ); 3687 seq_printf(m, "mediumDistribution: 0x%04X\n", lp->mediumDistribution );
3689 len += sprintf(buf+len,"txPowLevel: 0x%04X\n", lp->txPowLevel ); 3688 seq_printf(m, "txPowLevel: 0x%04X\n", lp->txPowLevel );
3690// len += sprintf(buf+len,"shortRetryLimit: 0x%04X\n", lp->shortRetryLimit ); 3689// seq_printf(m, "shortRetryLimit: 0x%04X\n", lp->shortRetryLimit );
3691// len += sprintf(buf+len,"longRetryLimit: 0x%04X\n", lp->longRetryLimit ); 3690// seq_printf(m, "longRetryLimit: 0x%04X\n", lp->longRetryLimit );
3692//x hcf_16 srsc[2]; 3691//x hcf_16 srsc[2];
3693//x hcf_16 brsc[2]; 3692//x hcf_16 brsc[2];
3694 len += sprintf(buf+len,"connectionControl: 0x%04X\n", lp->connectionControl ); 3693 seq_printf(m, "connectionControl: 0x%04X\n", lp->connectionControl );
3695//x //hcf_16 probeDataRates[2]; 3694//x //hcf_16 probeDataRates[2];
3696 len += sprintf(buf+len,"ownBeaconInterval: 0x%04X\n", lp->ownBeaconInterval ); 3695 seq_printf(m, "ownBeaconInterval: 0x%04X\n", lp->ownBeaconInterval );
3697 len += sprintf(buf+len,"coexistence: 0x%04X\n", lp->coexistence ); 3696 seq_printf(m, "coexistence: 0x%04X\n", lp->coexistence );
3698//x WVLAN_FRAME "txF: 0x%04X\n", lp->txF ); 3697//x WVLAN_FRAME "txF: 0x%04X\n", lp->txF );
3699//x WVLAN_LFRAME txList[DEFAULT_NUM_TX_FRAMES]; 3698//x WVLAN_LFRAME txList[DEFAULT_NUM_TX_FRAMES];
3700//x struct list_head "txFree: 0x%04X\n", lp->txFree ); 3699//x struct list_head "txFree: 0x%04X\n", lp->txFree );
3701//x struct list_head txQ[WVLAN_MAX_TX_QUEUES]; 3700//x struct list_head txQ[WVLAN_MAX_TX_QUEUES];
3702 len += sprintf(buf+len,"netif_queue_on: 0x%04X\n", lp->netif_queue_on ); 3701 seq_printf(m, "netif_queue_on: 0x%04X\n", lp->netif_queue_on );
3703 len += sprintf(buf+len,"txQ_count: 0x%04X\n", lp->txQ_count ); 3702 seq_printf(m, "txQ_count: 0x%04X\n", lp->txQ_count );
3704//x DESC_STRCT "desc_rx: 0x%04X\n", lp->desc_rx ); 3703//x DESC_STRCT "desc_rx: 0x%04X\n", lp->desc_rx );
3705//x DESC_STRCT "desc_tx: 0x%04X\n", lp->desc_tx ); 3704//x DESC_STRCT "desc_tx: 0x%04X\n", lp->desc_tx );
3706//x WVLAN_PORT_STATE "portState: 0x%04X\n", lp->portState ); 3705//x WVLAN_PORT_STATE "portState: 0x%04X\n", lp->portState );
3707//x ScanResult "scan_results: 0x%04X\n", lp->scan_results ); 3706//x ScanResult "scan_results: 0x%04X\n", lp->scan_results );
3708//x ProbeResult "probe_results: 0x%04X\n", lp->probe_results ); 3707//x ProbeResult "probe_results: 0x%04X\n", lp->probe_results );
3709 len += sprintf(buf+len,"probe_num_aps: 0x%04X\n", lp->probe_num_aps ); 3708 seq_printf(m, "probe_num_aps: 0x%04X\n", lp->probe_num_aps );
3710 len += sprintf(buf+len,"use_dma: 0x%04X\n", lp->use_dma ); 3709 seq_printf(m, "use_dma: 0x%04X\n", lp->use_dma );
3711//x DMA_STRCT "dma: 0x%04X\n", lp->dma ); 3710//x DMA_STRCT "dma: 0x%04X\n", lp->dma );
3712#ifdef USE_RTS 3711#ifdef USE_RTS
3713 len += sprintf(buf+len,"useRTS: 0x%04X\n", lp->useRTS ); 3712 seq_printf(m, "useRTS: 0x%04X\n", lp->useRTS );
3714#endif // USE_RTS 3713#endif // USE_RTS
3715#if 1 //;? (HCF_TYPE) & HCF_TYPE_AP 3714#if 1 //;? (HCF_TYPE) & HCF_TYPE_AP
3716 //;?should we restore this to allow smaller memory footprint 3715 //;?should we restore this to allow smaller memory footprint
3717 //;?I guess not. This should be brought under Debug mode only 3716 //;?I guess not. This should be brought under Debug mode only
3718 len += sprintf(buf+len,"DTIMPeriod: 0x%04X\n", lp->DTIMPeriod ); // 1 - 255 (1) 3717 seq_printf(m, "DTIMPeriod: 0x%04X\n", lp->DTIMPeriod ); // 1 - 255 (1)
3719 len += sprintf(buf+len,"multicastPMBuffering: 0x%04X\n", lp->multicastPMBuffering ); 3718 seq_printf(m, "multicastPMBuffering: 0x%04X\n", lp->multicastPMBuffering );
3720 len += sprintf(buf+len,"RejectAny: 0x%04X\n", lp->RejectAny ); // 0 - 1 (0) 3719 seq_printf(m, "RejectAny: 0x%04X\n", lp->RejectAny ); // 0 - 1 (0)
3721 len += sprintf(buf+len,"ExcludeUnencrypted: 0x%04X\n", lp->ExcludeUnencrypted ); // 0 - 1 (1) 3720 seq_printf(m, "ExcludeUnencrypted: 0x%04X\n", lp->ExcludeUnencrypted ); // 0 - 1 (1)
3722 len += sprintf(buf+len,"intraBSSRelay: 0x%04X\n", lp->intraBSSRelay ); 3721 seq_printf(m, "intraBSSRelay: 0x%04X\n", lp->intraBSSRelay );
3723 len += sprintf(buf+len,"wlags49_type: 0x%08lX\n", lp->wlags49_type ); 3722 seq_printf(m, "wlags49_type: 0x%08lX\n", lp->wlags49_type );
3724#ifdef USE_WDS 3723#ifdef USE_WDS
3725//x WVLAN_WDS_IF wds_port[NUM_WDS_PORTS]; 3724//x WVLAN_WDS_IF wds_port[NUM_WDS_PORTS];
3726#endif // USE_WDS 3725#endif // USE_WDS
3727#endif // HCF_AP 3726#endif // HCF_AP
3728 } else if ( lp->wlags49_type == 2 ){ 3727 } else if ( lp->wlags49_type == 2 ){
3729 len += sprintf(buf+len,"tallies to be added\n" ); 3728 seq_printf(m, "tallies to be added\n" );
3730//Hermes Tallies (IFB substructure) { 3729//Hermes Tallies (IFB substructure) {
3731 p = &lp->hcfCtx.IFB_NIC_Tallies; 3730 p = &lp->hcfCtx.IFB_NIC_Tallies;
3732 len += sprintf(buf+len,"TxUnicastFrames: %08lX\n", p->TxUnicastFrames ); 3731 seq_printf(m, "TxUnicastFrames: %08lX\n", p->TxUnicastFrames );
3733 len += sprintf(buf+len,"TxMulticastFrames: %08lX\n", p->TxMulticastFrames ); 3732 seq_printf(m, "TxMulticastFrames: %08lX\n", p->TxMulticastFrames );
3734 len += sprintf(buf+len,"TxFragments: %08lX\n", p->TxFragments ); 3733 seq_printf(m, "TxFragments: %08lX\n", p->TxFragments );
3735 len += sprintf(buf+len,"TxUnicastOctets: %08lX\n", p->TxUnicastOctets ); 3734 seq_printf(m, "TxUnicastOctets: %08lX\n", p->TxUnicastOctets );
3736 len += sprintf(buf+len,"TxMulticastOctets: %08lX\n", p->TxMulticastOctets ); 3735 seq_printf(m, "TxMulticastOctets: %08lX\n", p->TxMulticastOctets );
3737 len += sprintf(buf+len,"TxDeferredTransmissions: %08lX\n", p->TxDeferredTransmissions ); 3736 seq_printf(m, "TxDeferredTransmissions: %08lX\n", p->TxDeferredTransmissions );
3738 len += sprintf(buf+len,"TxSingleRetryFrames: %08lX\n", p->TxSingleRetryFrames ); 3737 seq_printf(m, "TxSingleRetryFrames: %08lX\n", p->TxSingleRetryFrames );
3739 len += sprintf(buf+len,"TxMultipleRetryFrames: %08lX\n", p->TxMultipleRetryFrames ); 3738 seq_printf(m, "TxMultipleRetryFrames: %08lX\n", p->TxMultipleRetryFrames );
3740 len += sprintf(buf+len,"TxRetryLimitExceeded: %08lX\n", p->TxRetryLimitExceeded ); 3739 seq_printf(m, "TxRetryLimitExceeded: %08lX\n", p->TxRetryLimitExceeded );
3741 len += sprintf(buf+len,"TxDiscards: %08lX\n", p->TxDiscards ); 3740 seq_printf(m, "TxDiscards: %08lX\n", p->TxDiscards );
3742 len += sprintf(buf+len,"RxUnicastFrames: %08lX\n", p->RxUnicastFrames ); 3741 seq_printf(m, "RxUnicastFrames: %08lX\n", p->RxUnicastFrames );
3743 len += sprintf(buf+len,"RxMulticastFrames: %08lX\n", p->RxMulticastFrames ); 3742 seq_printf(m, "RxMulticastFrames: %08lX\n", p->RxMulticastFrames );
3744 len += sprintf(buf+len,"RxFragments: %08lX\n", p->RxFragments ); 3743 seq_printf(m, "RxFragments: %08lX\n", p->RxFragments );
3745 len += sprintf(buf+len,"RxUnicastOctets: %08lX\n", p->RxUnicastOctets ); 3744 seq_printf(m, "RxUnicastOctets: %08lX\n", p->RxUnicastOctets );
3746 len += sprintf(buf+len,"RxMulticastOctets: %08lX\n", p->RxMulticastOctets ); 3745 seq_printf(m, "RxMulticastOctets: %08lX\n", p->RxMulticastOctets );
3747 len += sprintf(buf+len,"RxFCSErrors: %08lX\n", p->RxFCSErrors ); 3746 seq_printf(m, "RxFCSErrors: %08lX\n", p->RxFCSErrors );
3748 len += sprintf(buf+len,"RxDiscardsNoBuffer: %08lX\n", p->RxDiscardsNoBuffer ); 3747 seq_printf(m, "RxDiscardsNoBuffer: %08lX\n", p->RxDiscardsNoBuffer );
3749 len += sprintf(buf+len,"TxDiscardsWrongSA: %08lX\n", p->TxDiscardsWrongSA ); 3748 seq_printf(m, "TxDiscardsWrongSA: %08lX\n", p->TxDiscardsWrongSA );
3750 len += sprintf(buf+len,"RxWEPUndecryptable: %08lX\n", p->RxWEPUndecryptable ); 3749 seq_printf(m, "RxWEPUndecryptable: %08lX\n", p->RxWEPUndecryptable );
3751 len += sprintf(buf+len,"RxMsgInMsgFragments: %08lX\n", p->RxMsgInMsgFragments ); 3750 seq_printf(m, "RxMsgInMsgFragments: %08lX\n", p->RxMsgInMsgFragments );
3752 len += sprintf(buf+len,"RxMsgInBadMsgFragments: %08lX\n", p->RxMsgInBadMsgFragments ); 3751 seq_printf(m, "RxMsgInBadMsgFragments: %08lX\n", p->RxMsgInBadMsgFragments );
3753 len += sprintf(buf+len,"RxDiscardsWEPICVError: %08lX\n", p->RxDiscardsWEPICVError ); 3752 seq_printf(m, "RxDiscardsWEPICVError: %08lX\n", p->RxDiscardsWEPICVError );
3754 len += sprintf(buf+len,"RxDiscardsWEPExcluded: %08lX\n", p->RxDiscardsWEPExcluded ); 3753 seq_printf(m, "RxDiscardsWEPExcluded: %08lX\n", p->RxDiscardsWEPExcluded );
3755#if (HCF_EXT) & HCF_EXT_TALLIES_FW 3754#if (HCF_EXT) & HCF_EXT_TALLIES_FW
3756 //to be added ;? 3755 //to be added ;?
3757#endif // HCF_EXT_TALLIES_FW 3756#endif // HCF_EXT_TALLIES_FW
3758 } else if ( lp->wlags49_type & 0x8000 ) { //;?kludgy but it is unclear to me were else to place this 3757 } else if ( lp->wlags49_type & 0x8000 ) { //;?kludgy but it is unclear to me were else to place this
3759#if DBG 3758#if DBG
@@ -3761,27 +3760,19 @@ int scull_read_procmem(char *buf, char **start, off_t offset, int len, int *eof,
3761#endif // DBG 3760#endif // DBG
3762 lp->wlags49_type = 0; //default to IFB again ;? 3761 lp->wlags49_type = 0; //default to IFB again ;?
3763 } else { 3762 } else {
3764 len += sprintf(buf+len,"unknown value for wlags49_type: 0x%08lX\n", lp->wlags49_type ); 3763 seq_printf(m, "unknown value for wlags49_type: 0x%08lX\n", lp->wlags49_type );
3765 len += sprintf(buf+len,"0x0000 - IFB\n" ); 3764 seq_puts(m,
3766 len += sprintf(buf+len,"0x0001 - wl_private\n" ); 3765 "0x0000 - IFB\n"
3767 len += sprintf(buf+len,"0x0002 - Tallies\n" ); 3766 "0x0001 - wl_private\n"
3768 len += sprintf(buf+len,"0x8xxx - Change debufflag\n" ); 3767 "0x0002 - Tallies\n"
3769 len += sprintf(buf+len,"ERROR 0001\nWARNING 0002\nNOTICE 0004\nTRACE 0008\n" ); 3768 "0x8xxx - Change debufflag\n"
3770 len += sprintf(buf+len,"VERBOSE 0010\nPARAM 0020\nBREAK 0040\nRX 0100\n" ); 3769 "ERROR 0001\nWARNING 0002\nNOTICE 0004\nTRACE 0008\n"
3771 len += sprintf(buf+len,"TX 0200\nDS 0400\n" ); 3770 "VERBOSE 0010\nPARAM 0020\nBREAK 0040\nRX 0100\n"
3772 } 3771 "TX 0200\nDS 0400\n");
3773 return len; 3772 }
3773 return 0;
3774} // scull_read_procmem 3774} // scull_read_procmem
3775 3775
3776static void proc_write(const char *name, write_proc_t *w, void *data)
3777{
3778 struct proc_dir_entry * entry = create_proc_entry(name, S_IFREG | S_IWUSR, NULL);
3779 if (entry) {
3780 entry->write_proc = w;
3781 entry->data = data;
3782 }
3783} // proc_write
3784
3785static int write_int(struct file *file, const char *buffer, unsigned long count, void *data) 3776static int write_int(struct file *file, const char *buffer, unsigned long count, void *data)
3786{ 3777{
3787 static char proc_number[11]; 3778 static char proc_number[11];
diff --git a/drivers/target/loopback/tcm_loop.c b/drivers/target/loopback/tcm_loop.c
index 2d444b1ccd33..7c908141cc8a 100644
--- a/drivers/target/loopback/tcm_loop.c
+++ b/drivers/target/loopback/tcm_loop.c
@@ -79,11 +79,10 @@ static void tcm_loop_release_cmd(struct se_cmd *se_cmd)
79 kmem_cache_free(tcm_loop_cmd_cache, tl_cmd); 79 kmem_cache_free(tcm_loop_cmd_cache, tl_cmd);
80} 80}
81 81
82static int tcm_loop_proc_info(struct Scsi_Host *host, char *buffer, 82static int tcm_loop_show_info(struct seq_file *m, struct Scsi_Host *host)
83 char **start, off_t offset,
84 int length, int inout)
85{ 83{
86 return sprintf(buffer, "tcm_loop_proc_info()\n"); 84 seq_printf(m, "tcm_loop_proc_info()\n");
85 return 0;
87} 86}
88 87
89static int tcm_loop_driver_probe(struct device *); 88static int tcm_loop_driver_probe(struct device *);
@@ -336,7 +335,7 @@ static int tcm_loop_slave_configure(struct scsi_device *sd)
336} 335}
337 336
338static struct scsi_host_template tcm_loop_driver_template = { 337static struct scsi_host_template tcm_loop_driver_template = {
339 .proc_info = tcm_loop_proc_info, 338 .show_info = tcm_loop_show_info,
340 .proc_name = "tcm_loopback", 339 .proc_name = "tcm_loopback",
341 .name = "TCM_Loopback", 340 .name = "TCM_Loopback",
342 .queuecommand = tcm_loop_queuecommand, 341 .queuecommand = tcm_loop_queuecommand,
diff --git a/drivers/tty/serial/serial_core.c b/drivers/tty/serial/serial_core.c
index 8fbb6d22cdc8..f87dbfd32770 100644
--- a/drivers/tty/serial/serial_core.c
+++ b/drivers/tty/serial/serial_core.c
@@ -1711,7 +1711,7 @@ static int uart_proc_show(struct seq_file *m, void *v)
1711 1711
1712static int uart_proc_open(struct inode *inode, struct file *file) 1712static int uart_proc_open(struct inode *inode, struct file *file)
1713{ 1713{
1714 return single_open(file, uart_proc_show, PDE(inode)->data); 1714 return single_open(file, uart_proc_show, PDE_DATA(inode));
1715} 1715}
1716 1716
1717static const struct file_operations uart_proc_fops = { 1717static const struct file_operations uart_proc_fops = {
diff --git a/drivers/usb/gadget/at91_udc.c b/drivers/usb/gadget/at91_udc.c
index a690d64217f4..073b938f9135 100644
--- a/drivers/usb/gadget/at91_udc.c
+++ b/drivers/usb/gadget/at91_udc.c
@@ -221,7 +221,7 @@ static int proc_udc_show(struct seq_file *s, void *unused)
221 221
222static int proc_udc_open(struct inode *inode, struct file *file) 222static int proc_udc_open(struct inode *inode, struct file *file)
223{ 223{
224 return single_open(file, proc_udc_show, PDE(inode)->data); 224 return single_open(file, proc_udc_show, PDE_DATA(inode));
225} 225}
226 226
227static const struct file_operations proc_ops = { 227static const struct file_operations proc_ops = {
diff --git a/drivers/usb/gadget/f_fs.c b/drivers/usb/gadget/f_fs.c
index c377ff84bf2c..f394f295d63d 100644
--- a/drivers/usb/gadget/f_fs.c
+++ b/drivers/usb/gadget/f_fs.c
@@ -727,7 +727,6 @@ static long ffs_ep0_ioctl(struct file *file, unsigned code, unsigned long value)
727} 727}
728 728
729static const struct file_operations ffs_ep0_operations = { 729static const struct file_operations ffs_ep0_operations = {
730 .owner = THIS_MODULE,
731 .llseek = no_llseek, 730 .llseek = no_llseek,
732 731
733 .open = ffs_ep0_open, 732 .open = ffs_ep0_open,
@@ -947,7 +946,6 @@ static long ffs_epfile_ioctl(struct file *file, unsigned code,
947} 946}
948 947
949static const struct file_operations ffs_epfile_operations = { 948static const struct file_operations ffs_epfile_operations = {
950 .owner = THIS_MODULE,
951 .llseek = no_llseek, 949 .llseek = no_llseek,
952 950
953 .open = ffs_epfile_open, 951 .open = ffs_epfile_open,
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c
index 7c2a101d19ac..2d8c1cfea699 100644
--- a/drivers/usb/gadget/fsl_udc_core.c
+++ b/drivers/usb/gadget/fsl_udc_core.c
@@ -2010,47 +2010,37 @@ static int fsl_udc_stop(struct usb_gadget *g,
2010 2010
2011static const char proc_filename[] = "driver/fsl_usb2_udc"; 2011static const char proc_filename[] = "driver/fsl_usb2_udc";
2012 2012
2013static int fsl_proc_read(char *page, char **start, off_t off, int count, 2013static int fsl_proc_read(struct seq_file *m, void *v)
2014 int *eof, void *_dev)
2015{ 2014{
2016 char *buf = page;
2017 char *next = buf;
2018 unsigned size = count;
2019 unsigned long flags; 2015 unsigned long flags;
2020 int t, i; 2016 int i;
2021 u32 tmp_reg; 2017 u32 tmp_reg;
2022 struct fsl_ep *ep = NULL; 2018 struct fsl_ep *ep = NULL;
2023 struct fsl_req *req; 2019 struct fsl_req *req;
2024 2020
2025 struct fsl_udc *udc = udc_controller; 2021 struct fsl_udc *udc = udc_controller;
2026 if (off != 0)
2027 return 0;
2028 2022
2029 spin_lock_irqsave(&udc->lock, flags); 2023 spin_lock_irqsave(&udc->lock, flags);
2030 2024
2031 /* ------basic driver information ---- */ 2025 /* ------basic driver information ---- */
2032 t = scnprintf(next, size, 2026 seq_printf(m,
2033 DRIVER_DESC "\n" 2027 DRIVER_DESC "\n"
2034 "%s version: %s\n" 2028 "%s version: %s\n"
2035 "Gadget driver: %s\n\n", 2029 "Gadget driver: %s\n\n",
2036 driver_name, DRIVER_VERSION, 2030 driver_name, DRIVER_VERSION,
2037 udc->driver ? udc->driver->driver.name : "(none)"); 2031 udc->driver ? udc->driver->driver.name : "(none)");
2038 size -= t;
2039 next += t;
2040 2032
2041 /* ------ DR Registers ----- */ 2033 /* ------ DR Registers ----- */
2042 tmp_reg = fsl_readl(&dr_regs->usbcmd); 2034 tmp_reg = fsl_readl(&dr_regs->usbcmd);
2043 t = scnprintf(next, size, 2035 seq_printf(m,
2044 "USBCMD reg:\n" 2036 "USBCMD reg:\n"
2045 "SetupTW: %d\n" 2037 "SetupTW: %d\n"
2046 "Run/Stop: %s\n\n", 2038 "Run/Stop: %s\n\n",
2047 (tmp_reg & USB_CMD_SUTW) ? 1 : 0, 2039 (tmp_reg & USB_CMD_SUTW) ? 1 : 0,
2048 (tmp_reg & USB_CMD_RUN_STOP) ? "Run" : "Stop"); 2040 (tmp_reg & USB_CMD_RUN_STOP) ? "Run" : "Stop");
2049 size -= t;
2050 next += t;
2051 2041
2052 tmp_reg = fsl_readl(&dr_regs->usbsts); 2042 tmp_reg = fsl_readl(&dr_regs->usbsts);
2053 t = scnprintf(next, size, 2043 seq_printf(m,
2054 "USB Status Reg:\n" 2044 "USB Status Reg:\n"
2055 "Dr Suspend: %d Reset Received: %d System Error: %s " 2045 "Dr Suspend: %d Reset Received: %d System Error: %s "
2056 "USB Error Interrupt: %s\n\n", 2046 "USB Error Interrupt: %s\n\n",
@@ -2058,11 +2048,9 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
2058 (tmp_reg & USB_STS_RESET) ? 1 : 0, 2048 (tmp_reg & USB_STS_RESET) ? 1 : 0,
2059 (tmp_reg & USB_STS_SYS_ERR) ? "Err" : "Normal", 2049 (tmp_reg & USB_STS_SYS_ERR) ? "Err" : "Normal",
2060 (tmp_reg & USB_STS_ERR) ? "Err detected" : "No err"); 2050 (tmp_reg & USB_STS_ERR) ? "Err detected" : "No err");
2061 size -= t;
2062 next += t;
2063 2051
2064 tmp_reg = fsl_readl(&dr_regs->usbintr); 2052 tmp_reg = fsl_readl(&dr_regs->usbintr);
2065 t = scnprintf(next, size, 2053 seq_printf(m,
2066 "USB Interrupt Enable Reg:\n" 2054 "USB Interrupt Enable Reg:\n"
2067 "Sleep Enable: %d SOF Received Enable: %d " 2055 "Sleep Enable: %d SOF Received Enable: %d "
2068 "Reset Enable: %d\n" 2056 "Reset Enable: %d\n"
@@ -2076,33 +2064,25 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
2076 (tmp_reg & USB_INTR_PTC_DETECT_EN) ? 1 : 0, 2064 (tmp_reg & USB_INTR_PTC_DETECT_EN) ? 1 : 0,
2077 (tmp_reg & USB_INTR_ERR_INT_EN) ? 1 : 0, 2065 (tmp_reg & USB_INTR_ERR_INT_EN) ? 1 : 0,
2078 (tmp_reg & USB_INTR_INT_EN) ? 1 : 0); 2066 (tmp_reg & USB_INTR_INT_EN) ? 1 : 0);
2079 size -= t;
2080 next += t;
2081 2067
2082 tmp_reg = fsl_readl(&dr_regs->frindex); 2068 tmp_reg = fsl_readl(&dr_regs->frindex);
2083 t = scnprintf(next, size, 2069 seq_printf(m,
2084 "USB Frame Index Reg: Frame Number is 0x%x\n\n", 2070 "USB Frame Index Reg: Frame Number is 0x%x\n\n",
2085 (tmp_reg & USB_FRINDEX_MASKS)); 2071 (tmp_reg & USB_FRINDEX_MASKS));
2086 size -= t;
2087 next += t;
2088 2072
2089 tmp_reg = fsl_readl(&dr_regs->deviceaddr); 2073 tmp_reg = fsl_readl(&dr_regs->deviceaddr);
2090 t = scnprintf(next, size, 2074 seq_printf(m,
2091 "USB Device Address Reg: Device Addr is 0x%x\n\n", 2075 "USB Device Address Reg: Device Addr is 0x%x\n\n",
2092 (tmp_reg & USB_DEVICE_ADDRESS_MASK)); 2076 (tmp_reg & USB_DEVICE_ADDRESS_MASK));
2093 size -= t;
2094 next += t;
2095 2077
2096 tmp_reg = fsl_readl(&dr_regs->endpointlistaddr); 2078 tmp_reg = fsl_readl(&dr_regs->endpointlistaddr);
2097 t = scnprintf(next, size, 2079 seq_printf(m,
2098 "USB Endpoint List Address Reg: " 2080 "USB Endpoint List Address Reg: "
2099 "Device Addr is 0x%x\n\n", 2081 "Device Addr is 0x%x\n\n",
2100 (tmp_reg & USB_EP_LIST_ADDRESS_MASK)); 2082 (tmp_reg & USB_EP_LIST_ADDRESS_MASK));
2101 size -= t;
2102 next += t;
2103 2083
2104 tmp_reg = fsl_readl(&dr_regs->portsc1); 2084 tmp_reg = fsl_readl(&dr_regs->portsc1);
2105 t = scnprintf(next, size, 2085 seq_printf(m,
2106 "USB Port Status&Control Reg:\n" 2086 "USB Port Status&Control Reg:\n"
2107 "Port Transceiver Type : %s Port Speed: %s\n" 2087 "Port Transceiver Type : %s Port Speed: %s\n"
2108 "PHY Low Power Suspend: %s Port Reset: %s " 2088 "PHY Low Power Suspend: %s Port Reset: %s "
@@ -2111,7 +2091,7 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
2111 "Port Enable/Disable Change: %s\n" 2091 "Port Enable/Disable Change: %s\n"
2112 "Port Enabled/Disabled: %s " 2092 "Port Enabled/Disabled: %s "
2113 "Current Connect Status: %s\n\n", ( { 2093 "Current Connect Status: %s\n\n", ( {
2114 char *s; 2094 const char *s;
2115 switch (tmp_reg & PORTSCX_PTS_FSLS) { 2095 switch (tmp_reg & PORTSCX_PTS_FSLS) {
2116 case PORTSCX_PTS_UTMI: 2096 case PORTSCX_PTS_UTMI:
2117 s = "UTMI"; break; 2097 s = "UTMI"; break;
@@ -2137,13 +2117,11 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
2137 "Not correct", 2117 "Not correct",
2138 (tmp_reg & PORTSCX_CURRENT_CONNECT_STATUS) ? 2118 (tmp_reg & PORTSCX_CURRENT_CONNECT_STATUS) ?
2139 "Attached" : "Not-Att"); 2119 "Attached" : "Not-Att");
2140 size -= t;
2141 next += t;
2142 2120
2143 tmp_reg = fsl_readl(&dr_regs->usbmode); 2121 tmp_reg = fsl_readl(&dr_regs->usbmode);
2144 t = scnprintf(next, size, 2122 seq_printf(m,
2145 "USB Mode Reg: Controller Mode is: %s\n\n", ( { 2123 "USB Mode Reg: Controller Mode is: %s\n\n", ( {
2146 char *s; 2124 const char *s;
2147 switch (tmp_reg & USB_MODE_CTRL_MODE_HOST) { 2125 switch (tmp_reg & USB_MODE_CTRL_MODE_HOST) {
2148 case USB_MODE_CTRL_MODE_IDLE: 2126 case USB_MODE_CTRL_MODE_IDLE:
2149 s = "Idle"; break; 2127 s = "Idle"; break;
@@ -2156,103 +2134,87 @@ static int fsl_proc_read(char *page, char **start, off_t off, int count,
2156 } 2134 }
2157 s; 2135 s;
2158 } )); 2136 } ));
2159 size -= t;
2160 next += t;
2161 2137
2162 tmp_reg = fsl_readl(&dr_regs->endptsetupstat); 2138 tmp_reg = fsl_readl(&dr_regs->endptsetupstat);
2163 t = scnprintf(next, size, 2139 seq_printf(m,
2164 "Endpoint Setup Status Reg: SETUP on ep 0x%x\n\n", 2140 "Endpoint Setup Status Reg: SETUP on ep 0x%x\n\n",
2165 (tmp_reg & EP_SETUP_STATUS_MASK)); 2141 (tmp_reg & EP_SETUP_STATUS_MASK));
2166 size -= t;
2167 next += t;
2168 2142
2169 for (i = 0; i < udc->max_ep / 2; i++) { 2143 for (i = 0; i < udc->max_ep / 2; i++) {
2170 tmp_reg = fsl_readl(&dr_regs->endptctrl[i]); 2144 tmp_reg = fsl_readl(&dr_regs->endptctrl[i]);
2171 t = scnprintf(next, size, "EP Ctrl Reg [0x%x]: = [0x%x]\n", 2145 seq_printf(m, "EP Ctrl Reg [0x%x]: = [0x%x]\n", i, tmp_reg);
2172 i, tmp_reg);
2173 size -= t;
2174 next += t;
2175 } 2146 }
2176 tmp_reg = fsl_readl(&dr_regs->endpointprime); 2147 tmp_reg = fsl_readl(&dr_regs->endpointprime);
2177 t = scnprintf(next, size, "EP Prime Reg = [0x%x]\n\n", tmp_reg); 2148 seq_printf(m, "EP Prime Reg = [0x%x]\n\n", tmp_reg);
2178 size -= t;
2179 next += t;
2180 2149
2181#ifndef CONFIG_ARCH_MXC 2150#ifndef CONFIG_ARCH_MXC
2182 if (udc->pdata->have_sysif_regs) { 2151 if (udc->pdata->have_sysif_regs) {
2183 tmp_reg = usb_sys_regs->snoop1; 2152 tmp_reg = usb_sys_regs->snoop1;
2184 t = scnprintf(next, size, "Snoop1 Reg : = [0x%x]\n\n", tmp_reg); 2153 seq_printf(m, "Snoop1 Reg : = [0x%x]\n\n", tmp_reg);
2185 size -= t;
2186 next += t;
2187 2154
2188 tmp_reg = usb_sys_regs->control; 2155 tmp_reg = usb_sys_regs->control;
2189 t = scnprintf(next, size, "General Control Reg : = [0x%x]\n\n", 2156 seq_printf(m, "General Control Reg : = [0x%x]\n\n", tmp_reg);
2190 tmp_reg);
2191 size -= t;
2192 next += t;
2193 } 2157 }
2194#endif 2158#endif
2195 2159
2196 /* ------fsl_udc, fsl_ep, fsl_request structure information ----- */ 2160 /* ------fsl_udc, fsl_ep, fsl_request structure information ----- */
2197 ep = &udc->eps[0]; 2161 ep = &udc->eps[0];
2198 t = scnprintf(next, size, "For %s Maxpkt is 0x%x index is 0x%x\n", 2162 seq_printf(m, "For %s Maxpkt is 0x%x index is 0x%x\n",
2199 ep->ep.name, ep_maxpacket(ep), ep_index(ep)); 2163 ep->ep.name, ep_maxpacket(ep), ep_index(ep));
2200 size -= t;
2201 next += t;
2202 2164
2203 if (list_empty(&ep->queue)) { 2165 if (list_empty(&ep->queue)) {
2204 t = scnprintf(next, size, "its req queue is empty\n\n"); 2166 seq_puts(m, "its req queue is empty\n\n");
2205 size -= t;
2206 next += t;
2207 } else { 2167 } else {
2208 list_for_each_entry(req, &ep->queue, queue) { 2168 list_for_each_entry(req, &ep->queue, queue) {
2209 t = scnprintf(next, size, 2169 seq_printf(m,
2210 "req %p actual 0x%x length 0x%x buf %p\n", 2170 "req %p actual 0x%x length 0x%x buf %p\n",
2211 &req->req, req->req.actual, 2171 &req->req, req->req.actual,
2212 req->req.length, req->req.buf); 2172 req->req.length, req->req.buf);
2213 size -= t;
2214 next += t;
2215 } 2173 }
2216 } 2174 }
2217 /* other gadget->eplist ep */ 2175 /* other gadget->eplist ep */
2218 list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) { 2176 list_for_each_entry(ep, &udc->gadget.ep_list, ep.ep_list) {
2219 if (ep->ep.desc) { 2177 if (ep->ep.desc) {
2220 t = scnprintf(next, size, 2178 seq_printf(m,
2221 "\nFor %s Maxpkt is 0x%x " 2179 "\nFor %s Maxpkt is 0x%x "
2222 "index is 0x%x\n", 2180 "index is 0x%x\n",
2223 ep->ep.name, ep_maxpacket(ep), 2181 ep->ep.name, ep_maxpacket(ep),
2224 ep_index(ep)); 2182 ep_index(ep));
2225 size -= t;
2226 next += t;
2227 2183
2228 if (list_empty(&ep->queue)) { 2184 if (list_empty(&ep->queue)) {
2229 t = scnprintf(next, size, 2185 seq_puts(m, "its req queue is empty\n\n");
2230 "its req queue is empty\n\n");
2231 size -= t;
2232 next += t;
2233 } else { 2186 } else {
2234 list_for_each_entry(req, &ep->queue, queue) { 2187 list_for_each_entry(req, &ep->queue, queue) {
2235 t = scnprintf(next, size, 2188 seq_printf(m,
2236 "req %p actual 0x%x length " 2189 "req %p actual 0x%x length "
2237 "0x%x buf %p\n", 2190 "0x%x buf %p\n",
2238 &req->req, req->req.actual, 2191 &req->req, req->req.actual,
2239 req->req.length, req->req.buf); 2192 req->req.length, req->req.buf);
2240 size -= t; 2193 } /* end for each_entry of ep req */
2241 next += t; 2194 } /* end for else */
2242 } /* end for each_entry of ep req */ 2195 } /* end for if(ep->queue) */
2243 } /* end for else */ 2196 } /* end (ep->desc) */
2244 } /* end for if(ep->queue) */
2245 } /* end (ep->desc) */
2246 2197
2247 spin_unlock_irqrestore(&udc->lock, flags); 2198 spin_unlock_irqrestore(&udc->lock, flags);
2199 return 0;
2200}
2248 2201
2249 *eof = 1; 2202/*
2250 return count - size; 2203 * seq_file wrappers for procfile show routines.
2204 */
2205static int fsl_proc_open(struct inode *inode, struct file *file)
2206{
2207 return single_open(file, fsl_proc_read, NULL);
2251} 2208}
2252 2209
2253#define create_proc_file() create_proc_read_entry(proc_filename, \ 2210static const struct file_operations fsl_proc_fops = {
2254 0, NULL, fsl_proc_read, NULL) 2211 .open = fsl_proc_open,
2212 .read = seq_read,
2213 .llseek = seq_lseek,
2214 .release = seq_release,
2215};
2255 2216
2217#define create_proc_file() proc_create(proc_filename, 0, NULL, &fsl_proc_fops)
2256#define remove_proc_file() remove_proc_entry(proc_filename, NULL) 2218#define remove_proc_file() remove_proc_entry(proc_filename, NULL)
2257 2219
2258#else /* !CONFIG_USB_GADGET_DEBUG_FILES */ 2220#else /* !CONFIG_USB_GADGET_DEBUG_FILES */
diff --git a/drivers/usb/gadget/goku_udc.c b/drivers/usb/gadget/goku_udc.c
index 991aba390d9d..480eeb7cfd92 100644
--- a/drivers/usb/gadget/goku_udc.c
+++ b/drivers/usb/gadget/goku_udc.c
@@ -35,6 +35,7 @@
35#include <linux/list.h> 35#include <linux/list.h>
36#include <linux/interrupt.h> 36#include <linux/interrupt.h>
37#include <linux/proc_fs.h> 37#include <linux/proc_fs.h>
38#include <linux/seq_file.h>
38#include <linux/device.h> 39#include <linux/device.h>
39#include <linux/usb/ch9.h> 40#include <linux/usb/ch9.h>
40#include <linux/usb/gadget.h> 41#include <linux/usb/gadget.h>
@@ -1005,7 +1006,7 @@ static const struct usb_gadget_ops goku_ops = {
1005 1006
1006/*-------------------------------------------------------------------------*/ 1007/*-------------------------------------------------------------------------*/
1007 1008
1008static inline char *dmastr(void) 1009static inline const char *dmastr(void)
1009{ 1010{
1010 if (use_dma == 0) 1011 if (use_dma == 0)
1011 return "(dma disabled)"; 1012 return "(dma disabled)";
@@ -1022,13 +1023,10 @@ static const char proc_node_name [] = "driver/udc";
1022#define FOURBITS "%s%s%s%s" 1023#define FOURBITS "%s%s%s%s"
1023#define EIGHTBITS FOURBITS FOURBITS 1024#define EIGHTBITS FOURBITS FOURBITS
1024 1025
1025static void 1026static void dump_intmask(struct seq_file *m, const char *label, u32 mask)
1026dump_intmask(const char *label, u32 mask, char **next, unsigned *size)
1027{ 1027{
1028 int t;
1029
1030 /* int_status is the same format ... */ 1028 /* int_status is the same format ... */
1031 t = scnprintf(*next, *size, 1029 seq_printf(m,
1032 "%s %05X =" FOURBITS EIGHTBITS EIGHTBITS "\n", 1030 "%s %05X =" FOURBITS EIGHTBITS EIGHTBITS "\n",
1033 label, mask, 1031 label, mask,
1034 (mask & INT_PWRDETECT) ? " power" : "", 1032 (mask & INT_PWRDETECT) ? " power" : "",
@@ -1055,33 +1053,23 @@ dump_intmask(const char *label, u32 mask, char **next, unsigned *size)
1055 (mask & INT_ENDPOINT0) ? " ep0" : "", 1053 (mask & INT_ENDPOINT0) ? " ep0" : "",
1056 (mask & INT_USBRESET) ? " reset" : "", 1054 (mask & INT_USBRESET) ? " reset" : "",
1057 (mask & INT_SUSPEND) ? " suspend" : ""); 1055 (mask & INT_SUSPEND) ? " suspend" : "");
1058 *size -= t;
1059 *next += t;
1060} 1056}
1061 1057
1062 1058
1063static int 1059static int udc_proc_read(struct seq_file *m, void *v)
1064udc_proc_read(char *buffer, char **start, off_t off, int count,
1065 int *eof, void *_dev)
1066{ 1060{
1067 char *buf = buffer; 1061 struct goku_udc *dev = m->private;
1068 struct goku_udc *dev = _dev;
1069 struct goku_udc_regs __iomem *regs = dev->regs; 1062 struct goku_udc_regs __iomem *regs = dev->regs;
1070 char *next = buf;
1071 unsigned size = count;
1072 unsigned long flags; 1063 unsigned long flags;
1073 int i, t, is_usb_connected; 1064 int i, is_usb_connected;
1074 u32 tmp; 1065 u32 tmp;
1075 1066
1076 if (off != 0)
1077 return 0;
1078
1079 local_irq_save(flags); 1067 local_irq_save(flags);
1080 1068
1081 /* basic device status */ 1069 /* basic device status */
1082 tmp = readl(&regs->power_detect); 1070 tmp = readl(&regs->power_detect);
1083 is_usb_connected = tmp & PW_DETECT; 1071 is_usb_connected = tmp & PW_DETECT;
1084 t = scnprintf(next, size, 1072 seq_printf(m,
1085 "%s - %s\n" 1073 "%s - %s\n"
1086 "%s version: %s %s\n" 1074 "%s version: %s %s\n"
1087 "Gadget driver: %s\n" 1075 "Gadget driver: %s\n"
@@ -1093,7 +1081,7 @@ udc_proc_read(char *buffer, char **start, off_t off, int count,
1093 is_usb_connected 1081 is_usb_connected
1094 ? ((tmp & PW_PULLUP) ? "full speed" : "powered") 1082 ? ((tmp & PW_PULLUP) ? "full speed" : "powered")
1095 : "disconnected", 1083 : "disconnected",
1096 ({char *state; 1084 ({const char *state;
1097 switch(dev->ep0state){ 1085 switch(dev->ep0state){
1098 case EP0_DISCONNECT: state = "ep0_disconnect"; break; 1086 case EP0_DISCONNECT: state = "ep0_disconnect"; break;
1099 case EP0_IDLE: state = "ep0_idle"; break; 1087 case EP0_IDLE: state = "ep0_idle"; break;
@@ -1105,27 +1093,24 @@ udc_proc_read(char *buffer, char **start, off_t off, int count,
1105 default: state = "ep0_?"; break; 1093 default: state = "ep0_?"; break;
1106 } state; }) 1094 } state; })
1107 ); 1095 );
1108 size -= t;
1109 next += t;
1110 1096
1111 dump_intmask("int_status", readl(&regs->int_status), &next, &size); 1097 dump_intmask(m, "int_status", readl(&regs->int_status));
1112 dump_intmask("int_enable", readl(&regs->int_enable), &next, &size); 1098 dump_intmask(m, "int_enable", readl(&regs->int_enable));
1113 1099
1114 if (!is_usb_connected || !dev->driver || (tmp & PW_PULLUP) == 0) 1100 if (!is_usb_connected || !dev->driver || (tmp & PW_PULLUP) == 0)
1115 goto done; 1101 goto done;
1116 1102
1117 /* registers for (active) device and ep0 */ 1103 /* registers for (active) device and ep0 */
1118 t = scnprintf(next, size, "\nirqs %lu\ndataset %02x " 1104 if (seq_printf(m, "\nirqs %lu\ndataset %02x "
1119 "single.bcs %02x.%02x state %x addr %u\n", 1105 "single.bcs %02x.%02x state %x addr %u\n",
1120 dev->irqs, readl(&regs->DataSet), 1106 dev->irqs, readl(&regs->DataSet),
1121 readl(&regs->EPxSingle), readl(&regs->EPxBCS), 1107 readl(&regs->EPxSingle), readl(&regs->EPxBCS),
1122 readl(&regs->UsbState), 1108 readl(&regs->UsbState),
1123 readl(&regs->address)); 1109 readl(&regs->address)) < 0)
1124 size -= t; 1110 goto done;
1125 next += t;
1126 1111
1127 tmp = readl(&regs->dma_master); 1112 tmp = readl(&regs->dma_master);
1128 t = scnprintf(next, size, 1113 if (seq_printf(m,
1129 "dma %03X =" EIGHTBITS "%s %s\n", tmp, 1114 "dma %03X =" EIGHTBITS "%s %s\n", tmp,
1130 (tmp & MST_EOPB_DIS) ? " eopb-" : "", 1115 (tmp & MST_EOPB_DIS) ? " eopb-" : "",
1131 (tmp & MST_EOPB_ENA) ? " eopb+" : "", 1116 (tmp & MST_EOPB_ENA) ? " eopb+" : "",
@@ -1140,9 +1125,8 @@ udc_proc_read(char *buffer, char **start, off_t off, int count,
1140 (tmp & MST_WR_ENA) ? " OUT" : "", 1125 (tmp & MST_WR_ENA) ? " OUT" : "",
1141 (tmp & MST_CONNECTION) 1126 (tmp & MST_CONNECTION)
1142 ? "ep1in/ep2out" 1127 ? "ep1in/ep2out"
1143 : "ep1out/ep2in"); 1128 : "ep1out/ep2in") < 0)
1144 size -= t; 1129 goto done;
1145 next += t;
1146 1130
1147 /* dump endpoint queues */ 1131 /* dump endpoint queues */
1148 for (i = 0; i < 4; i++) { 1132 for (i = 0; i < 4; i++) {
@@ -1153,7 +1137,7 @@ udc_proc_read(char *buffer, char **start, off_t off, int count,
1153 continue; 1137 continue;
1154 1138
1155 tmp = readl(ep->reg_status); 1139 tmp = readl(ep->reg_status);
1156 t = scnprintf(next, size, 1140 if (seq_printf(m,
1157 "%s %s max %u %s, irqs %lu, " 1141 "%s %s max %u %s, irqs %lu, "
1158 "status %02x (%s) " FOURBITS "\n", 1142 "status %02x (%s) " FOURBITS "\n",
1159 ep->ep.name, 1143 ep->ep.name,
@@ -1186,18 +1170,12 @@ udc_proc_read(char *buffer, char **start, off_t off, int count,
1186 (tmp & EPxSTATUS_SUSPEND) ? " suspend" : "", 1170 (tmp & EPxSTATUS_SUSPEND) ? " suspend" : "",
1187 (tmp & EPxSTATUS_FIFO_DISABLE) ? " disable" : "", 1171 (tmp & EPxSTATUS_FIFO_DISABLE) ? " disable" : "",
1188 (tmp & EPxSTATUS_STAGE_ERROR) ? " ep0stat" : "" 1172 (tmp & EPxSTATUS_STAGE_ERROR) ? " ep0stat" : ""
1189 ); 1173 ) < 0)
1190 if (t <= 0 || t > size)
1191 goto done; 1174 goto done;
1192 size -= t;
1193 next += t;
1194 1175
1195 if (list_empty(&ep->queue)) { 1176 if (list_empty(&ep->queue)) {
1196 t = scnprintf(next, size, "\t(nothing queued)\n"); 1177 if (seq_puts(m, "\t(nothing queued)\n") < 0)
1197 if (t <= 0 || t > size)
1198 goto done; 1178 goto done;
1199 size -= t;
1200 next += t;
1201 continue; 1179 continue;
1202 } 1180 }
1203 list_for_each_entry(req, &ep->queue, queue) { 1181 list_for_each_entry(req, &ep->queue, queue) {
@@ -1211,23 +1189,34 @@ udc_proc_read(char *buffer, char **start, off_t off, int count,
1211 } else 1189 } else
1212 tmp = req->req.actual; 1190 tmp = req->req.actual;
1213 1191
1214 t = scnprintf(next, size, 1192 if (seq_printf(m,
1215 "\treq %p len %u/%u buf %p\n", 1193 "\treq %p len %u/%u buf %p\n",
1216 &req->req, tmp, req->req.length, 1194 &req->req, tmp, req->req.length,
1217 req->req.buf); 1195 req->req.buf) < 0)
1218 if (t <= 0 || t > size)
1219 goto done; 1196 goto done;
1220 size -= t;
1221 next += t;
1222 } 1197 }
1223 } 1198 }
1224 1199
1225done: 1200done:
1226 local_irq_restore(flags); 1201 local_irq_restore(flags);
1227 *eof = 1; 1202 return 0;
1228 return count - size; 1203}
1204
1205/*
1206 * seq_file wrappers for procfile show routines.
1207 */
1208static int udc_proc_open(struct inode *inode, struct file *file)
1209{
1210 return single_open(file, udc_proc_read, PDE_DATA(file_inode(file)));
1229} 1211}
1230 1212
1213static const struct file_operations udc_proc_fops = {
1214 .open = udc_proc_open,
1215 .read = seq_read,
1216 .llseek = seq_lseek,
1217 .release = seq_release,
1218};
1219
1231#endif /* CONFIG_USB_GADGET_DEBUG_FILES */ 1220#endif /* CONFIG_USB_GADGET_DEBUG_FILES */
1232 1221
1233/*-------------------------------------------------------------------------*/ 1222/*-------------------------------------------------------------------------*/
@@ -1796,7 +1785,7 @@ static int goku_probe(struct pci_dev *pdev, const struct pci_device_id *id)
1796 1785
1797 1786
1798#ifdef CONFIG_USB_GADGET_DEBUG_FILES 1787#ifdef CONFIG_USB_GADGET_DEBUG_FILES
1799 create_proc_read_entry(proc_node_name, 0, NULL, udc_proc_read, dev); 1788 proc_create_data(proc_node_name, 0, NULL, &udc_proc_fops, dev);
1800#endif 1789#endif
1801 1790
1802 retval = usb_add_gadget_udc_release(&pdev->dev, &dev->gadget, 1791 retval = usb_add_gadget_udc_release(&pdev->dev, &dev->gadget,
diff --git a/drivers/usb/gadget/inode.c b/drivers/usb/gadget/inode.c
index e2b2e9cf254a..dda0dc4a5567 100644
--- a/drivers/usb/gadget/inode.c
+++ b/drivers/usb/gadget/inode.c
@@ -887,7 +887,6 @@ ep_open (struct inode *inode, struct file *fd)
887 887
888/* used before endpoint configuration */ 888/* used before endpoint configuration */
889static const struct file_operations ep_config_operations = { 889static const struct file_operations ep_config_operations = {
890 .owner = THIS_MODULE,
891 .llseek = no_llseek, 890 .llseek = no_llseek,
892 891
893 .open = ep_open, 892 .open = ep_open,
@@ -1940,7 +1939,6 @@ dev_open (struct inode *inode, struct file *fd)
1940} 1939}
1941 1940
1942static const struct file_operations dev_init_operations = { 1941static const struct file_operations dev_init_operations = {
1943 .owner = THIS_MODULE,
1944 .llseek = no_llseek, 1942 .llseek = no_llseek,
1945 1943
1946 .open = dev_open, 1944 .open = dev_open,
diff --git a/drivers/usb/gadget/lpc32xx_udc.c b/drivers/usb/gadget/lpc32xx_udc.c
index b943d8cdfbf7..67128be1e1b7 100644
--- a/drivers/usb/gadget/lpc32xx_udc.c
+++ b/drivers/usb/gadget/lpc32xx_udc.c
@@ -565,7 +565,7 @@ static int proc_udc_show(struct seq_file *s, void *unused)
565 565
566static int proc_udc_open(struct inode *inode, struct file *file) 566static int proc_udc_open(struct inode *inode, struct file *file)
567{ 567{
568 return single_open(file, proc_udc_show, PDE(inode)->data); 568 return single_open(file, proc_udc_show, PDE_DATA(inode));
569} 569}
570 570
571static const struct file_operations proc_ops = { 571static const struct file_operations proc_ops = {
diff --git a/drivers/usb/gadget/rndis.c b/drivers/usb/gadget/rndis.c
index d9297eebbf73..1e4cfb05f70b 100644
--- a/drivers/usb/gadget/rndis.c
+++ b/drivers/usb/gadget/rndis.c
@@ -1065,7 +1065,7 @@ static int rndis_proc_show(struct seq_file *m, void *v)
1065static ssize_t rndis_proc_write(struct file *file, const char __user *buffer, 1065static ssize_t rndis_proc_write(struct file *file, const char __user *buffer,
1066 size_t count, loff_t *ppos) 1066 size_t count, loff_t *ppos)
1067{ 1067{
1068 rndis_params *p = PDE(file_inode(file))->data; 1068 rndis_params *p = PDE_DATA(file_inode(file));
1069 u32 speed = 0; 1069 u32 speed = 0;
1070 int i, fl_speed = 0; 1070 int i, fl_speed = 0;
1071 1071
@@ -1109,7 +1109,7 @@ static ssize_t rndis_proc_write(struct file *file, const char __user *buffer,
1109 1109
1110static int rndis_proc_open(struct inode *inode, struct file *file) 1110static int rndis_proc_open(struct inode *inode, struct file *file)
1111{ 1111{
1112 return single_open(file, rndis_proc_show, PDE(inode)->data); 1112 return single_open(file, rndis_proc_show, PDE_DATA(inode));
1113} 1113}
1114 1114
1115static const struct file_operations rndis_proc_fops = { 1115static const struct file_operations rndis_proc_fops = {
diff --git a/drivers/usb/host/isp1362-hcd.c b/drivers/usb/host/isp1362-hcd.c
index 974480c516fa..b04e8ece4d35 100644
--- a/drivers/usb/host/isp1362-hcd.c
+++ b/drivers/usb/host/isp1362-hcd.c
@@ -2175,7 +2175,7 @@ static int proc_isp1362_show(struct seq_file *s, void *unused)
2175 2175
2176static int proc_isp1362_open(struct inode *inode, struct file *file) 2176static int proc_isp1362_open(struct inode *inode, struct file *file)
2177{ 2177{
2178 return single_open(file, proc_isp1362_show, PDE(inode)->data); 2178 return single_open(file, proc_isp1362_show, PDE_DATA(inode));
2179} 2179}
2180 2180
2181static const struct file_operations proc_ops = { 2181static const struct file_operations proc_ops = {
@@ -2192,14 +2192,11 @@ static void create_debug_file(struct isp1362_hcd *isp1362_hcd)
2192{ 2192{
2193 struct proc_dir_entry *pde; 2193 struct proc_dir_entry *pde;
2194 2194
2195 pde = create_proc_entry(proc_filename, 0, NULL); 2195 pde = proc_create_data(proc_filename, 0, NULL, &proc_ops, isp1362_hcd);
2196 if (pde == NULL) { 2196 if (pde == NULL) {
2197 pr_warning("%s: Failed to create debug file '%s'\n", __func__, proc_filename); 2197 pr_warning("%s: Failed to create debug file '%s'\n", __func__, proc_filename);
2198 return; 2198 return;
2199 } 2199 }
2200
2201 pde->proc_fops = &proc_ops;
2202 pde->data = isp1362_hcd;
2203 isp1362_hcd->pde = pde; 2200 isp1362_hcd->pde = pde;
2204} 2201}
2205 2202
diff --git a/drivers/usb/host/sl811-hcd.c b/drivers/usb/host/sl811-hcd.c
index 15ed7e8d887f..ad4483efb6d6 100644
--- a/drivers/usb/host/sl811-hcd.c
+++ b/drivers/usb/host/sl811-hcd.c
@@ -1494,7 +1494,7 @@ static int proc_sl811h_show(struct seq_file *s, void *unused)
1494 1494
1495static int proc_sl811h_open(struct inode *inode, struct file *file) 1495static int proc_sl811h_open(struct inode *inode, struct file *file)
1496{ 1496{
1497 return single_open(file, proc_sl811h_show, PDE(inode)->data); 1497 return single_open(file, proc_sl811h_show, PDE_DATA(inode));
1498} 1498}
1499 1499
1500static const struct file_operations proc_ops = { 1500static const struct file_operations proc_ops = {
diff --git a/drivers/usb/misc/yurex.c b/drivers/usb/misc/yurex.c
index 42ad2e6d86c4..b6ab515bfc6c 100644
--- a/drivers/usb/misc/yurex.c
+++ b/drivers/usb/misc/yurex.c
@@ -407,8 +407,6 @@ static int yurex_release(struct inode *inode, struct file *file)
407 if (dev == NULL) 407 if (dev == NULL)
408 return -ENODEV; 408 return -ENODEV;
409 409
410 yurex_fasync(-1, file, 0);
411
412 /* decrement the count on our device */ 410 /* decrement the count on our device */
413 kref_put(&dev->kref, yurex_delete); 411 kref_put(&dev->kref, yurex_delete);
414 return 0; 412 return 0;
diff --git a/drivers/usb/storage/scsiglue.c b/drivers/usb/storage/scsiglue.c
index 4faa982807f2..92b05d95ec5e 100644
--- a/drivers/usb/storage/scsiglue.c
+++ b/drivers/usb/storage/scsiglue.c
@@ -437,22 +437,21 @@ void usb_stor_report_bus_reset(struct us_data *us)
437 * /proc/scsi/ functions 437 * /proc/scsi/ functions
438 ***********************************************************************/ 438 ***********************************************************************/
439 439
440static int write_info(struct Scsi_Host *host, char *buffer, int length)
441{
442 /* if someone is sending us data, just throw it away */
443 return length;
444}
445
440/* we use this macro to help us write into the buffer */ 446/* we use this macro to help us write into the buffer */
441#undef SPRINTF 447#undef SPRINTF
442#define SPRINTF(args...) \ 448#define SPRINTF(args...) seq_printf(m, ## args)
443 do { if (pos < buffer+length) pos += sprintf(pos, ## args); } while (0)
444 449
445static int proc_info (struct Scsi_Host *host, char *buffer, 450static int show_info (struct seq_file *m, struct Scsi_Host *host)
446 char **start, off_t offset, int length, int inout)
447{ 451{
448 struct us_data *us = host_to_us(host); 452 struct us_data *us = host_to_us(host);
449 char *pos = buffer;
450 const char *string; 453 const char *string;
451 454
452 /* if someone is sending us data, just throw it away */
453 if (inout)
454 return length;
455
456 /* print the controller name */ 455 /* print the controller name */
457 SPRINTF(" Host scsi%d: usb-storage\n", host->host_no); 456 SPRINTF(" Host scsi%d: usb-storage\n", host->host_no);
458 457
@@ -482,28 +481,14 @@ static int proc_info (struct Scsi_Host *host, char *buffer,
482 SPRINTF(" Transport: %s\n", us->transport_name); 481 SPRINTF(" Transport: %s\n", us->transport_name);
483 482
484 /* show the device flags */ 483 /* show the device flags */
485 if (pos < buffer + length) { 484 SPRINTF(" Quirks:");
486 pos += sprintf(pos, " Quirks:");
487 485
488#define US_FLAG(name, value) \ 486#define US_FLAG(name, value) \
489 if (us->fflags & value) pos += sprintf(pos, " " #name); 487 if (us->fflags & value) seq_printf(m, " " #name);
490US_DO_ALL_FLAGS 488US_DO_ALL_FLAGS
491#undef US_FLAG 489#undef US_FLAG
492 490 seq_putc(m, '\n');
493 *(pos++) = '\n'; 491 return 0;
494 }
495
496 /*
497 * Calculate start of next buffer, and return value.
498 */
499 *start = buffer + offset;
500
501 if ((pos - buffer) < offset)
502 return (0);
503 else if ((pos - buffer - offset) < length)
504 return (pos - buffer - offset);
505 else
506 return (length);
507} 492}
508 493
509/*********************************************************************** 494/***********************************************************************
@@ -548,7 +533,8 @@ struct scsi_host_template usb_stor_host_template = {
548 /* basic userland interface stuff */ 533 /* basic userland interface stuff */
549 .name = "usb-storage", 534 .name = "usb-storage",
550 .proc_name = "usb-storage", 535 .proc_name = "usb-storage",
551 .proc_info = proc_info, 536 .show_info = show_info,
537 .write_info = write_info,
552 .info = host_info, 538 .info = host_info,
553 539
554 /* command interface -- queued only */ 540 /* command interface -- queued only */
diff --git a/drivers/video/bfin_adv7393fb.c b/drivers/video/bfin_adv7393fb.c
index 8d411a3c9966..a54f7f7d763b 100644
--- a/drivers/video/bfin_adv7393fb.c
+++ b/drivers/video/bfin_adv7393fb.c
@@ -333,29 +333,23 @@ static int proc_output(char *buf)
333 return p - buf; 333 return p - buf;
334} 334}
335 335
336static int 336static ssize_t
337adv7393_read_proc(char *page, char **start, off_t off, 337adv7393_read_proc(struct file *file, char __user *buf,
338 int count, int *eof, void *data) 338 size_t size, loff_t *ppos)
339{ 339{
340 int len; 340 static const char message[] = "Usage:\n"
341 341 "echo 0x[REG][Value] > adv7393\n"
342 len = proc_output(page); 342 "example: echo 0x1234 >adv7393\n"
343 if (len <= off + count) 343 "writes 0x34 into Register 0x12\n";
344 *eof = 1; 344 return simple_read_from_buffer(buf, size, ppos, message,
345 *start = page + off; 345 sizeof(message));
346 len -= off;
347 if (len > count)
348 len = count;
349 if (len < 0)
350 len = 0;
351 return len;
352} 346}
353 347
354static int 348static ssize_t
355adv7393_write_proc(struct file *file, const char __user * buffer, 349adv7393_write_proc(struct file *file, const char __user * buffer,
356 size_t count, void *data) 350 size_t count, loff_t *ppos)
357{ 351{
358 struct adv7393fb_device *fbdev = data; 352 struct adv7393fb_device *fbdev = PDE_DATA(file_inode(file));
359 unsigned int val; 353 unsigned int val;
360 int ret; 354 int ret;
361 355
@@ -368,6 +362,12 @@ adv7393_write_proc(struct file *file, const char __user * buffer,
368 return count; 362 return count;
369} 363}
370 364
365static const struct file_operations fops = {
366 .read = adv7393_read_proc,
367 .write = adv7393_write_proc,
368 .llseek = default_llseek,
369};
370
371static int bfin_adv7393_fb_probe(struct i2c_client *client, 371static int bfin_adv7393_fb_probe(struct i2c_client *client,
372 const struct i2c_device_id *id) 372 const struct i2c_device_id *id)
373{ 373{
@@ -506,17 +506,12 @@ static int bfin_adv7393_fb_probe(struct i2c_client *client,
506 fbdev->info.node, fbdev->info.fix.id); 506 fbdev->info.node, fbdev->info.fix.id);
507 dev_info(&client->dev, "fb memory address : 0x%p\n", fbdev->fb_mem); 507 dev_info(&client->dev, "fb memory address : 0x%p\n", fbdev->fb_mem);
508 508
509 entry = create_proc_entry("driver/adv7393", 0, NULL); 509 entry = proc_create_data("driver/adv7393", 0, NULL, &fops, fbdev);
510 if (!entry) { 510 if (!entry) {
511 dev_err(&client->dev, "unable to create /proc entry\n"); 511 dev_err(&client->dev, "unable to create /proc entry\n");
512 ret = -EFAULT; 512 ret = -EFAULT;
513 goto free_fb; 513 goto free_fb;
514 } 514 }
515
516 entry->read_proc = adv7393_read_proc;
517 entry->write_proc = adv7393_write_proc;
518 entry->data = fbdev;
519
520 return 0; 515 return 0;
521 516
522free_fb: 517free_fb:
diff --git a/drivers/video/pxa3xx-gcu.c b/drivers/video/pxa3xx-gcu.c
index 6c984eacc7e3..97563c55af63 100644
--- a/drivers/video/pxa3xx-gcu.c
+++ b/drivers/video/pxa3xx-gcu.c
@@ -101,7 +101,6 @@ struct pxa3xx_gcu_priv {
101 dma_addr_t shared_phys; 101 dma_addr_t shared_phys;
102 struct resource *resource_mem; 102 struct resource *resource_mem;
103 struct miscdevice misc_dev; 103 struct miscdevice misc_dev;
104 struct file_operations misc_fops;
105 wait_queue_head_t wait_idle; 104 wait_queue_head_t wait_idle;
106 wait_queue_head_t wait_free; 105 wait_queue_head_t wait_free;
107 spinlock_t spinlock; 106 spinlock_t spinlock;
@@ -369,15 +368,20 @@ pxa3xx_gcu_wait_free(struct pxa3xx_gcu_priv *priv)
369 368
370/* Misc device layer */ 369/* Misc device layer */
371 370
371static inline struct pxa3xx_gcu_priv *file_dev(struct file *file)
372{
373 struct miscdevice *dev = file->private_data;
374 return container_of(dev, struct pxa3xx_gcu_priv, misc_dev);
375}
376
372static ssize_t 377static ssize_t
373pxa3xx_gcu_misc_write(struct file *filp, const char *buff, 378pxa3xx_gcu_misc_write(struct file *file, const char *buff,
374 size_t count, loff_t *offp) 379 size_t count, loff_t *offp)
375{ 380{
376 int ret; 381 int ret;
377 unsigned long flags; 382 unsigned long flags;
378 struct pxa3xx_gcu_batch *buffer; 383 struct pxa3xx_gcu_batch *buffer;
379 struct pxa3xx_gcu_priv *priv = 384 struct pxa3xx_gcu_priv *priv = file_dev(file);
380 container_of(filp->f_op, struct pxa3xx_gcu_priv, misc_fops);
381 385
382 int words = count / 4; 386 int words = count / 4;
383 387
@@ -450,11 +454,10 @@ pxa3xx_gcu_misc_write(struct file *filp, const char *buff,
450 454
451 455
452static long 456static long
453pxa3xx_gcu_misc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 457pxa3xx_gcu_misc_ioctl(struct file *file, unsigned int cmd, unsigned long arg)
454{ 458{
455 unsigned long flags; 459 unsigned long flags;
456 struct pxa3xx_gcu_priv *priv = 460 struct pxa3xx_gcu_priv *priv = file_dev(file);
457 container_of(filp->f_op, struct pxa3xx_gcu_priv, misc_fops);
458 461
459 switch (cmd) { 462 switch (cmd) {
460 case PXA3XX_GCU_IOCTL_RESET: 463 case PXA3XX_GCU_IOCTL_RESET:
@@ -471,11 +474,10 @@ pxa3xx_gcu_misc_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
471} 474}
472 475
473static int 476static int
474pxa3xx_gcu_misc_mmap(struct file *filp, struct vm_area_struct *vma) 477pxa3xx_gcu_misc_mmap(struct file *file, struct vm_area_struct *vma)
475{ 478{
476 unsigned int size = vma->vm_end - vma->vm_start; 479 unsigned int size = vma->vm_end - vma->vm_start;
477 struct pxa3xx_gcu_priv *priv = 480 struct pxa3xx_gcu_priv *priv = file_dev(file);
478 container_of(filp->f_op, struct pxa3xx_gcu_priv, misc_fops);
479 481
480 switch (vma->vm_pgoff) { 482 switch (vma->vm_pgoff) {
481 case 0: 483 case 0:
@@ -574,6 +576,13 @@ free_buffers(struct platform_device *dev,
574 priv->free = NULL; 576 priv->free = NULL;
575} 577}
576 578
579static const struct file_operations misc_fops = {
580 .owner = THIS_MODULE,
581 .write = pxa3xx_gcu_misc_write,
582 .unlocked_ioctl = pxa3xx_gcu_misc_ioctl,
583 .mmap = pxa3xx_gcu_misc_mmap
584};
585
577static int pxa3xx_gcu_probe(struct platform_device *dev) 586static int pxa3xx_gcu_probe(struct platform_device *dev)
578{ 587{
579 int i, ret, irq; 588 int i, ret, irq;
@@ -601,14 +610,9 @@ static int pxa3xx_gcu_probe(struct platform_device *dev)
601 * container_of(). This isn't really necessary as we have a fixed minor 610 * container_of(). This isn't really necessary as we have a fixed minor
602 * number anyway, but this is to avoid statics. */ 611 * number anyway, but this is to avoid statics. */
603 612
604 priv->misc_fops.owner = THIS_MODULE;
605 priv->misc_fops.write = pxa3xx_gcu_misc_write;
606 priv->misc_fops.unlocked_ioctl = pxa3xx_gcu_misc_ioctl;
607 priv->misc_fops.mmap = pxa3xx_gcu_misc_mmap;
608
609 priv->misc_dev.minor = MISCDEV_MINOR, 613 priv->misc_dev.minor = MISCDEV_MINOR,
610 priv->misc_dev.name = DRV_NAME, 614 priv->misc_dev.name = DRV_NAME,
611 priv->misc_dev.fops = &priv->misc_fops, 615 priv->misc_dev.fops = &misc_fops,
612 616
613 /* register misc device */ 617 /* register misc device */
614 ret = misc_register(&priv->misc_dev); 618 ret = misc_register(&priv->misc_dev);
diff --git a/drivers/zorro/proc.c b/drivers/zorro/proc.c
index 73b33837e12c..1c15ee7456b6 100644
--- a/drivers/zorro/proc.c
+++ b/drivers/zorro/proc.c
@@ -47,9 +47,7 @@ proc_bus_zorro_lseek(struct file *file, loff_t off, int whence)
47static ssize_t 47static ssize_t
48proc_bus_zorro_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos) 48proc_bus_zorro_read(struct file *file, char __user *buf, size_t nbytes, loff_t *ppos)
49{ 49{
50 struct inode *ino = file_inode(file); 50 struct zorro_dev *z = PDE_DATA(file_inode(file));
51 struct proc_dir_entry *dp = PDE(ino);
52 struct zorro_dev *z = dp->data;
53 struct ConfigDev cd; 51 struct ConfigDev cd;
54 loff_t pos = *ppos; 52 loff_t pos = *ppos;
55 53
@@ -141,7 +139,7 @@ static int __init zorro_proc_attach_device(unsigned int slot)
141 &zorro_autocon[slot]); 139 &zorro_autocon[slot]);
142 if (!entry) 140 if (!entry)
143 return -ENOMEM; 141 return -ENOMEM;
144 entry->size = sizeof(struct zorro_dev); 142 proc_set_size(entry, sizeof(struct zorro_dev));
145 return 0; 143 return 0;
146} 144}
147 145
diff --git a/fs/Makefile b/fs/Makefile
index f0db9c941a5f..4fe6df3ec28f 100644
--- a/fs/Makefile
+++ b/fs/Makefile
@@ -7,7 +7,7 @@
7 7
8obj-y := open.o read_write.o file_table.o super.o \ 8obj-y := open.o read_write.o file_table.o super.o \
9 char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \ 9 char_dev.o stat.o exec.o pipe.o namei.o fcntl.o \
10 ioctl.o readdir.o select.o fifo.o dcache.o inode.o \ 10 ioctl.o readdir.o select.o dcache.o inode.o \
11 attr.o bad_inode.o file.o filesystems.o namespace.o \ 11 attr.o bad_inode.o file.o filesystems.o namespace.o \
12 seq_file.o xattr.o libfs.o fs-writeback.o \ 12 seq_file.o xattr.o libfs.o fs-writeback.o \
13 pnode.o splice.o sync.o utimes.o \ 13 pnode.o splice.o sync.o utimes.o \
diff --git a/fs/afs/proc.c b/fs/afs/proc.c
index 096b23f821a1..526e4bbbde59 100644
--- a/fs/afs/proc.c
+++ b/fs/afs/proc.c
@@ -190,7 +190,7 @@ static int afs_proc_cells_open(struct inode *inode, struct file *file)
190 return ret; 190 return ret;
191 191
192 m = file->private_data; 192 m = file->private_data;
193 m->private = PDE(inode)->data; 193 m->private = PDE_DATA(inode);
194 194
195 return 0; 195 return 0;
196} 196}
@@ -448,7 +448,7 @@ static int afs_proc_cell_volumes_open(struct inode *inode, struct file *file)
448 struct seq_file *m; 448 struct seq_file *m;
449 int ret; 449 int ret;
450 450
451 cell = PDE(inode)->data; 451 cell = PDE_DATA(inode);
452 if (!cell) 452 if (!cell)
453 return -ENOENT; 453 return -ENOENT;
454 454
@@ -554,7 +554,7 @@ static int afs_proc_cell_vlservers_open(struct inode *inode, struct file *file)
554 struct seq_file *m; 554 struct seq_file *m;
555 int ret; 555 int ret;
556 556
557 cell = PDE(inode)->data; 557 cell = PDE_DATA(inode);
558 if (!cell) 558 if (!cell)
559 return -ENOENT; 559 return -ENOENT;
560 560
@@ -659,7 +659,7 @@ static int afs_proc_cell_servers_open(struct inode *inode, struct file *file)
659 struct seq_file *m; 659 struct seq_file *m;
660 int ret; 660 int ret;
661 661
662 cell = PDE(inode)->data; 662 cell = PDE_DATA(inode);
663 if (!cell) 663 if (!cell)
664 return -ENOENT; 664 return -ENOENT;
665 665
diff --git a/fs/aio.c b/fs/aio.c
index 6db8745c2edd..351afe7ac78e 100644
--- a/fs/aio.c
+++ b/fs/aio.c
@@ -1324,6 +1324,8 @@ static ssize_t aio_rw_vect_retry(struct kiocb *iocb)
1324 if (iocb->ki_pos < 0) 1324 if (iocb->ki_pos < 0)
1325 return -EINVAL; 1325 return -EINVAL;
1326 1326
1327 if (opcode == IOCB_CMD_PWRITEV)
1328 file_start_write(file);
1327 do { 1329 do {
1328 ret = rw_op(iocb, &iocb->ki_iovec[iocb->ki_cur_seg], 1330 ret = rw_op(iocb, &iocb->ki_iovec[iocb->ki_cur_seg],
1329 iocb->ki_nr_segs - iocb->ki_cur_seg, 1331 iocb->ki_nr_segs - iocb->ki_cur_seg,
@@ -1336,6 +1338,8 @@ static ssize_t aio_rw_vect_retry(struct kiocb *iocb)
1336 } while (ret > 0 && iocb->ki_left > 0 && 1338 } while (ret > 0 && iocb->ki_left > 0 &&
1337 (opcode == IOCB_CMD_PWRITEV || 1339 (opcode == IOCB_CMD_PWRITEV ||
1338 (!S_ISFIFO(inode->i_mode) && !S_ISSOCK(inode->i_mode)))); 1340 (!S_ISFIFO(inode->i_mode) && !S_ISSOCK(inode->i_mode))));
1341 if (opcode == IOCB_CMD_PWRITEV)
1342 file_end_write(file);
1339 1343
1340 /* This means we must have transferred all that we could */ 1344 /* This means we must have transferred all that we could */
1341 /* No need to retry anymore */ 1345 /* No need to retry anymore */
diff --git a/fs/binfmt_aout.c b/fs/binfmt_aout.c
index 02fe378fc506..bce87694f7b0 100644
--- a/fs/binfmt_aout.c
+++ b/fs/binfmt_aout.c
@@ -286,15 +286,12 @@ static int load_aout_binary(struct linux_binprm * bprm)
286 return error; 286 return error;
287 } 287 }
288 288
289 error = bprm->file->f_op->read(bprm->file, 289 error = read_code(bprm->file, text_addr, pos,
290 (char __user *)text_addr, 290 ex.a_text+ex.a_data);
291 ex.a_text+ex.a_data, &pos);
292 if ((signed long)error < 0) { 291 if ((signed long)error < 0) {
293 send_sig(SIGKILL, current, 0); 292 send_sig(SIGKILL, current, 0);
294 return error; 293 return error;
295 } 294 }
296
297 flush_icache_range(text_addr, text_addr+ex.a_text+ex.a_data);
298 } else { 295 } else {
299 if ((ex.a_text & 0xfff || ex.a_data & 0xfff) && 296 if ((ex.a_text & 0xfff || ex.a_data & 0xfff) &&
300 (N_MAGIC(ex) != NMAGIC) && printk_ratelimit()) 297 (N_MAGIC(ex) != NMAGIC) && printk_ratelimit())
@@ -310,14 +307,9 @@ static int load_aout_binary(struct linux_binprm * bprm)
310 } 307 }
311 308
312 if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) { 309 if (!bprm->file->f_op->mmap||((fd_offset & ~PAGE_MASK) != 0)) {
313 loff_t pos = fd_offset;
314 vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data); 310 vm_brk(N_TXTADDR(ex), ex.a_text+ex.a_data);
315 bprm->file->f_op->read(bprm->file, 311 read_code(bprm->file, N_TXTADDR(ex), fd_offset,
316 (char __user *)N_TXTADDR(ex), 312 ex.a_text + ex.a_data);
317 ex.a_text+ex.a_data, &pos);
318 flush_icache_range((unsigned long) N_TXTADDR(ex),
319 (unsigned long) N_TXTADDR(ex) +
320 ex.a_text+ex.a_data);
321 goto beyond_if; 313 goto beyond_if;
322 } 314 }
323 315
@@ -396,8 +388,6 @@ static int load_aout_library(struct file *file)
396 start_addr = ex.a_entry & 0xfffff000; 388 start_addr = ex.a_entry & 0xfffff000;
397 389
398 if ((N_TXTOFF(ex) & ~PAGE_MASK) != 0) { 390 if ((N_TXTOFF(ex) & ~PAGE_MASK) != 0) {
399 loff_t pos = N_TXTOFF(ex);
400
401 if (printk_ratelimit()) 391 if (printk_ratelimit())
402 { 392 {
403 printk(KERN_WARNING 393 printk(KERN_WARNING
@@ -406,11 +396,8 @@ static int load_aout_library(struct file *file)
406 } 396 }
407 vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss); 397 vm_brk(start_addr, ex.a_text + ex.a_data + ex.a_bss);
408 398
409 file->f_op->read(file, (char __user *)start_addr, 399 read_code(file, start_addr, N_TXTOFF(ex),
410 ex.a_text + ex.a_data, &pos); 400 ex.a_text + ex.a_data);
411 flush_icache_range((unsigned long) start_addr,
412 (unsigned long) start_addr + ex.a_text + ex.a_data);
413
414 retval = 0; 401 retval = 0;
415 goto out; 402 goto out;
416 } 403 }
diff --git a/fs/binfmt_elf_fdpic.c b/fs/binfmt_elf_fdpic.c
index c1cc06aed601..9dac212fc6f9 100644
--- a/fs/binfmt_elf_fdpic.c
+++ b/fs/binfmt_elf_fdpic.c
@@ -926,7 +926,6 @@ static int elf_fdpic_map_file_constdisp_on_uclinux(
926 struct elf32_fdpic_loadseg *seg; 926 struct elf32_fdpic_loadseg *seg;
927 struct elf32_phdr *phdr; 927 struct elf32_phdr *phdr;
928 unsigned long load_addr, base = ULONG_MAX, top = 0, maddr = 0, mflags; 928 unsigned long load_addr, base = ULONG_MAX, top = 0, maddr = 0, mflags;
929 loff_t fpos;
930 int loop, ret; 929 int loop, ret;
931 930
932 load_addr = params->load_addr; 931 load_addr = params->load_addr;
@@ -964,14 +963,12 @@ static int elf_fdpic_map_file_constdisp_on_uclinux(
964 if (params->phdrs[loop].p_type != PT_LOAD) 963 if (params->phdrs[loop].p_type != PT_LOAD)
965 continue; 964 continue;
966 965
967 fpos = phdr->p_offset;
968
969 seg->addr = maddr + (phdr->p_vaddr - base); 966 seg->addr = maddr + (phdr->p_vaddr - base);
970 seg->p_vaddr = phdr->p_vaddr; 967 seg->p_vaddr = phdr->p_vaddr;
971 seg->p_memsz = phdr->p_memsz; 968 seg->p_memsz = phdr->p_memsz;
972 969
973 ret = file->f_op->read(file, (void *) seg->addr, 970 ret = read_code(file, seg->addr, phdr->p_offset,
974 phdr->p_filesz, &fpos); 971 phdr->p_filesz);
975 if (ret < 0) 972 if (ret < 0)
976 return ret; 973 return ret;
977 974
diff --git a/fs/binfmt_flat.c b/fs/binfmt_flat.c
index 2036d21baaef..d50bbe59da1e 100644
--- a/fs/binfmt_flat.c
+++ b/fs/binfmt_flat.c
@@ -207,11 +207,12 @@ static int decompress_exec(
207 207
208 /* Read in first chunk of data and parse gzip header. */ 208 /* Read in first chunk of data and parse gzip header. */
209 fpos = offset; 209 fpos = offset;
210 ret = bprm->file->f_op->read(bprm->file, buf, LBUFSIZE, &fpos); 210 ret = kernel_read(bprm->file, offset, buf, LBUFSIZE);
211 211
212 strm.next_in = buf; 212 strm.next_in = buf;
213 strm.avail_in = ret; 213 strm.avail_in = ret;
214 strm.total_in = 0; 214 strm.total_in = 0;
215 fpos += ret;
215 216
216 retval = -ENOEXEC; 217 retval = -ENOEXEC;
217 218
@@ -277,7 +278,7 @@ static int decompress_exec(
277 } 278 }
278 279
279 while ((ret = zlib_inflate(&strm, Z_NO_FLUSH)) == Z_OK) { 280 while ((ret = zlib_inflate(&strm, Z_NO_FLUSH)) == Z_OK) {
280 ret = bprm->file->f_op->read(bprm->file, buf, LBUFSIZE, &fpos); 281 ret = kernel_read(bprm->file, fpos, buf, LBUFSIZE);
281 if (ret <= 0) 282 if (ret <= 0)
282 break; 283 break;
283 len -= ret; 284 len -= ret;
@@ -285,6 +286,7 @@ static int decompress_exec(
285 strm.next_in = buf; 286 strm.next_in = buf;
286 strm.avail_in = ret; 287 strm.avail_in = ret;
287 strm.total_in = 0; 288 strm.total_in = 0;
289 fpos += ret;
288 } 290 }
289 291
290 if (ret < 0) { 292 if (ret < 0) {
@@ -428,6 +430,7 @@ static int load_flat_file(struct linux_binprm * bprm,
428 unsigned long textpos = 0, datapos = 0, result; 430 unsigned long textpos = 0, datapos = 0, result;
429 unsigned long realdatastart = 0; 431 unsigned long realdatastart = 0;
430 unsigned long text_len, data_len, bss_len, stack_len, flags; 432 unsigned long text_len, data_len, bss_len, stack_len, flags;
433 unsigned long full_data;
431 unsigned long len, memp = 0; 434 unsigned long len, memp = 0;
432 unsigned long memp_size, extra, rlim; 435 unsigned long memp_size, extra, rlim;
433 unsigned long *reloc = 0, *rp; 436 unsigned long *reloc = 0, *rp;
@@ -451,6 +454,7 @@ static int load_flat_file(struct linux_binprm * bprm,
451 relocs = ntohl(hdr->reloc_count); 454 relocs = ntohl(hdr->reloc_count);
452 flags = ntohl(hdr->flags); 455 flags = ntohl(hdr->flags);
453 rev = ntohl(hdr->rev); 456 rev = ntohl(hdr->rev);
457 full_data = data_len + relocs * sizeof(unsigned long);
454 458
455 if (strncmp(hdr->magic, "bFLT", 4)) { 459 if (strncmp(hdr->magic, "bFLT", 4)) {
456 /* 460 /*
@@ -577,12 +581,12 @@ static int load_flat_file(struct linux_binprm * bprm,
577#ifdef CONFIG_BINFMT_ZFLAT 581#ifdef CONFIG_BINFMT_ZFLAT
578 if (flags & FLAT_FLAG_GZDATA) { 582 if (flags & FLAT_FLAG_GZDATA) {
579 result = decompress_exec(bprm, fpos, (char *) datapos, 583 result = decompress_exec(bprm, fpos, (char *) datapos,
580 data_len + (relocs * sizeof(unsigned long)), 0); 584 full_data, 0);
581 } else 585 } else
582#endif 586#endif
583 { 587 {
584 result = bprm->file->f_op->read(bprm->file, (char *) datapos, 588 result = read_code(bprm->file, datapos, fpos,
585 data_len + (relocs * sizeof(unsigned long)), &fpos); 589 full_data);
586 } 590 }
587 if (IS_ERR_VALUE(result)) { 591 if (IS_ERR_VALUE(result)) {
588 printk("Unable to read data+bss, errno %d\n", (int)-result); 592 printk("Unable to read data+bss, errno %d\n", (int)-result);
@@ -627,30 +631,25 @@ static int load_flat_file(struct linux_binprm * bprm,
627 if (flags & FLAT_FLAG_GZIP) { 631 if (flags & FLAT_FLAG_GZIP) {
628 result = decompress_exec(bprm, sizeof (struct flat_hdr), 632 result = decompress_exec(bprm, sizeof (struct flat_hdr),
629 (((char *) textpos) + sizeof (struct flat_hdr)), 633 (((char *) textpos) + sizeof (struct flat_hdr)),
630 (text_len + data_len + (relocs * sizeof(unsigned long)) 634 (text_len + full_data
631 - sizeof (struct flat_hdr)), 635 - sizeof (struct flat_hdr)),
632 0); 636 0);
633 memmove((void *) datapos, (void *) realdatastart, 637 memmove((void *) datapos, (void *) realdatastart,
634 data_len + (relocs * sizeof(unsigned long))); 638 full_data);
635 } else if (flags & FLAT_FLAG_GZDATA) { 639 } else if (flags & FLAT_FLAG_GZDATA) {
636 fpos = 0; 640 result = read_code(bprm->file, textpos, 0, text_len);
637 result = bprm->file->f_op->read(bprm->file,
638 (char *) textpos, text_len, &fpos);
639 if (!IS_ERR_VALUE(result)) 641 if (!IS_ERR_VALUE(result))
640 result = decompress_exec(bprm, text_len, (char *) datapos, 642 result = decompress_exec(bprm, text_len, (char *) datapos,
641 data_len + (relocs * sizeof(unsigned long)), 0); 643 full_data, 0);
642 } 644 }
643 else 645 else
644#endif 646#endif
645 { 647 {
646 fpos = 0; 648 result = read_code(bprm->file, textpos, 0, text_len);
647 result = bprm->file->f_op->read(bprm->file, 649 if (!IS_ERR_VALUE(result))
648 (char *) textpos, text_len, &fpos); 650 result = read_code(bprm->file, datapos,
649 if (!IS_ERR_VALUE(result)) { 651 ntohl(hdr->data_start),
650 fpos = ntohl(hdr->data_start); 652 full_data);
651 result = bprm->file->f_op->read(bprm->file, (char *) datapos,
652 data_len + (relocs * sizeof(unsigned long)), &fpos);
653 }
654 } 653 }
655 if (IS_ERR_VALUE(result)) { 654 if (IS_ERR_VALUE(result)) {
656 printk("Unable to read code+data+bss, errno %d\n",(int)-result); 655 printk("Unable to read code+data+bss, errno %d\n",(int)-result);
diff --git a/fs/btrfs/file.c b/fs/btrfs/file.c
index ade03e6f7bd2..bb8b7a0e28a6 100644
--- a/fs/btrfs/file.c
+++ b/fs/btrfs/file.c
@@ -1514,8 +1514,6 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
1514 size_t count, ocount; 1514 size_t count, ocount;
1515 bool sync = (file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host); 1515 bool sync = (file->f_flags & O_DSYNC) || IS_SYNC(file->f_mapping->host);
1516 1516
1517 sb_start_write(inode->i_sb);
1518
1519 mutex_lock(&inode->i_mutex); 1517 mutex_lock(&inode->i_mutex);
1520 1518
1521 err = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ); 1519 err = generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ);
@@ -1617,7 +1615,6 @@ static ssize_t btrfs_file_aio_write(struct kiocb *iocb,
1617 if (sync) 1615 if (sync)
1618 atomic_dec(&BTRFS_I(inode)->sync_writers); 1616 atomic_dec(&BTRFS_I(inode)->sync_writers);
1619out: 1617out:
1620 sb_end_write(inode->i_sb);
1621 current->backing_dev_info = NULL; 1618 current->backing_dev_info = NULL;
1622 return num_written ? num_written : err; 1619 return num_written ? num_written : err;
1623} 1620}
diff --git a/fs/cachefiles/rdwr.c b/fs/cachefiles/rdwr.c
index 480992259707..317f9ee9c991 100644
--- a/fs/cachefiles/rdwr.c
+++ b/fs/cachefiles/rdwr.c
@@ -962,12 +962,14 @@ int cachefiles_write_page(struct fscache_storage *op, struct page *page)
962 } 962 }
963 963
964 data = kmap(page); 964 data = kmap(page);
965 file_start_write(file);
965 old_fs = get_fs(); 966 old_fs = get_fs();
966 set_fs(KERNEL_DS); 967 set_fs(KERNEL_DS);
967 ret = file->f_op->write( 968 ret = file->f_op->write(
968 file, (const void __user *) data, len, &pos); 969 file, (const void __user *) data, len, &pos);
969 set_fs(old_fs); 970 set_fs(old_fs);
970 kunmap(page); 971 kunmap(page);
972 file_end_write(file);
971 if (ret != len) 973 if (ret != len)
972 ret = -EIO; 974 ret = -EIO;
973 } 975 }
diff --git a/fs/cifs/file.c b/fs/cifs/file.c
index 7a0dd99e4507..2d4a231dd70b 100644
--- a/fs/cifs/file.c
+++ b/fs/cifs/file.c
@@ -2520,8 +2520,6 @@ cifs_writev(struct kiocb *iocb, const struct iovec *iov,
2520 2520
2521 BUG_ON(iocb->ki_pos != pos); 2521 BUG_ON(iocb->ki_pos != pos);
2522 2522
2523 sb_start_write(inode->i_sb);
2524
2525 /* 2523 /*
2526 * We need to hold the sem to be sure nobody modifies lock list 2524 * We need to hold the sem to be sure nobody modifies lock list
2527 * with a brlock that prevents writing. 2525 * with a brlock that prevents writing.
@@ -2545,7 +2543,6 @@ cifs_writev(struct kiocb *iocb, const struct iovec *iov,
2545 } 2543 }
2546 2544
2547 up_read(&cinode->lock_sem); 2545 up_read(&cinode->lock_sem);
2548 sb_end_write(inode->i_sb);
2549 return rc; 2546 return rc;
2550} 2547}
2551 2548
diff --git a/fs/coda/file.c b/fs/coda/file.c
index fa4c100bdc7d..380b798f8443 100644
--- a/fs/coda/file.c
+++ b/fs/coda/file.c
@@ -79,6 +79,7 @@ coda_file_write(struct file *coda_file, const char __user *buf, size_t count, lo
79 return -EINVAL; 79 return -EINVAL;
80 80
81 host_inode = file_inode(host_file); 81 host_inode = file_inode(host_file);
82 file_start_write(host_file);
82 mutex_lock(&coda_inode->i_mutex); 83 mutex_lock(&coda_inode->i_mutex);
83 84
84 ret = host_file->f_op->write(host_file, buf, count, ppos); 85 ret = host_file->f_op->write(host_file, buf, count, ppos);
@@ -87,6 +88,7 @@ coda_file_write(struct file *coda_file, const char __user *buf, size_t count, lo
87 coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9; 88 coda_inode->i_blocks = (coda_inode->i_size + 511) >> 9;
88 coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC; 89 coda_inode->i_mtime = coda_inode->i_ctime = CURRENT_TIME_SEC;
89 mutex_unlock(&coda_inode->i_mutex); 90 mutex_unlock(&coda_inode->i_mutex);
91 file_end_write(host_file);
90 92
91 return ret; 93 return ret;
92} 94}
diff --git a/fs/compat.c b/fs/compat.c
index 5f83ffa42115..d0560c93973d 100644
--- a/fs/compat.c
+++ b/fs/compat.c
@@ -1068,190 +1068,6 @@ asmlinkage long compat_sys_getdents64(unsigned int fd,
1068} 1068}
1069#endif /* ! __ARCH_OMIT_COMPAT_SYS_GETDENTS64 */ 1069#endif /* ! __ARCH_OMIT_COMPAT_SYS_GETDENTS64 */
1070 1070
1071static ssize_t compat_do_readv_writev(int type, struct file *file,
1072 const struct compat_iovec __user *uvector,
1073 unsigned long nr_segs, loff_t *pos)
1074{
1075 compat_ssize_t tot_len;
1076 struct iovec iovstack[UIO_FASTIOV];
1077 struct iovec *iov = iovstack;
1078 ssize_t ret;
1079 io_fn_t fn;
1080 iov_fn_t fnv;
1081
1082 ret = -EINVAL;
1083 if (!file->f_op)
1084 goto out;
1085
1086 ret = compat_rw_copy_check_uvector(type, uvector, nr_segs,
1087 UIO_FASTIOV, iovstack, &iov);
1088 if (ret <= 0)
1089 goto out;
1090
1091 tot_len = ret;
1092 ret = rw_verify_area(type, file, pos, tot_len);
1093 if (ret < 0)
1094 goto out;
1095
1096 fnv = NULL;
1097 if (type == READ) {
1098 fn = file->f_op->read;
1099 fnv = file->f_op->aio_read;
1100 } else {
1101 fn = (io_fn_t)file->f_op->write;
1102 fnv = file->f_op->aio_write;
1103 }
1104
1105 if (fnv)
1106 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
1107 pos, fnv);
1108 else
1109 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
1110
1111out:
1112 if (iov != iovstack)
1113 kfree(iov);
1114 if ((ret + (type == READ)) > 0) {
1115 if (type == READ)
1116 fsnotify_access(file);
1117 else
1118 fsnotify_modify(file);
1119 }
1120 return ret;
1121}
1122
1123static size_t compat_readv(struct file *file,
1124 const struct compat_iovec __user *vec,
1125 unsigned long vlen, loff_t *pos)
1126{
1127 ssize_t ret = -EBADF;
1128
1129 if (!(file->f_mode & FMODE_READ))
1130 goto out;
1131
1132 ret = -EINVAL;
1133 if (!file->f_op || (!file->f_op->aio_read && !file->f_op->read))
1134 goto out;
1135
1136 ret = compat_do_readv_writev(READ, file, vec, vlen, pos);
1137
1138out:
1139 if (ret > 0)
1140 add_rchar(current, ret);
1141 inc_syscr(current);
1142 return ret;
1143}
1144
1145asmlinkage ssize_t
1146compat_sys_readv(unsigned long fd, const struct compat_iovec __user *vec,
1147 unsigned long vlen)
1148{
1149 struct fd f = fdget(fd);
1150 ssize_t ret;
1151 loff_t pos;
1152
1153 if (!f.file)
1154 return -EBADF;
1155 pos = f.file->f_pos;
1156 ret = compat_readv(f.file, vec, vlen, &pos);
1157 f.file->f_pos = pos;
1158 fdput(f);
1159 return ret;
1160}
1161
1162asmlinkage ssize_t
1163compat_sys_preadv64(unsigned long fd, const struct compat_iovec __user *vec,
1164 unsigned long vlen, loff_t pos)
1165{
1166 struct fd f;
1167 ssize_t ret;
1168
1169 if (pos < 0)
1170 return -EINVAL;
1171 f = fdget(fd);
1172 if (!f.file)
1173 return -EBADF;
1174 ret = -ESPIPE;
1175 if (f.file->f_mode & FMODE_PREAD)
1176 ret = compat_readv(f.file, vec, vlen, &pos);
1177 fdput(f);
1178 return ret;
1179}
1180
1181asmlinkage ssize_t
1182compat_sys_preadv(unsigned long fd, const struct compat_iovec __user *vec,
1183 unsigned long vlen, u32 pos_low, u32 pos_high)
1184{
1185 loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1186 return compat_sys_preadv64(fd, vec, vlen, pos);
1187}
1188
1189static size_t compat_writev(struct file *file,
1190 const struct compat_iovec __user *vec,
1191 unsigned long vlen, loff_t *pos)
1192{
1193 ssize_t ret = -EBADF;
1194
1195 if (!(file->f_mode & FMODE_WRITE))
1196 goto out;
1197
1198 ret = -EINVAL;
1199 if (!file->f_op || (!file->f_op->aio_write && !file->f_op->write))
1200 goto out;
1201
1202 ret = compat_do_readv_writev(WRITE, file, vec, vlen, pos);
1203
1204out:
1205 if (ret > 0)
1206 add_wchar(current, ret);
1207 inc_syscw(current);
1208 return ret;
1209}
1210
1211asmlinkage ssize_t
1212compat_sys_writev(unsigned long fd, const struct compat_iovec __user *vec,
1213 unsigned long vlen)
1214{
1215 struct fd f = fdget(fd);
1216 ssize_t ret;
1217 loff_t pos;
1218
1219 if (!f.file)
1220 return -EBADF;
1221 pos = f.file->f_pos;
1222 ret = compat_writev(f.file, vec, vlen, &pos);
1223 f.file->f_pos = pos;
1224 fdput(f);
1225 return ret;
1226}
1227
1228asmlinkage ssize_t
1229compat_sys_pwritev64(unsigned long fd, const struct compat_iovec __user *vec,
1230 unsigned long vlen, loff_t pos)
1231{
1232 struct fd f;
1233 ssize_t ret;
1234
1235 if (pos < 0)
1236 return -EINVAL;
1237 f = fdget(fd);
1238 if (!f.file)
1239 return -EBADF;
1240 ret = -ESPIPE;
1241 if (f.file->f_mode & FMODE_PWRITE)
1242 ret = compat_writev(f.file, vec, vlen, &pos);
1243 fdput(f);
1244 return ret;
1245}
1246
1247asmlinkage ssize_t
1248compat_sys_pwritev(unsigned long fd, const struct compat_iovec __user *vec,
1249 unsigned long vlen, u32 pos_low, u32 pos_high)
1250{
1251 loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1252 return compat_sys_pwritev64(fd, vec, vlen, pos);
1253}
1254
1255/* 1071/*
1256 * Exactly like fs/open.c:sys_open(), except that it doesn't set the 1072 * Exactly like fs/open.c:sys_open(), except that it doesn't set the
1257 * O_LARGEFILE flag. 1073 * O_LARGEFILE flag.
diff --git a/fs/coredump.c b/fs/coredump.c
index ec306cc9a28a..a9abe313e8d5 100644
--- a/fs/coredump.c
+++ b/fs/coredump.c
@@ -432,9 +432,7 @@ static bool dump_interrupted(void)
432 432
433static void wait_for_dump_helpers(struct file *file) 433static void wait_for_dump_helpers(struct file *file)
434{ 434{
435 struct pipe_inode_info *pipe; 435 struct pipe_inode_info *pipe = file->private_data;
436
437 pipe = file_inode(file)->i_pipe;
438 436
439 pipe_lock(pipe); 437 pipe_lock(pipe);
440 pipe->readers++; 438 pipe->readers++;
@@ -656,7 +654,9 @@ void do_coredump(siginfo_t *siginfo)
656 goto close_fail; 654 goto close_fail;
657 if (displaced) 655 if (displaced)
658 put_files_struct(displaced); 656 put_files_struct(displaced);
657 file_start_write(cprm.file);
659 core_dumped = !dump_interrupted() && binfmt->core_dump(&cprm); 658 core_dumped = !dump_interrupted() && binfmt->core_dump(&cprm);
659 file_end_write(cprm.file);
660 660
661 if (ispipe && core_pipe_limit) 661 if (ispipe && core_pipe_limit)
662 wait_for_dump_helpers(cprm.file); 662 wait_for_dump_helpers(cprm.file);
diff --git a/fs/efivarfs/file.c b/fs/efivarfs/file.c
index ede07fc7309f..bfb531564319 100644
--- a/fs/efivarfs/file.c
+++ b/fs/efivarfs/file.c
@@ -9,6 +9,7 @@
9 9
10#include <linux/efi.h> 10#include <linux/efi.h>
11#include <linux/fs.h> 11#include <linux/fs.h>
12#include <linux/slab.h>
12 13
13#include "internal.h" 14#include "internal.h"
14 15
diff --git a/fs/efivarfs/inode.c b/fs/efivarfs/inode.c
index 640e289d522e..7e787fb90293 100644
--- a/fs/efivarfs/inode.c
+++ b/fs/efivarfs/inode.c
@@ -10,6 +10,7 @@
10#include <linux/efi.h> 10#include <linux/efi.h>
11#include <linux/fs.h> 11#include <linux/fs.h>
12#include <linux/ctype.h> 12#include <linux/ctype.h>
13#include <linux/slab.h>
13 14
14#include "internal.h" 15#include "internal.h"
15 16
diff --git a/fs/efivarfs/super.c b/fs/efivarfs/super.c
index 525a2a1ac16c..141aee31884f 100644
--- a/fs/efivarfs/super.c
+++ b/fs/efivarfs/super.c
@@ -13,6 +13,8 @@
13#include <linux/module.h> 13#include <linux/module.h>
14#include <linux/pagemap.h> 14#include <linux/pagemap.h>
15#include <linux/ucs2_string.h> 15#include <linux/ucs2_string.h>
16#include <linux/slab.h>
17#include <linux/magic.h>
16 18
17#include "internal.h" 19#include "internal.h"
18 20
diff --git a/fs/exec.c b/fs/exec.c
index 963f510a25ab..643019585574 100644
--- a/fs/exec.c
+++ b/fs/exec.c
@@ -802,6 +802,15 @@ int kernel_read(struct file *file, loff_t offset,
802 802
803EXPORT_SYMBOL(kernel_read); 803EXPORT_SYMBOL(kernel_read);
804 804
805ssize_t read_code(struct file *file, unsigned long addr, loff_t pos, size_t len)
806{
807 ssize_t res = file->f_op->read(file, (void __user *)addr, len, &pos);
808 if (res > 0)
809 flush_icache_range(addr, addr + len);
810 return res;
811}
812EXPORT_SYMBOL(read_code);
813
805static int exec_mmap(struct mm_struct *mm) 814static int exec_mmap(struct mm_struct *mm)
806{ 815{
807 struct task_struct *tsk; 816 struct task_struct *tsk;
diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
index a11ea4d6164c..b1ed9e07434b 100644
--- a/fs/ext4/mballoc.c
+++ b/fs/ext4/mballoc.c
@@ -2260,7 +2260,7 @@ static const struct seq_operations ext4_mb_seq_groups_ops = {
2260 2260
2261static int ext4_mb_seq_groups_open(struct inode *inode, struct file *file) 2261static int ext4_mb_seq_groups_open(struct inode *inode, struct file *file)
2262{ 2262{
2263 struct super_block *sb = PDE(inode)->data; 2263 struct super_block *sb = PDE_DATA(inode);
2264 int rc; 2264 int rc;
2265 2265
2266 rc = seq_open(file, &ext4_mb_seq_groups_ops); 2266 rc = seq_open(file, &ext4_mb_seq_groups_ops);
diff --git a/fs/ext4/super.c b/fs/ext4/super.c
index dbc7c090c13a..24a146bde742 100644
--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -1806,7 +1806,7 @@ static int options_seq_show(struct seq_file *seq, void *offset)
1806 1806
1807static int options_open_fs(struct inode *inode, struct file *file) 1807static int options_open_fs(struct inode *inode, struct file *file)
1808{ 1808{
1809 return single_open(file, options_seq_show, PDE(inode)->data); 1809 return single_open(file, options_seq_show, PDE_DATA(inode));
1810} 1810}
1811 1811
1812static const struct file_operations ext4_seq_options_fops = { 1812static const struct file_operations ext4_seq_options_fops = {
diff --git a/fs/f2fs/acl.c b/fs/f2fs/acl.c
index 137af4255da6..44abc2f286e0 100644
--- a/fs/f2fs/acl.c
+++ b/fs/f2fs/acl.c
@@ -299,7 +299,7 @@ int f2fs_acl_chmod(struct inode *inode)
299 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb); 299 struct f2fs_sb_info *sbi = F2FS_SB(inode->i_sb);
300 struct posix_acl *acl; 300 struct posix_acl *acl;
301 int error; 301 int error;
302 mode_t mode = get_inode_mode(inode); 302 umode_t mode = get_inode_mode(inode);
303 303
304 if (!test_opt(sbi, POSIX_ACL)) 304 if (!test_opt(sbi, POSIX_ACL))
305 return 0; 305 return 0;
diff --git a/fs/f2fs/dir.c b/fs/f2fs/dir.c
index a1f38443ecee..1be948768e2f 100644
--- a/fs/f2fs/dir.c
+++ b/fs/f2fs/dir.c
@@ -60,7 +60,7 @@ static unsigned char f2fs_type_by_mode[S_IFMT >> S_SHIFT] = {
60 60
61static void set_de_type(struct f2fs_dir_entry *de, struct inode *inode) 61static void set_de_type(struct f2fs_dir_entry *de, struct inode *inode)
62{ 62{
63 mode_t mode = inode->i_mode; 63 umode_t mode = inode->i_mode;
64 de->file_type = f2fs_type_by_mode[(mode & S_IFMT) >> S_SHIFT]; 64 de->file_type = f2fs_type_by_mode[(mode & S_IFMT) >> S_SHIFT];
65} 65}
66 66
diff --git a/fs/f2fs/file.c b/fs/f2fs/file.c
index 958a46da19ae..db626282d424 100644
--- a/fs/f2fs/file.c
+++ b/fs/f2fs/file.c
@@ -590,7 +590,7 @@ long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
590 { 590 {
591 unsigned int oldflags; 591 unsigned int oldflags;
592 592
593 ret = mnt_want_write(filp->f_path.mnt); 593 ret = mnt_want_write_file(filp);
594 if (ret) 594 if (ret)
595 return ret; 595 return ret;
596 596
@@ -627,7 +627,7 @@ long f2fs_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
627 inode->i_ctime = CURRENT_TIME; 627 inode->i_ctime = CURRENT_TIME;
628 mark_inode_dirty(inode); 628 mark_inode_dirty(inode);
629out: 629out:
630 mnt_drop_write(filp->f_path.mnt); 630 mnt_drop_write_file(filp);
631 return ret; 631 return ret;
632 } 632 }
633 default: 633 default:
diff --git a/fs/fifo.c b/fs/fifo.c
deleted file mode 100644
index cf6f4345ceb0..000000000000
--- a/fs/fifo.c
+++ /dev/null
@@ -1,153 +0,0 @@
1/*
2 * linux/fs/fifo.c
3 *
4 * written by Paul H. Hargrove
5 *
6 * Fixes:
7 * 10-06-1999, AV: fixed OOM handling in fifo_open(), moved
8 * initialization there, switched to external
9 * allocation of pipe_inode_info.
10 */
11
12#include <linux/mm.h>
13#include <linux/fs.h>
14#include <linux/sched.h>
15#include <linux/pipe_fs_i.h>
16
17static int wait_for_partner(struct inode* inode, unsigned int *cnt)
18{
19 int cur = *cnt;
20
21 while (cur == *cnt) {
22 pipe_wait(inode->i_pipe);
23 if (signal_pending(current))
24 break;
25 }
26 return cur == *cnt ? -ERESTARTSYS : 0;
27}
28
29static void wake_up_partner(struct inode* inode)
30{
31 wake_up_interruptible(&inode->i_pipe->wait);
32}
33
34static int fifo_open(struct inode *inode, struct file *filp)
35{
36 struct pipe_inode_info *pipe;
37 int ret;
38
39 mutex_lock(&inode->i_mutex);
40 pipe = inode->i_pipe;
41 if (!pipe) {
42 ret = -ENOMEM;
43 pipe = alloc_pipe_info(inode);
44 if (!pipe)
45 goto err_nocleanup;
46 inode->i_pipe = pipe;
47 }
48 filp->f_version = 0;
49
50 /* We can only do regular read/write on fifos */
51 filp->f_mode &= (FMODE_READ | FMODE_WRITE);
52
53 switch (filp->f_mode) {
54 case FMODE_READ:
55 /*
56 * O_RDONLY
57 * POSIX.1 says that O_NONBLOCK means return with the FIFO
58 * opened, even when there is no process writing the FIFO.
59 */
60 filp->f_op = &read_pipefifo_fops;
61 pipe->r_counter++;
62 if (pipe->readers++ == 0)
63 wake_up_partner(inode);
64
65 if (!pipe->writers) {
66 if ((filp->f_flags & O_NONBLOCK)) {
67 /* suppress POLLHUP until we have
68 * seen a writer */
69 filp->f_version = pipe->w_counter;
70 } else {
71 if (wait_for_partner(inode, &pipe->w_counter))
72 goto err_rd;
73 }
74 }
75 break;
76
77 case FMODE_WRITE:
78 /*
79 * O_WRONLY
80 * POSIX.1 says that O_NONBLOCK means return -1 with
81 * errno=ENXIO when there is no process reading the FIFO.
82 */
83 ret = -ENXIO;
84 if ((filp->f_flags & O_NONBLOCK) && !pipe->readers)
85 goto err;
86
87 filp->f_op = &write_pipefifo_fops;
88 pipe->w_counter++;
89 if (!pipe->writers++)
90 wake_up_partner(inode);
91
92 if (!pipe->readers) {
93 if (wait_for_partner(inode, &pipe->r_counter))
94 goto err_wr;
95 }
96 break;
97
98 case FMODE_READ | FMODE_WRITE:
99 /*
100 * O_RDWR
101 * POSIX.1 leaves this case "undefined" when O_NONBLOCK is set.
102 * This implementation will NEVER block on a O_RDWR open, since
103 * the process can at least talk to itself.
104 */
105 filp->f_op = &rdwr_pipefifo_fops;
106
107 pipe->readers++;
108 pipe->writers++;
109 pipe->r_counter++;
110 pipe->w_counter++;
111 if (pipe->readers == 1 || pipe->writers == 1)
112 wake_up_partner(inode);
113 break;
114
115 default:
116 ret = -EINVAL;
117 goto err;
118 }
119
120 /* Ok! */
121 mutex_unlock(&inode->i_mutex);
122 return 0;
123
124err_rd:
125 if (!--pipe->readers)
126 wake_up_interruptible(&pipe->wait);
127 ret = -ERESTARTSYS;
128 goto err;
129
130err_wr:
131 if (!--pipe->writers)
132 wake_up_interruptible(&pipe->wait);
133 ret = -ERESTARTSYS;
134 goto err;
135
136err:
137 if (!pipe->readers && !pipe->writers)
138 free_pipe_info(inode);
139
140err_nocleanup:
141 mutex_unlock(&inode->i_mutex);
142 return ret;
143}
144
145/*
146 * Dummy default file-operations: the only thing this does
147 * is contain the open that then fills in the correct operations
148 * depending on the access mode of the file...
149 */
150const struct file_operations def_fifo_fops = {
151 .open = fifo_open, /* will set read_ or write_pipefifo_fops */
152 .llseek = noop_llseek,
153};
diff --git a/fs/file.c b/fs/file.c
index 3906d9577a18..4a78f981557a 100644
--- a/fs/file.c
+++ b/fs/file.c
@@ -23,24 +23,10 @@
23#include <linux/rcupdate.h> 23#include <linux/rcupdate.h>
24#include <linux/workqueue.h> 24#include <linux/workqueue.h>
25 25
26struct fdtable_defer {
27 spinlock_t lock;
28 struct work_struct wq;
29 struct fdtable *next;
30};
31
32int sysctl_nr_open __read_mostly = 1024*1024; 26int sysctl_nr_open __read_mostly = 1024*1024;
33int sysctl_nr_open_min = BITS_PER_LONG; 27int sysctl_nr_open_min = BITS_PER_LONG;
34int sysctl_nr_open_max = 1024 * 1024; /* raised later */ 28int sysctl_nr_open_max = 1024 * 1024; /* raised later */
35 29
36/*
37 * We use this list to defer free fdtables that have vmalloced
38 * sets/arrays. By keeping a per-cpu list, we avoid having to embed
39 * the work_struct in fdtable itself which avoids a 64 byte (i386) increase in
40 * this per-task structure.
41 */
42static DEFINE_PER_CPU(struct fdtable_defer, fdtable_defer_list);
43
44static void *alloc_fdmem(size_t size) 30static void *alloc_fdmem(size_t size)
45{ 31{
46 /* 32 /*
@@ -67,46 +53,9 @@ static void __free_fdtable(struct fdtable *fdt)
67 kfree(fdt); 53 kfree(fdt);
68} 54}
69 55
70static void free_fdtable_work(struct work_struct *work)
71{
72 struct fdtable_defer *f =
73 container_of(work, struct fdtable_defer, wq);
74 struct fdtable *fdt;
75
76 spin_lock_bh(&f->lock);
77 fdt = f->next;
78 f->next = NULL;
79 spin_unlock_bh(&f->lock);
80 while(fdt) {
81 struct fdtable *next = fdt->next;
82
83 __free_fdtable(fdt);
84 fdt = next;
85 }
86}
87
88static void free_fdtable_rcu(struct rcu_head *rcu) 56static void free_fdtable_rcu(struct rcu_head *rcu)
89{ 57{
90 struct fdtable *fdt = container_of(rcu, struct fdtable, rcu); 58 __free_fdtable(container_of(rcu, struct fdtable, rcu));
91 struct fdtable_defer *fddef;
92
93 BUG_ON(!fdt);
94 BUG_ON(fdt->max_fds <= NR_OPEN_DEFAULT);
95
96 if (!is_vmalloc_addr(fdt->fd) && !is_vmalloc_addr(fdt->open_fds)) {
97 kfree(fdt->fd);
98 kfree(fdt->open_fds);
99 kfree(fdt);
100 } else {
101 fddef = &get_cpu_var(fdtable_defer_list);
102 spin_lock(&fddef->lock);
103 fdt->next = fddef->next;
104 fddef->next = fdt;
105 /* vmallocs are handled from the workqueue context */
106 schedule_work(&fddef->wq);
107 spin_unlock(&fddef->lock);
108 put_cpu_var(fdtable_defer_list);
109 }
110} 59}
111 60
112/* 61/*
@@ -174,7 +123,6 @@ static struct fdtable * alloc_fdtable(unsigned int nr)
174 fdt->open_fds = data; 123 fdt->open_fds = data;
175 data += nr / BITS_PER_BYTE; 124 data += nr / BITS_PER_BYTE;
176 fdt->close_on_exec = data; 125 fdt->close_on_exec = data;
177 fdt->next = NULL;
178 126
179 return fdt; 127 return fdt;
180 128
@@ -221,7 +169,7 @@ static int expand_fdtable(struct files_struct *files, int nr)
221 /* Continue as planned */ 169 /* Continue as planned */
222 copy_fdtable(new_fdt, cur_fdt); 170 copy_fdtable(new_fdt, cur_fdt);
223 rcu_assign_pointer(files->fdt, new_fdt); 171 rcu_assign_pointer(files->fdt, new_fdt);
224 if (cur_fdt->max_fds > NR_OPEN_DEFAULT) 172 if (cur_fdt != &files->fdtab)
225 call_rcu(&cur_fdt->rcu, free_fdtable_rcu); 173 call_rcu(&cur_fdt->rcu, free_fdtable_rcu);
226 } else { 174 } else {
227 /* Somebody else expanded, so undo our attempt */ 175 /* Somebody else expanded, so undo our attempt */
@@ -316,7 +264,6 @@ struct files_struct *dup_fd(struct files_struct *oldf, int *errorp)
316 new_fdt->close_on_exec = newf->close_on_exec_init; 264 new_fdt->close_on_exec = newf->close_on_exec_init;
317 new_fdt->open_fds = newf->open_fds_init; 265 new_fdt->open_fds = newf->open_fds_init;
318 new_fdt->fd = &newf->fd_array[0]; 266 new_fdt->fd = &newf->fd_array[0];
319 new_fdt->next = NULL;
320 267
321 spin_lock(&oldf->file_lock); 268 spin_lock(&oldf->file_lock);
322 old_fdt = files_fdtable(oldf); 269 old_fdt = files_fdtable(oldf);
@@ -490,19 +437,8 @@ void exit_files(struct task_struct *tsk)
490 } 437 }
491} 438}
492 439
493static void fdtable_defer_list_init(int cpu)
494{
495 struct fdtable_defer *fddef = &per_cpu(fdtable_defer_list, cpu);
496 spin_lock_init(&fddef->lock);
497 INIT_WORK(&fddef->wq, free_fdtable_work);
498 fddef->next = NULL;
499}
500
501void __init files_defer_init(void) 440void __init files_defer_init(void)
502{ 441{
503 int i;
504 for_each_possible_cpu(i)
505 fdtable_defer_list_init(i);
506 sysctl_nr_open_max = min((size_t)INT_MAX, ~(size_t)0/sizeof(void *)) & 442 sysctl_nr_open_max = min((size_t)INT_MAX, ~(size_t)0/sizeof(void *)) &
507 -BITS_PER_LONG; 443 -BITS_PER_LONG;
508} 444}
diff --git a/fs/fuse/dev.c b/fs/fuse/dev.c
index 11dfa0c3fb46..9bfd1a3214e6 100644
--- a/fs/fuse/dev.c
+++ b/fs/fuse/dev.c
@@ -1319,7 +1319,7 @@ static ssize_t fuse_dev_splice_read(struct file *in, loff_t *ppos,
1319 page_nr++; 1319 page_nr++;
1320 ret += buf->len; 1320 ret += buf->len;
1321 1321
1322 if (pipe->inode) 1322 if (pipe->files)
1323 do_wakeup = 1; 1323 do_wakeup = 1;
1324 } 1324 }
1325 1325
diff --git a/fs/fuse/file.c b/fs/fuse/file.c
index 34b80ba95bad..d15c6f21c17f 100644
--- a/fs/fuse/file.c
+++ b/fs/fuse/file.c
@@ -971,7 +971,6 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
971 return err; 971 return err;
972 972
973 count = ocount; 973 count = ocount;
974 sb_start_write(inode->i_sb);
975 mutex_lock(&inode->i_mutex); 974 mutex_lock(&inode->i_mutex);
976 975
977 /* We can write back this queue in page reclaim */ 976 /* We can write back this queue in page reclaim */
@@ -1030,7 +1029,6 @@ static ssize_t fuse_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
1030out: 1029out:
1031 current->backing_dev_info = NULL; 1030 current->backing_dev_info = NULL;
1032 mutex_unlock(&inode->i_mutex); 1031 mutex_unlock(&inode->i_mutex);
1033 sb_end_write(inode->i_sb);
1034 1032
1035 return written ? written : err; 1033 return written ? written : err;
1036} 1034}
diff --git a/fs/hpfs/file.c b/fs/hpfs/file.c
index 9f9dbeceeee7..3027f4dbbab5 100644
--- a/fs/hpfs/file.c
+++ b/fs/hpfs/file.c
@@ -131,6 +131,24 @@ static int hpfs_write_begin(struct file *file, struct address_space *mapping,
131 return ret; 131 return ret;
132} 132}
133 133
134static int hpfs_write_end(struct file *file, struct address_space *mapping,
135 loff_t pos, unsigned len, unsigned copied,
136 struct page *pagep, void *fsdata)
137{
138 struct inode *inode = mapping->host;
139 int err;
140 err = generic_write_end(file, mapping, pos, len, copied, pagep, fsdata);
141 if (err < len)
142 hpfs_write_failed(mapping, pos + len);
143 if (!(err < 0)) {
144 /* make sure we write it on close, if not earlier */
145 hpfs_lock(inode->i_sb);
146 hpfs_i(inode)->i_dirty = 1;
147 hpfs_unlock(inode->i_sb);
148 }
149 return err;
150}
151
134static sector_t _hpfs_bmap(struct address_space *mapping, sector_t block) 152static sector_t _hpfs_bmap(struct address_space *mapping, sector_t block)
135{ 153{
136 return generic_block_bmap(mapping,block,hpfs_get_block); 154 return generic_block_bmap(mapping,block,hpfs_get_block);
@@ -140,30 +158,16 @@ const struct address_space_operations hpfs_aops = {
140 .readpage = hpfs_readpage, 158 .readpage = hpfs_readpage,
141 .writepage = hpfs_writepage, 159 .writepage = hpfs_writepage,
142 .write_begin = hpfs_write_begin, 160 .write_begin = hpfs_write_begin,
143 .write_end = generic_write_end, 161 .write_end = hpfs_write_end,
144 .bmap = _hpfs_bmap 162 .bmap = _hpfs_bmap
145}; 163};
146 164
147static ssize_t hpfs_file_write(struct file *file, const char __user *buf,
148 size_t count, loff_t *ppos)
149{
150 ssize_t retval;
151
152 retval = do_sync_write(file, buf, count, ppos);
153 if (retval > 0) {
154 hpfs_lock(file->f_path.dentry->d_sb);
155 hpfs_i(file_inode(file))->i_dirty = 1;
156 hpfs_unlock(file->f_path.dentry->d_sb);
157 }
158 return retval;
159}
160
161const struct file_operations hpfs_file_ops = 165const struct file_operations hpfs_file_ops =
162{ 166{
163 .llseek = generic_file_llseek, 167 .llseek = generic_file_llseek,
164 .read = do_sync_read, 168 .read = do_sync_read,
165 .aio_read = generic_file_aio_read, 169 .aio_read = generic_file_aio_read,
166 .write = hpfs_file_write, 170 .write = do_sync_write,
167 .aio_write = generic_file_aio_write, 171 .aio_write = generic_file_aio_write,
168 .mmap = generic_file_mmap, 172 .mmap = generic_file_mmap,
169 .release = hpfs_file_release, 173 .release = hpfs_file_release,
diff --git a/fs/hppfs/hppfs.c b/fs/hppfs/hppfs.c
index 126d3c2e2dee..cd3e38972c86 100644
--- a/fs/hppfs/hppfs.c
+++ b/fs/hppfs/hppfs.c
@@ -436,7 +436,6 @@ static int hppfs_open(struct inode *inode, struct file *file)
436 path.mnt = inode->i_sb->s_fs_info; 436 path.mnt = inode->i_sb->s_fs_info;
437 path.dentry = HPPFS_I(inode)->proc_dentry; 437 path.dentry = HPPFS_I(inode)->proc_dentry;
438 438
439 /* XXX This isn't closed anywhere */
440 data->proc_file = dentry_open(&path, file_mode(file->f_mode), cred); 439 data->proc_file = dentry_open(&path, file_mode(file->f_mode), cred);
441 err = PTR_ERR(data->proc_file); 440 err = PTR_ERR(data->proc_file);
442 if (IS_ERR(data->proc_file)) 441 if (IS_ERR(data->proc_file))
@@ -523,12 +522,23 @@ static loff_t hppfs_llseek(struct file *file, loff_t off, int where)
523 return default_llseek(file, off, where); 522 return default_llseek(file, off, where);
524} 523}
525 524
525static int hppfs_release(struct inode *inode, struct file *file)
526{
527 struct hppfs_private *data = file->private_data;
528 struct file *proc_file = data->proc_file;
529 if (proc_file)
530 fput(proc_file);
531 kfree(data);
532 return 0;
533}
534
526static const struct file_operations hppfs_file_fops = { 535static const struct file_operations hppfs_file_fops = {
527 .owner = NULL, 536 .owner = NULL,
528 .llseek = hppfs_llseek, 537 .llseek = hppfs_llseek,
529 .read = hppfs_read, 538 .read = hppfs_read,
530 .write = hppfs_write, 539 .write = hppfs_write,
531 .open = hppfs_open, 540 .open = hppfs_open,
541 .release = hppfs_release,
532}; 542};
533 543
534struct hppfs_dirent { 544struct hppfs_dirent {
@@ -570,18 +580,12 @@ static int hppfs_readdir(struct file *file, void *ent, filldir_t filldir)
570 return err; 580 return err;
571} 581}
572 582
573static int hppfs_fsync(struct file *file, loff_t start, loff_t end,
574 int datasync)
575{
576 return filemap_write_and_wait_range(file->f_mapping, start, end);
577}
578
579static const struct file_operations hppfs_dir_fops = { 583static const struct file_operations hppfs_dir_fops = {
580 .owner = NULL, 584 .owner = NULL,
581 .readdir = hppfs_readdir, 585 .readdir = hppfs_readdir,
582 .open = hppfs_dir_open, 586 .open = hppfs_dir_open,
583 .fsync = hppfs_fsync,
584 .llseek = default_llseek, 587 .llseek = default_llseek,
588 .release = hppfs_release,
585}; 589};
586 590
587static int hppfs_statfs(struct dentry *dentry, struct kstatfs *sf) 591static int hppfs_statfs(struct dentry *dentry, struct kstatfs *sf)
diff --git a/fs/inode.c b/fs/inode.c
index a898b3d43ccf..00d5fc3b86e1 100644
--- a/fs/inode.c
+++ b/fs/inode.c
@@ -1803,7 +1803,7 @@ void init_special_inode(struct inode *inode, umode_t mode, dev_t rdev)
1803 inode->i_fop = &def_blk_fops; 1803 inode->i_fop = &def_blk_fops;
1804 inode->i_rdev = rdev; 1804 inode->i_rdev = rdev;
1805 } else if (S_ISFIFO(mode)) 1805 } else if (S_ISFIFO(mode))
1806 inode->i_fop = &def_fifo_fops; 1806 inode->i_fop = &pipefifo_fops;
1807 else if (S_ISSOCK(mode)) 1807 else if (S_ISSOCK(mode))
1808 inode->i_fop = &bad_sock_fops; 1808 inode->i_fop = &bad_sock_fops;
1809 else 1809 else
diff --git a/fs/internal.h b/fs/internal.h
index 4be78237d896..eaa75f75b625 100644
--- a/fs/internal.h
+++ b/fs/internal.h
@@ -130,3 +130,8 @@ extern struct dentry *__d_alloc(struct super_block *, const struct qstr *);
130 * read_write.c 130 * read_write.c
131 */ 131 */
132extern ssize_t __kernel_write(struct file *, const char *, size_t, loff_t *); 132extern ssize_t __kernel_write(struct file *, const char *, size_t, loff_t *);
133
134/*
135 * pipe.c
136 */
137extern const struct file_operations pipefifo_fops;
diff --git a/fs/jbd2/journal.c b/fs/jbd2/journal.c
index f6c5ba027f4f..95457576e434 100644
--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -979,7 +979,7 @@ static const struct seq_operations jbd2_seq_info_ops = {
979 979
980static int jbd2_seq_info_open(struct inode *inode, struct file *file) 980static int jbd2_seq_info_open(struct inode *inode, struct file *file)
981{ 981{
982 journal_t *journal = PDE(inode)->data; 982 journal_t *journal = PDE_DATA(inode);
983 struct jbd2_stats_proc_session *s; 983 struct jbd2_stats_proc_session *s;
984 int rc, size; 984 int rc, size;
985 985
diff --git a/fs/mount.h b/fs/mount.h
index cd5007980400..64a858143ff9 100644
--- a/fs/mount.h
+++ b/fs/mount.h
@@ -18,6 +18,12 @@ struct mnt_pcp {
18 int mnt_writers; 18 int mnt_writers;
19}; 19};
20 20
21struct mountpoint {
22 struct list_head m_hash;
23 struct dentry *m_dentry;
24 int m_count;
25};
26
21struct mount { 27struct mount {
22 struct list_head mnt_hash; 28 struct list_head mnt_hash;
23 struct mount *mnt_parent; 29 struct mount *mnt_parent;
@@ -40,6 +46,7 @@ struct mount {
40 struct list_head mnt_slave; /* slave list entry */ 46 struct list_head mnt_slave; /* slave list entry */
41 struct mount *mnt_master; /* slave is on master->mnt_slave_list */ 47 struct mount *mnt_master; /* slave is on master->mnt_slave_list */
42 struct mnt_namespace *mnt_ns; /* containing namespace */ 48 struct mnt_namespace *mnt_ns; /* containing namespace */
49 struct mountpoint *mnt_mp; /* where is it mounted */
43#ifdef CONFIG_FSNOTIFY 50#ifdef CONFIG_FSNOTIFY
44 struct hlist_head mnt_fsnotify_marks; 51 struct hlist_head mnt_fsnotify_marks;
45 __u32 mnt_fsnotify_mask; 52 __u32 mnt_fsnotify_mask;
diff --git a/fs/namespace.c b/fs/namespace.c
index 341d3f564082..b4f96a5230a3 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -21,7 +21,8 @@
21#include <linux/fs_struct.h> /* get_fs_root et.al. */ 21#include <linux/fs_struct.h> /* get_fs_root et.al. */
22#include <linux/fsnotify.h> /* fsnotify_vfsmount_delete */ 22#include <linux/fsnotify.h> /* fsnotify_vfsmount_delete */
23#include <linux/uaccess.h> 23#include <linux/uaccess.h>
24#include <linux/proc_fs.h> 24#include <linux/proc_ns.h>
25#include <linux/magic.h>
25#include "pnode.h" 26#include "pnode.h"
26#include "internal.h" 27#include "internal.h"
27 28
@@ -36,6 +37,7 @@ static int mnt_id_start = 0;
36static int mnt_group_start = 1; 37static int mnt_group_start = 1;
37 38
38static struct list_head *mount_hashtable __read_mostly; 39static struct list_head *mount_hashtable __read_mostly;
40static struct list_head *mountpoint_hashtable __read_mostly;
39static struct kmem_cache *mnt_cache __read_mostly; 41static struct kmem_cache *mnt_cache __read_mostly;
40static struct rw_semaphore namespace_sem; 42static struct rw_semaphore namespace_sem;
41 43
@@ -605,6 +607,51 @@ struct vfsmount *lookup_mnt(struct path *path)
605 } 607 }
606} 608}
607 609
610static struct mountpoint *new_mountpoint(struct dentry *dentry)
611{
612 struct list_head *chain = mountpoint_hashtable + hash(NULL, dentry);
613 struct mountpoint *mp;
614
615 list_for_each_entry(mp, chain, m_hash) {
616 if (mp->m_dentry == dentry) {
617 /* might be worth a WARN_ON() */
618 if (d_unlinked(dentry))
619 return ERR_PTR(-ENOENT);
620 mp->m_count++;
621 return mp;
622 }
623 }
624
625 mp = kmalloc(sizeof(struct mountpoint), GFP_KERNEL);
626 if (!mp)
627 return ERR_PTR(-ENOMEM);
628
629 spin_lock(&dentry->d_lock);
630 if (d_unlinked(dentry)) {
631 spin_unlock(&dentry->d_lock);
632 kfree(mp);
633 return ERR_PTR(-ENOENT);
634 }
635 dentry->d_flags |= DCACHE_MOUNTED;
636 spin_unlock(&dentry->d_lock);
637 mp->m_dentry = dentry;
638 mp->m_count = 1;
639 list_add(&mp->m_hash, chain);
640 return mp;
641}
642
643static void put_mountpoint(struct mountpoint *mp)
644{
645 if (!--mp->m_count) {
646 struct dentry *dentry = mp->m_dentry;
647 spin_lock(&dentry->d_lock);
648 dentry->d_flags &= ~DCACHE_MOUNTED;
649 spin_unlock(&dentry->d_lock);
650 list_del(&mp->m_hash);
651 kfree(mp);
652 }
653}
654
608static inline int check_mnt(struct mount *mnt) 655static inline int check_mnt(struct mount *mnt)
609{ 656{
610 return mnt->mnt_ns == current->nsproxy->mnt_ns; 657 return mnt->mnt_ns == current->nsproxy->mnt_ns;
@@ -633,27 +680,6 @@ static void __touch_mnt_namespace(struct mnt_namespace *ns)
633} 680}
634 681
635/* 682/*
636 * Clear dentry's mounted state if it has no remaining mounts.
637 * vfsmount_lock must be held for write.
638 */
639static void dentry_reset_mounted(struct dentry *dentry)
640{
641 unsigned u;
642
643 for (u = 0; u < HASH_SIZE; u++) {
644 struct mount *p;
645
646 list_for_each_entry(p, &mount_hashtable[u], mnt_hash) {
647 if (p->mnt_mountpoint == dentry)
648 return;
649 }
650 }
651 spin_lock(&dentry->d_lock);
652 dentry->d_flags &= ~DCACHE_MOUNTED;
653 spin_unlock(&dentry->d_lock);
654}
655
656/*
657 * vfsmount lock must be held for write 683 * vfsmount lock must be held for write
658 */ 684 */
659static void detach_mnt(struct mount *mnt, struct path *old_path) 685static void detach_mnt(struct mount *mnt, struct path *old_path)
@@ -664,32 +690,35 @@ static void detach_mnt(struct mount *mnt, struct path *old_path)
664 mnt->mnt_mountpoint = mnt->mnt.mnt_root; 690 mnt->mnt_mountpoint = mnt->mnt.mnt_root;
665 list_del_init(&mnt->mnt_child); 691 list_del_init(&mnt->mnt_child);
666 list_del_init(&mnt->mnt_hash); 692 list_del_init(&mnt->mnt_hash);
667 dentry_reset_mounted(old_path->dentry); 693 put_mountpoint(mnt->mnt_mp);
694 mnt->mnt_mp = NULL;
668} 695}
669 696
670/* 697/*
671 * vfsmount lock must be held for write 698 * vfsmount lock must be held for write
672 */ 699 */
673void mnt_set_mountpoint(struct mount *mnt, struct dentry *dentry, 700void mnt_set_mountpoint(struct mount *mnt,
701 struct mountpoint *mp,
674 struct mount *child_mnt) 702 struct mount *child_mnt)
675{ 703{
704 mp->m_count++;
676 mnt_add_count(mnt, 1); /* essentially, that's mntget */ 705 mnt_add_count(mnt, 1); /* essentially, that's mntget */
677 child_mnt->mnt_mountpoint = dget(dentry); 706 child_mnt->mnt_mountpoint = dget(mp->m_dentry);
678 child_mnt->mnt_parent = mnt; 707 child_mnt->mnt_parent = mnt;
679 spin_lock(&dentry->d_lock); 708 child_mnt->mnt_mp = mp;
680 dentry->d_flags |= DCACHE_MOUNTED;
681 spin_unlock(&dentry->d_lock);
682} 709}
683 710
684/* 711/*
685 * vfsmount lock must be held for write 712 * vfsmount lock must be held for write
686 */ 713 */
687static void attach_mnt(struct mount *mnt, struct path *path) 714static void attach_mnt(struct mount *mnt,
715 struct mount *parent,
716 struct mountpoint *mp)
688{ 717{
689 mnt_set_mountpoint(real_mount(path->mnt), path->dentry, mnt); 718 mnt_set_mountpoint(parent, mp, mnt);
690 list_add_tail(&mnt->mnt_hash, mount_hashtable + 719 list_add_tail(&mnt->mnt_hash, mount_hashtable +
691 hash(path->mnt, path->dentry)); 720 hash(&parent->mnt, mp->m_dentry));
692 list_add_tail(&mnt->mnt_child, &real_mount(path->mnt)->mnt_mounts); 721 list_add_tail(&mnt->mnt_child, &parent->mnt_mounts);
693} 722}
694 723
695/* 724/*
@@ -1095,11 +1124,23 @@ int may_umount(struct vfsmount *mnt)
1095 1124
1096EXPORT_SYMBOL(may_umount); 1125EXPORT_SYMBOL(may_umount);
1097 1126
1098void release_mounts(struct list_head *head) 1127static LIST_HEAD(unmounted); /* protected by namespace_sem */
1128
1129static void namespace_unlock(void)
1099{ 1130{
1100 struct mount *mnt; 1131 struct mount *mnt;
1101 while (!list_empty(head)) { 1132 LIST_HEAD(head);
1102 mnt = list_first_entry(head, struct mount, mnt_hash); 1133
1134 if (likely(list_empty(&unmounted))) {
1135 up_write(&namespace_sem);
1136 return;
1137 }
1138
1139 list_splice_init(&unmounted, &head);
1140 up_write(&namespace_sem);
1141
1142 while (!list_empty(&head)) {
1143 mnt = list_first_entry(&head, struct mount, mnt_hash);
1103 list_del_init(&mnt->mnt_hash); 1144 list_del_init(&mnt->mnt_hash);
1104 if (mnt_has_parent(mnt)) { 1145 if (mnt_has_parent(mnt)) {
1105 struct dentry *dentry; 1146 struct dentry *dentry;
@@ -1119,11 +1160,16 @@ void release_mounts(struct list_head *head)
1119 } 1160 }
1120} 1161}
1121 1162
1163static inline void namespace_lock(void)
1164{
1165 down_write(&namespace_sem);
1166}
1167
1122/* 1168/*
1123 * vfsmount lock must be held for write 1169 * vfsmount lock must be held for write
1124 * namespace_sem must be held for write 1170 * namespace_sem must be held for write
1125 */ 1171 */
1126void umount_tree(struct mount *mnt, int propagate, struct list_head *kill) 1172void umount_tree(struct mount *mnt, int propagate)
1127{ 1173{
1128 LIST_HEAD(tmp_list); 1174 LIST_HEAD(tmp_list);
1129 struct mount *p; 1175 struct mount *p;
@@ -1142,20 +1188,20 @@ void umount_tree(struct mount *mnt, int propagate, struct list_head *kill)
1142 list_del_init(&p->mnt_child); 1188 list_del_init(&p->mnt_child);
1143 if (mnt_has_parent(p)) { 1189 if (mnt_has_parent(p)) {
1144 p->mnt_parent->mnt_ghosts++; 1190 p->mnt_parent->mnt_ghosts++;
1145 dentry_reset_mounted(p->mnt_mountpoint); 1191 put_mountpoint(p->mnt_mp);
1192 p->mnt_mp = NULL;
1146 } 1193 }
1147 change_mnt_propagation(p, MS_PRIVATE); 1194 change_mnt_propagation(p, MS_PRIVATE);
1148 } 1195 }
1149 list_splice(&tmp_list, kill); 1196 list_splice(&tmp_list, &unmounted);
1150} 1197}
1151 1198
1152static void shrink_submounts(struct mount *mnt, struct list_head *umounts); 1199static void shrink_submounts(struct mount *mnt);
1153 1200
1154static int do_umount(struct mount *mnt, int flags) 1201static int do_umount(struct mount *mnt, int flags)
1155{ 1202{
1156 struct super_block *sb = mnt->mnt.mnt_sb; 1203 struct super_block *sb = mnt->mnt.mnt_sb;
1157 int retval; 1204 int retval;
1158 LIST_HEAD(umount_list);
1159 1205
1160 retval = security_sb_umount(&mnt->mnt, flags); 1206 retval = security_sb_umount(&mnt->mnt, flags);
1161 if (retval) 1207 if (retval)
@@ -1222,22 +1268,21 @@ static int do_umount(struct mount *mnt, int flags)
1222 return retval; 1268 return retval;
1223 } 1269 }
1224 1270
1225 down_write(&namespace_sem); 1271 namespace_lock();
1226 br_write_lock(&vfsmount_lock); 1272 br_write_lock(&vfsmount_lock);
1227 event++; 1273 event++;
1228 1274
1229 if (!(flags & MNT_DETACH)) 1275 if (!(flags & MNT_DETACH))
1230 shrink_submounts(mnt, &umount_list); 1276 shrink_submounts(mnt);
1231 1277
1232 retval = -EBUSY; 1278 retval = -EBUSY;
1233 if (flags & MNT_DETACH || !propagate_mount_busy(mnt, 2)) { 1279 if (flags & MNT_DETACH || !propagate_mount_busy(mnt, 2)) {
1234 if (!list_empty(&mnt->mnt_list)) 1280 if (!list_empty(&mnt->mnt_list))
1235 umount_tree(mnt, 1, &umount_list); 1281 umount_tree(mnt, 1);
1236 retval = 0; 1282 retval = 0;
1237 } 1283 }
1238 br_write_unlock(&vfsmount_lock); 1284 br_write_unlock(&vfsmount_lock);
1239 up_write(&namespace_sem); 1285 namespace_unlock();
1240 release_mounts(&umount_list);
1241 return retval; 1286 return retval;
1242} 1287}
1243 1288
@@ -1310,13 +1355,13 @@ static bool mnt_ns_loop(struct path *path)
1310 * mount namespace loop? 1355 * mount namespace loop?
1311 */ 1356 */
1312 struct inode *inode = path->dentry->d_inode; 1357 struct inode *inode = path->dentry->d_inode;
1313 struct proc_inode *ei; 1358 struct proc_ns *ei;
1314 struct mnt_namespace *mnt_ns; 1359 struct mnt_namespace *mnt_ns;
1315 1360
1316 if (!proc_ns_inode(inode)) 1361 if (!proc_ns_inode(inode))
1317 return false; 1362 return false;
1318 1363
1319 ei = PROC_I(inode); 1364 ei = get_proc_ns(inode);
1320 if (ei->ns_ops != &mntns_operations) 1365 if (ei->ns_ops != &mntns_operations)
1321 return false; 1366 return false;
1322 1367
@@ -1327,8 +1372,7 @@ static bool mnt_ns_loop(struct path *path)
1327struct mount *copy_tree(struct mount *mnt, struct dentry *dentry, 1372struct mount *copy_tree(struct mount *mnt, struct dentry *dentry,
1328 int flag) 1373 int flag)
1329{ 1374{
1330 struct mount *res, *p, *q, *r; 1375 struct mount *res, *p, *q, *r, *parent;
1331 struct path path;
1332 1376
1333 if (!(flag & CL_COPY_ALL) && IS_MNT_UNBINDABLE(mnt)) 1377 if (!(flag & CL_COPY_ALL) && IS_MNT_UNBINDABLE(mnt))
1334 return ERR_PTR(-EINVAL); 1378 return ERR_PTR(-EINVAL);
@@ -1355,25 +1399,22 @@ struct mount *copy_tree(struct mount *mnt, struct dentry *dentry,
1355 q = q->mnt_parent; 1399 q = q->mnt_parent;
1356 } 1400 }
1357 p = s; 1401 p = s;
1358 path.mnt = &q->mnt; 1402 parent = q;
1359 path.dentry = p->mnt_mountpoint;
1360 q = clone_mnt(p, p->mnt.mnt_root, flag); 1403 q = clone_mnt(p, p->mnt.mnt_root, flag);
1361 if (IS_ERR(q)) 1404 if (IS_ERR(q))
1362 goto out; 1405 goto out;
1363 br_write_lock(&vfsmount_lock); 1406 br_write_lock(&vfsmount_lock);
1364 list_add_tail(&q->mnt_list, &res->mnt_list); 1407 list_add_tail(&q->mnt_list, &res->mnt_list);
1365 attach_mnt(q, &path); 1408 attach_mnt(q, parent, p->mnt_mp);
1366 br_write_unlock(&vfsmount_lock); 1409 br_write_unlock(&vfsmount_lock);
1367 } 1410 }
1368 } 1411 }
1369 return res; 1412 return res;
1370out: 1413out:
1371 if (res) { 1414 if (res) {
1372 LIST_HEAD(umount_list);
1373 br_write_lock(&vfsmount_lock); 1415 br_write_lock(&vfsmount_lock);
1374 umount_tree(res, 0, &umount_list); 1416 umount_tree(res, 0);
1375 br_write_unlock(&vfsmount_lock); 1417 br_write_unlock(&vfsmount_lock);
1376 release_mounts(&umount_list);
1377 } 1418 }
1378 return q; 1419 return q;
1379} 1420}
@@ -1383,10 +1424,10 @@ out:
1383struct vfsmount *collect_mounts(struct path *path) 1424struct vfsmount *collect_mounts(struct path *path)
1384{ 1425{
1385 struct mount *tree; 1426 struct mount *tree;
1386 down_write(&namespace_sem); 1427 namespace_lock();
1387 tree = copy_tree(real_mount(path->mnt), path->dentry, 1428 tree = copy_tree(real_mount(path->mnt), path->dentry,
1388 CL_COPY_ALL | CL_PRIVATE); 1429 CL_COPY_ALL | CL_PRIVATE);
1389 up_write(&namespace_sem); 1430 namespace_unlock();
1390 if (IS_ERR(tree)) 1431 if (IS_ERR(tree))
1391 return NULL; 1432 return NULL;
1392 return &tree->mnt; 1433 return &tree->mnt;
@@ -1394,13 +1435,11 @@ struct vfsmount *collect_mounts(struct path *path)
1394 1435
1395void drop_collected_mounts(struct vfsmount *mnt) 1436void drop_collected_mounts(struct vfsmount *mnt)
1396{ 1437{
1397 LIST_HEAD(umount_list); 1438 namespace_lock();
1398 down_write(&namespace_sem);
1399 br_write_lock(&vfsmount_lock); 1439 br_write_lock(&vfsmount_lock);
1400 umount_tree(real_mount(mnt), 0, &umount_list); 1440 umount_tree(real_mount(mnt), 0);
1401 br_write_unlock(&vfsmount_lock); 1441 br_write_unlock(&vfsmount_lock);
1402 up_write(&namespace_sem); 1442 namespace_unlock();
1403 release_mounts(&umount_list);
1404} 1443}
1405 1444
1406int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg, 1445int iterate_mounts(int (*f)(struct vfsmount *, void *), void *arg,
@@ -1509,11 +1548,11 @@ static int invent_group_ids(struct mount *mnt, bool recurse)
1509 * in allocations. 1548 * in allocations.
1510 */ 1549 */
1511static int attach_recursive_mnt(struct mount *source_mnt, 1550static int attach_recursive_mnt(struct mount *source_mnt,
1512 struct path *path, struct path *parent_path) 1551 struct mount *dest_mnt,
1552 struct mountpoint *dest_mp,
1553 struct path *parent_path)
1513{ 1554{
1514 LIST_HEAD(tree_list); 1555 LIST_HEAD(tree_list);
1515 struct mount *dest_mnt = real_mount(path->mnt);
1516 struct dentry *dest_dentry = path->dentry;
1517 struct mount *child, *p; 1556 struct mount *child, *p;
1518 int err; 1557 int err;
1519 1558
@@ -1522,7 +1561,7 @@ static int attach_recursive_mnt(struct mount *source_mnt,
1522 if (err) 1561 if (err)
1523 goto out; 1562 goto out;
1524 } 1563 }
1525 err = propagate_mnt(dest_mnt, dest_dentry, source_mnt, &tree_list); 1564 err = propagate_mnt(dest_mnt, dest_mp, source_mnt, &tree_list);
1526 if (err) 1565 if (err)
1527 goto out_cleanup_ids; 1566 goto out_cleanup_ids;
1528 1567
@@ -1534,10 +1573,10 @@ static int attach_recursive_mnt(struct mount *source_mnt,
1534 } 1573 }
1535 if (parent_path) { 1574 if (parent_path) {
1536 detach_mnt(source_mnt, parent_path); 1575 detach_mnt(source_mnt, parent_path);
1537 attach_mnt(source_mnt, path); 1576 attach_mnt(source_mnt, dest_mnt, dest_mp);
1538 touch_mnt_namespace(source_mnt->mnt_ns); 1577 touch_mnt_namespace(source_mnt->mnt_ns);
1539 } else { 1578 } else {
1540 mnt_set_mountpoint(dest_mnt, dest_dentry, source_mnt); 1579 mnt_set_mountpoint(dest_mnt, dest_mp, source_mnt);
1541 commit_tree(source_mnt); 1580 commit_tree(source_mnt);
1542 } 1581 }
1543 1582
@@ -1556,46 +1595,53 @@ static int attach_recursive_mnt(struct mount *source_mnt,
1556 return err; 1595 return err;
1557} 1596}
1558 1597
1559static int lock_mount(struct path *path) 1598static struct mountpoint *lock_mount(struct path *path)
1560{ 1599{
1561 struct vfsmount *mnt; 1600 struct vfsmount *mnt;
1601 struct dentry *dentry = path->dentry;
1562retry: 1602retry:
1563 mutex_lock(&path->dentry->d_inode->i_mutex); 1603 mutex_lock(&dentry->d_inode->i_mutex);
1564 if (unlikely(cant_mount(path->dentry))) { 1604 if (unlikely(cant_mount(dentry))) {
1565 mutex_unlock(&path->dentry->d_inode->i_mutex); 1605 mutex_unlock(&dentry->d_inode->i_mutex);
1566 return -ENOENT; 1606 return ERR_PTR(-ENOENT);
1567 } 1607 }
1568 down_write(&namespace_sem); 1608 namespace_lock();
1569 mnt = lookup_mnt(path); 1609 mnt = lookup_mnt(path);
1570 if (likely(!mnt)) 1610 if (likely(!mnt)) {
1571 return 0; 1611 struct mountpoint *mp = new_mountpoint(dentry);
1572 up_write(&namespace_sem); 1612 if (IS_ERR(mp)) {
1613 namespace_unlock();
1614 mutex_unlock(&dentry->d_inode->i_mutex);
1615 return mp;
1616 }
1617 return mp;
1618 }
1619 namespace_unlock();
1573 mutex_unlock(&path->dentry->d_inode->i_mutex); 1620 mutex_unlock(&path->dentry->d_inode->i_mutex);
1574 path_put(path); 1621 path_put(path);
1575 path->mnt = mnt; 1622 path->mnt = mnt;
1576 path->dentry = dget(mnt->mnt_root); 1623 dentry = path->dentry = dget(mnt->mnt_root);
1577 goto retry; 1624 goto retry;
1578} 1625}
1579 1626
1580static void unlock_mount(struct path *path) 1627static void unlock_mount(struct mountpoint *where)
1581{ 1628{
1582 up_write(&namespace_sem); 1629 struct dentry *dentry = where->m_dentry;
1583 mutex_unlock(&path->dentry->d_inode->i_mutex); 1630 put_mountpoint(where);
1631 namespace_unlock();
1632 mutex_unlock(&dentry->d_inode->i_mutex);
1584} 1633}
1585 1634
1586static int graft_tree(struct mount *mnt, struct path *path) 1635static int graft_tree(struct mount *mnt, struct mount *p, struct mountpoint *mp)
1587{ 1636{
1588 if (mnt->mnt.mnt_sb->s_flags & MS_NOUSER) 1637 if (mnt->mnt.mnt_sb->s_flags & MS_NOUSER)
1589 return -EINVAL; 1638 return -EINVAL;
1590 1639
1591 if (S_ISDIR(path->dentry->d_inode->i_mode) != 1640 if (S_ISDIR(mp->m_dentry->d_inode->i_mode) !=
1592 S_ISDIR(mnt->mnt.mnt_root->d_inode->i_mode)) 1641 S_ISDIR(mnt->mnt.mnt_root->d_inode->i_mode))
1593 return -ENOTDIR; 1642 return -ENOTDIR;
1594 1643
1595 if (d_unlinked(path->dentry)) 1644 return attach_recursive_mnt(mnt, p, mp, NULL);
1596 return -ENOENT;
1597
1598 return attach_recursive_mnt(mnt, path, NULL);
1599} 1645}
1600 1646
1601/* 1647/*
@@ -1633,7 +1679,7 @@ static int do_change_type(struct path *path, int flag)
1633 if (!type) 1679 if (!type)
1634 return -EINVAL; 1680 return -EINVAL;
1635 1681
1636 down_write(&namespace_sem); 1682 namespace_lock();
1637 if (type == MS_SHARED) { 1683 if (type == MS_SHARED) {
1638 err = invent_group_ids(mnt, recurse); 1684 err = invent_group_ids(mnt, recurse);
1639 if (err) 1685 if (err)
@@ -1646,7 +1692,7 @@ static int do_change_type(struct path *path, int flag)
1646 br_write_unlock(&vfsmount_lock); 1692 br_write_unlock(&vfsmount_lock);
1647 1693
1648 out_unlock: 1694 out_unlock:
1649 up_write(&namespace_sem); 1695 namespace_unlock();
1650 return err; 1696 return err;
1651} 1697}
1652 1698
@@ -1656,9 +1702,9 @@ static int do_change_type(struct path *path, int flag)
1656static int do_loopback(struct path *path, const char *old_name, 1702static int do_loopback(struct path *path, const char *old_name,
1657 int recurse) 1703 int recurse)
1658{ 1704{
1659 LIST_HEAD(umount_list);
1660 struct path old_path; 1705 struct path old_path;
1661 struct mount *mnt = NULL, *old; 1706 struct mount *mnt = NULL, *old, *parent;
1707 struct mountpoint *mp;
1662 int err; 1708 int err;
1663 if (!old_name || !*old_name) 1709 if (!old_name || !*old_name)
1664 return -EINVAL; 1710 return -EINVAL;
@@ -1670,17 +1716,19 @@ static int do_loopback(struct path *path, const char *old_name,
1670 if (mnt_ns_loop(&old_path)) 1716 if (mnt_ns_loop(&old_path))
1671 goto out; 1717 goto out;
1672 1718
1673 err = lock_mount(path); 1719 mp = lock_mount(path);
1674 if (err) 1720 err = PTR_ERR(mp);
1721 if (IS_ERR(mp))
1675 goto out; 1722 goto out;
1676 1723
1677 old = real_mount(old_path.mnt); 1724 old = real_mount(old_path.mnt);
1725 parent = real_mount(path->mnt);
1678 1726
1679 err = -EINVAL; 1727 err = -EINVAL;
1680 if (IS_MNT_UNBINDABLE(old)) 1728 if (IS_MNT_UNBINDABLE(old))
1681 goto out2; 1729 goto out2;
1682 1730
1683 if (!check_mnt(real_mount(path->mnt)) || !check_mnt(old)) 1731 if (!check_mnt(parent) || !check_mnt(old))
1684 goto out2; 1732 goto out2;
1685 1733
1686 if (recurse) 1734 if (recurse)
@@ -1693,15 +1741,14 @@ static int do_loopback(struct path *path, const char *old_name,
1693 goto out2; 1741 goto out2;
1694 } 1742 }
1695 1743
1696 err = graft_tree(mnt, path); 1744 err = graft_tree(mnt, parent, mp);
1697 if (err) { 1745 if (err) {
1698 br_write_lock(&vfsmount_lock); 1746 br_write_lock(&vfsmount_lock);
1699 umount_tree(mnt, 0, &umount_list); 1747 umount_tree(mnt, 0);
1700 br_write_unlock(&vfsmount_lock); 1748 br_write_unlock(&vfsmount_lock);
1701 } 1749 }
1702out2: 1750out2:
1703 unlock_mount(path); 1751 unlock_mount(mp);
1704 release_mounts(&umount_list);
1705out: 1752out:
1706 path_put(&old_path); 1753 path_put(&old_path);
1707 return err; 1754 return err;
@@ -1786,6 +1833,7 @@ static int do_move_mount(struct path *path, const char *old_name)
1786 struct path old_path, parent_path; 1833 struct path old_path, parent_path;
1787 struct mount *p; 1834 struct mount *p;
1788 struct mount *old; 1835 struct mount *old;
1836 struct mountpoint *mp;
1789 int err; 1837 int err;
1790 if (!old_name || !*old_name) 1838 if (!old_name || !*old_name)
1791 return -EINVAL; 1839 return -EINVAL;
@@ -1793,8 +1841,9 @@ static int do_move_mount(struct path *path, const char *old_name)
1793 if (err) 1841 if (err)
1794 return err; 1842 return err;
1795 1843
1796 err = lock_mount(path); 1844 mp = lock_mount(path);
1797 if (err < 0) 1845 err = PTR_ERR(mp);
1846 if (IS_ERR(mp))
1798 goto out; 1847 goto out;
1799 1848
1800 old = real_mount(old_path.mnt); 1849 old = real_mount(old_path.mnt);
@@ -1804,9 +1853,6 @@ static int do_move_mount(struct path *path, const char *old_name)
1804 if (!check_mnt(p) || !check_mnt(old)) 1853 if (!check_mnt(p) || !check_mnt(old))
1805 goto out1; 1854 goto out1;
1806 1855
1807 if (d_unlinked(path->dentry))
1808 goto out1;
1809
1810 err = -EINVAL; 1856 err = -EINVAL;
1811 if (old_path.dentry != old_path.mnt->mnt_root) 1857 if (old_path.dentry != old_path.mnt->mnt_root)
1812 goto out1; 1858 goto out1;
@@ -1833,7 +1879,7 @@ static int do_move_mount(struct path *path, const char *old_name)
1833 if (p == old) 1879 if (p == old)
1834 goto out1; 1880 goto out1;
1835 1881
1836 err = attach_recursive_mnt(old, path, &parent_path); 1882 err = attach_recursive_mnt(old, real_mount(path->mnt), mp, &parent_path);
1837 if (err) 1883 if (err)
1838 goto out1; 1884 goto out1;
1839 1885
@@ -1841,7 +1887,7 @@ static int do_move_mount(struct path *path, const char *old_name)
1841 * automatically */ 1887 * automatically */
1842 list_del_init(&old->mnt_expire); 1888 list_del_init(&old->mnt_expire);
1843out1: 1889out1:
1844 unlock_mount(path); 1890 unlock_mount(mp);
1845out: 1891out:
1846 if (!err) 1892 if (!err)
1847 path_put(&parent_path); 1893 path_put(&parent_path);
@@ -1877,21 +1923,24 @@ static struct vfsmount *fs_set_subtype(struct vfsmount *mnt, const char *fstype)
1877 */ 1923 */
1878static int do_add_mount(struct mount *newmnt, struct path *path, int mnt_flags) 1924static int do_add_mount(struct mount *newmnt, struct path *path, int mnt_flags)
1879{ 1925{
1926 struct mountpoint *mp;
1927 struct mount *parent;
1880 int err; 1928 int err;
1881 1929
1882 mnt_flags &= ~(MNT_SHARED | MNT_WRITE_HOLD | MNT_INTERNAL); 1930 mnt_flags &= ~(MNT_SHARED | MNT_WRITE_HOLD | MNT_INTERNAL);
1883 1931
1884 err = lock_mount(path); 1932 mp = lock_mount(path);
1885 if (err) 1933 if (IS_ERR(mp))
1886 return err; 1934 return PTR_ERR(mp);
1887 1935
1936 parent = real_mount(path->mnt);
1888 err = -EINVAL; 1937 err = -EINVAL;
1889 if (unlikely(!check_mnt(real_mount(path->mnt)))) { 1938 if (unlikely(!check_mnt(parent))) {
1890 /* that's acceptable only for automounts done in private ns */ 1939 /* that's acceptable only for automounts done in private ns */
1891 if (!(mnt_flags & MNT_SHRINKABLE)) 1940 if (!(mnt_flags & MNT_SHRINKABLE))
1892 goto unlock; 1941 goto unlock;
1893 /* ... and for those we'd better have mountpoint still alive */ 1942 /* ... and for those we'd better have mountpoint still alive */
1894 if (!real_mount(path->mnt)->mnt_ns) 1943 if (!parent->mnt_ns)
1895 goto unlock; 1944 goto unlock;
1896 } 1945 }
1897 1946
@@ -1906,10 +1955,10 @@ static int do_add_mount(struct mount *newmnt, struct path *path, int mnt_flags)
1906 goto unlock; 1955 goto unlock;
1907 1956
1908 newmnt->mnt.mnt_flags = mnt_flags; 1957 newmnt->mnt.mnt_flags = mnt_flags;
1909 err = graft_tree(newmnt, path); 1958 err = graft_tree(newmnt, parent, mp);
1910 1959
1911unlock: 1960unlock:
1912 unlock_mount(path); 1961 unlock_mount(mp);
1913 return err; 1962 return err;
1914} 1963}
1915 1964
@@ -1982,11 +2031,11 @@ int finish_automount(struct vfsmount *m, struct path *path)
1982fail: 2031fail:
1983 /* remove m from any expiration list it may be on */ 2032 /* remove m from any expiration list it may be on */
1984 if (!list_empty(&mnt->mnt_expire)) { 2033 if (!list_empty(&mnt->mnt_expire)) {
1985 down_write(&namespace_sem); 2034 namespace_lock();
1986 br_write_lock(&vfsmount_lock); 2035 br_write_lock(&vfsmount_lock);
1987 list_del_init(&mnt->mnt_expire); 2036 list_del_init(&mnt->mnt_expire);
1988 br_write_unlock(&vfsmount_lock); 2037 br_write_unlock(&vfsmount_lock);
1989 up_write(&namespace_sem); 2038 namespace_unlock();
1990 } 2039 }
1991 mntput(m); 2040 mntput(m);
1992 mntput(m); 2041 mntput(m);
@@ -2000,13 +2049,13 @@ fail:
2000 */ 2049 */
2001void mnt_set_expiry(struct vfsmount *mnt, struct list_head *expiry_list) 2050void mnt_set_expiry(struct vfsmount *mnt, struct list_head *expiry_list)
2002{ 2051{
2003 down_write(&namespace_sem); 2052 namespace_lock();
2004 br_write_lock(&vfsmount_lock); 2053 br_write_lock(&vfsmount_lock);
2005 2054
2006 list_add_tail(&real_mount(mnt)->mnt_expire, expiry_list); 2055 list_add_tail(&real_mount(mnt)->mnt_expire, expiry_list);
2007 2056
2008 br_write_unlock(&vfsmount_lock); 2057 br_write_unlock(&vfsmount_lock);
2009 up_write(&namespace_sem); 2058 namespace_unlock();
2010} 2059}
2011EXPORT_SYMBOL(mnt_set_expiry); 2060EXPORT_SYMBOL(mnt_set_expiry);
2012 2061
@@ -2019,12 +2068,11 @@ void mark_mounts_for_expiry(struct list_head *mounts)
2019{ 2068{
2020 struct mount *mnt, *next; 2069 struct mount *mnt, *next;
2021 LIST_HEAD(graveyard); 2070 LIST_HEAD(graveyard);
2022 LIST_HEAD(umounts);
2023 2071
2024 if (list_empty(mounts)) 2072 if (list_empty(mounts))
2025 return; 2073 return;
2026 2074
2027 down_write(&namespace_sem); 2075 namespace_lock();
2028 br_write_lock(&vfsmount_lock); 2076 br_write_lock(&vfsmount_lock);
2029 2077
2030 /* extract from the expiration list every vfsmount that matches the 2078 /* extract from the expiration list every vfsmount that matches the
@@ -2042,12 +2090,10 @@ void mark_mounts_for_expiry(struct list_head *mounts)
2042 while (!list_empty(&graveyard)) { 2090 while (!list_empty(&graveyard)) {
2043 mnt = list_first_entry(&graveyard, struct mount, mnt_expire); 2091 mnt = list_first_entry(&graveyard, struct mount, mnt_expire);
2044 touch_mnt_namespace(mnt->mnt_ns); 2092 touch_mnt_namespace(mnt->mnt_ns);
2045 umount_tree(mnt, 1, &umounts); 2093 umount_tree(mnt, 1);
2046 } 2094 }
2047 br_write_unlock(&vfsmount_lock); 2095 br_write_unlock(&vfsmount_lock);
2048 up_write(&namespace_sem); 2096 namespace_unlock();
2049
2050 release_mounts(&umounts);
2051} 2097}
2052 2098
2053EXPORT_SYMBOL_GPL(mark_mounts_for_expiry); 2099EXPORT_SYMBOL_GPL(mark_mounts_for_expiry);
@@ -2104,7 +2150,7 @@ resume:
2104 * 2150 *
2105 * vfsmount_lock must be held for write 2151 * vfsmount_lock must be held for write
2106 */ 2152 */
2107static void shrink_submounts(struct mount *mnt, struct list_head *umounts) 2153static void shrink_submounts(struct mount *mnt)
2108{ 2154{
2109 LIST_HEAD(graveyard); 2155 LIST_HEAD(graveyard);
2110 struct mount *m; 2156 struct mount *m;
@@ -2115,7 +2161,7 @@ static void shrink_submounts(struct mount *mnt, struct list_head *umounts)
2115 m = list_first_entry(&graveyard, struct mount, 2161 m = list_first_entry(&graveyard, struct mount,
2116 mnt_expire); 2162 mnt_expire);
2117 touch_mnt_namespace(m->mnt_ns); 2163 touch_mnt_namespace(m->mnt_ns);
2118 umount_tree(m, 1, umounts); 2164 umount_tree(m, 1);
2119 } 2165 }
2120 } 2166 }
2121} 2167}
@@ -2342,14 +2388,14 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns,
2342 if (IS_ERR(new_ns)) 2388 if (IS_ERR(new_ns))
2343 return new_ns; 2389 return new_ns;
2344 2390
2345 down_write(&namespace_sem); 2391 namespace_lock();
2346 /* First pass: copy the tree topology */ 2392 /* First pass: copy the tree topology */
2347 copy_flags = CL_COPY_ALL | CL_EXPIRE; 2393 copy_flags = CL_COPY_ALL | CL_EXPIRE;
2348 if (user_ns != mnt_ns->user_ns) 2394 if (user_ns != mnt_ns->user_ns)
2349 copy_flags |= CL_SHARED_TO_SLAVE | CL_UNPRIVILEGED; 2395 copy_flags |= CL_SHARED_TO_SLAVE | CL_UNPRIVILEGED;
2350 new = copy_tree(old, old->mnt.mnt_root, copy_flags); 2396 new = copy_tree(old, old->mnt.mnt_root, copy_flags);
2351 if (IS_ERR(new)) { 2397 if (IS_ERR(new)) {
2352 up_write(&namespace_sem); 2398 namespace_unlock();
2353 free_mnt_ns(new_ns); 2399 free_mnt_ns(new_ns);
2354 return ERR_CAST(new); 2400 return ERR_CAST(new);
2355 } 2401 }
@@ -2380,7 +2426,7 @@ static struct mnt_namespace *dup_mnt_ns(struct mnt_namespace *mnt_ns,
2380 p = next_mnt(p, old); 2426 p = next_mnt(p, old);
2381 q = next_mnt(q, new); 2427 q = next_mnt(q, new);
2382 } 2428 }
2383 up_write(&namespace_sem); 2429 namespace_unlock();
2384 2430
2385 if (rootmnt) 2431 if (rootmnt)
2386 mntput(rootmnt); 2432 mntput(rootmnt);
@@ -2550,7 +2596,8 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
2550 const char __user *, put_old) 2596 const char __user *, put_old)
2551{ 2597{
2552 struct path new, old, parent_path, root_parent, root; 2598 struct path new, old, parent_path, root_parent, root;
2553 struct mount *new_mnt, *root_mnt; 2599 struct mount *new_mnt, *root_mnt, *old_mnt;
2600 struct mountpoint *old_mp, *root_mp;
2554 int error; 2601 int error;
2555 2602
2556 if (!may_mount()) 2603 if (!may_mount())
@@ -2569,14 +2616,16 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
2569 goto out2; 2616 goto out2;
2570 2617
2571 get_fs_root(current->fs, &root); 2618 get_fs_root(current->fs, &root);
2572 error = lock_mount(&old); 2619 old_mp = lock_mount(&old);
2573 if (error) 2620 error = PTR_ERR(old_mp);
2621 if (IS_ERR(old_mp))
2574 goto out3; 2622 goto out3;
2575 2623
2576 error = -EINVAL; 2624 error = -EINVAL;
2577 new_mnt = real_mount(new.mnt); 2625 new_mnt = real_mount(new.mnt);
2578 root_mnt = real_mount(root.mnt); 2626 root_mnt = real_mount(root.mnt);
2579 if (IS_MNT_SHARED(real_mount(old.mnt)) || 2627 old_mnt = real_mount(old.mnt);
2628 if (IS_MNT_SHARED(old_mnt) ||
2580 IS_MNT_SHARED(new_mnt->mnt_parent) || 2629 IS_MNT_SHARED(new_mnt->mnt_parent) ||
2581 IS_MNT_SHARED(root_mnt->mnt_parent)) 2630 IS_MNT_SHARED(root_mnt->mnt_parent))
2582 goto out4; 2631 goto out4;
@@ -2585,37 +2634,37 @@ SYSCALL_DEFINE2(pivot_root, const char __user *, new_root,
2585 error = -ENOENT; 2634 error = -ENOENT;
2586 if (d_unlinked(new.dentry)) 2635 if (d_unlinked(new.dentry))
2587 goto out4; 2636 goto out4;
2588 if (d_unlinked(old.dentry))
2589 goto out4;
2590 error = -EBUSY; 2637 error = -EBUSY;
2591 if (new.mnt == root.mnt || 2638 if (new_mnt == root_mnt || old_mnt == root_mnt)
2592 old.mnt == root.mnt)
2593 goto out4; /* loop, on the same file system */ 2639 goto out4; /* loop, on the same file system */
2594 error = -EINVAL; 2640 error = -EINVAL;
2595 if (root.mnt->mnt_root != root.dentry) 2641 if (root.mnt->mnt_root != root.dentry)
2596 goto out4; /* not a mountpoint */ 2642 goto out4; /* not a mountpoint */
2597 if (!mnt_has_parent(root_mnt)) 2643 if (!mnt_has_parent(root_mnt))
2598 goto out4; /* not attached */ 2644 goto out4; /* not attached */
2645 root_mp = root_mnt->mnt_mp;
2599 if (new.mnt->mnt_root != new.dentry) 2646 if (new.mnt->mnt_root != new.dentry)
2600 goto out4; /* not a mountpoint */ 2647 goto out4; /* not a mountpoint */
2601 if (!mnt_has_parent(new_mnt)) 2648 if (!mnt_has_parent(new_mnt))
2602 goto out4; /* not attached */ 2649 goto out4; /* not attached */
2603 /* make sure we can reach put_old from new_root */ 2650 /* make sure we can reach put_old from new_root */
2604 if (!is_path_reachable(real_mount(old.mnt), old.dentry, &new)) 2651 if (!is_path_reachable(old_mnt, old.dentry, &new))
2605 goto out4; 2652 goto out4;
2653 root_mp->m_count++; /* pin it so it won't go away */
2606 br_write_lock(&vfsmount_lock); 2654 br_write_lock(&vfsmount_lock);
2607 detach_mnt(new_mnt, &parent_path); 2655 detach_mnt(new_mnt, &parent_path);
2608 detach_mnt(root_mnt, &root_parent); 2656 detach_mnt(root_mnt, &root_parent);
2609 /* mount old root on put_old */ 2657 /* mount old root on put_old */
2610 attach_mnt(root_mnt, &old); 2658 attach_mnt(root_mnt, old_mnt, old_mp);
2611 /* mount new_root on / */ 2659 /* mount new_root on / */
2612 attach_mnt(new_mnt, &root_parent); 2660 attach_mnt(new_mnt, real_mount(root_parent.mnt), root_mp);
2613 touch_mnt_namespace(current->nsproxy->mnt_ns); 2661 touch_mnt_namespace(current->nsproxy->mnt_ns);
2614 br_write_unlock(&vfsmount_lock); 2662 br_write_unlock(&vfsmount_lock);
2615 chroot_fs_refs(&root, &new); 2663 chroot_fs_refs(&root, &new);
2664 put_mountpoint(root_mp);
2616 error = 0; 2665 error = 0;
2617out4: 2666out4:
2618 unlock_mount(&old); 2667 unlock_mount(old_mp);
2619 if (!error) { 2668 if (!error) {
2620 path_put(&root_parent); 2669 path_put(&root_parent);
2621 path_put(&parent_path); 2670 path_put(&parent_path);
@@ -2670,14 +2719,17 @@ void __init mnt_init(void)
2670 0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL); 2719 0, SLAB_HWCACHE_ALIGN | SLAB_PANIC, NULL);
2671 2720
2672 mount_hashtable = (struct list_head *)__get_free_page(GFP_ATOMIC); 2721 mount_hashtable = (struct list_head *)__get_free_page(GFP_ATOMIC);
2722 mountpoint_hashtable = (struct list_head *)__get_free_page(GFP_ATOMIC);
2673 2723
2674 if (!mount_hashtable) 2724 if (!mount_hashtable || !mountpoint_hashtable)
2675 panic("Failed to allocate mount hash table\n"); 2725 panic("Failed to allocate mount hash table\n");
2676 2726
2677 printk(KERN_INFO "Mount-cache hash table entries: %lu\n", HASH_SIZE); 2727 printk(KERN_INFO "Mount-cache hash table entries: %lu\n", HASH_SIZE);
2678 2728
2679 for (u = 0; u < HASH_SIZE; u++) 2729 for (u = 0; u < HASH_SIZE; u++)
2680 INIT_LIST_HEAD(&mount_hashtable[u]); 2730 INIT_LIST_HEAD(&mount_hashtable[u]);
2731 for (u = 0; u < HASH_SIZE; u++)
2732 INIT_LIST_HEAD(&mountpoint_hashtable[u]);
2681 2733
2682 br_lock_init(&vfsmount_lock); 2734 br_lock_init(&vfsmount_lock);
2683 2735
@@ -2694,16 +2746,13 @@ void __init mnt_init(void)
2694 2746
2695void put_mnt_ns(struct mnt_namespace *ns) 2747void put_mnt_ns(struct mnt_namespace *ns)
2696{ 2748{
2697 LIST_HEAD(umount_list);
2698
2699 if (!atomic_dec_and_test(&ns->count)) 2749 if (!atomic_dec_and_test(&ns->count))
2700 return; 2750 return;
2701 down_write(&namespace_sem); 2751 namespace_lock();
2702 br_write_lock(&vfsmount_lock); 2752 br_write_lock(&vfsmount_lock);
2703 umount_tree(ns->root, 0, &umount_list); 2753 umount_tree(ns->root, 0);
2704 br_write_unlock(&vfsmount_lock); 2754 br_write_unlock(&vfsmount_lock);
2705 up_write(&namespace_sem); 2755 namespace_unlock();
2706 release_mounts(&umount_list);
2707 free_mnt_ns(ns); 2756 free_mnt_ns(ns);
2708} 2757}
2709 2758
diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c
index f33455b4d957..5bee0313dffd 100644
--- a/fs/nfsd/nfsctl.c
+++ b/fs/nfsd/nfsctl.c
@@ -177,7 +177,7 @@ static int export_features_open(struct inode *inode, struct file *file)
177 return single_open(file, export_features_show, NULL); 177 return single_open(file, export_features_show, NULL);
178} 178}
179 179
180static struct file_operations export_features_operations = { 180static const struct file_operations export_features_operations = {
181 .open = export_features_open, 181 .open = export_features_open,
182 .read = seq_read, 182 .read = seq_read,
183 .llseek = seq_lseek, 183 .llseek = seq_lseek,
@@ -196,7 +196,7 @@ static int supported_enctypes_open(struct inode *inode, struct file *file)
196 return single_open(file, supported_enctypes_show, NULL); 196 return single_open(file, supported_enctypes_show, NULL);
197} 197}
198 198
199static struct file_operations supported_enctypes_ops = { 199static const struct file_operations supported_enctypes_ops = {
200 .open = supported_enctypes_open, 200 .open = supported_enctypes_open,
201 .read = seq_read, 201 .read = seq_read,
202 .llseek = seq_lseek, 202 .llseek = seq_lseek,
diff --git a/fs/notify/inotify/inotify_user.c b/fs/notify/inotify/inotify_user.c
index c616a70e8cf9..959815c1e017 100644
--- a/fs/notify/inotify/inotify_user.c
+++ b/fs/notify/inotify/inotify_user.c
@@ -287,9 +287,6 @@ static int inotify_release(struct inode *ignored, struct file *file)
287 287
288 pr_debug("%s: group=%p\n", __func__, group); 288 pr_debug("%s: group=%p\n", __func__, group);
289 289
290 if (file->f_flags & FASYNC)
291 fsnotify_fasync(-1, file, 0);
292
293 /* free this group, matching get was inotify_init->fsnotify_obtain_group */ 290 /* free this group, matching get was inotify_init->fsnotify_obtain_group */
294 fsnotify_destroy_group(group); 291 fsnotify_destroy_group(group);
295 292
diff --git a/fs/ntfs/file.c b/fs/ntfs/file.c
index 5b2d4f0853ac..1da4b81e6f76 100644
--- a/fs/ntfs/file.c
+++ b/fs/ntfs/file.c
@@ -2129,7 +2129,6 @@ static ssize_t ntfs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
2129 2129
2130 BUG_ON(iocb->ki_pos != pos); 2130 BUG_ON(iocb->ki_pos != pos);
2131 2131
2132 sb_start_write(inode->i_sb);
2133 mutex_lock(&inode->i_mutex); 2132 mutex_lock(&inode->i_mutex);
2134 ret = ntfs_file_aio_write_nolock(iocb, iov, nr_segs, &iocb->ki_pos); 2133 ret = ntfs_file_aio_write_nolock(iocb, iov, nr_segs, &iocb->ki_pos);
2135 mutex_unlock(&inode->i_mutex); 2134 mutex_unlock(&inode->i_mutex);
@@ -2138,7 +2137,6 @@ static ssize_t ntfs_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
2138 if (err < 0) 2137 if (err < 0)
2139 ret = err; 2138 ret = err;
2140 } 2139 }
2141 sb_end_write(inode->i_sb);
2142 return ret; 2140 return ret;
2143} 2141}
2144 2142
diff --git a/fs/ocfs2/file.c b/fs/ocfs2/file.c
index 6474cb44004d..8a7509f9e6f5 100644
--- a/fs/ocfs2/file.c
+++ b/fs/ocfs2/file.c
@@ -2248,8 +2248,6 @@ static ssize_t ocfs2_file_aio_write(struct kiocb *iocb,
2248 if (iocb->ki_left == 0) 2248 if (iocb->ki_left == 0)
2249 return 0; 2249 return 0;
2250 2250
2251 sb_start_write(inode->i_sb);
2252
2253 appending = file->f_flags & O_APPEND ? 1 : 0; 2251 appending = file->f_flags & O_APPEND ? 1 : 0;
2254 direct_io = file->f_flags & O_DIRECT ? 1 : 0; 2252 direct_io = file->f_flags & O_DIRECT ? 1 : 0;
2255 2253
@@ -2423,7 +2421,6 @@ out_sems:
2423 ocfs2_iocb_clear_sem_locked(iocb); 2421 ocfs2_iocb_clear_sem_locked(iocb);
2424 2422
2425 mutex_unlock(&inode->i_mutex); 2423 mutex_unlock(&inode->i_mutex);
2426 sb_end_write(inode->i_sb);
2427 2424
2428 if (written) 2425 if (written)
2429 ret = written; 2426 ret = written;
@@ -2468,8 +2465,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
2468 out->f_path.dentry->d_name.len, 2465 out->f_path.dentry->d_name.len,
2469 out->f_path.dentry->d_name.name, len); 2466 out->f_path.dentry->d_name.name, len);
2470 2467
2471 if (pipe->inode) 2468 pipe_lock(pipe);
2472 mutex_lock_nested(&pipe->inode->i_mutex, I_MUTEX_PARENT);
2473 2469
2474 splice_from_pipe_begin(&sd); 2470 splice_from_pipe_begin(&sd);
2475 do { 2471 do {
@@ -2489,8 +2485,7 @@ static ssize_t ocfs2_file_splice_write(struct pipe_inode_info *pipe,
2489 } while (ret > 0); 2485 } while (ret > 0);
2490 splice_from_pipe_end(pipe, &sd); 2486 splice_from_pipe_end(pipe, &sd);
2491 2487
2492 if (pipe->inode) 2488 pipe_unlock(pipe);
2493 mutex_unlock(&pipe->inode->i_mutex);
2494 2489
2495 if (sd.num_spliced) 2490 if (sd.num_spliced)
2496 ret = sd.num_spliced; 2491 ret = sd.num_spliced;
diff --git a/fs/pipe.c b/fs/pipe.c
index 2234f3f61f8d..a029a14bacf1 100644
--- a/fs/pipe.c
+++ b/fs/pipe.c
@@ -25,6 +25,8 @@
25#include <asm/uaccess.h> 25#include <asm/uaccess.h>
26#include <asm/ioctls.h> 26#include <asm/ioctls.h>
27 27
28#include "internal.h"
29
28/* 30/*
29 * The max size that a non-root user is allowed to grow the pipe. Can 31 * The max size that a non-root user is allowed to grow the pipe. Can
30 * be set by root in /proc/sys/fs/pipe-max-size 32 * be set by root in /proc/sys/fs/pipe-max-size
@@ -53,8 +55,8 @@ unsigned int pipe_min_size = PAGE_SIZE;
53 55
54static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass) 56static void pipe_lock_nested(struct pipe_inode_info *pipe, int subclass)
55{ 57{
56 if (pipe->inode) 58 if (pipe->files)
57 mutex_lock_nested(&pipe->inode->i_mutex, subclass); 59 mutex_lock_nested(&pipe->mutex, subclass);
58} 60}
59 61
60void pipe_lock(struct pipe_inode_info *pipe) 62void pipe_lock(struct pipe_inode_info *pipe)
@@ -68,11 +70,21 @@ EXPORT_SYMBOL(pipe_lock);
68 70
69void pipe_unlock(struct pipe_inode_info *pipe) 71void pipe_unlock(struct pipe_inode_info *pipe)
70{ 72{
71 if (pipe->inode) 73 if (pipe->files)
72 mutex_unlock(&pipe->inode->i_mutex); 74 mutex_unlock(&pipe->mutex);
73} 75}
74EXPORT_SYMBOL(pipe_unlock); 76EXPORT_SYMBOL(pipe_unlock);
75 77
78static inline void __pipe_lock(struct pipe_inode_info *pipe)
79{
80 mutex_lock_nested(&pipe->mutex, I_MUTEX_PARENT);
81}
82
83static inline void __pipe_unlock(struct pipe_inode_info *pipe)
84{
85 mutex_unlock(&pipe->mutex);
86}
87
76void pipe_double_lock(struct pipe_inode_info *pipe1, 88void pipe_double_lock(struct pipe_inode_info *pipe1,
77 struct pipe_inode_info *pipe2) 89 struct pipe_inode_info *pipe2)
78{ 90{
@@ -361,8 +373,7 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov,
361 unsigned long nr_segs, loff_t pos) 373 unsigned long nr_segs, loff_t pos)
362{ 374{
363 struct file *filp = iocb->ki_filp; 375 struct file *filp = iocb->ki_filp;
364 struct inode *inode = file_inode(filp); 376 struct pipe_inode_info *pipe = filp->private_data;
365 struct pipe_inode_info *pipe;
366 int do_wakeup; 377 int do_wakeup;
367 ssize_t ret; 378 ssize_t ret;
368 struct iovec *iov = (struct iovec *)_iov; 379 struct iovec *iov = (struct iovec *)_iov;
@@ -375,8 +386,7 @@ pipe_read(struct kiocb *iocb, const struct iovec *_iov,
375 386
376 do_wakeup = 0; 387 do_wakeup = 0;
377 ret = 0; 388 ret = 0;
378 mutex_lock(&inode->i_mutex); 389 __pipe_lock(pipe);
379 pipe = inode->i_pipe;
380 for (;;) { 390 for (;;) {
381 int bufs = pipe->nrbufs; 391 int bufs = pipe->nrbufs;
382 if (bufs) { 392 if (bufs) {
@@ -464,7 +474,7 @@ redo:
464 } 474 }
465 pipe_wait(pipe); 475 pipe_wait(pipe);
466 } 476 }
467 mutex_unlock(&inode->i_mutex); 477 __pipe_unlock(pipe);
468 478
469 /* Signal writers asynchronously that there is more room. */ 479 /* Signal writers asynchronously that there is more room. */
470 if (do_wakeup) { 480 if (do_wakeup) {
@@ -486,8 +496,7 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov,
486 unsigned long nr_segs, loff_t ppos) 496 unsigned long nr_segs, loff_t ppos)
487{ 497{
488 struct file *filp = iocb->ki_filp; 498 struct file *filp = iocb->ki_filp;
489 struct inode *inode = file_inode(filp); 499 struct pipe_inode_info *pipe = filp->private_data;
490 struct pipe_inode_info *pipe;
491 ssize_t ret; 500 ssize_t ret;
492 int do_wakeup; 501 int do_wakeup;
493 struct iovec *iov = (struct iovec *)_iov; 502 struct iovec *iov = (struct iovec *)_iov;
@@ -501,8 +510,7 @@ pipe_write(struct kiocb *iocb, const struct iovec *_iov,
501 510
502 do_wakeup = 0; 511 do_wakeup = 0;
503 ret = 0; 512 ret = 0;
504 mutex_lock(&inode->i_mutex); 513 __pipe_lock(pipe);
505 pipe = inode->i_pipe;
506 514
507 if (!pipe->readers) { 515 if (!pipe->readers) {
508 send_sig(SIGPIPE, current, 0); 516 send_sig(SIGPIPE, current, 0);
@@ -649,7 +657,7 @@ redo2:
649 pipe->waiting_writers--; 657 pipe->waiting_writers--;
650 } 658 }
651out: 659out:
652 mutex_unlock(&inode->i_mutex); 660 __pipe_unlock(pipe);
653 if (do_wakeup) { 661 if (do_wakeup) {
654 wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM); 662 wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLRDNORM);
655 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); 663 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
@@ -662,29 +670,14 @@ out:
662 return ret; 670 return ret;
663} 671}
664 672
665static ssize_t
666bad_pipe_r(struct file *filp, char __user *buf, size_t count, loff_t *ppos)
667{
668 return -EBADF;
669}
670
671static ssize_t
672bad_pipe_w(struct file *filp, const char __user *buf, size_t count,
673 loff_t *ppos)
674{
675 return -EBADF;
676}
677
678static long pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) 673static long pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
679{ 674{
680 struct inode *inode = file_inode(filp); 675 struct pipe_inode_info *pipe = filp->private_data;
681 struct pipe_inode_info *pipe;
682 int count, buf, nrbufs; 676 int count, buf, nrbufs;
683 677
684 switch (cmd) { 678 switch (cmd) {
685 case FIONREAD: 679 case FIONREAD:
686 mutex_lock(&inode->i_mutex); 680 __pipe_lock(pipe);
687 pipe = inode->i_pipe;
688 count = 0; 681 count = 0;
689 buf = pipe->curbuf; 682 buf = pipe->curbuf;
690 nrbufs = pipe->nrbufs; 683 nrbufs = pipe->nrbufs;
@@ -692,7 +685,7 @@ static long pipe_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
692 count += pipe->bufs[buf].len; 685 count += pipe->bufs[buf].len;
693 buf = (buf+1) & (pipe->buffers - 1); 686 buf = (buf+1) & (pipe->buffers - 1);
694 } 687 }
695 mutex_unlock(&inode->i_mutex); 688 __pipe_unlock(pipe);
696 689
697 return put_user(count, (int __user *)arg); 690 return put_user(count, (int __user *)arg);
698 default: 691 default:
@@ -705,8 +698,7 @@ static unsigned int
705pipe_poll(struct file *filp, poll_table *wait) 698pipe_poll(struct file *filp, poll_table *wait)
706{ 699{
707 unsigned int mask; 700 unsigned int mask;
708 struct inode *inode = file_inode(filp); 701 struct pipe_inode_info *pipe = filp->private_data;
709 struct pipe_inode_info *pipe = inode->i_pipe;
710 int nrbufs; 702 int nrbufs;
711 703
712 poll_wait(filp, &pipe->wait, wait); 704 poll_wait(filp, &pipe->wait, wait);
@@ -734,197 +726,56 @@ pipe_poll(struct file *filp, poll_table *wait)
734} 726}
735 727
736static int 728static int
737pipe_release(struct inode *inode, int decr, int decw) 729pipe_release(struct inode *inode, struct file *file)
738{ 730{
739 struct pipe_inode_info *pipe; 731 struct pipe_inode_info *pipe = inode->i_pipe;
732 int kill = 0;
740 733
741 mutex_lock(&inode->i_mutex); 734 __pipe_lock(pipe);
742 pipe = inode->i_pipe; 735 if (file->f_mode & FMODE_READ)
743 pipe->readers -= decr; 736 pipe->readers--;
744 pipe->writers -= decw; 737 if (file->f_mode & FMODE_WRITE)
738 pipe->writers--;
745 739
746 if (!pipe->readers && !pipe->writers) { 740 if (pipe->readers || pipe->writers) {
747 free_pipe_info(inode);
748 } else {
749 wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLERR | POLLHUP); 741 wake_up_interruptible_sync_poll(&pipe->wait, POLLIN | POLLOUT | POLLRDNORM | POLLWRNORM | POLLERR | POLLHUP);
750 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN); 742 kill_fasync(&pipe->fasync_readers, SIGIO, POLL_IN);
751 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT); 743 kill_fasync(&pipe->fasync_writers, SIGIO, POLL_OUT);
752 } 744 }
753 mutex_unlock(&inode->i_mutex); 745 spin_lock(&inode->i_lock);
754 746 if (!--pipe->files) {
755 return 0; 747 inode->i_pipe = NULL;
756} 748 kill = 1;
757 749 }
758static int 750 spin_unlock(&inode->i_lock);
759pipe_read_fasync(int fd, struct file *filp, int on) 751 __pipe_unlock(pipe);
760{
761 struct inode *inode = file_inode(filp);
762 int retval;
763
764 mutex_lock(&inode->i_mutex);
765 retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_readers);
766 mutex_unlock(&inode->i_mutex);
767
768 return retval;
769}
770
771
772static int
773pipe_write_fasync(int fd, struct file *filp, int on)
774{
775 struct inode *inode = file_inode(filp);
776 int retval;
777 752
778 mutex_lock(&inode->i_mutex); 753 if (kill)
779 retval = fasync_helper(fd, filp, on, &inode->i_pipe->fasync_writers); 754 free_pipe_info(pipe);
780 mutex_unlock(&inode->i_mutex);
781 755
782 return retval; 756 return 0;
783} 757}
784 758
785
786static int 759static int
787pipe_rdwr_fasync(int fd, struct file *filp, int on) 760pipe_fasync(int fd, struct file *filp, int on)
788{ 761{
789 struct inode *inode = file_inode(filp); 762 struct pipe_inode_info *pipe = filp->private_data;
790 struct pipe_inode_info *pipe = inode->i_pipe; 763 int retval = 0;
791 int retval;
792 764
793 mutex_lock(&inode->i_mutex); 765 __pipe_lock(pipe);
794 retval = fasync_helper(fd, filp, on, &pipe->fasync_readers); 766 if (filp->f_mode & FMODE_READ)
795 if (retval >= 0) { 767 retval = fasync_helper(fd, filp, on, &pipe->fasync_readers);
768 if ((filp->f_mode & FMODE_WRITE) && retval >= 0) {
796 retval = fasync_helper(fd, filp, on, &pipe->fasync_writers); 769 retval = fasync_helper(fd, filp, on, &pipe->fasync_writers);
797 if (retval < 0) /* this can happen only if on == T */ 770 if (retval < 0 && (filp->f_mode & FMODE_READ))
771 /* this can happen only if on == T */
798 fasync_helper(-1, filp, 0, &pipe->fasync_readers); 772 fasync_helper(-1, filp, 0, &pipe->fasync_readers);
799 } 773 }
800 mutex_unlock(&inode->i_mutex); 774 __pipe_unlock(pipe);
801 return retval; 775 return retval;
802} 776}
803 777
804 778struct pipe_inode_info *alloc_pipe_info(void)
805static int
806pipe_read_release(struct inode *inode, struct file *filp)
807{
808 return pipe_release(inode, 1, 0);
809}
810
811static int
812pipe_write_release(struct inode *inode, struct file *filp)
813{
814 return pipe_release(inode, 0, 1);
815}
816
817static int
818pipe_rdwr_release(struct inode *inode, struct file *filp)
819{
820 int decr, decw;
821
822 decr = (filp->f_mode & FMODE_READ) != 0;
823 decw = (filp->f_mode & FMODE_WRITE) != 0;
824 return pipe_release(inode, decr, decw);
825}
826
827static int
828pipe_read_open(struct inode *inode, struct file *filp)
829{
830 int ret = -ENOENT;
831
832 mutex_lock(&inode->i_mutex);
833
834 if (inode->i_pipe) {
835 ret = 0;
836 inode->i_pipe->readers++;
837 }
838
839 mutex_unlock(&inode->i_mutex);
840
841 return ret;
842}
843
844static int
845pipe_write_open(struct inode *inode, struct file *filp)
846{
847 int ret = -ENOENT;
848
849 mutex_lock(&inode->i_mutex);
850
851 if (inode->i_pipe) {
852 ret = 0;
853 inode->i_pipe->writers++;
854 }
855
856 mutex_unlock(&inode->i_mutex);
857
858 return ret;
859}
860
861static int
862pipe_rdwr_open(struct inode *inode, struct file *filp)
863{
864 int ret = -ENOENT;
865
866 if (!(filp->f_mode & (FMODE_READ|FMODE_WRITE)))
867 return -EINVAL;
868
869 mutex_lock(&inode->i_mutex);
870
871 if (inode->i_pipe) {
872 ret = 0;
873 if (filp->f_mode & FMODE_READ)
874 inode->i_pipe->readers++;
875 if (filp->f_mode & FMODE_WRITE)
876 inode->i_pipe->writers++;
877 }
878
879 mutex_unlock(&inode->i_mutex);
880
881 return ret;
882}
883
884/*
885 * The file_operations structs are not static because they
886 * are also used in linux/fs/fifo.c to do operations on FIFOs.
887 *
888 * Pipes reuse fifos' file_operations structs.
889 */
890const struct file_operations read_pipefifo_fops = {
891 .llseek = no_llseek,
892 .read = do_sync_read,
893 .aio_read = pipe_read,
894 .write = bad_pipe_w,
895 .poll = pipe_poll,
896 .unlocked_ioctl = pipe_ioctl,
897 .open = pipe_read_open,
898 .release = pipe_read_release,
899 .fasync = pipe_read_fasync,
900};
901
902const struct file_operations write_pipefifo_fops = {
903 .llseek = no_llseek,
904 .read = bad_pipe_r,
905 .write = do_sync_write,
906 .aio_write = pipe_write,
907 .poll = pipe_poll,
908 .unlocked_ioctl = pipe_ioctl,
909 .open = pipe_write_open,
910 .release = pipe_write_release,
911 .fasync = pipe_write_fasync,
912};
913
914const struct file_operations rdwr_pipefifo_fops = {
915 .llseek = no_llseek,
916 .read = do_sync_read,
917 .aio_read = pipe_read,
918 .write = do_sync_write,
919 .aio_write = pipe_write,
920 .poll = pipe_poll,
921 .unlocked_ioctl = pipe_ioctl,
922 .open = pipe_rdwr_open,
923 .release = pipe_rdwr_release,
924 .fasync = pipe_rdwr_fasync,
925};
926
927struct pipe_inode_info * alloc_pipe_info(struct inode *inode)
928{ 779{
929 struct pipe_inode_info *pipe; 780 struct pipe_inode_info *pipe;
930 781
@@ -934,8 +785,8 @@ struct pipe_inode_info * alloc_pipe_info(struct inode *inode)
934 if (pipe->bufs) { 785 if (pipe->bufs) {
935 init_waitqueue_head(&pipe->wait); 786 init_waitqueue_head(&pipe->wait);
936 pipe->r_counter = pipe->w_counter = 1; 787 pipe->r_counter = pipe->w_counter = 1;
937 pipe->inode = inode;
938 pipe->buffers = PIPE_DEF_BUFFERS; 788 pipe->buffers = PIPE_DEF_BUFFERS;
789 mutex_init(&pipe->mutex);
939 return pipe; 790 return pipe;
940 } 791 }
941 kfree(pipe); 792 kfree(pipe);
@@ -944,7 +795,7 @@ struct pipe_inode_info * alloc_pipe_info(struct inode *inode)
944 return NULL; 795 return NULL;
945} 796}
946 797
947void __free_pipe_info(struct pipe_inode_info *pipe) 798void free_pipe_info(struct pipe_inode_info *pipe)
948{ 799{
949 int i; 800 int i;
950 801
@@ -959,12 +810,6 @@ void __free_pipe_info(struct pipe_inode_info *pipe)
959 kfree(pipe); 810 kfree(pipe);
960} 811}
961 812
962void free_pipe_info(struct inode *inode)
963{
964 __free_pipe_info(inode->i_pipe);
965 inode->i_pipe = NULL;
966}
967
968static struct vfsmount *pipe_mnt __read_mostly; 813static struct vfsmount *pipe_mnt __read_mostly;
969 814
970/* 815/*
@@ -990,13 +835,14 @@ static struct inode * get_pipe_inode(void)
990 835
991 inode->i_ino = get_next_ino(); 836 inode->i_ino = get_next_ino();
992 837
993 pipe = alloc_pipe_info(inode); 838 pipe = alloc_pipe_info();
994 if (!pipe) 839 if (!pipe)
995 goto fail_iput; 840 goto fail_iput;
996 inode->i_pipe = pipe;
997 841
842 inode->i_pipe = pipe;
843 pipe->files = 2;
998 pipe->readers = pipe->writers = 1; 844 pipe->readers = pipe->writers = 1;
999 inode->i_fop = &rdwr_pipefifo_fops; 845 inode->i_fop = &pipefifo_fops;
1000 846
1001 /* 847 /*
1002 * Mark the inode dirty from the very beginning, 848 * Mark the inode dirty from the very beginning,
@@ -1039,17 +885,19 @@ int create_pipe_files(struct file **res, int flags)
1039 d_instantiate(path.dentry, inode); 885 d_instantiate(path.dentry, inode);
1040 886
1041 err = -ENFILE; 887 err = -ENFILE;
1042 f = alloc_file(&path, FMODE_WRITE, &write_pipefifo_fops); 888 f = alloc_file(&path, FMODE_WRITE, &pipefifo_fops);
1043 if (IS_ERR(f)) 889 if (IS_ERR(f))
1044 goto err_dentry; 890 goto err_dentry;
1045 891
1046 f->f_flags = O_WRONLY | (flags & (O_NONBLOCK | O_DIRECT)); 892 f->f_flags = O_WRONLY | (flags & (O_NONBLOCK | O_DIRECT));
893 f->private_data = inode->i_pipe;
1047 894
1048 res[0] = alloc_file(&path, FMODE_READ, &read_pipefifo_fops); 895 res[0] = alloc_file(&path, FMODE_READ, &pipefifo_fops);
1049 if (IS_ERR(res[0])) 896 if (IS_ERR(res[0]))
1050 goto err_file; 897 goto err_file;
1051 898
1052 path_get(&path); 899 path_get(&path);
900 res[0]->private_data = inode->i_pipe;
1053 res[0]->f_flags = O_RDONLY | (flags & O_NONBLOCK); 901 res[0]->f_flags = O_RDONLY | (flags & O_NONBLOCK);
1054 res[1] = f; 902 res[1] = f;
1055 return 0; 903 return 0;
@@ -1057,12 +905,12 @@ int create_pipe_files(struct file **res, int flags)
1057err_file: 905err_file:
1058 put_filp(f); 906 put_filp(f);
1059err_dentry: 907err_dentry:
1060 free_pipe_info(inode); 908 free_pipe_info(inode->i_pipe);
1061 path_put(&path); 909 path_put(&path);
1062 return err; 910 return err;
1063 911
1064err_inode: 912err_inode:
1065 free_pipe_info(inode); 913 free_pipe_info(inode->i_pipe);
1066 iput(inode); 914 iput(inode);
1067 return err; 915 return err;
1068} 916}
@@ -1144,6 +992,168 @@ SYSCALL_DEFINE1(pipe, int __user *, fildes)
1144 return sys_pipe2(fildes, 0); 992 return sys_pipe2(fildes, 0);
1145} 993}
1146 994
995static int wait_for_partner(struct pipe_inode_info *pipe, unsigned int *cnt)
996{
997 int cur = *cnt;
998
999 while (cur == *cnt) {
1000 pipe_wait(pipe);
1001 if (signal_pending(current))
1002 break;
1003 }
1004 return cur == *cnt ? -ERESTARTSYS : 0;
1005}
1006
1007static void wake_up_partner(struct pipe_inode_info *pipe)
1008{
1009 wake_up_interruptible(&pipe->wait);
1010}
1011
1012static int fifo_open(struct inode *inode, struct file *filp)
1013{
1014 struct pipe_inode_info *pipe;
1015 bool is_pipe = inode->i_sb->s_magic == PIPEFS_MAGIC;
1016 int kill = 0;
1017 int ret;
1018
1019 filp->f_version = 0;
1020
1021 spin_lock(&inode->i_lock);
1022 if (inode->i_pipe) {
1023 pipe = inode->i_pipe;
1024 pipe->files++;
1025 spin_unlock(&inode->i_lock);
1026 } else {
1027 spin_unlock(&inode->i_lock);
1028 pipe = alloc_pipe_info();
1029 if (!pipe)
1030 return -ENOMEM;
1031 pipe->files = 1;
1032 spin_lock(&inode->i_lock);
1033 if (unlikely(inode->i_pipe)) {
1034 inode->i_pipe->files++;
1035 spin_unlock(&inode->i_lock);
1036 free_pipe_info(pipe);
1037 pipe = inode->i_pipe;
1038 } else {
1039 inode->i_pipe = pipe;
1040 spin_unlock(&inode->i_lock);
1041 }
1042 }
1043 filp->private_data = pipe;
1044 /* OK, we have a pipe and it's pinned down */
1045
1046 __pipe_lock(pipe);
1047
1048 /* We can only do regular read/write on fifos */
1049 filp->f_mode &= (FMODE_READ | FMODE_WRITE);
1050
1051 switch (filp->f_mode) {
1052 case FMODE_READ:
1053 /*
1054 * O_RDONLY
1055 * POSIX.1 says that O_NONBLOCK means return with the FIFO
1056 * opened, even when there is no process writing the FIFO.
1057 */
1058 pipe->r_counter++;
1059 if (pipe->readers++ == 0)
1060 wake_up_partner(pipe);
1061
1062 if (!is_pipe && !pipe->writers) {
1063 if ((filp->f_flags & O_NONBLOCK)) {
1064 /* suppress POLLHUP until we have
1065 * seen a writer */
1066 filp->f_version = pipe->w_counter;
1067 } else {
1068 if (wait_for_partner(pipe, &pipe->w_counter))
1069 goto err_rd;
1070 }
1071 }
1072 break;
1073
1074 case FMODE_WRITE:
1075 /*
1076 * O_WRONLY
1077 * POSIX.1 says that O_NONBLOCK means return -1 with
1078 * errno=ENXIO when there is no process reading the FIFO.
1079 */
1080 ret = -ENXIO;
1081 if (!is_pipe && (filp->f_flags & O_NONBLOCK) && !pipe->readers)
1082 goto err;
1083
1084 pipe->w_counter++;
1085 if (!pipe->writers++)
1086 wake_up_partner(pipe);
1087
1088 if (!is_pipe && !pipe->readers) {
1089 if (wait_for_partner(pipe, &pipe->r_counter))
1090 goto err_wr;
1091 }
1092 break;
1093
1094 case FMODE_READ | FMODE_WRITE:
1095 /*
1096 * O_RDWR
1097 * POSIX.1 leaves this case "undefined" when O_NONBLOCK is set.
1098 * This implementation will NEVER block on a O_RDWR open, since
1099 * the process can at least talk to itself.
1100 */
1101
1102 pipe->readers++;
1103 pipe->writers++;
1104 pipe->r_counter++;
1105 pipe->w_counter++;
1106 if (pipe->readers == 1 || pipe->writers == 1)
1107 wake_up_partner(pipe);
1108 break;
1109
1110 default:
1111 ret = -EINVAL;
1112 goto err;
1113 }
1114
1115 /* Ok! */
1116 __pipe_unlock(pipe);
1117 return 0;
1118
1119err_rd:
1120 if (!--pipe->readers)
1121 wake_up_interruptible(&pipe->wait);
1122 ret = -ERESTARTSYS;
1123 goto err;
1124
1125err_wr:
1126 if (!--pipe->writers)
1127 wake_up_interruptible(&pipe->wait);
1128 ret = -ERESTARTSYS;
1129 goto err;
1130
1131err:
1132 spin_lock(&inode->i_lock);
1133 if (!--pipe->files) {
1134 inode->i_pipe = NULL;
1135 kill = 1;
1136 }
1137 spin_unlock(&inode->i_lock);
1138 __pipe_unlock(pipe);
1139 if (kill)
1140 free_pipe_info(pipe);
1141 return ret;
1142}
1143
1144const struct file_operations pipefifo_fops = {
1145 .open = fifo_open,
1146 .llseek = no_llseek,
1147 .read = do_sync_read,
1148 .aio_read = pipe_read,
1149 .write = do_sync_write,
1150 .aio_write = pipe_write,
1151 .poll = pipe_poll,
1152 .unlocked_ioctl = pipe_ioctl,
1153 .release = pipe_release,
1154 .fasync = pipe_fasync,
1155};
1156
1147/* 1157/*
1148 * Allocate a new array of pipe buffers and copy the info over. Returns the 1158 * Allocate a new array of pipe buffers and copy the info over. Returns the
1149 * pipe size if successful, or return -ERROR on error. 1159 * pipe size if successful, or return -ERROR on error.
@@ -1229,9 +1239,7 @@ int pipe_proc_fn(struct ctl_table *table, int write, void __user *buf,
1229 */ 1239 */
1230struct pipe_inode_info *get_pipe_info(struct file *file) 1240struct pipe_inode_info *get_pipe_info(struct file *file)
1231{ 1241{
1232 struct inode *i = file_inode(file); 1242 return file->f_op == &pipefifo_fops ? file->private_data : NULL;
1233
1234 return S_ISFIFO(i->i_mode) ? i->i_pipe : NULL;
1235} 1243}
1236 1244
1237long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg) 1245long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
@@ -1243,7 +1251,7 @@ long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
1243 if (!pipe) 1251 if (!pipe)
1244 return -EBADF; 1252 return -EBADF;
1245 1253
1246 mutex_lock(&pipe->inode->i_mutex); 1254 __pipe_lock(pipe);
1247 1255
1248 switch (cmd) { 1256 switch (cmd) {
1249 case F_SETPIPE_SZ: { 1257 case F_SETPIPE_SZ: {
@@ -1272,7 +1280,7 @@ long pipe_fcntl(struct file *file, unsigned int cmd, unsigned long arg)
1272 } 1280 }
1273 1281
1274out: 1282out:
1275 mutex_unlock(&pipe->inode->i_mutex); 1283 __pipe_unlock(pipe);
1276 return ret; 1284 return ret;
1277} 1285}
1278 1286
diff --git a/fs/pnode.c b/fs/pnode.c
index 8b29d2164da6..3d2a7141b87a 100644
--- a/fs/pnode.c
+++ b/fs/pnode.c
@@ -218,7 +218,7 @@ static struct mount *get_source(struct mount *dest,
218 * @source_mnt: source mount. 218 * @source_mnt: source mount.
219 * @tree_list : list of heads of trees to be attached. 219 * @tree_list : list of heads of trees to be attached.
220 */ 220 */
221int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry, 221int propagate_mnt(struct mount *dest_mnt, struct mountpoint *dest_mp,
222 struct mount *source_mnt, struct list_head *tree_list) 222 struct mount *source_mnt, struct list_head *tree_list)
223{ 223{
224 struct user_namespace *user_ns = current->nsproxy->mnt_ns->user_ns; 224 struct user_namespace *user_ns = current->nsproxy->mnt_ns->user_ns;
@@ -227,7 +227,6 @@ int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry,
227 struct mount *prev_dest_mnt = dest_mnt; 227 struct mount *prev_dest_mnt = dest_mnt;
228 struct mount *prev_src_mnt = source_mnt; 228 struct mount *prev_src_mnt = source_mnt;
229 LIST_HEAD(tmp_list); 229 LIST_HEAD(tmp_list);
230 LIST_HEAD(umount_list);
231 230
232 for (m = propagation_next(dest_mnt, dest_mnt); m; 231 for (m = propagation_next(dest_mnt, dest_mnt); m;
233 m = propagation_next(m, dest_mnt)) { 232 m = propagation_next(m, dest_mnt)) {
@@ -250,8 +249,8 @@ int propagate_mnt(struct mount *dest_mnt, struct dentry *dest_dentry,
250 goto out; 249 goto out;
251 } 250 }
252 251
253 if (is_subdir(dest_dentry, m->mnt.mnt_root)) { 252 if (is_subdir(dest_mp->m_dentry, m->mnt.mnt_root)) {
254 mnt_set_mountpoint(m, dest_dentry, child); 253 mnt_set_mountpoint(m, dest_mp, child);
255 list_add_tail(&child->mnt_hash, tree_list); 254 list_add_tail(&child->mnt_hash, tree_list);
256 } else { 255 } else {
257 /* 256 /*
@@ -267,10 +266,9 @@ out:
267 br_write_lock(&vfsmount_lock); 266 br_write_lock(&vfsmount_lock);
268 while (!list_empty(&tmp_list)) { 267 while (!list_empty(&tmp_list)) {
269 child = list_first_entry(&tmp_list, struct mount, mnt_hash); 268 child = list_first_entry(&tmp_list, struct mount, mnt_hash);
270 umount_tree(child, 0, &umount_list); 269 umount_tree(child, 0);
271 } 270 }
272 br_write_unlock(&vfsmount_lock); 271 br_write_unlock(&vfsmount_lock);
273 release_mounts(&umount_list);
274 return ret; 272 return ret;
275} 273}
276 274
diff --git a/fs/pnode.h b/fs/pnode.h
index a0493d5ebfbf..b091445c1c4a 100644
--- a/fs/pnode.h
+++ b/fs/pnode.h
@@ -32,17 +32,16 @@ static inline void set_mnt_shared(struct mount *mnt)
32} 32}
33 33
34void change_mnt_propagation(struct mount *, int); 34void change_mnt_propagation(struct mount *, int);
35int propagate_mnt(struct mount *, struct dentry *, struct mount *, 35int propagate_mnt(struct mount *, struct mountpoint *, struct mount *,
36 struct list_head *); 36 struct list_head *);
37int propagate_umount(struct list_head *); 37int propagate_umount(struct list_head *);
38int propagate_mount_busy(struct mount *, int); 38int propagate_mount_busy(struct mount *, int);
39void mnt_release_group_id(struct mount *); 39void mnt_release_group_id(struct mount *);
40int get_dominating_id(struct mount *mnt, const struct path *root); 40int get_dominating_id(struct mount *mnt, const struct path *root);
41unsigned int mnt_get_count(struct mount *mnt); 41unsigned int mnt_get_count(struct mount *mnt);
42void mnt_set_mountpoint(struct mount *, struct dentry *, 42void mnt_set_mountpoint(struct mount *, struct mountpoint *,
43 struct mount *); 43 struct mount *);
44void release_mounts(struct list_head *); 44void umount_tree(struct mount *, int);
45void umount_tree(struct mount *, int, struct list_head *);
46struct mount *copy_tree(struct mount *, struct dentry *, int); 45struct mount *copy_tree(struct mount *, struct dentry *, int);
47bool is_path_reachable(struct mount *, struct dentry *, 46bool is_path_reachable(struct mount *, struct dentry *,
48 const struct path *root); 47 const struct path *root);
diff --git a/fs/proc/base.c b/fs/proc/base.c
index 3861bcec41ff..dd51e50001fe 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -405,6 +405,37 @@ static const struct file_operations proc_lstats_operations = {
405 405
406#endif 406#endif
407 407
408#ifdef CONFIG_CGROUPS
409static int cgroup_open(struct inode *inode, struct file *file)
410{
411 struct pid *pid = PROC_I(inode)->pid;
412 return single_open(file, proc_cgroup_show, pid);
413}
414
415static const struct file_operations proc_cgroup_operations = {
416 .open = cgroup_open,
417 .read = seq_read,
418 .llseek = seq_lseek,
419 .release = single_release,
420};
421#endif
422
423#ifdef CONFIG_PROC_PID_CPUSET
424
425static int cpuset_open(struct inode *inode, struct file *file)
426{
427 struct pid *pid = PROC_I(inode)->pid;
428 return single_open(file, proc_cpuset_show, pid);
429}
430
431static const struct file_operations proc_cpuset_operations = {
432 .open = cpuset_open,
433 .read = seq_read,
434 .llseek = seq_lseek,
435 .release = single_release,
436};
437#endif
438
408static int proc_oom_score(struct task_struct *task, char *buffer) 439static int proc_oom_score(struct task_struct *task, char *buffer)
409{ 440{
410 unsigned long totalpages = totalram_pages + total_swap_pages; 441 unsigned long totalpages = totalram_pages + total_swap_pages;
@@ -1621,6 +1652,15 @@ int pid_revalidate(struct dentry *dentry, unsigned int flags)
1621 return 0; 1652 return 0;
1622} 1653}
1623 1654
1655int pid_delete_dentry(const struct dentry *dentry)
1656{
1657 /* Is the task we represent dead?
1658 * If so, then don't put the dentry on the lru list,
1659 * kill it immediately.
1660 */
1661 return !proc_pid(dentry->d_inode)->tasks[PIDTYPE_PID].first;
1662}
1663
1624const struct dentry_operations pid_dentry_operations = 1664const struct dentry_operations pid_dentry_operations =
1625{ 1665{
1626 .d_revalidate = pid_revalidate, 1666 .d_revalidate = pid_revalidate,
@@ -2893,7 +2933,7 @@ retry:
2893 return iter; 2933 return iter;
2894} 2934}
2895 2935
2896#define TGID_OFFSET (FIRST_PROCESS_ENTRY) 2936#define TGID_OFFSET (FIRST_PROCESS_ENTRY + 1)
2897 2937
2898static int proc_pid_fill_cache(struct file *filp, void *dirent, filldir_t filldir, 2938static int proc_pid_fill_cache(struct file *filp, void *dirent, filldir_t filldir,
2899 struct tgid_iter iter) 2939 struct tgid_iter iter)
@@ -2916,13 +2956,21 @@ int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
2916 struct tgid_iter iter; 2956 struct tgid_iter iter;
2917 struct pid_namespace *ns; 2957 struct pid_namespace *ns;
2918 filldir_t __filldir; 2958 filldir_t __filldir;
2959 loff_t pos = filp->f_pos;
2919 2960
2920 if (filp->f_pos >= PID_MAX_LIMIT + TGID_OFFSET) 2961 if (pos >= PID_MAX_LIMIT + TGID_OFFSET)
2921 goto out; 2962 goto out;
2922 2963
2923 ns = filp->f_dentry->d_sb->s_fs_info; 2964 if (pos == TGID_OFFSET - 1) {
2965 if (proc_fill_cache(filp, dirent, filldir, "self", 4,
2966 NULL, NULL, NULL) < 0)
2967 goto out;
2968 iter.tgid = 0;
2969 } else {
2970 iter.tgid = pos - TGID_OFFSET;
2971 }
2924 iter.task = NULL; 2972 iter.task = NULL;
2925 iter.tgid = filp->f_pos - TGID_OFFSET; 2973 ns = filp->f_dentry->d_sb->s_fs_info;
2926 for (iter = next_tgid(ns, iter); 2974 for (iter = next_tgid(ns, iter);
2927 iter.task; 2975 iter.task;
2928 iter.tgid += 1, iter = next_tgid(ns, iter)) { 2976 iter.tgid += 1, iter = next_tgid(ns, iter)) {
diff --git a/fs/proc/fd.h b/fs/proc/fd.h
index cbb1d47deda8..7c047f256ae2 100644
--- a/fs/proc/fd.h
+++ b/fs/proc/fd.h
@@ -11,4 +11,9 @@ extern const struct inode_operations proc_fdinfo_inode_operations;
11 11
12extern int proc_fd_permission(struct inode *inode, int mask); 12extern int proc_fd_permission(struct inode *inode, int mask);
13 13
14static inline int proc_fd(struct inode *inode)
15{
16 return PROC_I(inode)->fd;
17}
18
14#endif /* __PROCFS_FD_H__ */ 19#endif /* __PROCFS_FD_H__ */
diff --git a/fs/proc/generic.c b/fs/proc/generic.c
index 21e1a8f1659d..a2596afffae6 100644
--- a/fs/proc/generic.c
+++ b/fs/proc/generic.c
@@ -36,212 +36,6 @@ static int proc_match(unsigned int len, const char *name, struct proc_dir_entry
36 return !memcmp(name, de->name, len); 36 return !memcmp(name, de->name, len);
37} 37}
38 38
39/* buffer size is one page but our output routines use some slack for overruns */
40#define PROC_BLOCK_SIZE (PAGE_SIZE - 1024)
41
42static ssize_t
43__proc_file_read(struct file *file, char __user *buf, size_t nbytes,
44 loff_t *ppos)
45{
46 struct inode * inode = file_inode(file);
47 char *page;
48 ssize_t retval=0;
49 int eof=0;
50 ssize_t n, count;
51 char *start;
52 struct proc_dir_entry * dp;
53 unsigned long long pos;
54
55 /*
56 * Gaah, please just use "seq_file" instead. The legacy /proc
57 * interfaces cut loff_t down to off_t for reads, and ignore
58 * the offset entirely for writes..
59 */
60 pos = *ppos;
61 if (pos > MAX_NON_LFS)
62 return 0;
63 if (nbytes > MAX_NON_LFS - pos)
64 nbytes = MAX_NON_LFS - pos;
65
66 dp = PDE(inode);
67 if (!(page = (char*) __get_free_page(GFP_TEMPORARY)))
68 return -ENOMEM;
69
70 while ((nbytes > 0) && !eof) {
71 count = min_t(size_t, PROC_BLOCK_SIZE, nbytes);
72
73 start = NULL;
74 if (dp->read_proc) {
75 /*
76 * How to be a proc read function
77 * ------------------------------
78 * Prototype:
79 * int f(char *buffer, char **start, off_t offset,
80 * int count, int *peof, void *dat)
81 *
82 * Assume that the buffer is "count" bytes in size.
83 *
84 * If you know you have supplied all the data you
85 * have, set *peof.
86 *
87 * You have three ways to return data:
88 * 0) Leave *start = NULL. (This is the default.)
89 * Put the data of the requested offset at that
90 * offset within the buffer. Return the number (n)
91 * of bytes there are from the beginning of the
92 * buffer up to the last byte of data. If the
93 * number of supplied bytes (= n - offset) is
94 * greater than zero and you didn't signal eof
95 * and the reader is prepared to take more data
96 * you will be called again with the requested
97 * offset advanced by the number of bytes
98 * absorbed. This interface is useful for files
99 * no larger than the buffer.
100 * 1) Set *start = an unsigned long value less than
101 * the buffer address but greater than zero.
102 * Put the data of the requested offset at the
103 * beginning of the buffer. Return the number of
104 * bytes of data placed there. If this number is
105 * greater than zero and you didn't signal eof
106 * and the reader is prepared to take more data
107 * you will be called again with the requested
108 * offset advanced by *start. This interface is
109 * useful when you have a large file consisting
110 * of a series of blocks which you want to count
111 * and return as wholes.
112 * (Hack by Paul.Russell@rustcorp.com.au)
113 * 2) Set *start = an address within the buffer.
114 * Put the data of the requested offset at *start.
115 * Return the number of bytes of data placed there.
116 * If this number is greater than zero and you
117 * didn't signal eof and the reader is prepared to
118 * take more data you will be called again with the
119 * requested offset advanced by the number of bytes
120 * absorbed.
121 */
122 n = dp->read_proc(page, &start, *ppos,
123 count, &eof, dp->data);
124 } else
125 break;
126
127 if (n == 0) /* end of file */
128 break;
129 if (n < 0) { /* error */
130 if (retval == 0)
131 retval = n;
132 break;
133 }
134
135 if (start == NULL) {
136 if (n > PAGE_SIZE) /* Apparent buffer overflow */
137 n = PAGE_SIZE;
138 n -= *ppos;
139 if (n <= 0)
140 break;
141 if (n > count)
142 n = count;
143 start = page + *ppos;
144 } else if (start < page) {
145 if (n > PAGE_SIZE) /* Apparent buffer overflow */
146 n = PAGE_SIZE;
147 if (n > count) {
148 /*
149 * Don't reduce n because doing so might
150 * cut off part of a data block.
151 */
152 pr_warn("proc_file_read: count exceeded\n");
153 }
154 } else /* start >= page */ {
155 unsigned long startoff = (unsigned long)(start - page);
156 if (n > (PAGE_SIZE - startoff)) /* buffer overflow? */
157 n = PAGE_SIZE - startoff;
158 if (n > count)
159 n = count;
160 }
161
162 n -= copy_to_user(buf, start < page ? page : start, n);
163 if (n == 0) {
164 if (retval == 0)
165 retval = -EFAULT;
166 break;
167 }
168
169 *ppos += start < page ? (unsigned long)start : n;
170 nbytes -= n;
171 buf += n;
172 retval += n;
173 }
174 free_page((unsigned long) page);
175 return retval;
176}
177
178static ssize_t
179proc_file_read(struct file *file, char __user *buf, size_t nbytes,
180 loff_t *ppos)
181{
182 struct proc_dir_entry *pde = PDE(file_inode(file));
183 ssize_t rv = -EIO;
184
185 spin_lock(&pde->pde_unload_lock);
186 if (!pde->proc_fops) {
187 spin_unlock(&pde->pde_unload_lock);
188 return rv;
189 }
190 pde->pde_users++;
191 spin_unlock(&pde->pde_unload_lock);
192
193 rv = __proc_file_read(file, buf, nbytes, ppos);
194
195 pde_users_dec(pde);
196 return rv;
197}
198
199static ssize_t
200proc_file_write(struct file *file, const char __user *buffer,
201 size_t count, loff_t *ppos)
202{
203 struct proc_dir_entry *pde = PDE(file_inode(file));
204 ssize_t rv = -EIO;
205
206 if (pde->write_proc) {
207 spin_lock(&pde->pde_unload_lock);
208 if (!pde->proc_fops) {
209 spin_unlock(&pde->pde_unload_lock);
210 return rv;
211 }
212 pde->pde_users++;
213 spin_unlock(&pde->pde_unload_lock);
214
215 /* FIXME: does this routine need ppos? probably... */
216 rv = pde->write_proc(file, buffer, count, pde->data);
217 pde_users_dec(pde);
218 }
219 return rv;
220}
221
222
223static loff_t
224proc_file_lseek(struct file *file, loff_t offset, int orig)
225{
226 loff_t retval = -EINVAL;
227 switch (orig) {
228 case 1:
229 offset += file->f_pos;
230 /* fallthrough */
231 case 0:
232 if (offset < 0 || offset > MAX_NON_LFS)
233 break;
234 file->f_pos = retval = offset;
235 }
236 return retval;
237}
238
239static const struct file_operations proc_file_operations = {
240 .llseek = proc_file_lseek,
241 .read = proc_file_read,
242 .write = proc_file_write,
243};
244
245static int proc_notify_change(struct dentry *dentry, struct iattr *iattr) 39static int proc_notify_change(struct dentry *dentry, struct iattr *iattr)
246{ 40{
247 struct inode *inode = dentry->d_inode; 41 struct inode *inode = dentry->d_inode;
@@ -371,7 +165,7 @@ void proc_free_inum(unsigned int inum)
371 165
372static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd) 166static void *proc_follow_link(struct dentry *dentry, struct nameidata *nd)
373{ 167{
374 nd_set_link(nd, PDE(dentry->d_inode)->data); 168 nd_set_link(nd, __PDE_DATA(dentry->d_inode));
375 return NULL; 169 return NULL;
376} 170}
377 171
@@ -541,19 +335,17 @@ static int proc_register(struct proc_dir_entry * dir, struct proc_dir_entry * dp
541 return ret; 335 return ret;
542 336
543 if (S_ISDIR(dp->mode)) { 337 if (S_ISDIR(dp->mode)) {
544 if (dp->proc_iops == NULL) { 338 dp->proc_fops = &proc_dir_operations;
545 dp->proc_fops = &proc_dir_operations; 339 dp->proc_iops = &proc_dir_inode_operations;
546 dp->proc_iops = &proc_dir_inode_operations;
547 }
548 dir->nlink++; 340 dir->nlink++;
549 } else if (S_ISLNK(dp->mode)) { 341 } else if (S_ISLNK(dp->mode)) {
550 if (dp->proc_iops == NULL) 342 dp->proc_iops = &proc_link_inode_operations;
551 dp->proc_iops = &proc_link_inode_operations;
552 } else if (S_ISREG(dp->mode)) { 343 } else if (S_ISREG(dp->mode)) {
553 if (dp->proc_fops == NULL) 344 BUG_ON(dp->proc_fops == NULL);
554 dp->proc_fops = &proc_file_operations; 345 dp->proc_iops = &proc_file_inode_operations;
555 if (dp->proc_iops == NULL) 346 } else {
556 dp->proc_iops = &proc_file_inode_operations; 347 WARN_ON(1);
348 return -EINVAL;
557 } 349 }
558 350
559 spin_lock(&proc_subdir_lock); 351 spin_lock(&proc_subdir_lock);
@@ -636,13 +428,17 @@ struct proc_dir_entry *proc_symlink(const char *name,
636} 428}
637EXPORT_SYMBOL(proc_symlink); 429EXPORT_SYMBOL(proc_symlink);
638 430
639struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode, 431struct proc_dir_entry *proc_mkdir_data(const char *name, umode_t mode,
640 struct proc_dir_entry *parent) 432 struct proc_dir_entry *parent, void *data)
641{ 433{
642 struct proc_dir_entry *ent; 434 struct proc_dir_entry *ent;
643 435
436 if (mode == 0)
437 mode = S_IRUGO | S_IXUGO;
438
644 ent = __proc_create(&parent, name, S_IFDIR | mode, 2); 439 ent = __proc_create(&parent, name, S_IFDIR | mode, 2);
645 if (ent) { 440 if (ent) {
441 ent->data = data;
646 if (proc_register(parent, ent) < 0) { 442 if (proc_register(parent, ent) < 0) {
647 kfree(ent); 443 kfree(ent);
648 ent = NULL; 444 ent = NULL;
@@ -650,82 +446,39 @@ struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode,
650 } 446 }
651 return ent; 447 return ent;
652} 448}
653EXPORT_SYMBOL(proc_mkdir_mode); 449EXPORT_SYMBOL_GPL(proc_mkdir_data);
654 450
655struct proc_dir_entry *proc_net_mkdir(struct net *net, const char *name, 451struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode,
656 struct proc_dir_entry *parent) 452 struct proc_dir_entry *parent)
657{ 453{
658 struct proc_dir_entry *ent; 454 return proc_mkdir_data(name, mode, parent, NULL);
659
660 ent = __proc_create(&parent, name, S_IFDIR | S_IRUGO | S_IXUGO, 2);
661 if (ent) {
662 ent->data = net;
663 if (proc_register(parent, ent) < 0) {
664 kfree(ent);
665 ent = NULL;
666 }
667 }
668 return ent;
669} 455}
670EXPORT_SYMBOL_GPL(proc_net_mkdir); 456EXPORT_SYMBOL(proc_mkdir_mode);
671 457
672struct proc_dir_entry *proc_mkdir(const char *name, 458struct proc_dir_entry *proc_mkdir(const char *name,
673 struct proc_dir_entry *parent) 459 struct proc_dir_entry *parent)
674{ 460{
675 return proc_mkdir_mode(name, S_IRUGO | S_IXUGO, parent); 461 return proc_mkdir_data(name, 0, parent, NULL);
676} 462}
677EXPORT_SYMBOL(proc_mkdir); 463EXPORT_SYMBOL(proc_mkdir);
678 464
679struct proc_dir_entry *create_proc_entry(const char *name, umode_t mode,
680 struct proc_dir_entry *parent)
681{
682 struct proc_dir_entry *ent;
683 nlink_t nlink;
684
685 if (S_ISDIR(mode)) {
686 if ((mode & S_IALLUGO) == 0)
687 mode |= S_IRUGO | S_IXUGO;
688 nlink = 2;
689 } else {
690 if ((mode & S_IFMT) == 0)
691 mode |= S_IFREG;
692 if ((mode & S_IALLUGO) == 0)
693 mode |= S_IRUGO;
694 nlink = 1;
695 }
696
697 ent = __proc_create(&parent, name, mode, nlink);
698 if (ent) {
699 if (proc_register(parent, ent) < 0) {
700 kfree(ent);
701 ent = NULL;
702 }
703 }
704 return ent;
705}
706EXPORT_SYMBOL(create_proc_entry);
707
708struct proc_dir_entry *proc_create_data(const char *name, umode_t mode, 465struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
709 struct proc_dir_entry *parent, 466 struct proc_dir_entry *parent,
710 const struct file_operations *proc_fops, 467 const struct file_operations *proc_fops,
711 void *data) 468 void *data)
712{ 469{
713 struct proc_dir_entry *pde; 470 struct proc_dir_entry *pde;
714 nlink_t nlink; 471 if ((mode & S_IFMT) == 0)
472 mode |= S_IFREG;
715 473
716 if (S_ISDIR(mode)) { 474 if (!S_ISREG(mode)) {
717 if ((mode & S_IALLUGO) == 0) 475 WARN_ON(1); /* use proc_mkdir() */
718 mode |= S_IRUGO | S_IXUGO; 476 return NULL;
719 nlink = 2;
720 } else {
721 if ((mode & S_IFMT) == 0)
722 mode |= S_IFREG;
723 if ((mode & S_IALLUGO) == 0)
724 mode |= S_IRUGO;
725 nlink = 1;
726 } 477 }
727 478
728 pde = __proc_create(&parent, name, mode, nlink); 479 if ((mode & S_IALLUGO) == 0)
480 mode |= S_IRUGO;
481 pde = __proc_create(&parent, name, mode, 1);
729 if (!pde) 482 if (!pde)
730 goto out; 483 goto out;
731 pde->proc_fops = proc_fops; 484 pde->proc_fops = proc_fops;
@@ -739,6 +492,19 @@ out:
739 return NULL; 492 return NULL;
740} 493}
741EXPORT_SYMBOL(proc_create_data); 494EXPORT_SYMBOL(proc_create_data);
495
496void proc_set_size(struct proc_dir_entry *de, loff_t size)
497{
498 de->size = size;
499}
500EXPORT_SYMBOL(proc_set_size);
501
502void proc_set_user(struct proc_dir_entry *de, kuid_t uid, kgid_t gid)
503{
504 de->uid = uid;
505 de->gid = gid;
506}
507EXPORT_SYMBOL(proc_set_user);
742 508
743static void free_proc_entry(struct proc_dir_entry *de) 509static void free_proc_entry(struct proc_dir_entry *de)
744{ 510{
@@ -755,41 +521,6 @@ void pde_put(struct proc_dir_entry *pde)
755 free_proc_entry(pde); 521 free_proc_entry(pde);
756} 522}
757 523
758static void entry_rundown(struct proc_dir_entry *de)
759{
760 spin_lock(&de->pde_unload_lock);
761 /*
762 * Stop accepting new callers into module. If you're
763 * dynamically allocating ->proc_fops, save a pointer somewhere.
764 */
765 de->proc_fops = NULL;
766 /* Wait until all existing callers into module are done. */
767 if (de->pde_users > 0) {
768 DECLARE_COMPLETION_ONSTACK(c);
769
770 if (!de->pde_unload_completion)
771 de->pde_unload_completion = &c;
772
773 spin_unlock(&de->pde_unload_lock);
774
775 wait_for_completion(de->pde_unload_completion);
776
777 spin_lock(&de->pde_unload_lock);
778 }
779
780 while (!list_empty(&de->pde_openers)) {
781 struct pde_opener *pdeo;
782
783 pdeo = list_first_entry(&de->pde_openers, struct pde_opener, lh);
784 list_del(&pdeo->lh);
785 spin_unlock(&de->pde_unload_lock);
786 pdeo->release(pdeo->inode, pdeo->file);
787 kfree(pdeo);
788 spin_lock(&de->pde_unload_lock);
789 }
790 spin_unlock(&de->pde_unload_lock);
791}
792
793/* 524/*
794 * Remove a /proc entry and free it if it's not currently in use. 525 * Remove a /proc entry and free it if it's not currently in use.
795 */ 526 */
@@ -821,7 +552,7 @@ void remove_proc_entry(const char *name, struct proc_dir_entry *parent)
821 return; 552 return;
822 } 553 }
823 554
824 entry_rundown(de); 555 proc_entry_rundown(de);
825 556
826 if (S_ISDIR(de->mode)) 557 if (S_ISDIR(de->mode))
827 parent->nlink--; 558 parent->nlink--;
@@ -870,7 +601,7 @@ int remove_proc_subtree(const char *name, struct proc_dir_entry *parent)
870 } 601 }
871 spin_unlock(&proc_subdir_lock); 602 spin_unlock(&proc_subdir_lock);
872 603
873 entry_rundown(de); 604 proc_entry_rundown(de);
874 next = de->parent; 605 next = de->parent;
875 if (S_ISDIR(de->mode)) 606 if (S_ISDIR(de->mode))
876 next->nlink--; 607 next->nlink--;
@@ -886,3 +617,23 @@ int remove_proc_subtree(const char *name, struct proc_dir_entry *parent)
886 return 0; 617 return 0;
887} 618}
888EXPORT_SYMBOL(remove_proc_subtree); 619EXPORT_SYMBOL(remove_proc_subtree);
620
621void *proc_get_parent_data(const struct inode *inode)
622{
623 struct proc_dir_entry *de = PDE(inode);
624 return de->parent->data;
625}
626EXPORT_SYMBOL_GPL(proc_get_parent_data);
627
628void proc_remove(struct proc_dir_entry *de)
629{
630 if (de)
631 remove_proc_subtree(de->name, de->parent);
632}
633EXPORT_SYMBOL(proc_remove);
634
635void *PDE_DATA(const struct inode *inode)
636{
637 return __PDE_DATA(inode);
638}
639EXPORT_SYMBOL(PDE_DATA);
diff --git a/fs/proc/inode.c b/fs/proc/inode.c
index 869116c2afbe..073aea60cf8f 100644
--- a/fs/proc/inode.c
+++ b/fs/proc/inode.c
@@ -22,6 +22,7 @@
22#include <linux/seq_file.h> 22#include <linux/seq_file.h>
23#include <linux/slab.h> 23#include <linux/slab.h>
24#include <linux/mount.h> 24#include <linux/mount.h>
25#include <linux/magic.h>
25 26
26#include <asm/uaccess.h> 27#include <asm/uaccess.h>
27 28
@@ -50,8 +51,8 @@ static void proc_evict_inode(struct inode *inode)
50 sysctl_head_put(head); 51 sysctl_head_put(head);
51 } 52 }
52 /* Release any associated namespace */ 53 /* Release any associated namespace */
53 ns_ops = PROC_I(inode)->ns_ops; 54 ns_ops = PROC_I(inode)->ns.ns_ops;
54 ns = PROC_I(inode)->ns; 55 ns = PROC_I(inode)->ns.ns;
55 if (ns_ops && ns) 56 if (ns_ops && ns)
56 ns_ops->put(ns); 57 ns_ops->put(ns);
57} 58}
@@ -72,8 +73,8 @@ static struct inode *proc_alloc_inode(struct super_block *sb)
72 ei->pde = NULL; 73 ei->pde = NULL;
73 ei->sysctl = NULL; 74 ei->sysctl = NULL;
74 ei->sysctl_entry = NULL; 75 ei->sysctl_entry = NULL;
75 ei->ns = NULL; 76 ei->ns.ns = NULL;
76 ei->ns_ops = NULL; 77 ei->ns.ns_ops = NULL;
77 inode = &ei->vfs_inode; 78 inode = &ei->vfs_inode;
78 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME; 79 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
79 return inode; 80 return inode;
@@ -129,96 +130,100 @@ static const struct super_operations proc_sops = {
129 .show_options = proc_show_options, 130 .show_options = proc_show_options,
130}; 131};
131 132
132static void __pde_users_dec(struct proc_dir_entry *pde) 133enum {BIAS = -1U<<31};
134
135static inline int use_pde(struct proc_dir_entry *pde)
136{
137 return atomic_inc_unless_negative(&pde->in_use);
138}
139
140static void unuse_pde(struct proc_dir_entry *pde)
133{ 141{
134 pde->pde_users--; 142 if (atomic_dec_return(&pde->in_use) == BIAS)
135 if (pde->pde_unload_completion && pde->pde_users == 0)
136 complete(pde->pde_unload_completion); 143 complete(pde->pde_unload_completion);
137} 144}
138 145
139void pde_users_dec(struct proc_dir_entry *pde) 146/* pde is locked */
147static void close_pdeo(struct proc_dir_entry *pde, struct pde_opener *pdeo)
140{ 148{
141 spin_lock(&pde->pde_unload_lock); 149 if (pdeo->closing) {
142 __pde_users_dec(pde); 150 /* somebody else is doing that, just wait */
143 spin_unlock(&pde->pde_unload_lock); 151 DECLARE_COMPLETION_ONSTACK(c);
152 pdeo->c = &c;
153 spin_unlock(&pde->pde_unload_lock);
154 wait_for_completion(&c);
155 spin_lock(&pde->pde_unload_lock);
156 } else {
157 struct file *file;
158 pdeo->closing = 1;
159 spin_unlock(&pde->pde_unload_lock);
160 file = pdeo->file;
161 pde->proc_fops->release(file_inode(file), file);
162 spin_lock(&pde->pde_unload_lock);
163 list_del_init(&pdeo->lh);
164 if (pdeo->c)
165 complete(pdeo->c);
166 kfree(pdeo);
167 }
168}
169
170void proc_entry_rundown(struct proc_dir_entry *de)
171{
172 DECLARE_COMPLETION_ONSTACK(c);
173 /* Wait until all existing callers into module are done. */
174 de->pde_unload_completion = &c;
175 if (atomic_add_return(BIAS, &de->in_use) != BIAS)
176 wait_for_completion(&c);
177
178 spin_lock(&de->pde_unload_lock);
179 while (!list_empty(&de->pde_openers)) {
180 struct pde_opener *pdeo;
181 pdeo = list_first_entry(&de->pde_openers, struct pde_opener, lh);
182 close_pdeo(de, pdeo);
183 }
184 spin_unlock(&de->pde_unload_lock);
144} 185}
145 186
146static loff_t proc_reg_llseek(struct file *file, loff_t offset, int whence) 187static loff_t proc_reg_llseek(struct file *file, loff_t offset, int whence)
147{ 188{
148 struct proc_dir_entry *pde = PDE(file_inode(file)); 189 struct proc_dir_entry *pde = PDE(file_inode(file));
149 loff_t rv = -EINVAL; 190 loff_t rv = -EINVAL;
150 loff_t (*llseek)(struct file *, loff_t, int); 191 if (use_pde(pde)) {
151 192 loff_t (*llseek)(struct file *, loff_t, int);
152 spin_lock(&pde->pde_unload_lock); 193 llseek = pde->proc_fops->llseek;
153 /* 194 if (!llseek)
154 * remove_proc_entry() is going to delete PDE (as part of module 195 llseek = default_llseek;
155 * cleanup sequence). No new callers into module allowed. 196 rv = llseek(file, offset, whence);
156 */ 197 unuse_pde(pde);
157 if (!pde->proc_fops) {
158 spin_unlock(&pde->pde_unload_lock);
159 return rv;
160 } 198 }
161 /*
162 * Bump refcount so that remove_proc_entry will wail for ->llseek to
163 * complete.
164 */
165 pde->pde_users++;
166 /*
167 * Save function pointer under lock, to protect against ->proc_fops
168 * NULL'ifying right after ->pde_unload_lock is dropped.
169 */
170 llseek = pde->proc_fops->llseek;
171 spin_unlock(&pde->pde_unload_lock);
172
173 if (!llseek)
174 llseek = default_llseek;
175 rv = llseek(file, offset, whence);
176
177 pde_users_dec(pde);
178 return rv; 199 return rv;
179} 200}
180 201
181static ssize_t proc_reg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) 202static ssize_t proc_reg_read(struct file *file, char __user *buf, size_t count, loff_t *ppos)
182{ 203{
204 ssize_t (*read)(struct file *, char __user *, size_t, loff_t *);
183 struct proc_dir_entry *pde = PDE(file_inode(file)); 205 struct proc_dir_entry *pde = PDE(file_inode(file));
184 ssize_t rv = -EIO; 206 ssize_t rv = -EIO;
185 ssize_t (*read)(struct file *, char __user *, size_t, loff_t *); 207 if (use_pde(pde)) {
186 208 read = pde->proc_fops->read;
187 spin_lock(&pde->pde_unload_lock); 209 if (read)
188 if (!pde->proc_fops) { 210 rv = read(file, buf, count, ppos);
189 spin_unlock(&pde->pde_unload_lock); 211 unuse_pde(pde);
190 return rv;
191 } 212 }
192 pde->pde_users++;
193 read = pde->proc_fops->read;
194 spin_unlock(&pde->pde_unload_lock);
195
196 if (read)
197 rv = read(file, buf, count, ppos);
198
199 pde_users_dec(pde);
200 return rv; 213 return rv;
201} 214}
202 215
203static ssize_t proc_reg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos) 216static ssize_t proc_reg_write(struct file *file, const char __user *buf, size_t count, loff_t *ppos)
204{ 217{
218 ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *);
205 struct proc_dir_entry *pde = PDE(file_inode(file)); 219 struct proc_dir_entry *pde = PDE(file_inode(file));
206 ssize_t rv = -EIO; 220 ssize_t rv = -EIO;
207 ssize_t (*write)(struct file *, const char __user *, size_t, loff_t *); 221 if (use_pde(pde)) {
208 222 write = pde->proc_fops->write;
209 spin_lock(&pde->pde_unload_lock); 223 if (write)
210 if (!pde->proc_fops) { 224 rv = write(file, buf, count, ppos);
211 spin_unlock(&pde->pde_unload_lock); 225 unuse_pde(pde);
212 return rv;
213 } 226 }
214 pde->pde_users++;
215 write = pde->proc_fops->write;
216 spin_unlock(&pde->pde_unload_lock);
217
218 if (write)
219 rv = write(file, buf, count, ppos);
220
221 pde_users_dec(pde);
222 return rv; 227 return rv;
223} 228}
224 229
@@ -227,20 +232,12 @@ static unsigned int proc_reg_poll(struct file *file, struct poll_table_struct *p
227 struct proc_dir_entry *pde = PDE(file_inode(file)); 232 struct proc_dir_entry *pde = PDE(file_inode(file));
228 unsigned int rv = DEFAULT_POLLMASK; 233 unsigned int rv = DEFAULT_POLLMASK;
229 unsigned int (*poll)(struct file *, struct poll_table_struct *); 234 unsigned int (*poll)(struct file *, struct poll_table_struct *);
230 235 if (use_pde(pde)) {
231 spin_lock(&pde->pde_unload_lock); 236 poll = pde->proc_fops->poll;
232 if (!pde->proc_fops) { 237 if (poll)
233 spin_unlock(&pde->pde_unload_lock); 238 rv = poll(file, pts);
234 return rv; 239 unuse_pde(pde);
235 } 240 }
236 pde->pde_users++;
237 poll = pde->proc_fops->poll;
238 spin_unlock(&pde->pde_unload_lock);
239
240 if (poll)
241 rv = poll(file, pts);
242
243 pde_users_dec(pde);
244 return rv; 241 return rv;
245} 242}
246 243
@@ -249,20 +246,12 @@ static long proc_reg_unlocked_ioctl(struct file *file, unsigned int cmd, unsigne
249 struct proc_dir_entry *pde = PDE(file_inode(file)); 246 struct proc_dir_entry *pde = PDE(file_inode(file));
250 long rv = -ENOTTY; 247 long rv = -ENOTTY;
251 long (*ioctl)(struct file *, unsigned int, unsigned long); 248 long (*ioctl)(struct file *, unsigned int, unsigned long);
252 249 if (use_pde(pde)) {
253 spin_lock(&pde->pde_unload_lock); 250 ioctl = pde->proc_fops->unlocked_ioctl;
254 if (!pde->proc_fops) { 251 if (ioctl)
255 spin_unlock(&pde->pde_unload_lock); 252 rv = ioctl(file, cmd, arg);
256 return rv; 253 unuse_pde(pde);
257 } 254 }
258 pde->pde_users++;
259 ioctl = pde->proc_fops->unlocked_ioctl;
260 spin_unlock(&pde->pde_unload_lock);
261
262 if (ioctl)
263 rv = ioctl(file, cmd, arg);
264
265 pde_users_dec(pde);
266 return rv; 255 return rv;
267} 256}
268 257
@@ -272,20 +261,12 @@ static long proc_reg_compat_ioctl(struct file *file, unsigned int cmd, unsigned
272 struct proc_dir_entry *pde = PDE(file_inode(file)); 261 struct proc_dir_entry *pde = PDE(file_inode(file));
273 long rv = -ENOTTY; 262 long rv = -ENOTTY;
274 long (*compat_ioctl)(struct file *, unsigned int, unsigned long); 263 long (*compat_ioctl)(struct file *, unsigned int, unsigned long);
275 264 if (use_pde(pde)) {
276 spin_lock(&pde->pde_unload_lock); 265 compat_ioctl = pde->proc_fops->compat_ioctl;
277 if (!pde->proc_fops) { 266 if (compat_ioctl)
278 spin_unlock(&pde->pde_unload_lock); 267 rv = compat_ioctl(file, cmd, arg);
279 return rv; 268 unuse_pde(pde);
280 } 269 }
281 pde->pde_users++;
282 compat_ioctl = pde->proc_fops->compat_ioctl;
283 spin_unlock(&pde->pde_unload_lock);
284
285 if (compat_ioctl)
286 rv = compat_ioctl(file, cmd, arg);
287
288 pde_users_dec(pde);
289 return rv; 270 return rv;
290} 271}
291#endif 272#endif
@@ -295,20 +276,12 @@ static int proc_reg_mmap(struct file *file, struct vm_area_struct *vma)
295 struct proc_dir_entry *pde = PDE(file_inode(file)); 276 struct proc_dir_entry *pde = PDE(file_inode(file));
296 int rv = -EIO; 277 int rv = -EIO;
297 int (*mmap)(struct file *, struct vm_area_struct *); 278 int (*mmap)(struct file *, struct vm_area_struct *);
298 279 if (use_pde(pde)) {
299 spin_lock(&pde->pde_unload_lock); 280 mmap = pde->proc_fops->mmap;
300 if (!pde->proc_fops) { 281 if (mmap)
301 spin_unlock(&pde->pde_unload_lock); 282 rv = mmap(file, vma);
302 return rv; 283 unuse_pde(pde);
303 } 284 }
304 pde->pde_users++;
305 mmap = pde->proc_fops->mmap;
306 spin_unlock(&pde->pde_unload_lock);
307
308 if (mmap)
309 rv = mmap(file, vma);
310
311 pde_users_dec(pde);
312 return rv; 285 return rv;
313} 286}
314 287
@@ -330,91 +303,47 @@ static int proc_reg_open(struct inode *inode, struct file *file)
330 * by hand in remove_proc_entry(). For this, save opener's credentials 303 * by hand in remove_proc_entry(). For this, save opener's credentials
331 * for later. 304 * for later.
332 */ 305 */
333 pdeo = kmalloc(sizeof(struct pde_opener), GFP_KERNEL); 306 pdeo = kzalloc(sizeof(struct pde_opener), GFP_KERNEL);
334 if (!pdeo) 307 if (!pdeo)
335 return -ENOMEM; 308 return -ENOMEM;
336 309
337 spin_lock(&pde->pde_unload_lock); 310 if (!use_pde(pde)) {
338 if (!pde->proc_fops) {
339 spin_unlock(&pde->pde_unload_lock);
340 kfree(pdeo); 311 kfree(pdeo);
341 return -ENOENT; 312 return -ENOENT;
342 } 313 }
343 pde->pde_users++;
344 open = pde->proc_fops->open; 314 open = pde->proc_fops->open;
345 release = pde->proc_fops->release; 315 release = pde->proc_fops->release;
346 spin_unlock(&pde->pde_unload_lock);
347 316
348 if (open) 317 if (open)
349 rv = open(inode, file); 318 rv = open(inode, file);
350 319
351 spin_lock(&pde->pde_unload_lock);
352 if (rv == 0 && release) { 320 if (rv == 0 && release) {
353 /* To know what to release. */ 321 /* To know what to release. */
354 pdeo->inode = inode;
355 pdeo->file = file; 322 pdeo->file = file;
356 /* Strictly for "too late" ->release in proc_reg_release(). */ 323 /* Strictly for "too late" ->release in proc_reg_release(). */
357 pdeo->release = release; 324 spin_lock(&pde->pde_unload_lock);
358 list_add(&pdeo->lh, &pde->pde_openers); 325 list_add(&pdeo->lh, &pde->pde_openers);
326 spin_unlock(&pde->pde_unload_lock);
359 } else 327 } else
360 kfree(pdeo); 328 kfree(pdeo);
361 __pde_users_dec(pde);
362 spin_unlock(&pde->pde_unload_lock);
363 return rv;
364}
365
366static struct pde_opener *find_pde_opener(struct proc_dir_entry *pde,
367 struct inode *inode, struct file *file)
368{
369 struct pde_opener *pdeo;
370 329
371 list_for_each_entry(pdeo, &pde->pde_openers, lh) { 330 unuse_pde(pde);
372 if (pdeo->inode == inode && pdeo->file == file) 331 return rv;
373 return pdeo;
374 }
375 return NULL;
376} 332}
377 333
378static int proc_reg_release(struct inode *inode, struct file *file) 334static int proc_reg_release(struct inode *inode, struct file *file)
379{ 335{
380 struct proc_dir_entry *pde = PDE(inode); 336 struct proc_dir_entry *pde = PDE(inode);
381 int rv = 0;
382 int (*release)(struct inode *, struct file *);
383 struct pde_opener *pdeo; 337 struct pde_opener *pdeo;
384
385 spin_lock(&pde->pde_unload_lock); 338 spin_lock(&pde->pde_unload_lock);
386 pdeo = find_pde_opener(pde, inode, file); 339 list_for_each_entry(pdeo, &pde->pde_openers, lh) {
387 if (!pde->proc_fops) { 340 if (pdeo->file == file) {
388 /* 341 close_pdeo(pde, pdeo);
389 * Can't simply exit, __fput() will think that everything is OK, 342 break;
390 * and move on to freeing struct file. remove_proc_entry() will 343 }
391 * find slacker in opener's list and will try to do non-trivial
392 * things with struct file. Therefore, remove opener from list.
393 *
394 * But if opener is removed from list, who will ->release it?
395 */
396 if (pdeo) {
397 list_del(&pdeo->lh);
398 spin_unlock(&pde->pde_unload_lock);
399 rv = pdeo->release(inode, file);
400 kfree(pdeo);
401 } else
402 spin_unlock(&pde->pde_unload_lock);
403 return rv;
404 }
405 pde->pde_users++;
406 release = pde->proc_fops->release;
407 if (pdeo) {
408 list_del(&pdeo->lh);
409 kfree(pdeo);
410 } 344 }
411 spin_unlock(&pde->pde_unload_lock); 345 spin_unlock(&pde->pde_unload_lock);
412 346 return 0;
413 if (release)
414 rv = release(inode, file);
415
416 pde_users_dec(pde);
417 return rv;
418} 347}
419 348
420static const struct file_operations proc_reg_file_ops = { 349static const struct file_operations proc_reg_file_ops = {
@@ -462,8 +391,8 @@ struct inode *proc_get_inode(struct super_block *sb, struct proc_dir_entry *de)
462 inode->i_size = de->size; 391 inode->i_size = de->size;
463 if (de->nlink) 392 if (de->nlink)
464 set_nlink(inode, de->nlink); 393 set_nlink(inode, de->nlink);
465 if (de->proc_iops) 394 WARN_ON(!de->proc_iops);
466 inode->i_op = de->proc_iops; 395 inode->i_op = de->proc_iops;
467 if (de->proc_fops) { 396 if (de->proc_fops) {
468 if (S_ISREG(inode->i_mode)) { 397 if (S_ISREG(inode->i_mode)) {
469#ifdef CONFIG_COMPAT 398#ifdef CONFIG_COMPAT
@@ -506,5 +435,5 @@ int proc_fill_super(struct super_block *s)
506 return -ENOMEM; 435 return -ENOMEM;
507 } 436 }
508 437
509 return 0; 438 return proc_setup_self(s);
510} 439}
diff --git a/fs/proc/internal.h b/fs/proc/internal.h
index 75710357a517..d600fb098b6a 100644
--- a/fs/proc/internal.h
+++ b/fs/proc/internal.h
@@ -1,4 +1,4 @@
1/* internal.h: internal procfs definitions 1/* Internal procfs definitions
2 * 2 *
3 * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved. 3 * Copyright (C) 2004 Red Hat, Inc. All Rights Reserved.
4 * Written by David Howells (dhowells@redhat.com) 4 * Written by David Howells (dhowells@redhat.com)
@@ -9,62 +9,83 @@
9 * 2 of the License, or (at your option) any later version. 9 * 2 of the License, or (at your option) any later version.
10 */ 10 */
11 11
12#include <linux/sched.h>
13#include <linux/proc_fs.h> 12#include <linux/proc_fs.h>
13#include <linux/proc_ns.h>
14#include <linux/spinlock.h>
15#include <linux/atomic.h>
14#include <linux/binfmts.h> 16#include <linux/binfmts.h>
15struct ctl_table_header;
16struct mempolicy;
17 17
18extern struct proc_dir_entry proc_root; 18struct ctl_table_header;
19extern void proc_self_init(void); 19struct mempolicy;
20#ifdef CONFIG_PROC_SYSCTL
21extern int proc_sys_init(void);
22extern void sysctl_head_put(struct ctl_table_header *head);
23#else
24static inline void proc_sys_init(void) { }
25static inline void sysctl_head_put(struct ctl_table_header *head) { }
26#endif
27#ifdef CONFIG_NET
28extern int proc_net_init(void);
29#else
30static inline int proc_net_init(void) { return 0; }
31#endif
32 20
33extern int proc_tid_stat(struct seq_file *m, struct pid_namespace *ns, 21/*
34 struct pid *pid, struct task_struct *task); 22 * This is not completely implemented yet. The idea is to
35extern int proc_tgid_stat(struct seq_file *m, struct pid_namespace *ns, 23 * create an in-memory tree (like the actual /proc filesystem
36 struct pid *pid, struct task_struct *task); 24 * tree) of these proc_dir_entries, so that we can dynamically
37extern int proc_pid_status(struct seq_file *m, struct pid_namespace *ns, 25 * add new files to /proc.
38 struct pid *pid, struct task_struct *task); 26 *
39extern int proc_pid_statm(struct seq_file *m, struct pid_namespace *ns, 27 * The "next" pointer creates a linked list of one /proc directory,
40 struct pid *pid, struct task_struct *task); 28 * while parent/subdir create the directory structure (every
41extern loff_t mem_lseek(struct file *file, loff_t offset, int orig); 29 * /proc file has a parent, but "subdir" is NULL for all
30 * non-directory entries).
31 */
32struct proc_dir_entry {
33 unsigned int low_ino;
34 umode_t mode;
35 nlink_t nlink;
36 kuid_t uid;
37 kgid_t gid;
38 loff_t size;
39 const struct inode_operations *proc_iops;
40 const struct file_operations *proc_fops;
41 struct proc_dir_entry *next, *parent, *subdir;
42 void *data;
43 atomic_t count; /* use count */
44 atomic_t in_use; /* number of callers into module in progress; */
45 /* negative -> it's going away RSN */
46 struct completion *pde_unload_completion;
47 struct list_head pde_openers; /* who did ->open, but not ->release */
48 spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
49 u8 namelen;
50 char name[];
51};
42 52
43extern const struct file_operations proc_tid_children_operations; 53union proc_op {
44extern const struct file_operations proc_pid_maps_operations; 54 int (*proc_get_link)(struct dentry *, struct path *);
45extern const struct file_operations proc_tid_maps_operations; 55 int (*proc_read)(struct task_struct *task, char *page);
46extern const struct file_operations proc_pid_numa_maps_operations; 56 int (*proc_show)(struct seq_file *m,
47extern const struct file_operations proc_tid_numa_maps_operations; 57 struct pid_namespace *ns, struct pid *pid,
48extern const struct file_operations proc_pid_smaps_operations; 58 struct task_struct *task);
49extern const struct file_operations proc_tid_smaps_operations; 59};
50extern const struct file_operations proc_clear_refs_operations;
51extern const struct file_operations proc_pagemap_operations;
52extern const struct file_operations proc_net_operations;
53extern const struct inode_operations proc_net_inode_operations;
54extern const struct inode_operations proc_pid_link_inode_operations;
55 60
56struct proc_maps_private { 61struct proc_inode {
57 struct pid *pid; 62 struct pid *pid;
58 struct task_struct *task; 63 int fd;
59#ifdef CONFIG_MMU 64 union proc_op op;
60 struct vm_area_struct *tail_vma; 65 struct proc_dir_entry *pde;
61#endif 66 struct ctl_table_header *sysctl;
62#ifdef CONFIG_NUMA 67 struct ctl_table *sysctl_entry;
63 struct mempolicy *task_mempolicy; 68 struct proc_ns ns;
64#endif 69 struct inode vfs_inode;
65}; 70};
66 71
67void proc_init_inodecache(void); 72/*
73 * General functions
74 */
75static inline struct proc_inode *PROC_I(const struct inode *inode)
76{
77 return container_of(inode, struct proc_inode, vfs_inode);
78}
79
80static inline struct proc_dir_entry *PDE(const struct inode *inode)
81{
82 return PROC_I(inode)->pde;
83}
84
85static inline void *__PDE_DATA(const struct inode *inode)
86{
87 return PDE(inode)->data;
88}
68 89
69static inline struct pid *proc_pid(struct inode *inode) 90static inline struct pid *proc_pid(struct inode *inode)
70{ 91{
@@ -76,11 +97,6 @@ static inline struct task_struct *get_proc_task(struct inode *inode)
76 return get_pid_task(proc_pid(inode), PIDTYPE_PID); 97 return get_pid_task(proc_pid(inode), PIDTYPE_PID);
77} 98}
78 99
79static inline int proc_fd(struct inode *inode)
80{
81 return PROC_I(inode)->fd;
82}
83
84static inline int task_dumpable(struct task_struct *task) 100static inline int task_dumpable(struct task_struct *task)
85{ 101{
86 int dumpable = 0; 102 int dumpable = 0;
@@ -96,15 +112,6 @@ static inline int task_dumpable(struct task_struct *task)
96 return 0; 112 return 0;
97} 113}
98 114
99static inline int pid_delete_dentry(const struct dentry * dentry)
100{
101 /* Is the task we represent dead?
102 * If so, then don't put the dentry on the lru list,
103 * kill it immediately.
104 */
105 return !proc_pid(dentry->d_inode)->tasks[PIDTYPE_PID].first;
106}
107
108static inline unsigned name_to_int(struct dentry *dentry) 115static inline unsigned name_to_int(struct dentry *dentry)
109{ 116{
110 const char *name = dentry->d_name.name; 117 const char *name = dentry->d_name.name;
@@ -127,63 +134,165 @@ out:
127 return ~0U; 134 return ~0U;
128} 135}
129 136
130struct dentry *proc_lookup_de(struct proc_dir_entry *de, struct inode *ino, 137/*
131 struct dentry *dentry); 138 * Offset of the first process in the /proc root directory..
132int proc_readdir_de(struct proc_dir_entry *de, struct file *filp, void *dirent, 139 */
133 filldir_t filldir); 140#define FIRST_PROCESS_ENTRY 256
141
142/* Worst case buffer size needed for holding an integer. */
143#define PROC_NUMBUF 13
134 144
135struct pde_opener { 145/*
136 struct inode *inode; 146 * array.c
137 struct file *file; 147 */
138 int (*release)(struct inode *, struct file *); 148extern const struct file_operations proc_tid_children_operations;
139 struct list_head lh;
140};
141void pde_users_dec(struct proc_dir_entry *pde);
142 149
150extern int proc_tid_stat(struct seq_file *, struct pid_namespace *,
151 struct pid *, struct task_struct *);
152extern int proc_tgid_stat(struct seq_file *, struct pid_namespace *,
153 struct pid *, struct task_struct *);
154extern int proc_pid_status(struct seq_file *, struct pid_namespace *,
155 struct pid *, struct task_struct *);
156extern int proc_pid_statm(struct seq_file *, struct pid_namespace *,
157 struct pid *, struct task_struct *);
158
159/*
160 * base.c
161 */
162extern const struct dentry_operations pid_dentry_operations;
163extern int pid_getattr(struct vfsmount *, struct dentry *, struct kstat *);
164extern int proc_setattr(struct dentry *, struct iattr *);
165extern struct inode *proc_pid_make_inode(struct super_block *, struct task_struct *);
166extern int pid_revalidate(struct dentry *, unsigned int);
167extern int pid_delete_dentry(const struct dentry *);
168extern int proc_pid_readdir(struct file *, void *, filldir_t);
169extern struct dentry *proc_pid_lookup(struct inode *, struct dentry *, unsigned int);
170extern loff_t mem_lseek(struct file *, loff_t, int);
171
172/* Lookups */
173typedef struct dentry *instantiate_t(struct inode *, struct dentry *,
174 struct task_struct *, const void *);
175extern int proc_fill_cache(struct file *, void *, filldir_t, const char *, int,
176 instantiate_t, struct task_struct *, const void *);
177
178/*
179 * generic.c
180 */
143extern spinlock_t proc_subdir_lock; 181extern spinlock_t proc_subdir_lock;
144 182
145struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, unsigned int); 183extern struct dentry *proc_lookup(struct inode *, struct dentry *, unsigned int);
146int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir); 184extern struct dentry *proc_lookup_de(struct proc_dir_entry *, struct inode *,
147unsigned long task_vsize(struct mm_struct *); 185 struct dentry *);
148unsigned long task_statm(struct mm_struct *, 186extern int proc_readdir(struct file *, void *, filldir_t);
149 unsigned long *, unsigned long *, unsigned long *, unsigned long *); 187extern int proc_readdir_de(struct proc_dir_entry *, struct file *, void *, filldir_t);
150void task_mem(struct seq_file *, struct mm_struct *);
151 188
152static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde) 189static inline struct proc_dir_entry *pde_get(struct proc_dir_entry *pde)
153{ 190{
154 atomic_inc(&pde->count); 191 atomic_inc(&pde->count);
155 return pde; 192 return pde;
156} 193}
157void pde_put(struct proc_dir_entry *pde); 194extern void pde_put(struct proc_dir_entry *);
158
159int proc_fill_super(struct super_block *);
160struct inode *proc_get_inode(struct super_block *, struct proc_dir_entry *);
161int proc_remount(struct super_block *sb, int *flags, char *data);
162 195
163/* 196/*
164 * These are generic /proc routines that use the internal 197 * inode.c
165 * "struct proc_dir_entry" tree to traverse the filesystem.
166 *
167 * The /proc root directory has extended versions to take care
168 * of the /proc/<pid> subdirectories.
169 */ 198 */
170int proc_readdir(struct file *, void *, filldir_t); 199struct pde_opener {
171struct dentry *proc_lookup(struct inode *, struct dentry *, unsigned int); 200 struct file *file;
201 struct list_head lh;
202 int closing;
203 struct completion *c;
204};
172 205
206extern const struct inode_operations proc_pid_link_inode_operations;
173 207
208extern void proc_init_inodecache(void);
209extern struct inode *proc_get_inode(struct super_block *, struct proc_dir_entry *);
210extern int proc_fill_super(struct super_block *);
211extern void proc_entry_rundown(struct proc_dir_entry *);
174 212
175/* Lookups */ 213/*
176typedef struct dentry *instantiate_t(struct inode *, struct dentry *, 214 * proc_devtree.c
177 struct task_struct *, const void *); 215 */
178int proc_fill_cache(struct file *filp, void *dirent, filldir_t filldir, 216#ifdef CONFIG_PROC_DEVICETREE
179 const char *name, int len, 217extern void proc_device_tree_init(void);
180 instantiate_t instantiate, struct task_struct *task, const void *ptr); 218#endif
181int pid_revalidate(struct dentry *dentry, unsigned int flags);
182struct inode *proc_pid_make_inode(struct super_block * sb, struct task_struct *task);
183extern const struct dentry_operations pid_dentry_operations;
184int pid_getattr(struct vfsmount *mnt, struct dentry *dentry, struct kstat *stat);
185int proc_setattr(struct dentry *dentry, struct iattr *attr);
186 219
220/*
221 * proc_namespaces.c
222 */
187extern const struct inode_operations proc_ns_dir_inode_operations; 223extern const struct inode_operations proc_ns_dir_inode_operations;
188extern const struct file_operations proc_ns_dir_operations; 224extern const struct file_operations proc_ns_dir_operations;
189 225
226/*
227 * proc_net.c
228 */
229extern const struct file_operations proc_net_operations;
230extern const struct inode_operations proc_net_inode_operations;
231
232#ifdef CONFIG_NET
233extern int proc_net_init(void);
234#else
235static inline int proc_net_init(void) { return 0; }
236#endif
237
238/*
239 * proc_self.c
240 */
241extern int proc_setup_self(struct super_block *);
242
243/*
244 * proc_sysctl.c
245 */
246#ifdef CONFIG_PROC_SYSCTL
247extern int proc_sys_init(void);
248extern void sysctl_head_put(struct ctl_table_header *);
249#else
250static inline void proc_sys_init(void) { }
251static inline void sysctl_head_put(struct ctl_table_header *head) { }
252#endif
253
254/*
255 * proc_tty.c
256 */
257#ifdef CONFIG_TTY
258extern void proc_tty_init(void);
259#else
260static inline void proc_tty_init(void) {}
261#endif
262
263/*
264 * root.c
265 */
266extern struct proc_dir_entry proc_root;
267
268extern void proc_self_init(void);
269extern int proc_remount(struct super_block *, int *, char *);
270
271/*
272 * task_[no]mmu.c
273 */
274struct proc_maps_private {
275 struct pid *pid;
276 struct task_struct *task;
277#ifdef CONFIG_MMU
278 struct vm_area_struct *tail_vma;
279#endif
280#ifdef CONFIG_NUMA
281 struct mempolicy *task_mempolicy;
282#endif
283};
284
285extern const struct file_operations proc_pid_maps_operations;
286extern const struct file_operations proc_tid_maps_operations;
287extern const struct file_operations proc_pid_numa_maps_operations;
288extern const struct file_operations proc_tid_numa_maps_operations;
289extern const struct file_operations proc_pid_smaps_operations;
290extern const struct file_operations proc_tid_smaps_operations;
291extern const struct file_operations proc_clear_refs_operations;
292extern const struct file_operations proc_pagemap_operations;
293
294extern unsigned long task_vsize(struct mm_struct *);
295extern unsigned long task_statm(struct mm_struct *,
296 unsigned long *, unsigned long *,
297 unsigned long *, unsigned long *);
298extern void task_mem(struct seq_file *, struct mm_struct *);
diff --git a/fs/proc/kcore.c b/fs/proc/kcore.c
index f6a13f489e30..0a22194e5d58 100644
--- a/fs/proc/kcore.c
+++ b/fs/proc/kcore.c
@@ -11,6 +11,7 @@
11 11
12#include <linux/mm.h> 12#include <linux/mm.h>
13#include <linux/proc_fs.h> 13#include <linux/proc_fs.h>
14#include <linux/kcore.h>
14#include <linux/user.h> 15#include <linux/user.h>
15#include <linux/capability.h> 16#include <linux/capability.h>
16#include <linux/elf.h> 17#include <linux/elf.h>
@@ -28,6 +29,7 @@
28#include <linux/ioport.h> 29#include <linux/ioport.h>
29#include <linux/memory.h> 30#include <linux/memory.h>
30#include <asm/sections.h> 31#include <asm/sections.h>
32#include "internal.h"
31 33
32#define CORE_STR "CORE" 34#define CORE_STR "CORE"
33 35
diff --git a/fs/proc/namespaces.c b/fs/proc/namespaces.c
index 66b51c0383da..54bdc6701e9f 100644
--- a/fs/proc/namespaces.c
+++ b/fs/proc/namespaces.c
@@ -51,7 +51,7 @@ static int ns_delete_dentry(const struct dentry *dentry)
51static char *ns_dname(struct dentry *dentry, char *buffer, int buflen) 51static char *ns_dname(struct dentry *dentry, char *buffer, int buflen)
52{ 52{
53 struct inode *inode = dentry->d_inode; 53 struct inode *inode = dentry->d_inode;
54 const struct proc_ns_operations *ns_ops = PROC_I(inode)->ns_ops; 54 const struct proc_ns_operations *ns_ops = PROC_I(inode)->ns.ns_ops;
55 55
56 return dynamic_dname(dentry, buffer, buflen, "%s:[%lu]", 56 return dynamic_dname(dentry, buffer, buflen, "%s:[%lu]",
57 ns_ops->name, inode->i_ino); 57 ns_ops->name, inode->i_ino);
@@ -95,8 +95,8 @@ static struct dentry *proc_ns_get_dentry(struct super_block *sb,
95 inode->i_op = &ns_inode_operations; 95 inode->i_op = &ns_inode_operations;
96 inode->i_mode = S_IFREG | S_IRUGO; 96 inode->i_mode = S_IFREG | S_IRUGO;
97 inode->i_fop = &ns_file_operations; 97 inode->i_fop = &ns_file_operations;
98 ei->ns_ops = ns_ops; 98 ei->ns.ns_ops = ns_ops;
99 ei->ns = ns; 99 ei->ns.ns = ns;
100 unlock_new_inode(inode); 100 unlock_new_inode(inode);
101 } else { 101 } else {
102 ns_ops->put(ns); 102 ns_ops->put(ns);
@@ -128,7 +128,7 @@ static void *proc_ns_follow_link(struct dentry *dentry, struct nameidata *nd)
128 if (!ptrace_may_access(task, PTRACE_MODE_READ)) 128 if (!ptrace_may_access(task, PTRACE_MODE_READ))
129 goto out_put_task; 129 goto out_put_task;
130 130
131 ns_path.dentry = proc_ns_get_dentry(sb, task, ei->ns_ops); 131 ns_path.dentry = proc_ns_get_dentry(sb, task, ei->ns.ns_ops);
132 if (IS_ERR(ns_path.dentry)) { 132 if (IS_ERR(ns_path.dentry)) {
133 error = ERR_CAST(ns_path.dentry); 133 error = ERR_CAST(ns_path.dentry);
134 goto out_put_task; 134 goto out_put_task;
@@ -148,7 +148,7 @@ static int proc_ns_readlink(struct dentry *dentry, char __user *buffer, int bufl
148{ 148{
149 struct inode *inode = dentry->d_inode; 149 struct inode *inode = dentry->d_inode;
150 struct proc_inode *ei = PROC_I(inode); 150 struct proc_inode *ei = PROC_I(inode);
151 const struct proc_ns_operations *ns_ops = ei->ns_ops; 151 const struct proc_ns_operations *ns_ops = ei->ns.ns_ops;
152 struct task_struct *task; 152 struct task_struct *task;
153 void *ns; 153 void *ns;
154 char name[50]; 154 char name[50];
@@ -202,7 +202,7 @@ static struct dentry *proc_ns_instantiate(struct inode *dir,
202 ei = PROC_I(inode); 202 ei = PROC_I(inode);
203 inode->i_mode = S_IFLNK|S_IRWXUGO; 203 inode->i_mode = S_IFLNK|S_IRWXUGO;
204 inode->i_op = &proc_ns_link_inode_operations; 204 inode->i_op = &proc_ns_link_inode_operations;
205 ei->ns_ops = ns_ops; 205 ei->ns.ns_ops = ns_ops;
206 206
207 d_set_d_op(dentry, &pid_dentry_operations); 207 d_set_d_op(dentry, &pid_dentry_operations);
208 d_add(dentry, inode); 208 d_add(dentry, inode);
@@ -337,6 +337,11 @@ out_invalid:
337 return ERR_PTR(-EINVAL); 337 return ERR_PTR(-EINVAL);
338} 338}
339 339
340struct proc_ns *get_proc_ns(struct inode *inode)
341{
342 return &PROC_I(inode)->ns;
343}
344
340bool proc_ns_inode(struct inode *inode) 345bool proc_ns_inode(struct inode *inode)
341{ 346{
342 return inode->i_fop == &ns_file_operations; 347 return inode->i_fop == &ns_file_operations;
diff --git a/fs/proc/proc_devtree.c b/fs/proc/proc_devtree.c
index 30b590f5bd35..505afc950e0a 100644
--- a/fs/proc/proc_devtree.c
+++ b/fs/proc/proc_devtree.c
@@ -41,7 +41,7 @@ static int property_proc_show(struct seq_file *m, void *v)
41 41
42static int property_proc_open(struct inode *inode, struct file *file) 42static int property_proc_open(struct inode *inode, struct file *file)
43{ 43{
44 return single_open(file, property_proc_show, PDE(inode)->data); 44 return single_open(file, property_proc_show, __PDE_DATA(inode));
45} 45}
46 46
47static const struct file_operations property_proc_fops = { 47static const struct file_operations property_proc_fops = {
diff --git a/fs/proc/proc_net.c b/fs/proc/proc_net.c
index b4ac6572474f..986e83220d56 100644
--- a/fs/proc/proc_net.c
+++ b/fs/proc/proc_net.c
@@ -26,6 +26,10 @@
26 26
27#include "internal.h" 27#include "internal.h"
28 28
29static inline struct net *PDE_NET(struct proc_dir_entry *pde)
30{
31 return pde->parent->data;
32}
29 33
30static struct net *get_proc_net(const struct inode *inode) 34static struct net *get_proc_net(const struct inode *inode)
31{ 35{
diff --git a/fs/proc/root.c b/fs/proc/root.c
index 9c7fab1d23f0..41a6ea93f486 100644
--- a/fs/proc/root.c
+++ b/fs/proc/root.c
@@ -141,6 +141,8 @@ static void proc_kill_sb(struct super_block *sb)
141 struct pid_namespace *ns; 141 struct pid_namespace *ns;
142 142
143 ns = (struct pid_namespace *)sb->s_fs_info; 143 ns = (struct pid_namespace *)sb->s_fs_info;
144 if (ns->proc_self)
145 dput(ns->proc_self);
144 kill_anon_super(sb); 146 kill_anon_super(sb);
145 put_pid_ns(ns); 147 put_pid_ns(ns);
146} 148}
diff --git a/fs/proc/self.c b/fs/proc/self.c
index aa5cc3bff140..6b6a993b5c25 100644
--- a/fs/proc/self.c
+++ b/fs/proc/self.c
@@ -1,6 +1,8 @@
1#include <linux/proc_fs.h>
2#include <linux/sched.h> 1#include <linux/sched.h>
3#include <linux/namei.h> 2#include <linux/namei.h>
3#include <linux/slab.h>
4#include <linux/pid_namespace.h>
5#include "internal.h"
4 6
5/* 7/*
6 * /proc/self: 8 * /proc/self:
@@ -48,12 +50,43 @@ static const struct inode_operations proc_self_inode_operations = {
48 .put_link = proc_self_put_link, 50 .put_link = proc_self_put_link,
49}; 51};
50 52
51void __init proc_self_init(void) 53static unsigned self_inum;
54
55int proc_setup_self(struct super_block *s)
52{ 56{
53 struct proc_dir_entry *proc_self_symlink; 57 struct inode *root_inode = s->s_root->d_inode;
54 mode_t mode; 58 struct pid_namespace *ns = s->s_fs_info;
59 struct dentry *self;
60
61 mutex_lock(&root_inode->i_mutex);
62 self = d_alloc_name(s->s_root, "self");
63 if (self) {
64 struct inode *inode = new_inode_pseudo(s);
65 if (inode) {
66 inode->i_ino = self_inum;
67 inode->i_mtime = inode->i_atime = inode->i_ctime = CURRENT_TIME;
68 inode->i_mode = S_IFLNK | S_IRWXUGO;
69 inode->i_uid = GLOBAL_ROOT_UID;
70 inode->i_gid = GLOBAL_ROOT_GID;
71 inode->i_op = &proc_self_inode_operations;
72 d_add(self, inode);
73 } else {
74 dput(self);
75 self = ERR_PTR(-ENOMEM);
76 }
77 } else {
78 self = ERR_PTR(-ENOMEM);
79 }
80 mutex_unlock(&root_inode->i_mutex);
81 if (IS_ERR(self)) {
82 pr_err("proc_fill_super: can't allocate /proc/self\n");
83 return PTR_ERR(self);
84 }
85 ns->proc_self = self;
86 return 0;
87}
55 88
56 mode = S_IFLNK | S_IRWXUGO; 89void __init proc_self_init(void)
57 proc_self_symlink = proc_create("self", mode, NULL, NULL ); 90{
58 proc_self_symlink->proc_iops = &proc_self_inode_operations; 91 proc_alloc_inum(&self_inum);
59} 92}
diff --git a/fs/proc/vmcore.c b/fs/proc/vmcore.c
index b870f740ab5a..17f7e080d7ff 100644
--- a/fs/proc/vmcore.c
+++ b/fs/proc/vmcore.c
@@ -8,7 +8,7 @@
8 */ 8 */
9 9
10#include <linux/mm.h> 10#include <linux/mm.h>
11#include <linux/proc_fs.h> 11#include <linux/kcore.h>
12#include <linux/user.h> 12#include <linux/user.h>
13#include <linux/elf.h> 13#include <linux/elf.h>
14#include <linux/elfcore.h> 14#include <linux/elfcore.h>
@@ -22,6 +22,7 @@
22#include <linux/list.h> 22#include <linux/list.h>
23#include <asm/uaccess.h> 23#include <asm/uaccess.h>
24#include <asm/io.h> 24#include <asm/io.h>
25#include "internal.h"
25 26
26/* List representing chunks of contiguous memory areas and their offsets in 27/* List representing chunks of contiguous memory areas and their offsets in
27 * vmcore file. 28 * vmcore file.
@@ -698,7 +699,7 @@ void vmcore_cleanup(void)
698 struct list_head *pos, *next; 699 struct list_head *pos, *next;
699 700
700 if (proc_vmcore) { 701 if (proc_vmcore) {
701 remove_proc_entry(proc_vmcore->name, proc_vmcore->parent); 702 proc_remove(proc_vmcore);
702 proc_vmcore = NULL; 703 proc_vmcore = NULL;
703 } 704 }
704 705
diff --git a/fs/read_write.c b/fs/read_write.c
index 8274a794253b..605dbbcb1973 100644
--- a/fs/read_write.c
+++ b/fs/read_write.c
@@ -459,6 +459,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
459 ret = rw_verify_area(WRITE, file, pos, count); 459 ret = rw_verify_area(WRITE, file, pos, count);
460 if (ret >= 0) { 460 if (ret >= 0) {
461 count = ret; 461 count = ret;
462 file_start_write(file);
462 if (file->f_op->write) 463 if (file->f_op->write)
463 ret = file->f_op->write(file, buf, count, pos); 464 ret = file->f_op->write(file, buf, count, pos);
464 else 465 else
@@ -468,6 +469,7 @@ ssize_t vfs_write(struct file *file, const char __user *buf, size_t count, loff_
468 add_wchar(current, ret); 469 add_wchar(current, ret);
469 } 470 }
470 inc_syscw(current); 471 inc_syscw(current);
472 file_end_write(file);
471 } 473 }
472 474
473 return ret; 475 return ret;
@@ -576,7 +578,7 @@ unsigned long iov_shorten(struct iovec *iov, unsigned long nr_segs, size_t to)
576} 578}
577EXPORT_SYMBOL(iov_shorten); 579EXPORT_SYMBOL(iov_shorten);
578 580
579ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov, 581static ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov,
580 unsigned long nr_segs, size_t len, loff_t *ppos, iov_fn_t fn) 582 unsigned long nr_segs, size_t len, loff_t *ppos, iov_fn_t fn)
581{ 583{
582 struct kiocb kiocb; 584 struct kiocb kiocb;
@@ -601,7 +603,7 @@ ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov,
601} 603}
602 604
603/* Do it by hand, with file-ops */ 605/* Do it by hand, with file-ops */
604ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov, 606static ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov,
605 unsigned long nr_segs, loff_t *ppos, io_fn_t fn) 607 unsigned long nr_segs, loff_t *ppos, io_fn_t fn)
606{ 608{
607 struct iovec *vector = iov; 609 struct iovec *vector = iov;
@@ -743,6 +745,7 @@ static ssize_t do_readv_writev(int type, struct file *file,
743 } else { 745 } else {
744 fn = (io_fn_t)file->f_op->write; 746 fn = (io_fn_t)file->f_op->write;
745 fnv = file->f_op->aio_write; 747 fnv = file->f_op->aio_write;
748 file_start_write(file);
746 } 749 }
747 750
748 if (fnv) 751 if (fnv)
@@ -751,6 +754,9 @@ static ssize_t do_readv_writev(int type, struct file *file,
751 else 754 else
752 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn); 755 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
753 756
757 if (type != READ)
758 file_end_write(file);
759
754out: 760out:
755 if (iov != iovstack) 761 if (iov != iovstack)
756 kfree(iov); 762 kfree(iov);
@@ -881,6 +887,201 @@ SYSCALL_DEFINE5(pwritev, unsigned long, fd, const struct iovec __user *, vec,
881 return ret; 887 return ret;
882} 888}
883 889
890#ifdef CONFIG_COMPAT
891
892static ssize_t compat_do_readv_writev(int type, struct file *file,
893 const struct compat_iovec __user *uvector,
894 unsigned long nr_segs, loff_t *pos)
895{
896 compat_ssize_t tot_len;
897 struct iovec iovstack[UIO_FASTIOV];
898 struct iovec *iov = iovstack;
899 ssize_t ret;
900 io_fn_t fn;
901 iov_fn_t fnv;
902
903 ret = -EINVAL;
904 if (!file->f_op)
905 goto out;
906
907 ret = -EFAULT;
908 if (!access_ok(VERIFY_READ, uvector, nr_segs*sizeof(*uvector)))
909 goto out;
910
911 ret = compat_rw_copy_check_uvector(type, uvector, nr_segs,
912 UIO_FASTIOV, iovstack, &iov);
913 if (ret <= 0)
914 goto out;
915
916 tot_len = ret;
917 ret = rw_verify_area(type, file, pos, tot_len);
918 if (ret < 0)
919 goto out;
920
921 fnv = NULL;
922 if (type == READ) {
923 fn = file->f_op->read;
924 fnv = file->f_op->aio_read;
925 } else {
926 fn = (io_fn_t)file->f_op->write;
927 fnv = file->f_op->aio_write;
928 file_start_write(file);
929 }
930
931 if (fnv)
932 ret = do_sync_readv_writev(file, iov, nr_segs, tot_len,
933 pos, fnv);
934 else
935 ret = do_loop_readv_writev(file, iov, nr_segs, pos, fn);
936
937 if (type != READ)
938 file_end_write(file);
939
940out:
941 if (iov != iovstack)
942 kfree(iov);
943 if ((ret + (type == READ)) > 0) {
944 if (type == READ)
945 fsnotify_access(file);
946 else
947 fsnotify_modify(file);
948 }
949 return ret;
950}
951
952static size_t compat_readv(struct file *file,
953 const struct compat_iovec __user *vec,
954 unsigned long vlen, loff_t *pos)
955{
956 ssize_t ret = -EBADF;
957
958 if (!(file->f_mode & FMODE_READ))
959 goto out;
960
961 ret = -EINVAL;
962 if (!file->f_op || (!file->f_op->aio_read && !file->f_op->read))
963 goto out;
964
965 ret = compat_do_readv_writev(READ, file, vec, vlen, pos);
966
967out:
968 if (ret > 0)
969 add_rchar(current, ret);
970 inc_syscr(current);
971 return ret;
972}
973
974COMPAT_SYSCALL_DEFINE3(readv, unsigned long, fd,
975 const struct compat_iovec __user *,vec,
976 unsigned long, vlen)
977{
978 struct fd f = fdget(fd);
979 ssize_t ret;
980 loff_t pos;
981
982 if (!f.file)
983 return -EBADF;
984 pos = f.file->f_pos;
985 ret = compat_readv(f.file, vec, vlen, &pos);
986 f.file->f_pos = pos;
987 fdput(f);
988 return ret;
989}
990
991COMPAT_SYSCALL_DEFINE4(preadv64, unsigned long, fd,
992 const struct compat_iovec __user *,vec,
993 unsigned long, vlen, loff_t, pos)
994{
995 struct fd f;
996 ssize_t ret;
997
998 if (pos < 0)
999 return -EINVAL;
1000 f = fdget(fd);
1001 if (!f.file)
1002 return -EBADF;
1003 ret = -ESPIPE;
1004 if (f.file->f_mode & FMODE_PREAD)
1005 ret = compat_readv(f.file, vec, vlen, &pos);
1006 fdput(f);
1007 return ret;
1008}
1009
1010COMPAT_SYSCALL_DEFINE5(preadv, unsigned long, fd,
1011 const struct compat_iovec __user *,vec,
1012 unsigned long, vlen, u32, pos_low, u32, pos_high)
1013{
1014 loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1015 return compat_sys_preadv64(fd, vec, vlen, pos);
1016}
1017
1018static size_t compat_writev(struct file *file,
1019 const struct compat_iovec __user *vec,
1020 unsigned long vlen, loff_t *pos)
1021{
1022 ssize_t ret = -EBADF;
1023
1024 if (!(file->f_mode & FMODE_WRITE))
1025 goto out;
1026
1027 ret = -EINVAL;
1028 if (!file->f_op || (!file->f_op->aio_write && !file->f_op->write))
1029 goto out;
1030
1031 ret = compat_do_readv_writev(WRITE, file, vec, vlen, pos);
1032
1033out:
1034 if (ret > 0)
1035 add_wchar(current, ret);
1036 inc_syscw(current);
1037 return ret;
1038}
1039
1040COMPAT_SYSCALL_DEFINE3(writev, unsigned long, fd,
1041 const struct compat_iovec __user *, vec,
1042 unsigned long, vlen)
1043{
1044 struct fd f = fdget(fd);
1045 ssize_t ret;
1046 loff_t pos;
1047
1048 if (!f.file)
1049 return -EBADF;
1050 pos = f.file->f_pos;
1051 ret = compat_writev(f.file, vec, vlen, &pos);
1052 f.file->f_pos = pos;
1053 fdput(f);
1054 return ret;
1055}
1056
1057COMPAT_SYSCALL_DEFINE4(pwritev64, unsigned long, fd,
1058 const struct compat_iovec __user *,vec,
1059 unsigned long, vlen, loff_t, pos)
1060{
1061 struct fd f;
1062 ssize_t ret;
1063
1064 if (pos < 0)
1065 return -EINVAL;
1066 f = fdget(fd);
1067 if (!f.file)
1068 return -EBADF;
1069 ret = -ESPIPE;
1070 if (f.file->f_mode & FMODE_PWRITE)
1071 ret = compat_writev(f.file, vec, vlen, &pos);
1072 fdput(f);
1073 return ret;
1074}
1075
1076COMPAT_SYSCALL_DEFINE5(pwritev, unsigned long, fd,
1077 const struct compat_iovec __user *,vec,
1078 unsigned long, vlen, u32, pos_low, u32, pos_high)
1079{
1080 loff_t pos = ((loff_t)pos_high << 32) | pos_low;
1081 return compat_sys_pwritev64(fd, vec, vlen, pos);
1082}
1083#endif
1084
884static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos, 1085static ssize_t do_sendfile(int out_fd, int in_fd, loff_t *ppos,
885 size_t count, loff_t max) 1086 size_t count, loff_t max)
886{ 1087{
diff --git a/fs/read_write.h b/fs/read_write.h
index d07b954c6e0c..0ec530d9305b 100644
--- a/fs/read_write.h
+++ b/fs/read_write.h
@@ -7,8 +7,3 @@
7typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *); 7typedef ssize_t (*io_fn_t)(struct file *, char __user *, size_t, loff_t *);
8typedef ssize_t (*iov_fn_t)(struct kiocb *, const struct iovec *, 8typedef ssize_t (*iov_fn_t)(struct kiocb *, const struct iovec *,
9 unsigned long, loff_t); 9 unsigned long, loff_t);
10
11ssize_t do_sync_readv_writev(struct file *filp, const struct iovec *iov,
12 unsigned long nr_segs, size_t len, loff_t *ppos, iov_fn_t fn);
13ssize_t do_loop_readv_writev(struct file *filp, struct iovec *iov,
14 unsigned long nr_segs, loff_t *ppos, io_fn_t fn);
diff --git a/fs/reiserfs/file.c b/fs/reiserfs/file.c
index 6165bd4784f6..dcaafcfc23b0 100644
--- a/fs/reiserfs/file.c
+++ b/fs/reiserfs/file.c
@@ -234,68 +234,9 @@ int reiserfs_commit_page(struct inode *inode, struct page *page,
234 return ret; 234 return ret;
235} 235}
236 236
237/* Write @count bytes at position @ppos in a file indicated by @file
238 from the buffer @buf.
239
240 generic_file_write() is only appropriate for filesystems that are not seeking to optimize performance and want
241 something simple that works. It is not for serious use by general purpose filesystems, excepting the one that it was
242 written for (ext2/3). This is for several reasons:
243
244 * It has no understanding of any filesystem specific optimizations.
245
246 * It enters the filesystem repeatedly for each page that is written.
247
248 * It depends on reiserfs_get_block() function which if implemented by reiserfs performs costly search_by_key
249 * operation for each page it is supplied with. By contrast reiserfs_file_write() feeds as much as possible at a time
250 * to reiserfs which allows for fewer tree traversals.
251
252 * Each indirect pointer insertion takes a lot of cpu, because it involves memory moves inside of blocks.
253
254 * Asking the block allocation code for blocks one at a time is slightly less efficient.
255
256 All of these reasons for not using only generic file write were understood back when reiserfs was first miscoded to
257 use it, but we were in a hurry to make code freeze, and so it couldn't be revised then. This new code should make
258 things right finally.
259
260 Future Features: providing search_by_key with hints.
261
262*/
263static ssize_t reiserfs_file_write(struct file *file, /* the file we are going to write into */
264 const char __user * buf, /* pointer to user supplied data
265 (in userspace) */
266 size_t count, /* amount of bytes to write */
267 loff_t * ppos /* pointer to position in file that we start writing at. Should be updated to
268 * new current position before returning. */
269 )
270{
271 struct inode *inode = file_inode(file); // Inode of the file that we are writing to.
272 /* To simplify coding at this time, we store
273 locked pages in array for now */
274 struct reiserfs_transaction_handle th;
275 th.t_trans_id = 0;
276
277 /* If a filesystem is converted from 3.5 to 3.6, we'll have v3.5 items
278 * lying around (most of the disk, in fact). Despite the filesystem
279 * now being a v3.6 format, the old items still can't support large
280 * file sizes. Catch this case here, as the rest of the VFS layer is
281 * oblivious to the different limitations between old and new items.
282 * reiserfs_setattr catches this for truncates. This chunk is lifted
283 * from generic_write_checks. */
284 if (get_inode_item_key_version (inode) == KEY_FORMAT_3_5 &&
285 *ppos + count > MAX_NON_LFS) {
286 if (*ppos >= MAX_NON_LFS) {
287 return -EFBIG;
288 }
289 if (count > MAX_NON_LFS - (unsigned long)*ppos)
290 count = MAX_NON_LFS - (unsigned long)*ppos;
291 }
292
293 return do_sync_write(file, buf, count, ppos);
294}
295
296const struct file_operations reiserfs_file_operations = { 237const struct file_operations reiserfs_file_operations = {
297 .read = do_sync_read, 238 .read = do_sync_read,
298 .write = reiserfs_file_write, 239 .write = do_sync_write,
299 .unlocked_ioctl = reiserfs_ioctl, 240 .unlocked_ioctl = reiserfs_ioctl,
300#ifdef CONFIG_COMPAT 241#ifdef CONFIG_COMPAT
301 .compat_ioctl = reiserfs_compat_ioctl, 242 .compat_ioctl = reiserfs_compat_ioctl,
diff --git a/fs/reiserfs/procfs.c b/fs/reiserfs/procfs.c
index 9cc0740adffa..33532f79b4f7 100644
--- a/fs/reiserfs/procfs.c
+++ b/fs/reiserfs/procfs.c
@@ -394,20 +394,24 @@ static int set_sb(struct super_block *sb, void *data)
394 return -ENOENT; 394 return -ENOENT;
395} 395}
396 396
397struct reiserfs_seq_private {
398 struct super_block *sb;
399 int (*show) (struct seq_file *, struct super_block *);
400};
401
397static void *r_start(struct seq_file *m, loff_t * pos) 402static void *r_start(struct seq_file *m, loff_t * pos)
398{ 403{
399 struct proc_dir_entry *de = m->private; 404 struct reiserfs_seq_private *priv = m->private;
400 struct super_block *s = de->parent->data;
401 loff_t l = *pos; 405 loff_t l = *pos;
402 406
403 if (l) 407 if (l)
404 return NULL; 408 return NULL;
405 409
406 if (IS_ERR(sget(&reiserfs_fs_type, test_sb, set_sb, 0, s))) 410 if (IS_ERR(sget(&reiserfs_fs_type, test_sb, set_sb, 0, priv->sb)))
407 return NULL; 411 return NULL;
408 412
409 up_write(&s->s_umount); 413 up_write(&priv->sb->s_umount);
410 return s; 414 return priv->sb;
411} 415}
412 416
413static void *r_next(struct seq_file *m, void *v, loff_t * pos) 417static void *r_next(struct seq_file *m, void *v, loff_t * pos)
@@ -426,9 +430,8 @@ static void r_stop(struct seq_file *m, void *v)
426 430
427static int r_show(struct seq_file *m, void *v) 431static int r_show(struct seq_file *m, void *v)
428{ 432{
429 struct proc_dir_entry *de = m->private; 433 struct reiserfs_seq_private *priv = m->private;
430 int (*show) (struct seq_file *, struct super_block *) = de->data; 434 return priv->show(m, v);
431 return show(m, v);
432} 435}
433 436
434static const struct seq_operations r_ops = { 437static const struct seq_operations r_ops = {
@@ -440,11 +443,15 @@ static const struct seq_operations r_ops = {
440 443
441static int r_open(struct inode *inode, struct file *file) 444static int r_open(struct inode *inode, struct file *file)
442{ 445{
443 int ret = seq_open(file, &r_ops); 446 struct reiserfs_seq_private *priv;
447 int ret = seq_open_private(file, &r_ops,
448 sizeof(struct reiserfs_seq_private));
444 449
445 if (!ret) { 450 if (!ret) {
446 struct seq_file *m = file->private_data; 451 struct seq_file *m = file->private_data;
447 m->private = PDE(inode); 452 priv = m->private;
453 priv->sb = proc_get_parent_data(inode);
454 priv->show = PDE_DATA(inode);
448 } 455 }
449 return ret; 456 return ret;
450} 457}
@@ -453,7 +460,7 @@ static const struct file_operations r_file_operations = {
453 .open = r_open, 460 .open = r_open,
454 .read = seq_read, 461 .read = seq_read,
455 .llseek = seq_lseek, 462 .llseek = seq_lseek,
456 .release = seq_release, 463 .release = seq_release_private,
457 .owner = THIS_MODULE, 464 .owner = THIS_MODULE,
458}; 465};
459 466
@@ -479,9 +486,8 @@ int reiserfs_proc_info_init(struct super_block *sb)
479 *s = '!'; 486 *s = '!';
480 487
481 spin_lock_init(&__PINFO(sb).lock); 488 spin_lock_init(&__PINFO(sb).lock);
482 REISERFS_SB(sb)->procdir = proc_mkdir(b, proc_info_root); 489 REISERFS_SB(sb)->procdir = proc_mkdir_data(b, 0, proc_info_root, sb);
483 if (REISERFS_SB(sb)->procdir) { 490 if (REISERFS_SB(sb)->procdir) {
484 REISERFS_SB(sb)->procdir->data = sb;
485 add_file(sb, "version", show_version); 491 add_file(sb, "version", show_version);
486 add_file(sb, "super", show_super); 492 add_file(sb, "super", show_super);
487 add_file(sb, "per-level", show_per_level); 493 add_file(sb, "per-level", show_per_level);
@@ -499,29 +505,17 @@ int reiserfs_proc_info_init(struct super_block *sb)
499int reiserfs_proc_info_done(struct super_block *sb) 505int reiserfs_proc_info_done(struct super_block *sb)
500{ 506{
501 struct proc_dir_entry *de = REISERFS_SB(sb)->procdir; 507 struct proc_dir_entry *de = REISERFS_SB(sb)->procdir;
502 char b[BDEVNAME_SIZE]; 508 if (de) {
503 char *s; 509 char b[BDEVNAME_SIZE];
510 char *s;
504 511
505 /* Some block devices use /'s */ 512 /* Some block devices use /'s */
506 strlcpy(b, reiserfs_bdevname(sb), BDEVNAME_SIZE); 513 strlcpy(b, reiserfs_bdevname(sb), BDEVNAME_SIZE);
507 s = strchr(b, '/'); 514 s = strchr(b, '/');
508 if (s) 515 if (s)
509 *s = '!'; 516 *s = '!';
510 517
511 if (de) { 518 remove_proc_subtree(b, proc_info_root);
512 remove_proc_entry("journal", de);
513 remove_proc_entry("oidmap", de);
514 remove_proc_entry("on-disk-super", de);
515 remove_proc_entry("bitmap", de);
516 remove_proc_entry("per-level", de);
517 remove_proc_entry("super", de);
518 remove_proc_entry("version", de);
519 }
520 spin_lock(&__PINFO(sb).lock);
521 __PINFO(sb).exiting = 1;
522 spin_unlock(&__PINFO(sb).lock);
523 if (proc_info_root) {
524 remove_proc_entry(b, proc_info_root);
525 REISERFS_SB(sb)->procdir = NULL; 519 REISERFS_SB(sb)->procdir = NULL;
526 } 520 }
527 return 0; 521 return 0;
diff --git a/fs/seq_file.c b/fs/seq_file.c
index 38bb59f3f2ad..774c1eb7f1c9 100644
--- a/fs/seq_file.c
+++ b/fs/seq_file.c
@@ -599,6 +599,24 @@ int single_open(struct file *file, int (*show)(struct seq_file *, void *),
599} 599}
600EXPORT_SYMBOL(single_open); 600EXPORT_SYMBOL(single_open);
601 601
602int single_open_size(struct file *file, int (*show)(struct seq_file *, void *),
603 void *data, size_t size)
604{
605 char *buf = kmalloc(size, GFP_KERNEL);
606 int ret;
607 if (!buf)
608 return -ENOMEM;
609 ret = single_open(file, show, data);
610 if (ret) {
611 kfree(buf);
612 return ret;
613 }
614 ((struct seq_file *)file->private_data)->buf = buf;
615 ((struct seq_file *)file->private_data)->size = size;
616 return 0;
617}
618EXPORT_SYMBOL(single_open_size);
619
602int single_release(struct inode *inode, struct file *file) 620int single_release(struct inode *inode, struct file *file)
603{ 621{
604 const struct seq_operations *op = ((struct seq_file *)file->private_data)->op; 622 const struct seq_operations *op = ((struct seq_file *)file->private_data)->op;
diff --git a/fs/splice.c b/fs/splice.c
index 6b485b8753bd..e6b25598c8c4 100644
--- a/fs/splice.c
+++ b/fs/splice.c
@@ -219,7 +219,7 @@ ssize_t splice_to_pipe(struct pipe_inode_info *pipe,
219 page_nr++; 219 page_nr++;
220 ret += buf->len; 220 ret += buf->len;
221 221
222 if (pipe->inode) 222 if (pipe->files)
223 do_wakeup = 1; 223 do_wakeup = 1;
224 224
225 if (!--spd->nr_pages) 225 if (!--spd->nr_pages)
@@ -829,7 +829,7 @@ int splice_from_pipe_feed(struct pipe_inode_info *pipe, struct splice_desc *sd,
829 ops->release(pipe, buf); 829 ops->release(pipe, buf);
830 pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1); 830 pipe->curbuf = (pipe->curbuf + 1) & (pipe->buffers - 1);
831 pipe->nrbufs--; 831 pipe->nrbufs--;
832 if (pipe->inode) 832 if (pipe->files)
833 sd->need_wakeup = true; 833 sd->need_wakeup = true;
834 } 834 }
835 835
@@ -1001,8 +1001,6 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
1001 }; 1001 };
1002 ssize_t ret; 1002 ssize_t ret;
1003 1003
1004 sb_start_write(inode->i_sb);
1005
1006 pipe_lock(pipe); 1004 pipe_lock(pipe);
1007 1005
1008 splice_from_pipe_begin(&sd); 1006 splice_from_pipe_begin(&sd);
@@ -1038,7 +1036,6 @@ generic_file_splice_write(struct pipe_inode_info *pipe, struct file *out,
1038 *ppos += ret; 1036 *ppos += ret;
1039 balance_dirty_pages_ratelimited(mapping); 1037 balance_dirty_pages_ratelimited(mapping);
1040 } 1038 }
1041 sb_end_write(inode->i_sb);
1042 1039
1043 return ret; 1040 return ret;
1044} 1041}
@@ -1118,7 +1115,10 @@ static long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
1118 else 1115 else
1119 splice_write = default_file_splice_write; 1116 splice_write = default_file_splice_write;
1120 1117
1121 return splice_write(pipe, out, ppos, len, flags); 1118 file_start_write(out);
1119 ret = splice_write(pipe, out, ppos, len, flags);
1120 file_end_write(out);
1121 return ret;
1122} 1122}
1123 1123
1124/* 1124/*
@@ -1184,7 +1184,7 @@ ssize_t splice_direct_to_actor(struct file *in, struct splice_desc *sd,
1184 */ 1184 */
1185 pipe = current->splice_pipe; 1185 pipe = current->splice_pipe;
1186 if (unlikely(!pipe)) { 1186 if (unlikely(!pipe)) {
1187 pipe = alloc_pipe_info(NULL); 1187 pipe = alloc_pipe_info();
1188 if (!pipe) 1188 if (!pipe)
1189 return -ENOMEM; 1189 return -ENOMEM;
1190 1190
diff --git a/fs/xfs/xfs_file.c b/fs/xfs/xfs_file.c
index f03bf1a456fb..3800128d2171 100644
--- a/fs/xfs/xfs_file.c
+++ b/fs/xfs/xfs_file.c
@@ -775,8 +775,6 @@ xfs_file_aio_write(
775 if (ocount == 0) 775 if (ocount == 0)
776 return 0; 776 return 0;
777 777
778 sb_start_write(inode->i_sb);
779
780 if (XFS_FORCED_SHUTDOWN(ip->i_mount)) { 778 if (XFS_FORCED_SHUTDOWN(ip->i_mount)) {
781 ret = -EIO; 779 ret = -EIO;
782 goto out; 780 goto out;
@@ -800,7 +798,6 @@ xfs_file_aio_write(
800 } 798 }
801 799
802out: 800out:
803 sb_end_write(inode->i_sb);
804 return ret; 801 return ret;
805} 802}
806 803
diff --git a/include/drm/drmP.h b/include/drm/drmP.h
index 2d94d7413d71..60c33f14408f 100644
--- a/include/drm/drmP.h
+++ b/include/drm/drmP.h
@@ -1022,7 +1022,7 @@ struct drm_info_list {
1022struct drm_info_node { 1022struct drm_info_node {
1023 struct list_head list; 1023 struct list_head list;
1024 struct drm_minor *minor; 1024 struct drm_minor *minor;
1025 struct drm_info_list *info_ent; 1025 const struct drm_info_list *info_ent;
1026 struct dentry *dent; 1026 struct dentry *dent;
1027}; 1027};
1028 1028
@@ -1546,8 +1546,7 @@ extern struct idr drm_minors_idr;
1546extern struct drm_local_map *drm_getsarea(struct drm_device *dev); 1546extern struct drm_local_map *drm_getsarea(struct drm_device *dev);
1547 1547
1548 /* Proc support (drm_proc.h) */ 1548 /* Proc support (drm_proc.h) */
1549extern int drm_proc_init(struct drm_minor *minor, int minor_id, 1549extern int drm_proc_init(struct drm_minor *minor, struct proc_dir_entry *root);
1550 struct proc_dir_entry *root);
1551extern int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root); 1550extern int drm_proc_cleanup(struct drm_minor *minor, struct proc_dir_entry *root);
1552 1551
1553 /* Debugfs support */ 1552 /* Debugfs support */
diff --git a/include/linux/binfmts.h b/include/linux/binfmts.h
index c3a09149f793..70cf138690e9 100644
--- a/include/linux/binfmts.h
+++ b/include/linux/binfmts.h
@@ -118,5 +118,6 @@ extern int prepare_bprm_creds(struct linux_binprm *bprm);
118extern void install_exec_creds(struct linux_binprm *bprm); 118extern void install_exec_creds(struct linux_binprm *bprm);
119extern void set_binfmt(struct linux_binfmt *new); 119extern void set_binfmt(struct linux_binfmt *new);
120extern void free_bprm(struct linux_binprm *); 120extern void free_bprm(struct linux_binprm *);
121extern ssize_t read_code(struct file *, unsigned long, loff_t, size_t);
121 122
122#endif /* _LINUX_BINFMTS_H */ 123#endif /* _LINUX_BINFMTS_H */
diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h
index 646ab9d15e42..3bff9ce09cf7 100644
--- a/include/linux/cgroup.h
+++ b/include/linux/cgroup.h
@@ -39,7 +39,7 @@ extern int cgroupstats_build(struct cgroupstats *stats,
39extern int cgroup_load_subsys(struct cgroup_subsys *ss); 39extern int cgroup_load_subsys(struct cgroup_subsys *ss);
40extern void cgroup_unload_subsys(struct cgroup_subsys *ss); 40extern void cgroup_unload_subsys(struct cgroup_subsys *ss);
41 41
42extern const struct file_operations proc_cgroup_operations; 42extern int proc_cgroup_show(struct seq_file *, void *);
43 43
44/* 44/*
45 * Define the enumeration of all cgroup subsystems. 45 * Define the enumeration of all cgroup subsystems.
diff --git a/include/linux/cpuset.h b/include/linux/cpuset.h
index ccd1de8ad822..cc1b01cf2035 100644
--- a/include/linux/cpuset.h
+++ b/include/linux/cpuset.h
@@ -63,10 +63,9 @@ extern int cpuset_mems_allowed_intersects(const struct task_struct *tsk1,
63extern int cpuset_memory_pressure_enabled; 63extern int cpuset_memory_pressure_enabled;
64extern void __cpuset_memory_pressure_bump(void); 64extern void __cpuset_memory_pressure_bump(void);
65 65
66extern const struct file_operations proc_cpuset_operations;
67struct seq_file;
68extern void cpuset_task_status_allowed(struct seq_file *m, 66extern void cpuset_task_status_allowed(struct seq_file *m,
69 struct task_struct *task); 67 struct task_struct *task);
68extern int proc_cpuset_show(struct seq_file *, void *);
70 69
71extern int cpuset_mem_spread_node(void); 70extern int cpuset_mem_spread_node(void);
72extern int cpuset_slab_spread_node(void); 71extern int cpuset_slab_spread_node(void);
diff --git a/include/linux/fdtable.h b/include/linux/fdtable.h
index fb7dacae0522..085197bd8812 100644
--- a/include/linux/fdtable.h
+++ b/include/linux/fdtable.h
@@ -27,7 +27,6 @@ struct fdtable {
27 unsigned long *close_on_exec; 27 unsigned long *close_on_exec;
28 unsigned long *open_fds; 28 unsigned long *open_fds;
29 struct rcu_head rcu; 29 struct rcu_head rcu;
30 struct fdtable *next;
31}; 30};
32 31
33static inline bool close_on_exec(int fd, const struct fdtable *fdt) 32static inline bool close_on_exec(int fd, const struct fdtable *fdt)
diff --git a/include/linux/fs.h b/include/linux/fs.h
index 17d8b1596215..e8cd6b839675 100644
--- a/include/linux/fs.h
+++ b/include/linux/fs.h
@@ -2082,7 +2082,6 @@ extern int sync_filesystem(struct super_block *);
2082extern const struct file_operations def_blk_fops; 2082extern const struct file_operations def_blk_fops;
2083extern const struct file_operations def_chr_fops; 2083extern const struct file_operations def_chr_fops;
2084extern const struct file_operations bad_sock_fops; 2084extern const struct file_operations bad_sock_fops;
2085extern const struct file_operations def_fifo_fops;
2086#ifdef CONFIG_BLOCK 2085#ifdef CONFIG_BLOCK
2087extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long); 2086extern int ioctl_by_bdev(struct block_device *, unsigned, unsigned long);
2088extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long); 2087extern int blkdev_ioctl(struct block_device *, fmode_t, unsigned, unsigned long);
@@ -2154,10 +2153,6 @@ extern void init_special_inode(struct inode *, umode_t, dev_t);
2154extern void make_bad_inode(struct inode *); 2153extern void make_bad_inode(struct inode *);
2155extern int is_bad_inode(struct inode *); 2154extern int is_bad_inode(struct inode *);
2156 2155
2157extern const struct file_operations read_pipefifo_fops;
2158extern const struct file_operations write_pipefifo_fops;
2159extern const struct file_operations rdwr_pipefifo_fops;
2160
2161#ifdef CONFIG_BLOCK 2156#ifdef CONFIG_BLOCK
2162/* 2157/*
2163 * return READ, READA, or WRITE 2158 * return READ, READA, or WRITE
@@ -2225,6 +2220,20 @@ static inline struct inode *file_inode(struct file *f)
2225 return f->f_inode; 2220 return f->f_inode;
2226} 2221}
2227 2222
2223static inline void file_start_write(struct file *file)
2224{
2225 if (!S_ISREG(file_inode(file)->i_mode))
2226 return;
2227 __sb_start_write(file_inode(file)->i_sb, SB_FREEZE_WRITE, true);
2228}
2229
2230static inline void file_end_write(struct file *file)
2231{
2232 if (!S_ISREG(file_inode(file)->i_mode))
2233 return;
2234 __sb_end_write(file_inode(file)->i_sb, SB_FREEZE_WRITE);
2235}
2236
2228/* 2237/*
2229 * get_write_access() gets write permission for a file. 2238 * get_write_access() gets write permission for a file.
2230 * put_write_access() releases this write permission. 2239 * put_write_access() releases this write permission.
diff --git a/include/linux/kcore.h b/include/linux/kcore.h
new file mode 100644
index 000000000000..d92762286645
--- /dev/null
+++ b/include/linux/kcore.h
@@ -0,0 +1,38 @@
1/*
2 * /proc/kcore definitions
3 */
4#ifndef _LINUX_KCORE_H
5#define _LINUX_KCORE_H
6
7enum kcore_type {
8 KCORE_TEXT,
9 KCORE_VMALLOC,
10 KCORE_RAM,
11 KCORE_VMEMMAP,
12 KCORE_OTHER,
13};
14
15struct kcore_list {
16 struct list_head list;
17 unsigned long addr;
18 size_t size;
19 int type;
20};
21
22struct vmcore {
23 struct list_head list;
24 unsigned long long paddr;
25 unsigned long long size;
26 loff_t offset;
27};
28
29#ifdef CONFIG_PROC_KCORE
30extern void kclist_add(struct kcore_list *, void *, size_t, int type);
31#else
32static inline
33void kclist_add(struct kcore_list *new, void *addr, size_t size, int type)
34{
35}
36#endif
37
38#endif /* _LINUX_KCORE_H */
diff --git a/include/linux/nubus.h b/include/linux/nubus.h
index a8696bbdfbc4..b3740527571a 100644
--- a/include/linux/nubus.h
+++ b/include/linux/nubus.h
@@ -80,7 +80,11 @@ extern struct nubus_board* nubus_boards;
80 80
81/* Generic NuBus interface functions, modelled after the PCI interface */ 81/* Generic NuBus interface functions, modelled after the PCI interface */
82void nubus_scan_bus(void); 82void nubus_scan_bus(void);
83#ifdef CONFIG_PROC_FS
83extern void nubus_proc_init(void); 84extern void nubus_proc_init(void);
85#else
86static inline void nubus_proc_init(void) {}
87#endif
84int get_nubus_list(char *buf); 88int get_nubus_list(char *buf);
85int nubus_proc_attach_device(struct nubus_dev *dev); 89int nubus_proc_attach_device(struct nubus_dev *dev);
86int nubus_proc_detach_device(struct nubus_dev *dev); 90int nubus_proc_detach_device(struct nubus_dev *dev);
diff --git a/include/linux/of.h b/include/linux/of.h
index a0f129284948..2d25ff8fe39a 100644
--- a/include/linux/of.h
+++ b/include/linux/of.h
@@ -540,4 +540,14 @@ static inline int of_property_read_u32(const struct device_node *np,
540 return of_property_read_u32_array(np, propname, out_value, 1); 540 return of_property_read_u32_array(np, propname, out_value, 1);
541} 541}
542 542
543#if defined(CONFIG_PROC_FS) && defined(CONFIG_PROC_DEVICETREE)
544extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *);
545extern void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop);
546extern void proc_device_tree_remove_prop(struct proc_dir_entry *pde,
547 struct property *prop);
548extern void proc_device_tree_update_prop(struct proc_dir_entry *pde,
549 struct property *newprop,
550 struct property *oldprop);
551#endif
552
543#endif /* _LINUX_OF_H */ 553#endif /* _LINUX_OF_H */
diff --git a/include/linux/pid_namespace.h b/include/linux/pid_namespace.h
index 8ac32836690e..731e4ecee3bd 100644
--- a/include/linux/pid_namespace.h
+++ b/include/linux/pid_namespace.h
@@ -30,6 +30,7 @@ struct pid_namespace {
30 struct pid_namespace *parent; 30 struct pid_namespace *parent;
31#ifdef CONFIG_PROC_FS 31#ifdef CONFIG_PROC_FS
32 struct vfsmount *proc_mnt; 32 struct vfsmount *proc_mnt;
33 struct dentry *proc_self;
33#endif 34#endif
34#ifdef CONFIG_BSD_PROCESS_ACCT 35#ifdef CONFIG_BSD_PROCESS_ACCT
35 struct bsd_acct_struct *bacct; 36 struct bsd_acct_struct *bacct;
diff --git a/include/linux/pipe_fs_i.h b/include/linux/pipe_fs_i.h
index ad1a427b5267..b8809fef61f5 100644
--- a/include/linux/pipe_fs_i.h
+++ b/include/linux/pipe_fs_i.h
@@ -27,6 +27,7 @@ struct pipe_buffer {
27 27
28/** 28/**
29 * struct pipe_inode_info - a linux kernel pipe 29 * struct pipe_inode_info - a linux kernel pipe
30 * @mutex: mutex protecting the whole thing
30 * @wait: reader/writer wait point in case of empty/full pipe 31 * @wait: reader/writer wait point in case of empty/full pipe
31 * @nrbufs: the number of non-empty pipe buffers in this pipe 32 * @nrbufs: the number of non-empty pipe buffers in this pipe
32 * @buffers: total number of buffers (should be a power of 2) 33 * @buffers: total number of buffers (should be a power of 2)
@@ -34,26 +35,27 @@ struct pipe_buffer {
34 * @tmp_page: cached released page 35 * @tmp_page: cached released page
35 * @readers: number of current readers of this pipe 36 * @readers: number of current readers of this pipe
36 * @writers: number of current writers of this pipe 37 * @writers: number of current writers of this pipe
38 * @files: number of struct file refering this pipe (protected by ->i_lock)
37 * @waiting_writers: number of writers blocked waiting for room 39 * @waiting_writers: number of writers blocked waiting for room
38 * @r_counter: reader counter 40 * @r_counter: reader counter
39 * @w_counter: writer counter 41 * @w_counter: writer counter
40 * @fasync_readers: reader side fasync 42 * @fasync_readers: reader side fasync
41 * @fasync_writers: writer side fasync 43 * @fasync_writers: writer side fasync
42 * @inode: inode this pipe is attached to
43 * @bufs: the circular array of pipe buffers 44 * @bufs: the circular array of pipe buffers
44 **/ 45 **/
45struct pipe_inode_info { 46struct pipe_inode_info {
47 struct mutex mutex;
46 wait_queue_head_t wait; 48 wait_queue_head_t wait;
47 unsigned int nrbufs, curbuf, buffers; 49 unsigned int nrbufs, curbuf, buffers;
48 unsigned int readers; 50 unsigned int readers;
49 unsigned int writers; 51 unsigned int writers;
52 unsigned int files;
50 unsigned int waiting_writers; 53 unsigned int waiting_writers;
51 unsigned int r_counter; 54 unsigned int r_counter;
52 unsigned int w_counter; 55 unsigned int w_counter;
53 struct page *tmp_page; 56 struct page *tmp_page;
54 struct fasync_struct *fasync_readers; 57 struct fasync_struct *fasync_readers;
55 struct fasync_struct *fasync_writers; 58 struct fasync_struct *fasync_writers;
56 struct inode *inode;
57 struct pipe_buffer *bufs; 59 struct pipe_buffer *bufs;
58}; 60};
59 61
@@ -144,9 +146,8 @@ int pipe_proc_fn(struct ctl_table *, int, void __user *, size_t *, loff_t *);
144/* Drop the inode semaphore and wait for a pipe event, atomically */ 146/* Drop the inode semaphore and wait for a pipe event, atomically */
145void pipe_wait(struct pipe_inode_info *pipe); 147void pipe_wait(struct pipe_inode_info *pipe);
146 148
147struct pipe_inode_info * alloc_pipe_info(struct inode * inode); 149struct pipe_inode_info *alloc_pipe_info(void);
148void free_pipe_info(struct inode * inode); 150void free_pipe_info(struct pipe_inode_info *);
149void __free_pipe_info(struct pipe_inode_info *);
150 151
151/* Generic pipe buffer ops functions */ 152/* Generic pipe buffer ops functions */
152void *generic_pipe_buf_map(struct pipe_inode_info *, struct pipe_buffer *, int); 153void *generic_pipe_buf_map(struct pipe_inode_info *, struct pipe_buffer *, int);
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h
index 94dfb2aa5533..608e60a74c3c 100644
--- a/include/linux/proc_fs.h
+++ b/include/linux/proc_fs.h
@@ -1,318 +1,79 @@
1#ifndef _LINUX_PROC_FS_H
2#define _LINUX_PROC_FS_H
3
4#include <linux/slab.h>
5#include <linux/fs.h>
6#include <linux/spinlock.h>
7#include <linux/magic.h>
8#include <linux/atomic.h>
9
10struct net;
11struct completion;
12struct mm_struct;
13
14/* 1/*
15 * The proc filesystem constants/structures 2 * The proc filesystem constants/structures
16 */ 3 */
4#ifndef _LINUX_PROC_FS_H
5#define _LINUX_PROC_FS_H
17 6
18/* 7#include <linux/types.h>
19 * Offset of the first process in the /proc root directory.. 8#include <linux/fs.h>
20 */
21#define FIRST_PROCESS_ENTRY 256
22
23/* Worst case buffer size needed for holding an integer. */
24#define PROC_NUMBUF 13
25
26/*
27 * We always define these enumerators
28 */
29
30enum {
31 PROC_ROOT_INO = 1,
32 PROC_IPC_INIT_INO = 0xEFFFFFFFU,
33 PROC_UTS_INIT_INO = 0xEFFFFFFEU,
34 PROC_USER_INIT_INO = 0xEFFFFFFDU,
35 PROC_PID_INIT_INO = 0xEFFFFFFCU,
36};
37
38/*
39 * This is not completely implemented yet. The idea is to
40 * create an in-memory tree (like the actual /proc filesystem
41 * tree) of these proc_dir_entries, so that we can dynamically
42 * add new files to /proc.
43 *
44 * The "next" pointer creates a linked list of one /proc directory,
45 * while parent/subdir create the directory structure (every
46 * /proc file has a parent, but "subdir" is NULL for all
47 * non-directory entries).
48 */
49
50typedef int (read_proc_t)(char *page, char **start, off_t off,
51 int count, int *eof, void *data);
52typedef int (write_proc_t)(struct file *file, const char __user *buffer,
53 unsigned long count, void *data);
54
55struct proc_dir_entry {
56 unsigned int low_ino;
57 umode_t mode;
58 nlink_t nlink;
59 kuid_t uid;
60 kgid_t gid;
61 loff_t size;
62 const struct inode_operations *proc_iops;
63 /*
64 * NULL ->proc_fops means "PDE is going away RSN" or
65 * "PDE is just created". In either case, e.g. ->read_proc won't be
66 * called because it's too late or too early, respectively.
67 *
68 * If you're allocating ->proc_fops dynamically, save a pointer
69 * somewhere.
70 */
71 const struct file_operations *proc_fops;
72 struct proc_dir_entry *next, *parent, *subdir;
73 void *data;
74 read_proc_t *read_proc;
75 write_proc_t *write_proc;
76 atomic_t count; /* use count */
77 int pde_users; /* number of callers into module in progress */
78 struct completion *pde_unload_completion;
79 struct list_head pde_openers; /* who did ->open, but not ->release */
80 spinlock_t pde_unload_lock; /* proc_fops checks and pde_users bumps */
81 u8 namelen;
82 char name[];
83};
84
85enum kcore_type {
86 KCORE_TEXT,
87 KCORE_VMALLOC,
88 KCORE_RAM,
89 KCORE_VMEMMAP,
90 KCORE_OTHER,
91};
92
93struct kcore_list {
94 struct list_head list;
95 unsigned long addr;
96 size_t size;
97 int type;
98};
99 9
100struct vmcore { 10struct proc_dir_entry;
101 struct list_head list;
102 unsigned long long paddr;
103 unsigned long long size;
104 loff_t offset;
105};
106 11
107#ifdef CONFIG_PROC_FS 12#ifdef CONFIG_PROC_FS
108 13
109extern void proc_root_init(void); 14extern void proc_root_init(void);
110 15extern void proc_flush_task(struct task_struct *);
111void proc_flush_task(struct task_struct *task);
112
113extern struct proc_dir_entry *create_proc_entry(const char *name, umode_t mode,
114 struct proc_dir_entry *parent);
115struct proc_dir_entry *proc_create_data(const char *name, umode_t mode,
116 struct proc_dir_entry *parent,
117 const struct file_operations *proc_fops,
118 void *data);
119extern void remove_proc_entry(const char *name, struct proc_dir_entry *parent);
120extern int remove_proc_subtree(const char *name, struct proc_dir_entry *parent);
121
122struct pid_namespace;
123
124extern int pid_ns_prepare_proc(struct pid_namespace *ns);
125extern void pid_ns_release_proc(struct pid_namespace *ns);
126
127/*
128 * proc_tty.c
129 */
130struct tty_driver;
131#ifdef CONFIG_TTY
132extern void proc_tty_init(void);
133#else
134static inline void proc_tty_init(void)
135{ }
136#endif
137extern void proc_tty_register_driver(struct tty_driver *driver);
138extern void proc_tty_unregister_driver(struct tty_driver *driver);
139
140/*
141 * proc_devtree.c
142 */
143#ifdef CONFIG_PROC_DEVICETREE
144struct device_node;
145struct property;
146extern void proc_device_tree_init(void);
147extern void proc_device_tree_add_node(struct device_node *, struct proc_dir_entry *);
148extern void proc_device_tree_add_prop(struct proc_dir_entry *pde, struct property *prop);
149extern void proc_device_tree_remove_prop(struct proc_dir_entry *pde,
150 struct property *prop);
151extern void proc_device_tree_update_prop(struct proc_dir_entry *pde,
152 struct property *newprop,
153 struct property *oldprop);
154#endif /* CONFIG_PROC_DEVICETREE */
155 16
156extern struct proc_dir_entry *proc_symlink(const char *, 17extern struct proc_dir_entry *proc_symlink(const char *,
157 struct proc_dir_entry *, const char *); 18 struct proc_dir_entry *, const char *);
158extern struct proc_dir_entry *proc_mkdir(const char *,struct proc_dir_entry *); 19extern struct proc_dir_entry *proc_mkdir(const char *, struct proc_dir_entry *);
159extern struct proc_dir_entry *proc_mkdir_mode(const char *name, umode_t mode, 20extern struct proc_dir_entry *proc_mkdir_data(const char *, umode_t,
160 struct proc_dir_entry *parent); 21 struct proc_dir_entry *, void *);
161 22extern struct proc_dir_entry *proc_mkdir_mode(const char *, umode_t,
162static inline struct proc_dir_entry *proc_create(const char *name, umode_t mode, 23 struct proc_dir_entry *);
163 struct proc_dir_entry *parent, const struct file_operations *proc_fops) 24
25extern struct proc_dir_entry *proc_create_data(const char *, umode_t,
26 struct proc_dir_entry *,
27 const struct file_operations *,
28 void *);
29
30static inline struct proc_dir_entry *proc_create(
31 const char *name, umode_t mode, struct proc_dir_entry *parent,
32 const struct file_operations *proc_fops)
164{ 33{
165 return proc_create_data(name, mode, parent, proc_fops, NULL); 34 return proc_create_data(name, mode, parent, proc_fops, NULL);
166} 35}
167 36
168static inline struct proc_dir_entry *create_proc_read_entry(const char *name, 37extern void proc_set_size(struct proc_dir_entry *, loff_t);
169 umode_t mode, struct proc_dir_entry *base, 38extern void proc_set_user(struct proc_dir_entry *, kuid_t, kgid_t);
170 read_proc_t *read_proc, void * data) 39extern void *PDE_DATA(const struct inode *);
171{ 40extern void *proc_get_parent_data(const struct inode *);
172 struct proc_dir_entry *res=create_proc_entry(name,mode,base); 41extern void proc_remove(struct proc_dir_entry *);
173 if (res) { 42extern void remove_proc_entry(const char *, struct proc_dir_entry *);
174 res->read_proc=read_proc; 43extern int remove_proc_subtree(const char *, struct proc_dir_entry *);
175 res->data=data;
176 }
177 return res;
178}
179
180extern struct proc_dir_entry *proc_net_mkdir(struct net *net, const char *name,
181 struct proc_dir_entry *parent);
182
183extern struct file *proc_ns_fget(int fd);
184extern bool proc_ns_inode(struct inode *inode);
185 44
186extern int proc_alloc_inum(unsigned int *pino); 45#else /* CONFIG_PROC_FS */
187extern void proc_free_inum(unsigned int inum);
188#else
189 46
190static inline void proc_flush_task(struct task_struct *task) 47static inline void proc_flush_task(struct task_struct *task)
191{ 48{
192} 49}
193 50
194static inline struct proc_dir_entry *create_proc_entry(const char *name,
195 umode_t mode, struct proc_dir_entry *parent) { return NULL; }
196
197#define proc_create(name, mode, parent, fops) ({ (void)(mode), NULL; })
198
199static inline struct proc_dir_entry *proc_create_data(const char *name,
200 umode_t mode, struct proc_dir_entry *parent,
201 const struct file_operations *proc_fops, void *data)
202{
203 return NULL;
204}
205#define remove_proc_entry(name, parent) do {} while (0)
206#define remove_proc_subtree(name, parent) do {} while (0)
207
208static inline struct proc_dir_entry *proc_symlink(const char *name, 51static inline struct proc_dir_entry *proc_symlink(const char *name,
209 struct proc_dir_entry *parent,const char *dest) {return NULL;} 52 struct proc_dir_entry *parent,const char *dest) { return NULL;}
210static inline struct proc_dir_entry *proc_mkdir(const char *name, 53static inline struct proc_dir_entry *proc_mkdir(const char *name,
211 struct proc_dir_entry *parent) {return NULL;} 54 struct proc_dir_entry *parent) {return NULL;}
55static inline struct proc_dir_entry *proc_mkdir_data(const char *name,
56 umode_t mode, struct proc_dir_entry *parent, void *data) { return NULL; }
212static inline struct proc_dir_entry *proc_mkdir_mode(const char *name, 57static inline struct proc_dir_entry *proc_mkdir_mode(const char *name,
213 umode_t mode, struct proc_dir_entry *parent) { return NULL; } 58 umode_t mode, struct proc_dir_entry *parent) { return NULL; }
59#define proc_create(name, mode, parent, proc_fops) ({NULL;})
60#define proc_create_data(name, mode, parent, proc_fops, data) ({NULL;})
214 61
215static inline struct proc_dir_entry *create_proc_read_entry(const char *name, 62static inline void proc_set_size(struct proc_dir_entry *de, loff_t size) {}
216 umode_t mode, struct proc_dir_entry *base, 63static inline void proc_set_user(struct proc_dir_entry *de, kuid_t uid, kgid_t gid) {}
217 read_proc_t *read_proc, void * data) { return NULL; } 64static inline void *PDE_DATA(const struct inode *inode) {BUG(); return NULL;}
218 65static inline void *proc_get_parent_data(const struct inode *inode) { BUG(); return NULL; }
219struct tty_driver;
220static inline void proc_tty_register_driver(struct tty_driver *driver) {};
221static inline void proc_tty_unregister_driver(struct tty_driver *driver) {};
222 66
223static inline int pid_ns_prepare_proc(struct pid_namespace *ns) 67static inline void proc_remove(struct proc_dir_entry *de) {}
224{ 68#define remove_proc_entry(name, parent) do {} while (0)
225 return 0; 69static inline int remove_proc_subtree(const char *name, struct proc_dir_entry *parent) { return 0; }
226}
227
228static inline void pid_ns_release_proc(struct pid_namespace *ns)
229{
230}
231
232static inline struct file *proc_ns_fget(int fd)
233{
234 return ERR_PTR(-EINVAL);
235}
236
237static inline bool proc_ns_inode(struct inode *inode)
238{
239 return false;
240}
241 70
242static inline int proc_alloc_inum(unsigned int *inum)
243{
244 *inum = 1;
245 return 0;
246}
247static inline void proc_free_inum(unsigned int inum)
248{
249}
250#endif /* CONFIG_PROC_FS */ 71#endif /* CONFIG_PROC_FS */
251 72
252#if !defined(CONFIG_PROC_KCORE) 73static inline struct proc_dir_entry *proc_net_mkdir(
253static inline void 74 struct net *net, const char *name, struct proc_dir_entry *parent)
254kclist_add(struct kcore_list *new, void *addr, size_t size, int type)
255{ 75{
76 return proc_mkdir_data(name, 0, parent, net);
256} 77}
257#else
258extern void kclist_add(struct kcore_list *, void *, size_t, int type);
259#endif
260
261struct nsproxy;
262struct proc_ns_operations {
263 const char *name;
264 int type;
265 void *(*get)(struct task_struct *task);
266 void (*put)(void *ns);
267 int (*install)(struct nsproxy *nsproxy, void *ns);
268 unsigned int (*inum)(void *ns);
269};
270extern const struct proc_ns_operations netns_operations;
271extern const struct proc_ns_operations utsns_operations;
272extern const struct proc_ns_operations ipcns_operations;
273extern const struct proc_ns_operations pidns_operations;
274extern const struct proc_ns_operations userns_operations;
275extern const struct proc_ns_operations mntns_operations;
276
277union proc_op {
278 int (*proc_get_link)(struct dentry *, struct path *);
279 int (*proc_read)(struct task_struct *task, char *page);
280 int (*proc_show)(struct seq_file *m,
281 struct pid_namespace *ns, struct pid *pid,
282 struct task_struct *task);
283};
284
285struct ctl_table_header;
286struct ctl_table;
287
288struct proc_inode {
289 struct pid *pid;
290 int fd;
291 union proc_op op;
292 struct proc_dir_entry *pde;
293 struct ctl_table_header *sysctl;
294 struct ctl_table *sysctl_entry;
295 void *ns;
296 const struct proc_ns_operations *ns_ops;
297 struct inode vfs_inode;
298};
299
300static inline struct proc_inode *PROC_I(const struct inode *inode)
301{
302 return container_of(inode, struct proc_inode, vfs_inode);
303}
304
305static inline struct proc_dir_entry *PDE(const struct inode *inode)
306{
307 return PROC_I(inode)->pde;
308}
309
310static inline struct net *PDE_NET(struct proc_dir_entry *pde)
311{
312 return pde->parent->data;
313}
314
315#include <linux/signal.h>
316 78
317void render_sigset_t(struct seq_file *m, const char *header, sigset_t *set);
318#endif /* _LINUX_PROC_FS_H */ 79#endif /* _LINUX_PROC_FS_H */
diff --git a/include/linux/proc_ns.h b/include/linux/proc_ns.h
new file mode 100644
index 000000000000..34a1e105bef4
--- /dev/null
+++ b/include/linux/proc_ns.h
@@ -0,0 +1,74 @@
1/*
2 * procfs namespace bits
3 */
4#ifndef _LINUX_PROC_NS_H
5#define _LINUX_PROC_NS_H
6
7struct pid_namespace;
8struct nsproxy;
9
10struct proc_ns_operations {
11 const char *name;
12 int type;
13 void *(*get)(struct task_struct *task);
14 void (*put)(void *ns);
15 int (*install)(struct nsproxy *nsproxy, void *ns);
16 unsigned int (*inum)(void *ns);
17};
18
19struct proc_ns {
20 void *ns;
21 const struct proc_ns_operations *ns_ops;
22};
23
24extern const struct proc_ns_operations netns_operations;
25extern const struct proc_ns_operations utsns_operations;
26extern const struct proc_ns_operations ipcns_operations;
27extern const struct proc_ns_operations pidns_operations;
28extern const struct proc_ns_operations userns_operations;
29extern const struct proc_ns_operations mntns_operations;
30
31/*
32 * We always define these enumerators
33 */
34enum {
35 PROC_ROOT_INO = 1,
36 PROC_IPC_INIT_INO = 0xEFFFFFFFU,
37 PROC_UTS_INIT_INO = 0xEFFFFFFEU,
38 PROC_USER_INIT_INO = 0xEFFFFFFDU,
39 PROC_PID_INIT_INO = 0xEFFFFFFCU,
40};
41
42#ifdef CONFIG_PROC_FS
43
44extern int pid_ns_prepare_proc(struct pid_namespace *ns);
45extern void pid_ns_release_proc(struct pid_namespace *ns);
46extern struct file *proc_ns_fget(int fd);
47extern struct proc_ns *get_proc_ns(struct inode *);
48extern int proc_alloc_inum(unsigned int *pino);
49extern void proc_free_inum(unsigned int inum);
50extern bool proc_ns_inode(struct inode *inode);
51
52#else /* CONFIG_PROC_FS */
53
54static inline int pid_ns_prepare_proc(struct pid_namespace *ns) { return 0; }
55static inline void pid_ns_release_proc(struct pid_namespace *ns) {}
56
57static inline struct file *proc_ns_fget(int fd)
58{
59 return ERR_PTR(-EINVAL);
60}
61
62static inline struct proc_ns *get_proc_ns(struct inode *inode) { return NULL; }
63
64static inline int proc_alloc_inum(unsigned int *inum)
65{
66 *inum = 1;
67 return 0;
68}
69static inline void proc_free_inum(unsigned int inum) {}
70static inline bool proc_ns_inode(struct inode *inode) { return false; }
71
72#endif /* CONFIG_PROC_FS */
73
74#endif /* _LINUX_PROC_NS_H */
diff --git a/include/linux/profile.h b/include/linux/profile.h
index 21123902366d..aaad3861beb8 100644
--- a/include/linux/profile.h
+++ b/include/linux/profile.h
@@ -18,10 +18,10 @@ struct pt_regs;
18struct notifier_block; 18struct notifier_block;
19 19
20#if defined(CONFIG_PROFILING) && defined(CONFIG_PROC_FS) 20#if defined(CONFIG_PROFILING) && defined(CONFIG_PROC_FS)
21void create_prof_cpu_mask(struct proc_dir_entry *de); 21void create_prof_cpu_mask(void);
22int create_proc_profile(void); 22int create_proc_profile(void);
23#else 23#else
24static inline void create_prof_cpu_mask(struct proc_dir_entry *de) 24static inline void create_prof_cpu_mask(void)
25{ 25{
26} 26}
27 27
diff --git a/include/linux/seq_file.h b/include/linux/seq_file.h
index 68a04a343cad..2da29ac178fc 100644
--- a/include/linux/seq_file.h
+++ b/include/linux/seq_file.h
@@ -123,6 +123,7 @@ static inline int seq_nodemask_list(struct seq_file *m, nodemask_t *mask)
123} 123}
124 124
125int single_open(struct file *, int (*)(struct seq_file *, void *), void *); 125int single_open(struct file *, int (*)(struct seq_file *, void *), void *);
126int single_open_size(struct file *, int (*)(struct seq_file *, void *), void *, size_t);
126int single_release(struct inode *, struct file *); 127int single_release(struct inode *, struct file *);
127void *__seq_open_private(struct file *, const struct seq_operations *, int); 128void *__seq_open_private(struct file *, const struct seq_operations *, int);
128int seq_open_private(struct file *, const struct seq_operations *, int); 129int seq_open_private(struct file *, const struct seq_operations *, int);
diff --git a/include/linux/signal.h b/include/linux/signal.h
index 9475c5cb28bc..d897484730c0 100644
--- a/include/linux/signal.h
+++ b/include/linux/signal.h
@@ -434,4 +434,9 @@ void signals_init(void);
434int restore_altstack(const stack_t __user *); 434int restore_altstack(const stack_t __user *);
435int __save_altstack(stack_t __user *, unsigned long); 435int __save_altstack(stack_t __user *, unsigned long);
436 436
437#ifdef CONFIG_PROC_FS
438struct seq_file;
439extern void render_sigset_t(struct seq_file *, const char *, sigset_t *);
440#endif
441
437#endif /* _LINUX_SIGNAL_H */ 442#endif /* _LINUX_SIGNAL_H */
diff --git a/include/linux/tty.h b/include/linux/tty.h
index 367a9dfc4ea2..7e92bd86a808 100644
--- a/include/linux/tty.h
+++ b/include/linux/tty.h
@@ -691,5 +691,12 @@ do { \
691 finish_wait(&wq, &__wait); \ 691 finish_wait(&wq, &__wait); \
692} while (0) 692} while (0)
693 693
694#ifdef CONFIG_PROC_FS
695extern void proc_tty_register_driver(struct tty_driver *);
696extern void proc_tty_unregister_driver(struct tty_driver *);
697#else
698static inline void proc_tty_register_driver(struct tty_driver *d) {}
699static inline void proc_tty_unregister_driver(struct tty_driver *d) {}
700#endif
694 701
695#endif 702#endif
diff --git a/include/net/bluetooth/bluetooth.h b/include/net/bluetooth/bluetooth.h
index 6912ef9a1881..10eb9b389014 100644
--- a/include/net/bluetooth/bluetooth.h
+++ b/include/net/bluetooth/bluetooth.h
@@ -226,7 +226,6 @@ struct bt_sock_list {
226 struct hlist_head head; 226 struct hlist_head head;
227 rwlock_t lock; 227 rwlock_t lock;
228#ifdef CONFIG_PROC_FS 228#ifdef CONFIG_PROC_FS
229 struct file_operations fops;
230 int (* custom_seq_show)(struct seq_file *, void *); 229 int (* custom_seq_show)(struct seq_file *, void *);
231#endif 230#endif
232}; 231};
@@ -330,7 +329,7 @@ extern void hci_sock_cleanup(void);
330extern int bt_sysfs_init(void); 329extern int bt_sysfs_init(void);
331extern void bt_sysfs_cleanup(void); 330extern void bt_sysfs_cleanup(void);
332 331
333extern int bt_procfs_init(struct module* module, struct net *net, const char *name, 332extern int bt_procfs_init(struct net *net, const char *name,
334 struct bt_sock_list* sk_list, 333 struct bt_sock_list* sk_list,
335 int (* seq_show)(struct seq_file *, void *)); 334 int (* seq_show)(struct seq_file *, void *));
336extern void bt_procfs_cleanup(struct net *net, const char *name); 335extern void bt_procfs_cleanup(struct net *net, const char *name);
diff --git a/include/net/lib80211.h b/include/net/lib80211.h
index d178c26a5558..be95b9262801 100644
--- a/include/net/lib80211.h
+++ b/include/net/lib80211.h
@@ -30,6 +30,8 @@
30#include <linux/skbuff.h> 30#include <linux/skbuff.h>
31#include <linux/ieee80211.h> 31#include <linux/ieee80211.h>
32#include <linux/timer.h> 32#include <linux/timer.h>
33#include <linux/seq_file.h>
34
33/* print_ssid() is intended to be used in debug (and possibly error) 35/* print_ssid() is intended to be used in debug (and possibly error)
34 * messages. It should never be used for passing ssid to user space. */ 36 * messages. It should never be used for passing ssid to user space. */
35const char *print_ssid(char *buf, const char *ssid, u8 ssid_len); 37const char *print_ssid(char *buf, const char *ssid, u8 ssid_len);
@@ -75,7 +77,7 @@ struct lib80211_crypto_ops {
75 77
76 /* procfs handler for printing out key information and possible 78 /* procfs handler for printing out key information and possible
77 * statistics */ 79 * statistics */
78 char *(*print_stats) (char *p, void *priv); 80 void (*print_stats) (struct seq_file *m, void *priv);
79 81
80 /* Crypto specific flag get/set for configuration settings */ 82 /* Crypto specific flag get/set for configuration settings */
81 unsigned long (*get_flags) (void *priv); 83 unsigned long (*get_flags) (void *priv);
diff --git a/include/scsi/scsi_host.h b/include/scsi/scsi_host.h
index 2b6956e9853d..755243572219 100644
--- a/include/scsi/scsi_host.h
+++ b/include/scsi/scsi_host.h
@@ -6,6 +6,7 @@
6#include <linux/types.h> 6#include <linux/types.h>
7#include <linux/workqueue.h> 7#include <linux/workqueue.h>
8#include <linux/mutex.h> 8#include <linux/mutex.h>
9#include <linux/seq_file.h>
9#include <scsi/scsi.h> 10#include <scsi/scsi.h>
10 11
11struct request_queue; 12struct request_queue;
@@ -340,7 +341,8 @@ struct scsi_host_template {
340 * 341 *
341 * Status: OBSOLETE 342 * Status: OBSOLETE
342 */ 343 */
343 int (*proc_info)(struct Scsi_Host *, char *, char **, off_t, int, int); 344 int (*show_info)(struct seq_file *, struct Scsi_Host *);
345 int (*write_info)(struct Scsi_Host *, char *, int);
344 346
345 /* 347 /*
346 * This is an optional routine that allows the transport to become 348 * This is an optional routine that allows the transport to become
@@ -375,7 +377,7 @@ struct scsi_host_template {
375 377
376 /* 378 /*
377 * Used to store the procfs directory if a driver implements the 379 * Used to store the procfs directory if a driver implements the
378 * proc_info method. 380 * show_info method.
379 */ 381 */
380 struct proc_dir_entry *proc_dir; 382 struct proc_dir_entry *proc_dir;
381 383
diff --git a/init/version.c b/init/version.c
index 58170f18912d..1a4718e500fe 100644
--- a/init/version.c
+++ b/init/version.c
@@ -12,7 +12,7 @@
12#include <linux/utsname.h> 12#include <linux/utsname.h>
13#include <generated/utsrelease.h> 13#include <generated/utsrelease.h>
14#include <linux/version.h> 14#include <linux/version.h>
15#include <linux/proc_fs.h> 15#include <linux/proc_ns.h>
16 16
17#ifndef CONFIG_KALLSYMS 17#ifndef CONFIG_KALLSYMS
18#define version(a) Version_ ## a 18#define version(a) Version_ ## a
diff --git a/ipc/msgutil.c b/ipc/msgutil.c
index d43439e6eb47..491e71f2a1b8 100644
--- a/ipc/msgutil.c
+++ b/ipc/msgutil.c
@@ -16,7 +16,7 @@
16#include <linux/msg.h> 16#include <linux/msg.h>
17#include <linux/ipc_namespace.h> 17#include <linux/ipc_namespace.h>
18#include <linux/utsname.h> 18#include <linux/utsname.h>
19#include <linux/proc_fs.h> 19#include <linux/proc_ns.h>
20#include <linux/uaccess.h> 20#include <linux/uaccess.h>
21 21
22#include "util.h" 22#include "util.h"
diff --git a/ipc/namespace.c b/ipc/namespace.c
index 7c1fa451b0b0..7ee61bf44933 100644
--- a/ipc/namespace.c
+++ b/ipc/namespace.c
@@ -12,7 +12,7 @@
12#include <linux/fs.h> 12#include <linux/fs.h>
13#include <linux/mount.h> 13#include <linux/mount.h>
14#include <linux/user_namespace.h> 14#include <linux/user_namespace.h>
15#include <linux/proc_fs.h> 15#include <linux/proc_ns.h>
16 16
17#include "util.h" 17#include "util.h"
18 18
diff --git a/ipc/util.c b/ipc/util.c
index 579201e4bc01..abfc13e8677f 100644
--- a/ipc/util.c
+++ b/ipc/util.c
@@ -1031,7 +1031,7 @@ static int sysvipc_proc_open(struct inode *inode, struct file *file)
1031 seq = file->private_data; 1031 seq = file->private_data;
1032 seq->private = iter; 1032 seq->private = iter;
1033 1033
1034 iter->iface = PDE(inode)->data; 1034 iter->iface = PDE_DATA(inode);
1035 iter->ns = get_ipc_ns(current->nsproxy->ipc_ns); 1035 iter->ns = get_ipc_ns(current->nsproxy->ipc_ns);
1036out: 1036out:
1037 return ret; 1037 return ret;
diff --git a/kernel/acct.c b/kernel/acct.c
index b9bd7f098ee5..85389fe2abd0 100644
--- a/kernel/acct.c
+++ b/kernel/acct.c
@@ -543,6 +543,7 @@ static void do_acct_process(struct bsd_acct_struct *acct,
543 * Kernel segment override to datasegment and write it 543 * Kernel segment override to datasegment and write it
544 * to the accounting file. 544 * to the accounting file.
545 */ 545 */
546 file_start_write(file);
546 fs = get_fs(); 547 fs = get_fs();
547 set_fs(KERNEL_DS); 548 set_fs(KERNEL_DS);
548 /* 549 /*
@@ -554,6 +555,7 @@ static void do_acct_process(struct bsd_acct_struct *acct,
554 sizeof(acct_t), &file->f_pos); 555 sizeof(acct_t), &file->f_pos);
555 current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim; 556 current->signal->rlim[RLIMIT_FSIZE].rlim_cur = flim;
556 set_fs(fs); 557 set_fs(fs);
558 file_end_write(file);
557out: 559out:
558 revert_creds(orig_cred); 560 revert_creds(orig_cred);
559} 561}
diff --git a/kernel/cgroup.c b/kernel/cgroup.c
index d3abce2d6455..2a9926275f80 100644
--- a/kernel/cgroup.c
+++ b/kernel/cgroup.c
@@ -4678,7 +4678,7 @@ out:
4678 */ 4678 */
4679 4679
4680/* TODO: Use a proper seq_file iterator */ 4680/* TODO: Use a proper seq_file iterator */
4681static int proc_cgroup_show(struct seq_file *m, void *v) 4681int proc_cgroup_show(struct seq_file *m, void *v)
4682{ 4682{
4683 struct pid *pid; 4683 struct pid *pid;
4684 struct task_struct *tsk; 4684 struct task_struct *tsk;
@@ -4730,19 +4730,6 @@ out:
4730 return retval; 4730 return retval;
4731} 4731}
4732 4732
4733static int cgroup_open(struct inode *inode, struct file *file)
4734{
4735 struct pid *pid = PROC_I(inode)->pid;
4736 return single_open(file, proc_cgroup_show, pid);
4737}
4738
4739const struct file_operations proc_cgroup_operations = {
4740 .open = cgroup_open,
4741 .read = seq_read,
4742 .llseek = seq_lseek,
4743 .release = single_release,
4744};
4745
4746/* Display information about each subsystem and each hierarchy */ 4733/* Display information about each subsystem and each hierarchy */
4747static int proc_cgroupstats_show(struct seq_file *m, void *v) 4734static int proc_cgroupstats_show(struct seq_file *m, void *v)
4748{ 4735{
diff --git a/kernel/configs.c b/kernel/configs.c
index 42e8fa075eed..c18b1f1ae515 100644
--- a/kernel/configs.c
+++ b/kernel/configs.c
@@ -79,7 +79,7 @@ static int __init ikconfig_init(void)
79 if (!entry) 79 if (!entry)
80 return -ENOMEM; 80 return -ENOMEM;
81 81
82 entry->size = kernel_config_data_size; 82 proc_set_size(entry, kernel_config_data_size);
83 83
84 return 0; 84 return 0;
85} 85}
diff --git a/kernel/cpuset.c b/kernel/cpuset.c
index 12331120767c..64b3f791bbe5 100644
--- a/kernel/cpuset.c
+++ b/kernel/cpuset.c
@@ -2609,7 +2609,7 @@ void __cpuset_memory_pressure_bump(void)
2609 * and we take cpuset_mutex, keeping cpuset_attach() from changing it 2609 * and we take cpuset_mutex, keeping cpuset_attach() from changing it
2610 * anyway. 2610 * anyway.
2611 */ 2611 */
2612static int proc_cpuset_show(struct seq_file *m, void *unused_v) 2612int proc_cpuset_show(struct seq_file *m, void *unused_v)
2613{ 2613{
2614 struct pid *pid; 2614 struct pid *pid;
2615 struct task_struct *tsk; 2615 struct task_struct *tsk;
@@ -2643,19 +2643,6 @@ out_free:
2643out: 2643out:
2644 return retval; 2644 return retval;
2645} 2645}
2646
2647static int cpuset_open(struct inode *inode, struct file *file)
2648{
2649 struct pid *pid = PROC_I(inode)->pid;
2650 return single_open(file, proc_cpuset_show, pid);
2651}
2652
2653const struct file_operations proc_cpuset_operations = {
2654 .open = cpuset_open,
2655 .read = seq_read,
2656 .llseek = seq_lseek,
2657 .release = single_release,
2658};
2659#endif /* CONFIG_PROC_PID_CPUSET */ 2646#endif /* CONFIG_PROC_PID_CPUSET */
2660 2647
2661/* Display task mems_allowed in /proc/<pid>/status file. */ 2648/* Display task mems_allowed in /proc/<pid>/status file. */
diff --git a/kernel/exit.c b/kernel/exit.c
index 6e3151ec900f..af2eb3cbd499 100644
--- a/kernel/exit.c
+++ b/kernel/exit.c
@@ -847,7 +847,7 @@ void do_exit(long code)
847 exit_io_context(tsk); 847 exit_io_context(tsk);
848 848
849 if (tsk->splice_pipe) 849 if (tsk->splice_pipe)
850 __free_pipe_info(tsk->splice_pipe); 850 free_pipe_info(tsk->splice_pipe);
851 851
852 if (tsk->task_frag.page) 852 if (tsk->task_frag.page)
853 put_page(tsk->task_frag.page); 853 put_page(tsk->task_frag.page);
diff --git a/kernel/irq/proc.c b/kernel/irq/proc.c
index 397db02209ed..19ed5c425c3b 100644
--- a/kernel/irq/proc.c
+++ b/kernel/irq/proc.c
@@ -76,7 +76,7 @@ static int irq_affinity_list_proc_show(struct seq_file *m, void *v)
76static ssize_t write_irq_affinity(int type, struct file *file, 76static ssize_t write_irq_affinity(int type, struct file *file,
77 const char __user *buffer, size_t count, loff_t *pos) 77 const char __user *buffer, size_t count, loff_t *pos)
78{ 78{
79 unsigned int irq = (int)(long)PDE(file_inode(file))->data; 79 unsigned int irq = (int)(long)PDE_DATA(file_inode(file));
80 cpumask_var_t new_value; 80 cpumask_var_t new_value;
81 int err; 81 int err;
82 82
@@ -131,17 +131,17 @@ static ssize_t irq_affinity_list_proc_write(struct file *file,
131 131
132static int irq_affinity_proc_open(struct inode *inode, struct file *file) 132static int irq_affinity_proc_open(struct inode *inode, struct file *file)
133{ 133{
134 return single_open(file, irq_affinity_proc_show, PDE(inode)->data); 134 return single_open(file, irq_affinity_proc_show, PDE_DATA(inode));
135} 135}
136 136
137static int irq_affinity_list_proc_open(struct inode *inode, struct file *file) 137static int irq_affinity_list_proc_open(struct inode *inode, struct file *file)
138{ 138{
139 return single_open(file, irq_affinity_list_proc_show, PDE(inode)->data); 139 return single_open(file, irq_affinity_list_proc_show, PDE_DATA(inode));
140} 140}
141 141
142static int irq_affinity_hint_proc_open(struct inode *inode, struct file *file) 142static int irq_affinity_hint_proc_open(struct inode *inode, struct file *file)
143{ 143{
144 return single_open(file, irq_affinity_hint_proc_show, PDE(inode)->data); 144 return single_open(file, irq_affinity_hint_proc_show, PDE_DATA(inode));
145} 145}
146 146
147static const struct file_operations irq_affinity_proc_fops = { 147static const struct file_operations irq_affinity_proc_fops = {
@@ -212,7 +212,7 @@ out:
212 212
213static int default_affinity_open(struct inode *inode, struct file *file) 213static int default_affinity_open(struct inode *inode, struct file *file)
214{ 214{
215 return single_open(file, default_affinity_show, PDE(inode)->data); 215 return single_open(file, default_affinity_show, PDE_DATA(inode));
216} 216}
217 217
218static const struct file_operations default_affinity_proc_fops = { 218static const struct file_operations default_affinity_proc_fops = {
@@ -233,7 +233,7 @@ static int irq_node_proc_show(struct seq_file *m, void *v)
233 233
234static int irq_node_proc_open(struct inode *inode, struct file *file) 234static int irq_node_proc_open(struct inode *inode, struct file *file)
235{ 235{
236 return single_open(file, irq_node_proc_show, PDE(inode)->data); 236 return single_open(file, irq_node_proc_show, PDE_DATA(inode));
237} 237}
238 238
239static const struct file_operations irq_node_proc_fops = { 239static const struct file_operations irq_node_proc_fops = {
@@ -256,7 +256,7 @@ static int irq_spurious_proc_show(struct seq_file *m, void *v)
256 256
257static int irq_spurious_proc_open(struct inode *inode, struct file *file) 257static int irq_spurious_proc_open(struct inode *inode, struct file *file)
258{ 258{
259 return single_open(file, irq_spurious_proc_show, PDE(inode)->data); 259 return single_open(file, irq_spurious_proc_show, PDE_DATA(inode));
260} 260}
261 261
262static const struct file_operations irq_spurious_proc_fops = { 262static const struct file_operations irq_spurious_proc_fops = {
@@ -366,11 +366,7 @@ void unregister_irq_proc(unsigned int irq, struct irq_desc *desc)
366 366
367void unregister_handler_proc(unsigned int irq, struct irqaction *action) 367void unregister_handler_proc(unsigned int irq, struct irqaction *action)
368{ 368{
369 if (action->dir) { 369 proc_remove(action->dir);
370 struct irq_desc *desc = irq_to_desc(irq);
371
372 remove_proc_entry(action->dir->name, desc->dir);
373 }
374} 370}
375 371
376static void register_default_affinity_proc(void) 372static void register_default_affinity_proc(void)
diff --git a/kernel/nsproxy.c b/kernel/nsproxy.c
index afc0456f227a..364ceab15f0c 100644
--- a/kernel/nsproxy.c
+++ b/kernel/nsproxy.c
@@ -22,7 +22,7 @@
22#include <linux/pid_namespace.h> 22#include <linux/pid_namespace.h>
23#include <net/net_namespace.h> 23#include <net/net_namespace.h>
24#include <linux/ipc_namespace.h> 24#include <linux/ipc_namespace.h>
25#include <linux/proc_fs.h> 25#include <linux/proc_ns.h>
26#include <linux/file.h> 26#include <linux/file.h>
27#include <linux/syscalls.h> 27#include <linux/syscalls.h>
28 28
@@ -241,7 +241,7 @@ SYSCALL_DEFINE2(setns, int, fd, int, nstype)
241 const struct proc_ns_operations *ops; 241 const struct proc_ns_operations *ops;
242 struct task_struct *tsk = current; 242 struct task_struct *tsk = current;
243 struct nsproxy *new_nsproxy; 243 struct nsproxy *new_nsproxy;
244 struct proc_inode *ei; 244 struct proc_ns *ei;
245 struct file *file; 245 struct file *file;
246 int err; 246 int err;
247 247
@@ -250,7 +250,7 @@ SYSCALL_DEFINE2(setns, int, fd, int, nstype)
250 return PTR_ERR(file); 250 return PTR_ERR(file);
251 251
252 err = -EINVAL; 252 err = -EINVAL;
253 ei = PROC_I(file_inode(file)); 253 ei = get_proc_ns(file_inode(file));
254 ops = ei->ns_ops; 254 ops = ei->ns_ops;
255 if (nstype && (ops->type != nstype)) 255 if (nstype && (ops->type != nstype))
256 goto out; 256 goto out;
diff --git a/kernel/pid.c b/kernel/pid.c
index 6283d6412aff..0db3e791a06d 100644
--- a/kernel/pid.c
+++ b/kernel/pid.c
@@ -36,6 +36,7 @@
36#include <linux/pid_namespace.h> 36#include <linux/pid_namespace.h>
37#include <linux/init_task.h> 37#include <linux/init_task.h>
38#include <linux/syscalls.h> 38#include <linux/syscalls.h>
39#include <linux/proc_ns.h>
39#include <linux/proc_fs.h> 40#include <linux/proc_fs.h>
40 41
41#define pid_hashfn(nr, ns) \ 42#define pid_hashfn(nr, ns) \
diff --git a/kernel/pid_namespace.c b/kernel/pid_namespace.c
index 69473c4a653f..6917e8edb48e 100644
--- a/kernel/pid_namespace.c
+++ b/kernel/pid_namespace.c
@@ -15,7 +15,7 @@
15#include <linux/err.h> 15#include <linux/err.h>
16#include <linux/acct.h> 16#include <linux/acct.h>
17#include <linux/slab.h> 17#include <linux/slab.h>
18#include <linux/proc_fs.h> 18#include <linux/proc_ns.h>
19#include <linux/reboot.h> 19#include <linux/reboot.h>
20#include <linux/export.h> 20#include <linux/export.h>
21 21
diff --git a/kernel/profile.c b/kernel/profile.c
index dc3384ee874e..0bf400737660 100644
--- a/kernel/profile.c
+++ b/kernel/profile.c
@@ -462,10 +462,10 @@ static const struct file_operations prof_cpu_mask_proc_fops = {
462 .write = prof_cpu_mask_proc_write, 462 .write = prof_cpu_mask_proc_write,
463}; 463};
464 464
465void create_prof_cpu_mask(struct proc_dir_entry *root_irq_dir) 465void create_prof_cpu_mask(void)
466{ 466{
467 /* create /proc/irq/prof_cpu_mask */ 467 /* create /proc/irq/prof_cpu_mask */
468 proc_create("prof_cpu_mask", 0600, root_irq_dir, &prof_cpu_mask_proc_fops); 468 proc_create("irq/prof_cpu_mask", 0600, NULL, &prof_cpu_mask_proc_fops);
469} 469}
470 470
471/* 471/*
@@ -600,7 +600,7 @@ int __ref create_proc_profile(void) /* false positive from hotcpu_notifier */
600 NULL, &proc_profile_operations); 600 NULL, &proc_profile_operations);
601 if (!entry) 601 if (!entry)
602 return 0; 602 return 0;
603 entry->size = (1+prof_len) * sizeof(atomic_t); 603 proc_set_size(entry, (1 + prof_len) * sizeof(atomic_t));
604 hotcpu_notifier(profile_cpu_callback, 0); 604 hotcpu_notifier(profile_cpu_callback, 0);
605 return 0; 605 return 0;
606} 606}
diff --git a/kernel/sched/stats.c b/kernel/sched/stats.c
index e036eda1a9c9..da98af347e8b 100644
--- a/kernel/sched/stats.c
+++ b/kernel/sched/stats.c
@@ -130,16 +130,11 @@ static int schedstat_open(struct inode *inode, struct file *file)
130 return seq_open(file, &schedstat_sops); 130 return seq_open(file, &schedstat_sops);
131} 131}
132 132
133static int schedstat_release(struct inode *inode, struct file *file)
134{
135 return 0;
136};
137
138static const struct file_operations proc_schedstat_operations = { 133static const struct file_operations proc_schedstat_operations = {
139 .open = schedstat_open, 134 .open = schedstat_open,
140 .read = seq_read, 135 .read = seq_read,
141 .llseek = seq_lseek, 136 .llseek = seq_lseek,
142 .release = schedstat_release, 137 .release = seq_release,
143}; 138};
144 139
145static int __init proc_schedstat_init(void) 140static int __init proc_schedstat_init(void)
diff --git a/kernel/user.c b/kernel/user.c
index 8e635a18ab52..69b4c3d48cde 100644
--- a/kernel/user.c
+++ b/kernel/user.c
@@ -16,7 +16,7 @@
16#include <linux/interrupt.h> 16#include <linux/interrupt.h>
17#include <linux/export.h> 17#include <linux/export.h>
18#include <linux/user_namespace.h> 18#include <linux/user_namespace.h>
19#include <linux/proc_fs.h> 19#include <linux/proc_ns.h>
20 20
21/* 21/*
22 * userns count is 1 for root user, 1 for init_uts_ns, 22 * userns count is 1 for root user, 1 for init_uts_ns,
diff --git a/kernel/user_namespace.c b/kernel/user_namespace.c
index e134d8f365dd..d8c30db06c5b 100644
--- a/kernel/user_namespace.c
+++ b/kernel/user_namespace.c
@@ -9,7 +9,7 @@
9#include <linux/nsproxy.h> 9#include <linux/nsproxy.h>
10#include <linux/slab.h> 10#include <linux/slab.h>
11#include <linux/user_namespace.h> 11#include <linux/user_namespace.h>
12#include <linux/proc_fs.h> 12#include <linux/proc_ns.h>
13#include <linux/highuid.h> 13#include <linux/highuid.h>
14#include <linux/cred.h> 14#include <linux/cred.h>
15#include <linux/securebits.h> 15#include <linux/securebits.h>
diff --git a/kernel/utsname.c b/kernel/utsname.c
index a47fc5de3113..2fc8576efaa8 100644
--- a/kernel/utsname.c
+++ b/kernel/utsname.c
@@ -15,7 +15,7 @@
15#include <linux/err.h> 15#include <linux/err.h>
16#include <linux/slab.h> 16#include <linux/slab.h>
17#include <linux/user_namespace.h> 17#include <linux/user_namespace.h>
18#include <linux/proc_fs.h> 18#include <linux/proc_ns.h>
19 19
20static struct uts_namespace *create_uts_ns(void) 20static struct uts_namespace *create_uts_ns(void)
21{ 21{
diff --git a/lib/notifier-error-inject.c b/lib/notifier-error-inject.c
index 44b92cb6224f..eb4a04afea80 100644
--- a/lib/notifier-error-inject.c
+++ b/lib/notifier-error-inject.c
@@ -17,7 +17,7 @@ static int debugfs_errno_get(void *data, u64 *val)
17DEFINE_SIMPLE_ATTRIBUTE(fops_errno, debugfs_errno_get, debugfs_errno_set, 17DEFINE_SIMPLE_ATTRIBUTE(fops_errno, debugfs_errno_get, debugfs_errno_set,
18 "%lld\n"); 18 "%lld\n");
19 19
20static struct dentry *debugfs_create_errno(const char *name, mode_t mode, 20static struct dentry *debugfs_create_errno(const char *name, umode_t mode,
21 struct dentry *parent, int *value) 21 struct dentry *parent, int *value)
22{ 22{
23 return debugfs_create_file(name, mode, parent, value, &fops_errno); 23 return debugfs_create_file(name, mode, parent, value, &fops_errno);
@@ -50,7 +50,7 @@ struct dentry *notifier_err_inject_init(const char *name, struct dentry *parent,
50 struct notifier_err_inject *err_inject, int priority) 50 struct notifier_err_inject *err_inject, int priority)
51{ 51{
52 struct notifier_err_inject_action *action; 52 struct notifier_err_inject_action *action;
53 mode_t mode = S_IFREG | S_IRUSR | S_IWUSR; 53 umode_t mode = S_IFREG | S_IRUSR | S_IWUSR;
54 struct dentry *dir; 54 struct dentry *dir;
55 struct dentry *actions_dir; 55 struct dentry *actions_dir;
56 56
diff --git a/mm/filemap.c b/mm/filemap.c
index e989fb1eaa72..7905fe721aa8 100644
--- a/mm/filemap.c
+++ b/mm/filemap.c
@@ -2546,7 +2546,6 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
2546 2546
2547 BUG_ON(iocb->ki_pos != pos); 2547 BUG_ON(iocb->ki_pos != pos);
2548 2548
2549 sb_start_write(inode->i_sb);
2550 mutex_lock(&inode->i_mutex); 2549 mutex_lock(&inode->i_mutex);
2551 ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos); 2550 ret = __generic_file_aio_write(iocb, iov, nr_segs, &iocb->ki_pos);
2552 mutex_unlock(&inode->i_mutex); 2551 mutex_unlock(&inode->i_mutex);
@@ -2558,7 +2557,6 @@ ssize_t generic_file_aio_write(struct kiocb *iocb, const struct iovec *iov,
2558 if (err < 0 && ret > 0) 2557 if (err < 0 && ret > 0)
2559 ret = err; 2558 ret = err;
2560 } 2559 }
2561 sb_end_write(inode->i_sb);
2562 return ret; 2560 return ret;
2563} 2561}
2564EXPORT_SYMBOL(generic_file_aio_write); 2562EXPORT_SYMBOL(generic_file_aio_write);
diff --git a/mm/filemap_xip.c b/mm/filemap_xip.c
index a912da6ddfd4..28fe26b64f8a 100644
--- a/mm/filemap_xip.c
+++ b/mm/filemap_xip.c
@@ -404,8 +404,6 @@ xip_file_write(struct file *filp, const char __user *buf, size_t len,
404 loff_t pos; 404 loff_t pos;
405 ssize_t ret; 405 ssize_t ret;
406 406
407 sb_start_write(inode->i_sb);
408
409 mutex_lock(&inode->i_mutex); 407 mutex_lock(&inode->i_mutex);
410 408
411 if (!access_ok(VERIFY_READ, buf, len)) { 409 if (!access_ok(VERIFY_READ, buf, len)) {
@@ -439,7 +437,6 @@ xip_file_write(struct file *filp, const char __user *buf, size_t len,
439 current->backing_dev_info = NULL; 437 current->backing_dev_info = NULL;
440 out_up: 438 out_up:
441 mutex_unlock(&inode->i_mutex); 439 mutex_unlock(&inode->i_mutex);
442 sb_end_write(inode->i_sb);
443 return ret; 440 return ret;
444} 441}
445EXPORT_SYMBOL_GPL(xip_file_write); 442EXPORT_SYMBOL_GPL(xip_file_write);
diff --git a/mm/vmalloc.c b/mm/vmalloc.c
index 72043d6c88c0..b12fd8612604 100644
--- a/mm/vmalloc.c
+++ b/mm/vmalloc.c
@@ -27,10 +27,30 @@
27#include <linux/pfn.h> 27#include <linux/pfn.h>
28#include <linux/kmemleak.h> 28#include <linux/kmemleak.h>
29#include <linux/atomic.h> 29#include <linux/atomic.h>
30#include <linux/llist.h>
30#include <asm/uaccess.h> 31#include <asm/uaccess.h>
31#include <asm/tlbflush.h> 32#include <asm/tlbflush.h>
32#include <asm/shmparam.h> 33#include <asm/shmparam.h>
33 34
35struct vfree_deferred {
36 struct llist_head list;
37 struct work_struct wq;
38};
39static DEFINE_PER_CPU(struct vfree_deferred, vfree_deferred);
40
41static void __vunmap(const void *, int);
42
43static void free_work(struct work_struct *w)
44{
45 struct vfree_deferred *p = container_of(w, struct vfree_deferred, wq);
46 struct llist_node *llnode = llist_del_all(&p->list);
47 while (llnode) {
48 void *p = llnode;
49 llnode = llist_next(llnode);
50 __vunmap(p, 1);
51 }
52}
53
34/*** Page table manipulation functions ***/ 54/*** Page table manipulation functions ***/
35 55
36static void vunmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end) 56static void vunmap_pte_range(pmd_t *pmd, unsigned long addr, unsigned long end)
@@ -1175,10 +1195,14 @@ void __init vmalloc_init(void)
1175 1195
1176 for_each_possible_cpu(i) { 1196 for_each_possible_cpu(i) {
1177 struct vmap_block_queue *vbq; 1197 struct vmap_block_queue *vbq;
1198 struct vfree_deferred *p;
1178 1199
1179 vbq = &per_cpu(vmap_block_queue, i); 1200 vbq = &per_cpu(vmap_block_queue, i);
1180 spin_lock_init(&vbq->lock); 1201 spin_lock_init(&vbq->lock);
1181 INIT_LIST_HEAD(&vbq->free); 1202 INIT_LIST_HEAD(&vbq->free);
1203 p = &per_cpu(vfree_deferred, i);
1204 init_llist_head(&p->list);
1205 INIT_WORK(&p->wq, free_work);
1182 } 1206 }
1183 1207
1184 /* Import existing vmlist entries. */ 1208 /* Import existing vmlist entries. */
@@ -1486,7 +1510,7 @@ static void __vunmap(const void *addr, int deallocate_pages)
1486 kfree(area); 1510 kfree(area);
1487 return; 1511 return;
1488} 1512}
1489 1513
1490/** 1514/**
1491 * vfree - release memory allocated by vmalloc() 1515 * vfree - release memory allocated by vmalloc()
1492 * @addr: memory base address 1516 * @addr: memory base address
@@ -1495,15 +1519,25 @@ static void __vunmap(const void *addr, int deallocate_pages)
1495 * obtained from vmalloc(), vmalloc_32() or __vmalloc(). If @addr is 1519 * obtained from vmalloc(), vmalloc_32() or __vmalloc(). If @addr is
1496 * NULL, no operation is performed. 1520 * NULL, no operation is performed.
1497 * 1521 *
1498 * Must not be called in interrupt context. 1522 * Must not be called in NMI context (strictly speaking, only if we don't
1523 * have CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG, but making the calling
1524 * conventions for vfree() arch-depenedent would be a really bad idea)
1525 *
1499 */ 1526 */
1500void vfree(const void *addr) 1527void vfree(const void *addr)
1501{ 1528{
1502 BUG_ON(in_interrupt()); 1529 BUG_ON(in_nmi());
1503 1530
1504 kmemleak_free(addr); 1531 kmemleak_free(addr);
1505 1532
1506 __vunmap(addr, 1); 1533 if (!addr)
1534 return;
1535 if (unlikely(in_interrupt())) {
1536 struct vfree_deferred *p = &__get_cpu_var(vfree_deferred);
1537 llist_add((struct llist_node *)addr, &p->list);
1538 schedule_work(&p->wq);
1539 } else
1540 __vunmap(addr, 1);
1507} 1541}
1508EXPORT_SYMBOL(vfree); 1542EXPORT_SYMBOL(vfree);
1509 1543
@@ -1520,7 +1554,8 @@ void vunmap(const void *addr)
1520{ 1554{
1521 BUG_ON(in_interrupt()); 1555 BUG_ON(in_interrupt());
1522 might_sleep(); 1556 might_sleep();
1523 __vunmap(addr, 0); 1557 if (addr)
1558 __vunmap(addr, 0);
1524} 1559}
1525EXPORT_SYMBOL(vunmap); 1560EXPORT_SYMBOL(vunmap);
1526 1561
diff --git a/net/8021q/vlanproc.c b/net/8021q/vlanproc.c
index dc526ec965e4..1d0e89213a28 100644
--- a/net/8021q/vlanproc.c
+++ b/net/8021q/vlanproc.c
@@ -93,7 +93,7 @@ static const struct file_operations vlan_fops = {
93 93
94static int vlandev_seq_open(struct inode *inode, struct file *file) 94static int vlandev_seq_open(struct inode *inode, struct file *file)
95{ 95{
96 return single_open(file, vlandev_seq_show, PDE(inode)->data); 96 return single_open(file, vlandev_seq_show, PDE_DATA(inode));
97} 97}
98 98
99static const struct file_operations vlandev_fops = { 99static const struct file_operations vlandev_fops = {
@@ -184,14 +184,9 @@ int vlan_proc_add_dev(struct net_device *vlandev)
184 */ 184 */
185int vlan_proc_rem_dev(struct net_device *vlandev) 185int vlan_proc_rem_dev(struct net_device *vlandev)
186{ 186{
187 struct vlan_net *vn = net_generic(dev_net(vlandev), vlan_net_id);
188
189 /** NOTE: This will consume the memory pointed to by dent, it seems. */ 187 /** NOTE: This will consume the memory pointed to by dent, it seems. */
190 if (vlan_dev_priv(vlandev)->dent) { 188 proc_remove(vlan_dev_priv(vlandev)->dent);
191 remove_proc_entry(vlan_dev_priv(vlandev)->dent->name, 189 vlan_dev_priv(vlandev)->dent = NULL;
192 vn->proc_vlan_dir);
193 vlan_dev_priv(vlandev)->dent = NULL;
194 }
195 return 0; 190 return 0;
196} 191}
197 192
diff --git a/net/atm/proc.c b/net/atm/proc.c
index 6ac35ff0d6b9..bbb6461a4b7f 100644
--- a/net/atm/proc.c
+++ b/net/atm/proc.c
@@ -385,7 +385,7 @@ static ssize_t proc_dev_atm_read(struct file *file, char __user *buf,
385 page = get_zeroed_page(GFP_KERNEL); 385 page = get_zeroed_page(GFP_KERNEL);
386 if (!page) 386 if (!page)
387 return -ENOMEM; 387 return -ENOMEM;
388 dev = PDE(file_inode(file))->data; 388 dev = PDE_DATA(file_inode(file));
389 if (!dev->ops->proc_read) 389 if (!dev->ops->proc_read)
390 length = -EINVAL; 390 length = -EINVAL;
391 else { 391 else {
diff --git a/net/bluetooth/af_bluetooth.c b/net/bluetooth/af_bluetooth.c
index e5338f787d68..9096137c889c 100644
--- a/net/bluetooth/af_bluetooth.c
+++ b/net/bluetooth/af_bluetooth.c
@@ -609,7 +609,7 @@ static int bt_seq_open(struct inode *inode, struct file *file)
609 struct bt_sock_list *sk_list; 609 struct bt_sock_list *sk_list;
610 struct bt_seq_state *s; 610 struct bt_seq_state *s;
611 611
612 sk_list = PDE(inode)->data; 612 sk_list = PDE_DATA(inode);
613 s = __seq_open_private(file, &bt_seq_ops, 613 s = __seq_open_private(file, &bt_seq_ops,
614 sizeof(struct bt_seq_state)); 614 sizeof(struct bt_seq_state));
615 if (!s) 615 if (!s)
@@ -619,26 +619,21 @@ static int bt_seq_open(struct inode *inode, struct file *file)
619 return 0; 619 return 0;
620} 620}
621 621
622int bt_procfs_init(struct module* module, struct net *net, const char *name, 622static const struct file_operations bt_fops = {
623 .open = bt_seq_open,
624 .read = seq_read,
625 .llseek = seq_lseek,
626 .release = seq_release_private
627};
628
629int bt_procfs_init(struct net *net, const char *name,
623 struct bt_sock_list* sk_list, 630 struct bt_sock_list* sk_list,
624 int (* seq_show)(struct seq_file *, void *)) 631 int (* seq_show)(struct seq_file *, void *))
625{ 632{
626 struct proc_dir_entry * pde;
627
628 sk_list->custom_seq_show = seq_show; 633 sk_list->custom_seq_show = seq_show;
629 634
630 sk_list->fops.owner = module; 635 if (!proc_create_data(name, 0, net->proc_net, &bt_fops, sk_list))
631 sk_list->fops.open = bt_seq_open;
632 sk_list->fops.read = seq_read;
633 sk_list->fops.llseek = seq_lseek;
634 sk_list->fops.release = seq_release_private;
635
636 pde = proc_create(name, 0, net->proc_net, &sk_list->fops);
637 if (!pde)
638 return -ENOMEM; 636 return -ENOMEM;
639
640 pde->data = sk_list;
641
642 return 0; 637 return 0;
643} 638}
644 639
@@ -647,7 +642,7 @@ void bt_procfs_cleanup(struct net *net, const char *name)
647 remove_proc_entry(name, net->proc_net); 642 remove_proc_entry(name, net->proc_net);
648} 643}
649#else 644#else
650int bt_procfs_init(struct module* module, struct net *net, const char *name, 645int bt_procfs_init(struct net *net, const char *name,
651 struct bt_sock_list* sk_list, 646 struct bt_sock_list* sk_list,
652 int (* seq_show)(struct seq_file *, void *)) 647 int (* seq_show)(struct seq_file *, void *))
653{ 648{
diff --git a/net/bluetooth/bnep/sock.c b/net/bluetooth/bnep/sock.c
index 5b1c04e28821..5f051290daba 100644
--- a/net/bluetooth/bnep/sock.c
+++ b/net/bluetooth/bnep/sock.c
@@ -234,7 +234,7 @@ int __init bnep_sock_init(void)
234 goto error; 234 goto error;
235 } 235 }
236 236
237 err = bt_procfs_init(THIS_MODULE, &init_net, "bnep", &bnep_sk_list, NULL); 237 err = bt_procfs_init(&init_net, "bnep", &bnep_sk_list, NULL);
238 if (err < 0) { 238 if (err < 0) {
239 BT_ERR("Failed to create BNEP proc file"); 239 BT_ERR("Failed to create BNEP proc file");
240 bt_sock_unregister(BTPROTO_BNEP); 240 bt_sock_unregister(BTPROTO_BNEP);
diff --git a/net/bluetooth/cmtp/capi.c b/net/bluetooth/cmtp/capi.c
index a4a9d4b6816c..cd75e4d64b90 100644
--- a/net/bluetooth/cmtp/capi.c
+++ b/net/bluetooth/cmtp/capi.c
@@ -539,7 +539,7 @@ static int cmtp_proc_show(struct seq_file *m, void *v)
539 539
540static int cmtp_proc_open(struct inode *inode, struct file *file) 540static int cmtp_proc_open(struct inode *inode, struct file *file)
541{ 541{
542 return single_open(file, cmtp_proc_show, PDE(inode)->data); 542 return single_open(file, cmtp_proc_show, PDE_DATA(inode));
543} 543}
544 544
545static const struct file_operations cmtp_proc_fops = { 545static const struct file_operations cmtp_proc_fops = {
diff --git a/net/bluetooth/cmtp/sock.c b/net/bluetooth/cmtp/sock.c
index 58d9edebab4b..d82787d417bd 100644
--- a/net/bluetooth/cmtp/sock.c
+++ b/net/bluetooth/cmtp/sock.c
@@ -245,7 +245,7 @@ int cmtp_init_sockets(void)
245 goto error; 245 goto error;
246 } 246 }
247 247
248 err = bt_procfs_init(THIS_MODULE, &init_net, "cmtp", &cmtp_sk_list, NULL); 248 err = bt_procfs_init(&init_net, "cmtp", &cmtp_sk_list, NULL);
249 if (err < 0) { 249 if (err < 0) {
250 BT_ERR("Failed to create CMTP proc file"); 250 BT_ERR("Failed to create CMTP proc file");
251 bt_sock_unregister(BTPROTO_HIDP); 251 bt_sock_unregister(BTPROTO_HIDP);
diff --git a/net/bluetooth/hci_sock.c b/net/bluetooth/hci_sock.c
index aa4354fca77c..9bd7d959e384 100644
--- a/net/bluetooth/hci_sock.c
+++ b/net/bluetooth/hci_sock.c
@@ -1107,7 +1107,7 @@ int __init hci_sock_init(void)
1107 goto error; 1107 goto error;
1108 } 1108 }
1109 1109
1110 err = bt_procfs_init(THIS_MODULE, &init_net, "hci", &hci_sk_list, NULL); 1110 err = bt_procfs_init(&init_net, "hci", &hci_sk_list, NULL);
1111 if (err < 0) { 1111 if (err < 0) {
1112 BT_ERR("Failed to create HCI proc file"); 1112 BT_ERR("Failed to create HCI proc file");
1113 bt_sock_unregister(BTPROTO_HCI); 1113 bt_sock_unregister(BTPROTO_HCI);
diff --git a/net/bluetooth/hidp/sock.c b/net/bluetooth/hidp/sock.c
index 2f4cbb0865ca..cb3fdde1968a 100644
--- a/net/bluetooth/hidp/sock.c
+++ b/net/bluetooth/hidp/sock.c
@@ -275,7 +275,7 @@ int __init hidp_init_sockets(void)
275 goto error; 275 goto error;
276 } 276 }
277 277
278 err = bt_procfs_init(THIS_MODULE, &init_net, "hidp", &hidp_sk_list, NULL); 278 err = bt_procfs_init(&init_net, "hidp", &hidp_sk_list, NULL);
279 if (err < 0) { 279 if (err < 0) {
280 BT_ERR("Failed to create HIDP proc file"); 280 BT_ERR("Failed to create HIDP proc file");
281 bt_sock_unregister(BTPROTO_HIDP); 281 bt_sock_unregister(BTPROTO_HIDP);
diff --git a/net/bluetooth/l2cap_sock.c b/net/bluetooth/l2cap_sock.c
index 141e7b058b7e..36fed40c162c 100644
--- a/net/bluetooth/l2cap_sock.c
+++ b/net/bluetooth/l2cap_sock.c
@@ -1298,7 +1298,7 @@ int __init l2cap_init_sockets(void)
1298 goto error; 1298 goto error;
1299 } 1299 }
1300 1300
1301 err = bt_procfs_init(THIS_MODULE, &init_net, "l2cap", &l2cap_sk_list, 1301 err = bt_procfs_init(&init_net, "l2cap", &l2cap_sk_list,
1302 NULL); 1302 NULL);
1303 if (err < 0) { 1303 if (err < 0) {
1304 BT_ERR("Failed to create L2CAP proc file"); 1304 BT_ERR("Failed to create L2CAP proc file");
diff --git a/net/bluetooth/rfcomm/sock.c b/net/bluetooth/rfcomm/sock.c
index a8638b58c4bf..30b3721dc6d7 100644
--- a/net/bluetooth/rfcomm/sock.c
+++ b/net/bluetooth/rfcomm/sock.c
@@ -1037,7 +1037,7 @@ int __init rfcomm_init_sockets(void)
1037 goto error; 1037 goto error;
1038 } 1038 }
1039 1039
1040 err = bt_procfs_init(THIS_MODULE, &init_net, "rfcomm", &rfcomm_sk_list, NULL); 1040 err = bt_procfs_init(&init_net, "rfcomm", &rfcomm_sk_list, NULL);
1041 if (err < 0) { 1041 if (err < 0) {
1042 BT_ERR("Failed to create RFCOMM proc file"); 1042 BT_ERR("Failed to create RFCOMM proc file");
1043 bt_sock_unregister(BTPROTO_RFCOMM); 1043 bt_sock_unregister(BTPROTO_RFCOMM);
diff --git a/net/bluetooth/sco.c b/net/bluetooth/sco.c
index 373d81e6e8f0..e7bd4eea575c 100644
--- a/net/bluetooth/sco.c
+++ b/net/bluetooth/sco.c
@@ -1119,7 +1119,7 @@ int __init sco_init(void)
1119 goto error; 1119 goto error;
1120 } 1120 }
1121 1121
1122 err = bt_procfs_init(THIS_MODULE, &init_net, "sco", &sco_sk_list, NULL); 1122 err = bt_procfs_init(&init_net, "sco", &sco_sk_list, NULL);
1123 if (err < 0) { 1123 if (err < 0) {
1124 BT_ERR("Failed to create SCO proc file"); 1124 BT_ERR("Failed to create SCO proc file");
1125 bt_sock_unregister(BTPROTO_SCO); 1125 bt_sock_unregister(BTPROTO_SCO);
diff --git a/net/can/bcm.c b/net/can/bcm.c
index 5dcb20076f39..8f113e6ff327 100644
--- a/net/can/bcm.c
+++ b/net/can/bcm.c
@@ -226,7 +226,7 @@ static int bcm_proc_show(struct seq_file *m, void *v)
226 226
227static int bcm_proc_open(struct inode *inode, struct file *file) 227static int bcm_proc_open(struct inode *inode, struct file *file)
228{ 228{
229 return single_open(file, bcm_proc_show, PDE(inode)->data); 229 return single_open(file, bcm_proc_show, PDE_DATA(inode));
230} 230}
231 231
232static const struct file_operations bcm_proc_fops = { 232static const struct file_operations bcm_proc_fops = {
diff --git a/net/can/proc.c b/net/can/proc.c
index 1ab8c888f102..b543470c8f8b 100644
--- a/net/can/proc.c
+++ b/net/can/proc.c
@@ -378,7 +378,7 @@ static int can_rcvlist_proc_show(struct seq_file *m, void *v)
378 378
379static int can_rcvlist_proc_open(struct inode *inode, struct file *file) 379static int can_rcvlist_proc_open(struct inode *inode, struct file *file)
380{ 380{
381 return single_open(file, can_rcvlist_proc_show, PDE(inode)->data); 381 return single_open(file, can_rcvlist_proc_show, PDE_DATA(inode));
382} 382}
383 383
384static const struct file_operations can_rcvlist_proc_fops = { 384static const struct file_operations can_rcvlist_proc_fops = {
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index 89a3a07d85fb..5c56b217b999 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -2705,7 +2705,7 @@ static int neigh_stat_seq_open(struct inode *inode, struct file *file)
2705 2705
2706 if (!ret) { 2706 if (!ret) {
2707 struct seq_file *sf = file->private_data; 2707 struct seq_file *sf = file->private_data;
2708 sf->private = PDE(inode)->data; 2708 sf->private = PDE_DATA(inode);
2709 } 2709 }
2710 return ret; 2710 return ret;
2711}; 2711};
diff --git a/net/core/net_namespace.c b/net/core/net_namespace.c
index 80e271d9e64b..f97652036754 100644
--- a/net/core/net_namespace.c
+++ b/net/core/net_namespace.c
@@ -10,7 +10,8 @@
10#include <linux/idr.h> 10#include <linux/idr.h>
11#include <linux/rculist.h> 11#include <linux/rculist.h>
12#include <linux/nsproxy.h> 12#include <linux/nsproxy.h>
13#include <linux/proc_fs.h> 13#include <linux/fs.h>
14#include <linux/proc_ns.h>
14#include <linux/file.h> 15#include <linux/file.h>
15#include <linux/export.h> 16#include <linux/export.h>
16#include <linux/user_namespace.h> 17#include <linux/user_namespace.h>
@@ -336,7 +337,7 @@ EXPORT_SYMBOL_GPL(__put_net);
336 337
337struct net *get_net_ns_by_fd(int fd) 338struct net *get_net_ns_by_fd(int fd)
338{ 339{
339 struct proc_inode *ei; 340 struct proc_ns *ei;
340 struct file *file; 341 struct file *file;
341 struct net *net; 342 struct net *net;
342 343
@@ -344,7 +345,7 @@ struct net *get_net_ns_by_fd(int fd)
344 if (IS_ERR(file)) 345 if (IS_ERR(file))
345 return ERR_CAST(file); 346 return ERR_CAST(file);
346 347
347 ei = PROC_I(file_inode(file)); 348 ei = get_proc_ns(file_inode(file));
348 if (ei->ns_ops == &netns_operations) 349 if (ei->ns_ops == &netns_operations)
349 net = get_net(ei->ns); 350 net = get_net(ei->ns);
350 else 351 else
diff --git a/net/core/pktgen.c b/net/core/pktgen.c
index 5c217427a669..11f2704c3810 100644
--- a/net/core/pktgen.c
+++ b/net/core/pktgen.c
@@ -508,7 +508,7 @@ out:
508 508
509static int pgctrl_open(struct inode *inode, struct file *file) 509static int pgctrl_open(struct inode *inode, struct file *file)
510{ 510{
511 return single_open(file, pgctrl_show, PDE(inode)->data); 511 return single_open(file, pgctrl_show, PDE_DATA(inode));
512} 512}
513 513
514static const struct file_operations pktgen_fops = { 514static const struct file_operations pktgen_fops = {
@@ -1685,7 +1685,7 @@ static ssize_t pktgen_if_write(struct file *file,
1685 1685
1686static int pktgen_if_open(struct inode *inode, struct file *file) 1686static int pktgen_if_open(struct inode *inode, struct file *file)
1687{ 1687{
1688 return single_open(file, pktgen_if_show, PDE(inode)->data); 1688 return single_open(file, pktgen_if_show, PDE_DATA(inode));
1689} 1689}
1690 1690
1691static const struct file_operations pktgen_if_fops = { 1691static const struct file_operations pktgen_if_fops = {
@@ -1823,7 +1823,7 @@ out:
1823 1823
1824static int pktgen_thread_open(struct inode *inode, struct file *file) 1824static int pktgen_thread_open(struct inode *inode, struct file *file)
1825{ 1825{
1826 return single_open(file, pktgen_thread_show, PDE(inode)->data); 1826 return single_open(file, pktgen_thread_show, PDE_DATA(inode));
1827} 1827}
1828 1828
1829static const struct file_operations pktgen_thread_fops = { 1829static const struct file_operations pktgen_thread_fops = {
@@ -1904,7 +1904,7 @@ static void pktgen_change_name(const struct pktgen_net *pn, struct net_device *d
1904 if (pkt_dev->odev != dev) 1904 if (pkt_dev->odev != dev)
1905 continue; 1905 continue;
1906 1906
1907 remove_proc_entry(pkt_dev->entry->name, pn->proc_dir); 1907 proc_remove(pkt_dev->entry);
1908 1908
1909 pkt_dev->entry = proc_create_data(dev->name, 0600, 1909 pkt_dev->entry = proc_create_data(dev->name, 0600,
1910 pn->proc_dir, 1910 pn->proc_dir,
@@ -3574,8 +3574,6 @@ static void _rem_dev_from_if_list(struct pktgen_thread *t,
3574static int pktgen_remove_device(struct pktgen_thread *t, 3574static int pktgen_remove_device(struct pktgen_thread *t,
3575 struct pktgen_dev *pkt_dev) 3575 struct pktgen_dev *pkt_dev)
3576{ 3576{
3577 struct pktgen_net *pn = t->net;
3578
3579 pr_debug("remove_device pkt_dev=%p\n", pkt_dev); 3577 pr_debug("remove_device pkt_dev=%p\n", pkt_dev);
3580 3578
3581 if (pkt_dev->running) { 3579 if (pkt_dev->running) {
@@ -3595,7 +3593,7 @@ static int pktgen_remove_device(struct pktgen_thread *t,
3595 _rem_dev_from_if_list(t, pkt_dev); 3593 _rem_dev_from_if_list(t, pkt_dev);
3596 3594
3597 if (pkt_dev->entry) 3595 if (pkt_dev->entry)
3598 remove_proc_entry(pkt_dev->entry->name, pn->proc_dir); 3596 proc_remove(pkt_dev->entry);
3599 3597
3600#ifdef CONFIG_XFRM 3598#ifdef CONFIG_XFRM
3601 free_SAs(pkt_dev); 3599 free_SAs(pkt_dev);
diff --git a/net/ipv4/netfilter/ipt_CLUSTERIP.c b/net/ipv4/netfilter/ipt_CLUSTERIP.c
index 5852b249054f..0b732efd32e2 100644
--- a/net/ipv4/netfilter/ipt_CLUSTERIP.c
+++ b/net/ipv4/netfilter/ipt_CLUSTERIP.c
@@ -105,7 +105,7 @@ clusterip_config_entry_put(struct clusterip_config *c)
105 * functions are also incrementing the refcount on their own, 105 * functions are also incrementing the refcount on their own,
106 * so it's safe to remove the entry even if it's in use. */ 106 * so it's safe to remove the entry even if it's in use. */
107#ifdef CONFIG_PROC_FS 107#ifdef CONFIG_PROC_FS
108 remove_proc_entry(c->pde->name, c->pde->parent); 108 proc_remove(c->pde);
109#endif 109#endif
110 return; 110 return;
111 } 111 }
@@ -631,7 +631,7 @@ static int clusterip_proc_open(struct inode *inode, struct file *file)
631 631
632 if (!ret) { 632 if (!ret) {
633 struct seq_file *sf = file->private_data; 633 struct seq_file *sf = file->private_data;
634 struct clusterip_config *c = PDE(inode)->data; 634 struct clusterip_config *c = PDE_DATA(inode);
635 635
636 sf->private = c; 636 sf->private = c;
637 637
@@ -643,7 +643,7 @@ static int clusterip_proc_open(struct inode *inode, struct file *file)
643 643
644static int clusterip_proc_release(struct inode *inode, struct file *file) 644static int clusterip_proc_release(struct inode *inode, struct file *file)
645{ 645{
646 struct clusterip_config *c = PDE(inode)->data; 646 struct clusterip_config *c = PDE_DATA(inode);
647 int ret; 647 int ret;
648 648
649 ret = seq_release(inode, file); 649 ret = seq_release(inode, file);
@@ -657,7 +657,7 @@ static int clusterip_proc_release(struct inode *inode, struct file *file)
657static ssize_t clusterip_proc_write(struct file *file, const char __user *input, 657static ssize_t clusterip_proc_write(struct file *file, const char __user *input,
658 size_t size, loff_t *ofs) 658 size_t size, loff_t *ofs)
659{ 659{
660 struct clusterip_config *c = PDE(file_inode(file))->data; 660 struct clusterip_config *c = PDE_DATA(file_inode(file));
661#define PROC_WRITELEN 10 661#define PROC_WRITELEN 10
662 char buffer[PROC_WRITELEN+1]; 662 char buffer[PROC_WRITELEN+1];
663 unsigned long nodenum; 663 unsigned long nodenum;
@@ -736,7 +736,7 @@ static void __exit clusterip_tg_exit(void)
736{ 736{
737 pr_info("ClusterIP Version %s unloading\n", CLUSTERIP_VERSION); 737 pr_info("ClusterIP Version %s unloading\n", CLUSTERIP_VERSION);
738#ifdef CONFIG_PROC_FS 738#ifdef CONFIG_PROC_FS
739 remove_proc_entry(clusterip_procdir->name, clusterip_procdir->parent); 739 proc_remove(clusterip_procdir);
740#endif 740#endif
741 nf_unregister_hook(&cip_arp_ops); 741 nf_unregister_hook(&cip_arp_ops);
742 xt_unregister_target(&clusterip_tg_reg); 742 xt_unregister_target(&clusterip_tg_reg);
diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
index d979657b8a12..719652305a29 100644
--- a/net/ipv4/tcp_ipv4.c
+++ b/net/ipv4/tcp_ipv4.c
@@ -2583,7 +2583,7 @@ static void tcp_seq_stop(struct seq_file *seq, void *v)
2583 2583
2584int tcp_seq_open(struct inode *inode, struct file *file) 2584int tcp_seq_open(struct inode *inode, struct file *file)
2585{ 2585{
2586 struct tcp_seq_afinfo *afinfo = PDE(inode)->data; 2586 struct tcp_seq_afinfo *afinfo = PDE_DATA(inode);
2587 struct tcp_iter_state *s; 2587 struct tcp_iter_state *s;
2588 int err; 2588 int err;
2589 2589
diff --git a/net/ipv4/udp.c b/net/ipv4/udp.c
index 3159d16441d0..6abbe6455129 100644
--- a/net/ipv4/udp.c
+++ b/net/ipv4/udp.c
@@ -2100,7 +2100,7 @@ static void udp_seq_stop(struct seq_file *seq, void *v)
2100 2100
2101int udp_seq_open(struct inode *inode, struct file *file) 2101int udp_seq_open(struct inode *inode, struct file *file)
2102{ 2102{
2103 struct udp_seq_afinfo *afinfo = PDE(inode)->data; 2103 struct udp_seq_afinfo *afinfo = PDE_DATA(inode);
2104 struct udp_iter_state *s; 2104 struct udp_iter_state *s;
2105 int err; 2105 int err;
2106 2106
diff --git a/net/ipv6/proc.c b/net/ipv6/proc.c
index 115cc58898f5..f3c1ff4357ff 100644
--- a/net/ipv6/proc.c
+++ b/net/ipv6/proc.c
@@ -251,7 +251,7 @@ static int snmp6_dev_seq_show(struct seq_file *seq, void *v)
251 251
252static int snmp6_dev_seq_open(struct inode *inode, struct file *file) 252static int snmp6_dev_seq_open(struct inode *inode, struct file *file)
253{ 253{
254 return single_open(file, snmp6_dev_seq_show, PDE(inode)->data); 254 return single_open(file, snmp6_dev_seq_show, PDE_DATA(inode));
255} 255}
256 256
257static const struct file_operations snmp6_dev_seq_fops = { 257static const struct file_operations snmp6_dev_seq_fops = {
@@ -291,8 +291,7 @@ int snmp6_unregister_dev(struct inet6_dev *idev)
291 return -ENOENT; 291 return -ENOENT;
292 if (!idev->stats.proc_dir_entry) 292 if (!idev->stats.proc_dir_entry)
293 return -EINVAL; 293 return -EINVAL;
294 remove_proc_entry(idev->stats.proc_dir_entry->name, 294 proc_remove(idev->stats.proc_dir_entry);
295 net->mib.proc_net_devsnmp6);
296 idev->stats.proc_dir_entry = NULL; 295 idev->stats.proc_dir_entry = NULL;
297 return 0; 296 return 0;
298} 297}
diff --git a/net/netfilter/x_tables.c b/net/netfilter/x_tables.c
index 1a73b18683b6..8b03028cca69 100644
--- a/net/netfilter/x_tables.c
+++ b/net/netfilter/x_tables.c
@@ -1000,7 +1000,7 @@ static int xt_table_open(struct inode *inode, struct file *file)
1000 sizeof(struct xt_names_priv)); 1000 sizeof(struct xt_names_priv));
1001 if (!ret) { 1001 if (!ret) {
1002 priv = ((struct seq_file *)file->private_data)->private; 1002 priv = ((struct seq_file *)file->private_data)->private;
1003 priv->af = (unsigned long)PDE(inode)->data; 1003 priv->af = (unsigned long)PDE_DATA(inode);
1004 } 1004 }
1005 return ret; 1005 return ret;
1006} 1006}
@@ -1148,7 +1148,7 @@ static int xt_match_open(struct inode *inode, struct file *file)
1148 1148
1149 seq = file->private_data; 1149 seq = file->private_data;
1150 seq->private = trav; 1150 seq->private = trav;
1151 trav->nfproto = (unsigned long)PDE(inode)->data; 1151 trav->nfproto = (unsigned long)PDE_DATA(inode);
1152 return 0; 1152 return 0;
1153} 1153}
1154 1154
@@ -1212,7 +1212,7 @@ static int xt_target_open(struct inode *inode, struct file *file)
1212 1212
1213 seq = file->private_data; 1213 seq = file->private_data;
1214 seq->private = trav; 1214 seq->private = trav;
1215 trav->nfproto = (unsigned long)PDE(inode)->data; 1215 trav->nfproto = (unsigned long)PDE_DATA(inode);
1216 return 0; 1216 return 0;
1217} 1217}
1218 1218
diff --git a/net/netfilter/xt_hashlimit.c b/net/netfilter/xt_hashlimit.c
index 0199e7bb8f81..9ff035c71403 100644
--- a/net/netfilter/xt_hashlimit.c
+++ b/net/netfilter/xt_hashlimit.c
@@ -108,6 +108,7 @@ struct xt_hashlimit_htable {
108 108
109 /* seq_file stuff */ 109 /* seq_file stuff */
110 struct proc_dir_entry *pde; 110 struct proc_dir_entry *pde;
111 const char *name;
111 struct net *net; 112 struct net *net;
112 113
113 struct hlist_head hash[0]; /* hashtable itself */ 114 struct hlist_head hash[0]; /* hashtable itself */
@@ -254,6 +255,11 @@ static int htable_create(struct net *net, struct xt_hashlimit_mtinfo1 *minfo,
254 hinfo->count = 0; 255 hinfo->count = 0;
255 hinfo->family = family; 256 hinfo->family = family;
256 hinfo->rnd_initialized = false; 257 hinfo->rnd_initialized = false;
258 hinfo->name = kstrdup(minfo->name, GFP_KERNEL);
259 if (!hinfo->name) {
260 vfree(hinfo);
261 return -ENOMEM;
262 }
257 spin_lock_init(&hinfo->lock); 263 spin_lock_init(&hinfo->lock);
258 264
259 hinfo->pde = proc_create_data(minfo->name, 0, 265 hinfo->pde = proc_create_data(minfo->name, 0,
@@ -261,6 +267,7 @@ static int htable_create(struct net *net, struct xt_hashlimit_mtinfo1 *minfo,
261 hashlimit_net->ipt_hashlimit : hashlimit_net->ip6t_hashlimit, 267 hashlimit_net->ipt_hashlimit : hashlimit_net->ip6t_hashlimit,
262 &dl_file_ops, hinfo); 268 &dl_file_ops, hinfo);
263 if (hinfo->pde == NULL) { 269 if (hinfo->pde == NULL) {
270 kfree(hinfo->name);
264 vfree(hinfo); 271 vfree(hinfo);
265 return -ENOMEM; 272 return -ENOMEM;
266 } 273 }
@@ -331,9 +338,10 @@ static void htable_destroy(struct xt_hashlimit_htable *hinfo)
331 parent = hashlimit_net->ip6t_hashlimit; 338 parent = hashlimit_net->ip6t_hashlimit;
332 339
333 if(parent != NULL) 340 if(parent != NULL)
334 remove_proc_entry(hinfo->pde->name, parent); 341 remove_proc_entry(hinfo->name, parent);
335 342
336 htable_selective_cleanup(hinfo, select_all); 343 htable_selective_cleanup(hinfo, select_all);
344 kfree(hinfo->name);
337 vfree(hinfo); 345 vfree(hinfo);
338} 346}
339 347
@@ -345,7 +353,7 @@ static struct xt_hashlimit_htable *htable_find_get(struct net *net,
345 struct xt_hashlimit_htable *hinfo; 353 struct xt_hashlimit_htable *hinfo;
346 354
347 hlist_for_each_entry(hinfo, &hashlimit_net->htables, node) { 355 hlist_for_each_entry(hinfo, &hashlimit_net->htables, node) {
348 if (!strcmp(name, hinfo->pde->name) && 356 if (!strcmp(name, hinfo->name) &&
349 hinfo->family == family) { 357 hinfo->family == family) {
350 hinfo->use++; 358 hinfo->use++;
351 return hinfo; 359 return hinfo;
@@ -842,7 +850,7 @@ static int dl_proc_open(struct inode *inode, struct file *file)
842 850
843 if (!ret) { 851 if (!ret) {
844 struct seq_file *sf = file->private_data; 852 struct seq_file *sf = file->private_data;
845 sf->private = PDE(inode)->data; 853 sf->private = PDE_DATA(inode);
846 } 854 }
847 return ret; 855 return ret;
848} 856}
@@ -888,7 +896,7 @@ static void __net_exit hashlimit_proc_net_exit(struct net *net)
888 pde = hashlimit_net->ip6t_hashlimit; 896 pde = hashlimit_net->ip6t_hashlimit;
889 897
890 hlist_for_each_entry(hinfo, &hashlimit_net->htables, node) 898 hlist_for_each_entry(hinfo, &hashlimit_net->htables, node)
891 remove_proc_entry(hinfo->pde->name, pde); 899 remove_proc_entry(hinfo->name, pde);
892 900
893 hashlimit_net->ipt_hashlimit = NULL; 901 hashlimit_net->ipt_hashlimit = NULL;
894 hashlimit_net->ip6t_hashlimit = NULL; 902 hashlimit_net->ip6t_hashlimit = NULL;
diff --git a/net/netfilter/xt_recent.c b/net/netfilter/xt_recent.c
index d9cad315229d..1e657cf715c4 100644
--- a/net/netfilter/xt_recent.c
+++ b/net/netfilter/xt_recent.c
@@ -401,8 +401,7 @@ static int recent_mt_check(const struct xt_mtchk_param *par,
401 ret = -ENOMEM; 401 ret = -ENOMEM;
402 goto out; 402 goto out;
403 } 403 }
404 pde->uid = uid; 404 proc_set_user(pde, uid, gid);
405 pde->gid = gid;
406#endif 405#endif
407 spin_lock_bh(&recent_lock); 406 spin_lock_bh(&recent_lock);
408 list_add_tail(&t->list, &recent_net->tables); 407 list_add_tail(&t->list, &recent_net->tables);
@@ -525,14 +524,13 @@ static const struct seq_operations recent_seq_ops = {
525 524
526static int recent_seq_open(struct inode *inode, struct file *file) 525static int recent_seq_open(struct inode *inode, struct file *file)
527{ 526{
528 struct proc_dir_entry *pde = PDE(inode);
529 struct recent_iter_state *st; 527 struct recent_iter_state *st;
530 528
531 st = __seq_open_private(file, &recent_seq_ops, sizeof(*st)); 529 st = __seq_open_private(file, &recent_seq_ops, sizeof(*st));
532 if (st == NULL) 530 if (st == NULL)
533 return -ENOMEM; 531 return -ENOMEM;
534 532
535 st->table = pde->data; 533 st->table = PDE_DATA(inode);
536 return 0; 534 return 0;
537} 535}
538 536
@@ -540,8 +538,7 @@ static ssize_t
540recent_mt_proc_write(struct file *file, const char __user *input, 538recent_mt_proc_write(struct file *file, const char __user *input,
541 size_t size, loff_t *loff) 539 size_t size, loff_t *loff)
542{ 540{
543 const struct proc_dir_entry *pde = PDE(file_inode(file)); 541 struct recent_table *t = PDE_DATA(file_inode(file));
544 struct recent_table *t = pde->data;
545 struct recent_entry *e; 542 struct recent_entry *e;
546 char buf[sizeof("+b335:1d35:1e55:dead:c0de:1715:5afe:c0de")]; 543 char buf[sizeof("+b335:1d35:1e55:dead:c0de:1715:5afe:c0de")];
547 const char *c = buf; 544 const char *c = buf;
diff --git a/net/socket.c b/net/socket.c
index 280283f03ccc..b416093997da 100644
--- a/net/socket.c
+++ b/net/socket.c
@@ -1160,15 +1160,6 @@ static int sock_mmap(struct file *file, struct vm_area_struct *vma)
1160 1160
1161static int sock_close(struct inode *inode, struct file *filp) 1161static int sock_close(struct inode *inode, struct file *filp)
1162{ 1162{
1163 /*
1164 * It was possible the inode is NULL we were
1165 * closing an unfinished socket.
1166 */
1167
1168 if (!inode) {
1169 printk(KERN_DEBUG "sock_close: NULL inode\n");
1170 return 0;
1171 }
1172 sock_release(SOCKET_I(inode)); 1163 sock_release(SOCKET_I(inode));
1173 return 0; 1164 return 0;
1174} 1165}
diff --git a/net/sunrpc/cache.c b/net/sunrpc/cache.c
index ce2d180d05a4..f1889be80912 100644
--- a/net/sunrpc/cache.c
+++ b/net/sunrpc/cache.c
@@ -1460,7 +1460,7 @@ static ssize_t write_flush(struct file *file, const char __user *buf,
1460static ssize_t cache_read_procfs(struct file *filp, char __user *buf, 1460static ssize_t cache_read_procfs(struct file *filp, char __user *buf,
1461 size_t count, loff_t *ppos) 1461 size_t count, loff_t *ppos)
1462{ 1462{
1463 struct cache_detail *cd = PDE(file_inode(filp))->data; 1463 struct cache_detail *cd = PDE_DATA(file_inode(filp));
1464 1464
1465 return cache_read(filp, buf, count, ppos, cd); 1465 return cache_read(filp, buf, count, ppos, cd);
1466} 1466}
@@ -1468,14 +1468,14 @@ static ssize_t cache_read_procfs(struct file *filp, char __user *buf,
1468static ssize_t cache_write_procfs(struct file *filp, const char __user *buf, 1468static ssize_t cache_write_procfs(struct file *filp, const char __user *buf,
1469 size_t count, loff_t *ppos) 1469 size_t count, loff_t *ppos)
1470{ 1470{
1471 struct cache_detail *cd = PDE(file_inode(filp))->data; 1471 struct cache_detail *cd = PDE_DATA(file_inode(filp));
1472 1472
1473 return cache_write(filp, buf, count, ppos, cd); 1473 return cache_write(filp, buf, count, ppos, cd);
1474} 1474}
1475 1475
1476static unsigned int cache_poll_procfs(struct file *filp, poll_table *wait) 1476static unsigned int cache_poll_procfs(struct file *filp, poll_table *wait)
1477{ 1477{
1478 struct cache_detail *cd = PDE(file_inode(filp))->data; 1478 struct cache_detail *cd = PDE_DATA(file_inode(filp));
1479 1479
1480 return cache_poll(filp, wait, cd); 1480 return cache_poll(filp, wait, cd);
1481} 1481}
@@ -1484,21 +1484,21 @@ static long cache_ioctl_procfs(struct file *filp,
1484 unsigned int cmd, unsigned long arg) 1484 unsigned int cmd, unsigned long arg)
1485{ 1485{
1486 struct inode *inode = file_inode(filp); 1486 struct inode *inode = file_inode(filp);
1487 struct cache_detail *cd = PDE(inode)->data; 1487 struct cache_detail *cd = PDE_DATA(inode);
1488 1488
1489 return cache_ioctl(inode, filp, cmd, arg, cd); 1489 return cache_ioctl(inode, filp, cmd, arg, cd);
1490} 1490}
1491 1491
1492static int cache_open_procfs(struct inode *inode, struct file *filp) 1492static int cache_open_procfs(struct inode *inode, struct file *filp)
1493{ 1493{
1494 struct cache_detail *cd = PDE(inode)->data; 1494 struct cache_detail *cd = PDE_DATA(inode);
1495 1495
1496 return cache_open(inode, filp, cd); 1496 return cache_open(inode, filp, cd);
1497} 1497}
1498 1498
1499static int cache_release_procfs(struct inode *inode, struct file *filp) 1499static int cache_release_procfs(struct inode *inode, struct file *filp)
1500{ 1500{
1501 struct cache_detail *cd = PDE(inode)->data; 1501 struct cache_detail *cd = PDE_DATA(inode);
1502 1502
1503 return cache_release(inode, filp, cd); 1503 return cache_release(inode, filp, cd);
1504} 1504}
@@ -1516,14 +1516,14 @@ static const struct file_operations cache_file_operations_procfs = {
1516 1516
1517static int content_open_procfs(struct inode *inode, struct file *filp) 1517static int content_open_procfs(struct inode *inode, struct file *filp)
1518{ 1518{
1519 struct cache_detail *cd = PDE(inode)->data; 1519 struct cache_detail *cd = PDE_DATA(inode);
1520 1520
1521 return content_open(inode, filp, cd); 1521 return content_open(inode, filp, cd);
1522} 1522}
1523 1523
1524static int content_release_procfs(struct inode *inode, struct file *filp) 1524static int content_release_procfs(struct inode *inode, struct file *filp)
1525{ 1525{
1526 struct cache_detail *cd = PDE(inode)->data; 1526 struct cache_detail *cd = PDE_DATA(inode);
1527 1527
1528 return content_release(inode, filp, cd); 1528 return content_release(inode, filp, cd);
1529} 1529}
@@ -1537,14 +1537,14 @@ static const struct file_operations content_file_operations_procfs = {
1537 1537
1538static int open_flush_procfs(struct inode *inode, struct file *filp) 1538static int open_flush_procfs(struct inode *inode, struct file *filp)
1539{ 1539{
1540 struct cache_detail *cd = PDE(inode)->data; 1540 struct cache_detail *cd = PDE_DATA(inode);
1541 1541
1542 return open_flush(inode, filp, cd); 1542 return open_flush(inode, filp, cd);
1543} 1543}
1544 1544
1545static int release_flush_procfs(struct inode *inode, struct file *filp) 1545static int release_flush_procfs(struct inode *inode, struct file *filp)
1546{ 1546{
1547 struct cache_detail *cd = PDE(inode)->data; 1547 struct cache_detail *cd = PDE_DATA(inode);
1548 1548
1549 return release_flush(inode, filp, cd); 1549 return release_flush(inode, filp, cd);
1550} 1550}
@@ -1552,7 +1552,7 @@ static int release_flush_procfs(struct inode *inode, struct file *filp)
1552static ssize_t read_flush_procfs(struct file *filp, char __user *buf, 1552static ssize_t read_flush_procfs(struct file *filp, char __user *buf,
1553 size_t count, loff_t *ppos) 1553 size_t count, loff_t *ppos)
1554{ 1554{
1555 struct cache_detail *cd = PDE(file_inode(filp))->data; 1555 struct cache_detail *cd = PDE_DATA(file_inode(filp));
1556 1556
1557 return read_flush(filp, buf, count, ppos, cd); 1557 return read_flush(filp, buf, count, ppos, cd);
1558} 1558}
@@ -1561,7 +1561,7 @@ static ssize_t write_flush_procfs(struct file *filp,
1561 const char __user *buf, 1561 const char __user *buf,
1562 size_t count, loff_t *ppos) 1562 size_t count, loff_t *ppos)
1563{ 1563{
1564 struct cache_detail *cd = PDE(file_inode(filp))->data; 1564 struct cache_detail *cd = PDE_DATA(file_inode(filp));
1565 1565
1566 return write_flush(filp, buf, count, ppos, cd); 1566 return write_flush(filp, buf, count, ppos, cd);
1567} 1567}
diff --git a/net/sunrpc/stats.c b/net/sunrpc/stats.c
index bc2068ee795b..21b75cb08c03 100644
--- a/net/sunrpc/stats.c
+++ b/net/sunrpc/stats.c
@@ -64,7 +64,7 @@ static int rpc_proc_show(struct seq_file *seq, void *v) {
64 64
65static int rpc_proc_open(struct inode *inode, struct file *file) 65static int rpc_proc_open(struct inode *inode, struct file *file)
66{ 66{
67 return single_open(file, rpc_proc_show, PDE(inode)->data); 67 return single_open(file, rpc_proc_show, PDE_DATA(inode));
68} 68}
69 69
70static const struct file_operations rpc_proc_fops = { 70static const struct file_operations rpc_proc_fops = {
diff --git a/net/wireless/lib80211_crypt_ccmp.c b/net/wireless/lib80211_crypt_ccmp.c
index 1526c211db66..dc0e59e53dbf 100644
--- a/net/wireless/lib80211_crypt_ccmp.c
+++ b/net/wireless/lib80211_crypt_ccmp.c
@@ -430,24 +430,23 @@ static int lib80211_ccmp_get_key(void *key, int len, u8 * seq, void *priv)
430 return CCMP_TK_LEN; 430 return CCMP_TK_LEN;
431} 431}
432 432
433static char *lib80211_ccmp_print_stats(char *p, void *priv) 433static void lib80211_ccmp_print_stats(struct seq_file *m, void *priv)
434{ 434{
435 struct lib80211_ccmp_data *ccmp = priv; 435 struct lib80211_ccmp_data *ccmp = priv;
436 436
437 p += sprintf(p, "key[%d] alg=CCMP key_set=%d " 437 seq_printf(m,
438 "tx_pn=%02x%02x%02x%02x%02x%02x " 438 "key[%d] alg=CCMP key_set=%d "
439 "rx_pn=%02x%02x%02x%02x%02x%02x " 439 "tx_pn=%02x%02x%02x%02x%02x%02x "
440 "format_errors=%d replays=%d decrypt_errors=%d\n", 440 "rx_pn=%02x%02x%02x%02x%02x%02x "
441 ccmp->key_idx, ccmp->key_set, 441 "format_errors=%d replays=%d decrypt_errors=%d\n",
442 ccmp->tx_pn[0], ccmp->tx_pn[1], ccmp->tx_pn[2], 442 ccmp->key_idx, ccmp->key_set,
443 ccmp->tx_pn[3], ccmp->tx_pn[4], ccmp->tx_pn[5], 443 ccmp->tx_pn[0], ccmp->tx_pn[1], ccmp->tx_pn[2],
444 ccmp->rx_pn[0], ccmp->rx_pn[1], ccmp->rx_pn[2], 444 ccmp->tx_pn[3], ccmp->tx_pn[4], ccmp->tx_pn[5],
445 ccmp->rx_pn[3], ccmp->rx_pn[4], ccmp->rx_pn[5], 445 ccmp->rx_pn[0], ccmp->rx_pn[1], ccmp->rx_pn[2],
446 ccmp->dot11RSNAStatsCCMPFormatErrors, 446 ccmp->rx_pn[3], ccmp->rx_pn[4], ccmp->rx_pn[5],
447 ccmp->dot11RSNAStatsCCMPReplays, 447 ccmp->dot11RSNAStatsCCMPFormatErrors,
448 ccmp->dot11RSNAStatsCCMPDecryptErrors); 448 ccmp->dot11RSNAStatsCCMPReplays,
449 449 ccmp->dot11RSNAStatsCCMPDecryptErrors);
450 return p;
451} 450}
452 451
453static struct lib80211_crypto_ops lib80211_crypt_ccmp = { 452static struct lib80211_crypto_ops lib80211_crypt_ccmp = {
diff --git a/net/wireless/lib80211_crypt_tkip.c b/net/wireless/lib80211_crypt_tkip.c
index d475cfc8568f..8c90ba79e56e 100644
--- a/net/wireless/lib80211_crypt_tkip.c
+++ b/net/wireless/lib80211_crypt_tkip.c
@@ -703,30 +703,30 @@ static int lib80211_tkip_get_key(void *key, int len, u8 * seq, void *priv)
703 return TKIP_KEY_LEN; 703 return TKIP_KEY_LEN;
704} 704}
705 705
706static char *lib80211_tkip_print_stats(char *p, void *priv) 706static void lib80211_tkip_print_stats(struct seq_file *m, void *priv)
707{ 707{
708 struct lib80211_tkip_data *tkip = priv; 708 struct lib80211_tkip_data *tkip = priv;
709 p += sprintf(p, "key[%d] alg=TKIP key_set=%d " 709 seq_printf(m,
710 "tx_pn=%02x%02x%02x%02x%02x%02x " 710 "key[%d] alg=TKIP key_set=%d "
711 "rx_pn=%02x%02x%02x%02x%02x%02x " 711 "tx_pn=%02x%02x%02x%02x%02x%02x "
712 "replays=%d icv_errors=%d local_mic_failures=%d\n", 712 "rx_pn=%02x%02x%02x%02x%02x%02x "
713 tkip->key_idx, tkip->key_set, 713 "replays=%d icv_errors=%d local_mic_failures=%d\n",
714 (tkip->tx_iv32 >> 24) & 0xff, 714 tkip->key_idx, tkip->key_set,
715 (tkip->tx_iv32 >> 16) & 0xff, 715 (tkip->tx_iv32 >> 24) & 0xff,
716 (tkip->tx_iv32 >> 8) & 0xff, 716 (tkip->tx_iv32 >> 16) & 0xff,
717 tkip->tx_iv32 & 0xff, 717 (tkip->tx_iv32 >> 8) & 0xff,
718 (tkip->tx_iv16 >> 8) & 0xff, 718 tkip->tx_iv32 & 0xff,
719 tkip->tx_iv16 & 0xff, 719 (tkip->tx_iv16 >> 8) & 0xff,
720 (tkip->rx_iv32 >> 24) & 0xff, 720 tkip->tx_iv16 & 0xff,
721 (tkip->rx_iv32 >> 16) & 0xff, 721 (tkip->rx_iv32 >> 24) & 0xff,
722 (tkip->rx_iv32 >> 8) & 0xff, 722 (tkip->rx_iv32 >> 16) & 0xff,
723 tkip->rx_iv32 & 0xff, 723 (tkip->rx_iv32 >> 8) & 0xff,
724 (tkip->rx_iv16 >> 8) & 0xff, 724 tkip->rx_iv32 & 0xff,
725 tkip->rx_iv16 & 0xff, 725 (tkip->rx_iv16 >> 8) & 0xff,
726 tkip->dot11RSNAStatsTKIPReplays, 726 tkip->rx_iv16 & 0xff,
727 tkip->dot11RSNAStatsTKIPICVErrors, 727 tkip->dot11RSNAStatsTKIPReplays,
728 tkip->dot11RSNAStatsTKIPLocalMICFailures); 728 tkip->dot11RSNAStatsTKIPICVErrors,
729 return p; 729 tkip->dot11RSNAStatsTKIPLocalMICFailures);
730} 730}
731 731
732static struct lib80211_crypto_ops lib80211_crypt_tkip = { 732static struct lib80211_crypto_ops lib80211_crypt_tkip = {
diff --git a/net/wireless/lib80211_crypt_wep.c b/net/wireless/lib80211_crypt_wep.c
index c1304018fc1c..1c292e4ea7b6 100644
--- a/net/wireless/lib80211_crypt_wep.c
+++ b/net/wireless/lib80211_crypt_wep.c
@@ -253,11 +253,10 @@ static int lib80211_wep_get_key(void *key, int len, u8 * seq, void *priv)
253 return wep->key_len; 253 return wep->key_len;
254} 254}
255 255
256static char *lib80211_wep_print_stats(char *p, void *priv) 256static void lib80211_wep_print_stats(struct seq_file *m, void *priv)
257{ 257{
258 struct lib80211_wep_data *wep = priv; 258 struct lib80211_wep_data *wep = priv;
259 p += sprintf(p, "key[%d] alg=WEP len=%d\n", wep->key_idx, wep->key_len); 259 seq_printf(m, "key[%d] alg=WEP len=%d\n", wep->key_idx, wep->key_len);
260 return p;
261} 260}
262 261
263static struct lib80211_crypto_ops lib80211_crypt_wep = { 262static struct lib80211_crypto_ops lib80211_crypt_wep = {
diff --git a/net/x25/x25_proc.c b/net/x25/x25_proc.c
index 2ffde4631ae2..0917f047f2cf 100644
--- a/net/x25/x25_proc.c
+++ b/net/x25/x25_proc.c
@@ -187,7 +187,6 @@ static int x25_seq_forward_open(struct inode *inode, struct file *file)
187} 187}
188 188
189static const struct file_operations x25_seq_socket_fops = { 189static const struct file_operations x25_seq_socket_fops = {
190 .owner = THIS_MODULE,
191 .open = x25_seq_socket_open, 190 .open = x25_seq_socket_open,
192 .read = seq_read, 191 .read = seq_read,
193 .llseek = seq_lseek, 192 .llseek = seq_lseek,
@@ -195,7 +194,6 @@ static const struct file_operations x25_seq_socket_fops = {
195}; 194};
196 195
197static const struct file_operations x25_seq_route_fops = { 196static const struct file_operations x25_seq_route_fops = {
198 .owner = THIS_MODULE,
199 .open = x25_seq_route_open, 197 .open = x25_seq_route_open,
200 .read = seq_read, 198 .read = seq_read,
201 .llseek = seq_lseek, 199 .llseek = seq_lseek,
@@ -203,55 +201,38 @@ static const struct file_operations x25_seq_route_fops = {
203}; 201};
204 202
205static const struct file_operations x25_seq_forward_fops = { 203static const struct file_operations x25_seq_forward_fops = {
206 .owner = THIS_MODULE,
207 .open = x25_seq_forward_open, 204 .open = x25_seq_forward_open,
208 .read = seq_read, 205 .read = seq_read,
209 .llseek = seq_lseek, 206 .llseek = seq_lseek,
210 .release = seq_release, 207 .release = seq_release,
211}; 208};
212 209
213static struct proc_dir_entry *x25_proc_dir;
214
215int __init x25_proc_init(void) 210int __init x25_proc_init(void)
216{ 211{
217 struct proc_dir_entry *p; 212 if (!proc_mkdir("x25", init_net.proc_net))
218 int rc = -ENOMEM; 213 return -ENOMEM;
219 214
220 x25_proc_dir = proc_mkdir("x25", init_net.proc_net); 215 if (!proc_create("x25/route", S_IRUGO, init_net.proc_net,
221 if (!x25_proc_dir) 216 &x25_seq_route_fops))
222 goto out; 217 goto out;
223 218
224 p = proc_create("route", S_IRUGO, x25_proc_dir, &x25_seq_route_fops); 219 if (!proc_create("x25/socket", S_IRUGO, init_net.proc_net,
225 if (!p) 220 &x25_seq_socket_fops))
226 goto out_route; 221 goto out;
227
228 p = proc_create("socket", S_IRUGO, x25_proc_dir, &x25_seq_socket_fops);
229 if (!p)
230 goto out_socket;
231 222
232 p = proc_create("forward", S_IRUGO, x25_proc_dir, 223 if (!proc_create("x25/forward", S_IRUGO, init_net.proc_net,
233 &x25_seq_forward_fops); 224 &x25_seq_forward_fops))
234 if (!p) 225 goto out;
235 goto out_forward; 226 return 0;
236 rc = 0;
237 227
238out: 228out:
239 return rc; 229 remove_proc_subtree("x25", init_net.proc_net);
240out_forward: 230 return -ENOMEM;
241 remove_proc_entry("socket", x25_proc_dir);
242out_socket:
243 remove_proc_entry("route", x25_proc_dir);
244out_route:
245 remove_proc_entry("x25", init_net.proc_net);
246 goto out;
247} 231}
248 232
249void __exit x25_proc_exit(void) 233void __exit x25_proc_exit(void)
250{ 234{
251 remove_proc_entry("forward", x25_proc_dir); 235 remove_proc_subtree("x25", init_net.proc_net);
252 remove_proc_entry("route", x25_proc_dir);
253 remove_proc_entry("socket", x25_proc_dir);
254 remove_proc_entry("x25", init_net.proc_net);
255} 236}
256 237
257#else /* CONFIG_PROC_FS */ 238#else /* CONFIG_PROC_FS */
diff --git a/security/tomoyo/common.c b/security/tomoyo/common.c
index f89a0333b813..283862aebdc8 100644
--- a/security/tomoyo/common.c
+++ b/security/tomoyo/common.c
@@ -2681,10 +2681,8 @@ out:
2681 * tomoyo_close_control - close() for /sys/kernel/security/tomoyo/ interface. 2681 * tomoyo_close_control - close() for /sys/kernel/security/tomoyo/ interface.
2682 * 2682 *
2683 * @head: Pointer to "struct tomoyo_io_buffer". 2683 * @head: Pointer to "struct tomoyo_io_buffer".
2684 *
2685 * Returns 0.
2686 */ 2684 */
2687int tomoyo_close_control(struct tomoyo_io_buffer *head) 2685void tomoyo_close_control(struct tomoyo_io_buffer *head)
2688{ 2686{
2689 /* 2687 /*
2690 * If the file is /sys/kernel/security/tomoyo/query , decrement the 2688 * If the file is /sys/kernel/security/tomoyo/query , decrement the
@@ -2694,7 +2692,6 @@ int tomoyo_close_control(struct tomoyo_io_buffer *head)
2694 atomic_dec_and_test(&tomoyo_query_observers)) 2692 atomic_dec_and_test(&tomoyo_query_observers))
2695 wake_up_all(&tomoyo_answer_wait); 2693 wake_up_all(&tomoyo_answer_wait);
2696 tomoyo_notify_gc(head, false); 2694 tomoyo_notify_gc(head, false);
2697 return 0;
2698} 2695}
2699 2696
2700/** 2697/**
diff --git a/security/tomoyo/common.h b/security/tomoyo/common.h
index d4f166bc3508..b897d4862016 100644
--- a/security/tomoyo/common.h
+++ b/security/tomoyo/common.h
@@ -958,7 +958,7 @@ const struct tomoyo_path_info *tomoyo_path_matches_group
958(const struct tomoyo_path_info *pathname, const struct tomoyo_group *group); 958(const struct tomoyo_path_info *pathname, const struct tomoyo_group *group);
959int tomoyo_check_open_permission(struct tomoyo_domain_info *domain, 959int tomoyo_check_open_permission(struct tomoyo_domain_info *domain,
960 struct path *path, const int flag); 960 struct path *path, const int flag);
961int tomoyo_close_control(struct tomoyo_io_buffer *head); 961void tomoyo_close_control(struct tomoyo_io_buffer *head);
962int tomoyo_env_perm(struct tomoyo_request_info *r, const char *env); 962int tomoyo_env_perm(struct tomoyo_request_info *r, const char *env);
963int tomoyo_execute_permission(struct tomoyo_request_info *r, 963int tomoyo_execute_permission(struct tomoyo_request_info *r,
964 const struct tomoyo_path_info *filename); 964 const struct tomoyo_path_info *filename);
diff --git a/security/tomoyo/securityfs_if.c b/security/tomoyo/securityfs_if.c
index fcf32783b66b..179a955b319d 100644
--- a/security/tomoyo/securityfs_if.c
+++ b/security/tomoyo/securityfs_if.c
@@ -143,14 +143,13 @@ static int tomoyo_open(struct inode *inode, struct file *file)
143/** 143/**
144 * tomoyo_release - close() for /sys/kernel/security/tomoyo/ interface. 144 * tomoyo_release - close() for /sys/kernel/security/tomoyo/ interface.
145 * 145 *
146 * @inode: Pointer to "struct inode".
147 * @file: Pointer to "struct file". 146 * @file: Pointer to "struct file".
148 * 147 *
149 * Returns 0 on success, negative value otherwise.
150 */ 148 */
151static int tomoyo_release(struct inode *inode, struct file *file) 149static int tomoyo_release(struct inode *inode, struct file *file)
152{ 150{
153 return tomoyo_close_control(file->private_data); 151 tomoyo_close_control(file->private_data);
152 return 0;
154} 153}
155 154
156/** 155/**
diff --git a/sound/core/info.c b/sound/core/info.c
index 5bb97e7d325a..3c9bd6b10a96 100644
--- a/sound/core/info.c
+++ b/sound/core/info.c
@@ -153,13 +153,6 @@ EXPORT_SYMBOL(snd_seq_root);
153struct snd_info_entry *snd_oss_root; 153struct snd_info_entry *snd_oss_root;
154#endif 154#endif
155 155
156static void snd_remove_proc_entry(struct proc_dir_entry *parent,
157 struct proc_dir_entry *de)
158{
159 if (de)
160 remove_proc_entry(de->name, parent);
161}
162
163static loff_t snd_info_entry_llseek(struct file *file, loff_t offset, int orig) 156static loff_t snd_info_entry_llseek(struct file *file, loff_t offset, int orig)
164{ 157{
165 struct snd_info_private_data *data; 158 struct snd_info_private_data *data;
@@ -310,12 +303,10 @@ static int snd_info_entry_open(struct inode *inode, struct file *file)
310 struct snd_info_entry *entry; 303 struct snd_info_entry *entry;
311 struct snd_info_private_data *data; 304 struct snd_info_private_data *data;
312 struct snd_info_buffer *buffer; 305 struct snd_info_buffer *buffer;
313 struct proc_dir_entry *p;
314 int mode, err; 306 int mode, err;
315 307
316 mutex_lock(&info_mutex); 308 mutex_lock(&info_mutex);
317 p = PDE(inode); 309 entry = PDE_DATA(inode);
318 entry = p == NULL ? NULL : (struct snd_info_entry *)p->data;
319 if (entry == NULL || ! entry->p) { 310 if (entry == NULL || ! entry->p) {
320 mutex_unlock(&info_mutex); 311 mutex_unlock(&info_mutex);
321 return -ENODEV; 312 return -ENODEV;
@@ -582,7 +573,7 @@ int __exit snd_info_done(void)
582#ifdef CONFIG_SND_OSSEMUL 573#ifdef CONFIG_SND_OSSEMUL
583 snd_info_free_entry(snd_oss_root); 574 snd_info_free_entry(snd_oss_root);
584#endif 575#endif
585 snd_remove_proc_entry(NULL, snd_proc_root); 576 proc_remove(snd_proc_root);
586 } 577 }
587 return 0; 578 return 0;
588} 579}
@@ -644,7 +635,7 @@ void snd_info_card_id_change(struct snd_card *card)
644{ 635{
645 mutex_lock(&info_mutex); 636 mutex_lock(&info_mutex);
646 if (card->proc_root_link) { 637 if (card->proc_root_link) {
647 snd_remove_proc_entry(snd_proc_root, card->proc_root_link); 638 proc_remove(card->proc_root_link);
648 card->proc_root_link = NULL; 639 card->proc_root_link = NULL;
649 } 640 }
650 if (strcmp(card->id, card->proc_root->name)) 641 if (strcmp(card->id, card->proc_root->name))
@@ -663,10 +654,8 @@ void snd_info_card_disconnect(struct snd_card *card)
663 if (!card) 654 if (!card)
664 return; 655 return;
665 mutex_lock(&info_mutex); 656 mutex_lock(&info_mutex);
666 if (card->proc_root_link) { 657 proc_remove(card->proc_root_link);
667 snd_remove_proc_entry(snd_proc_root, card->proc_root_link); 658 card->proc_root_link = NULL;
668 card->proc_root_link = NULL;
669 }
670 if (card->proc_root) 659 if (card->proc_root)
671 snd_info_disconnect(card->proc_root); 660 snd_info_disconnect(card->proc_root);
672 mutex_unlock(&info_mutex); 661 mutex_unlock(&info_mutex);
@@ -858,7 +847,7 @@ static void snd_info_disconnect(struct snd_info_entry *entry)
858 list_del_init(&entry->list); 847 list_del_init(&entry->list);
859 root = entry->parent == NULL ? snd_proc_root : entry->parent->p; 848 root = entry->parent == NULL ? snd_proc_root : entry->parent->p;
860 snd_BUG_ON(!root); 849 snd_BUG_ON(!root);
861 snd_remove_proc_entry(root, entry->p); 850 proc_remove(entry->p);
862 entry->p = NULL; 851 entry->p = NULL;
863} 852}
864 853
@@ -959,15 +948,21 @@ int snd_info_register(struct snd_info_entry * entry)
959 return -ENXIO; 948 return -ENXIO;
960 root = entry->parent == NULL ? snd_proc_root : entry->parent->p; 949 root = entry->parent == NULL ? snd_proc_root : entry->parent->p;
961 mutex_lock(&info_mutex); 950 mutex_lock(&info_mutex);
962 p = create_proc_entry(entry->name, entry->mode, root); 951 if (S_ISDIR(entry->mode)) {
963 if (!p) { 952 p = proc_mkdir_mode(entry->name, entry->mode, root);
964 mutex_unlock(&info_mutex); 953 if (!p) {
965 return -ENOMEM; 954 mutex_unlock(&info_mutex);
955 return -ENOMEM;
956 }
957 } else {
958 p = proc_create_data(entry->name, entry->mode, root,
959 &snd_info_entry_operations, entry);
960 if (!p) {
961 mutex_unlock(&info_mutex);
962 return -ENOMEM;
963 }
964 proc_set_size(p, entry->size);
966 } 965 }
967 if (!S_ISDIR(entry->mode))
968 p->proc_fops = &snd_info_entry_operations;
969 p->size = entry->size;
970 p->data = entry;
971 entry->p = p; 966 entry->p = p;
972 if (entry->parent) 967 if (entry->parent)
973 list_add_tail(&entry->list, &entry->parent->children); 968 list_add_tail(&entry->list, &entry->parent->children);
diff --git a/sound/oss/dmasound/dmasound_core.c b/sound/oss/dmasound/dmasound_core.c
index c918313c2206..bac43b5b6e95 100644
--- a/sound/oss/dmasound/dmasound_core.c
+++ b/sound/oss/dmasound/dmasound_core.c
@@ -835,7 +835,7 @@ static void sq_reset(void)
835 shared_resources_initialised = 0 ; 835 shared_resources_initialised = 0 ;
836} 836}
837 837
838static int sq_fsync(struct file *filp, struct dentry *dentry) 838static int sq_fsync(void)
839{ 839{
840 int rc = 0; 840 int rc = 0;
841 int timeout = 5; 841 int timeout = 5;
@@ -874,7 +874,7 @@ static int sq_release(struct inode *inode, struct file *file)
874 874
875 if (file->f_mode & FMODE_WRITE) { 875 if (file->f_mode & FMODE_WRITE) {
876 if (write_sq.busy) 876 if (write_sq.busy)
877 rc = sq_fsync(file, file->f_path.dentry); 877 rc = sq_fsync();
878 878
879 sq_reset_output() ; /* make sure dma is stopped and all is quiet */ 879 sq_reset_output() ; /* make sure dma is stopped and all is quiet */
880 write_sq_release_buffers(); 880 write_sq_release_buffers();
@@ -1025,7 +1025,7 @@ static int sq_ioctl(struct file *file, u_int cmd, u_long arg)
1025 */ 1025 */
1026 result = 0 ; 1026 result = 0 ;
1027 if (file->f_mode & FMODE_WRITE) { 1027 if (file->f_mode & FMODE_WRITE) {
1028 result = sq_fsync(file, file->f_path.dentry); 1028 result = sq_fsync();
1029 sq_reset_output() ; 1029 sq_reset_output() ;
1030 } 1030 }
1031 /* if we are the shared resource owner then release them */ 1031 /* if we are the shared resource owner then release them */
diff --git a/sound/sound_firmware.c b/sound/sound_firmware.c
index e14903468051..b155137ee312 100644
--- a/sound/sound_firmware.c
+++ b/sound/sound_firmware.c
@@ -1,6 +1,7 @@
1#include <linux/vmalloc.h> 1#include <linux/vmalloc.h>
2#include <linux/module.h> 2#include <linux/module.h>
3#include <linux/fs.h> 3#include <linux/fs.h>
4#include <linux/file.h>
4#include <linux/mm.h> 5#include <linux/mm.h>
5#include <linux/sched.h> 6#include <linux/sched.h>
6#include <asm/uaccess.h> 7#include <asm/uaccess.h>
@@ -23,14 +24,14 @@ static int do_mod_firmware_load(const char *fn, char **fp)
23 if (l <= 0 || l > 131072) 24 if (l <= 0 || l > 131072)
24 { 25 {
25 printk(KERN_INFO "Invalid firmware '%s'\n", fn); 26 printk(KERN_INFO "Invalid firmware '%s'\n", fn);
26 filp_close(filp, NULL); 27 fput(filp);
27 return 0; 28 return 0;
28 } 29 }
29 dp = vmalloc(l); 30 dp = vmalloc(l);
30 if (dp == NULL) 31 if (dp == NULL)
31 { 32 {
32 printk(KERN_INFO "Out of memory loading '%s'.\n", fn); 33 printk(KERN_INFO "Out of memory loading '%s'.\n", fn);
33 filp_close(filp, NULL); 34 fput(filp);
34 return 0; 35 return 0;
35 } 36 }
36 pos = 0; 37 pos = 0;
@@ -38,10 +39,10 @@ static int do_mod_firmware_load(const char *fn, char **fp)
38 { 39 {
39 printk(KERN_INFO "Failed to read '%s'.\n", fn); 40 printk(KERN_INFO "Failed to read '%s'.\n", fn);
40 vfree(dp); 41 vfree(dp);
41 filp_close(filp, NULL); 42 fput(filp);
42 return 0; 43 return 0;
43 } 44 }
44 filp_close(filp, NULL); 45 fput(filp);
45 *fp = dp; 46 *fp = dp;
46 return (int) l; 47 return (int) l;
47} 48}