mkdir include/linux/modules; \
fi
-oldconfig: symlinks
+oldconfig: symlinks scripts/split-include
$(CONFIG_SHELL) scripts/Configure -d arch/$(ARCH)/config.in
+ scripts/split-include include/linux/autoconf.h include/config
-xconfig: symlinks
+xconfig: symlinks scripts/split-include
$(MAKE) -C scripts kconfig.tk
wish -f scripts/kconfig.tk
+ scripts/split-include include/linux/autoconf.h include/config
-menuconfig: include/linux/version.h symlinks
+menuconfig: include/linux/version.h symlinks scripts/split-include
$(MAKE) -C scripts/lxdialog all
$(CONFIG_SHELL) scripts/Menuconfig arch/$(ARCH)/config.in
+ scripts/split-include include/linux/autoconf.h include/config
-config: symlinks
+config: symlinks scripts/split-include
$(CONFIG_SHELL) scripts/Configure arch/$(ARCH)/config.in
+ scripts/split-include include/linux/autoconf.h include/config
linuxsubdirs: dummy
set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i; done
clean: archclean
rm -f kernel/ksyms.lst include/linux/compile.h
- rm -f core `find . -name '*.[oas]' ! -regex '.*lxdialog/.*' -print`
- rm -f core `find . -type f -name 'core' -print`
+ rm -f `find . -name '*.[oas]' ! -regex '.*lxdialog/.*' -print`
+ rm -f `find . -type f -name 'core' -print`
+ rm -f `find . -name '.*.flags' -print`
rm -f vmlinux System.map
rm -f .tmp*
rm -f drivers/char/consolemap_deftbl.c drivers/char/conmakehash
rm -f scripts/lxdialog/*.o scripts/lxdialog/lxdialog
rm -f .menuconfig.log
rm -f include/asm
+ rm -rf include/config
rm -f .depend `find . -name .depend -print`
- rm -f .hdepend scripts/mkdep
+ rm -f .hdepend scripts/mkdep scripts/split-include
rm -f $(TOPDIR)/include/linux/modversions.h
rm -rf $(TOPDIR)/include/linux/modules
rm -rf modules
find . -type f -print | sort | xargs sum > .SUMS
dep-files: scripts/mkdep archdep include/linux/version.h
- scripts/mkdep init/*.c > .tmpdepend
+ scripts/mkdep init/*.c > .depend
scripts/mkdep `find $(FINDHPATH) -follow -name \*.h ! -name modversions.h -print` > .hdepend
set -e; for i in $(SUBDIRS); do $(MAKE) -C $$i fastdep; done
- mv .tmpdepend .depend
MODVERFILE :=
depend dep: dep-files $(MODVERFILE)
+checkconfig:
+ perl -w scripts/checkconfig.pl `find $(FINDHPATH) $(SUBDIRS) -name '*.[hcS]' -print | sort`
+
ifdef CONFIGURATION
..$(CONFIGURATION):
@echo
scripts/mkdep: scripts/mkdep.c
$(HOSTCC) $(HOSTCFLAGS) -o scripts/mkdep scripts/mkdep.c
+
+scripts/split-include: scripts/split-include.c
+ $(HOSTCC) $(HOSTCFLAGS) -o scripts/split-include scripts/split-include.c
#
%.s: %.c
- $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -S $< -o $@
+ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -S $< -o $@
%.i: %.c
- $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -E $< > $@
+ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -E $< > $@
%.o: %.c
- $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -c -o $@ $<
+ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -c -o $@ $<
+ @ ( \
+ echo 'ifeq ($(strip $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@)),$$(strip $$(CFLAGS) $$(EXTRA_CFLAGS) $$(CFLAGS_$@)))' ; \
+ echo 'FILES_FLAGS_UP_TO_DATE += $@' ; \
+ echo 'endif' \
+ ) > .$@.flags
%.o: %.s
$(AS) $(ASFLAGS) $(EXTRA_CFLAGS) -o $@ $<
#
ifdef O_TARGET
ALL_O = $(OX_OBJS) $(O_OBJS)
-$(O_TARGET): $(ALL_O) $(TOPDIR)/include/linux/config.h
+$(O_TARGET): $(ALL_O)
rm -f $@
ifneq "$(strip $(ALL_O))" ""
$(LD) $(EXTRA_LDFLAGS) -r -o $@ $(ALL_O)
else
$(AR) rcs $@
endif
+ @ ( \
+ echo 'ifeq ($(strip $(EXTRA_LDFLAGS) $(ALL_O)),$$(strip $$(EXTRA_LDFLAGS) $$(ALL_O)))' ; \
+ echo 'FILES_FLAGS_UP_TO_DATE += $@' ; \
+ echo 'endif' \
+ ) > .$@.flags
endif # O_TARGET
#
# Rule to compile a set of .o files into one .a file
#
ifdef L_TARGET
-$(L_TARGET): $(LX_OBJS) $(L_OBJS) $(TOPDIR)/include/linux/config.h
+$(L_TARGET): $(LX_OBJS) $(L_OBJS)
rm -f $@
$(AR) $(EXTRA_ARFLAGS) rcs $@ $(LX_OBJS) $(L_OBJS)
+ @ ( \
+ echo 'ifeq ($(strip $(EXTRA_ARFLAGS) $(LX_OBJS) $(L_OBJS)),$$(strip $$(EXTRA_ARFLAGS) $$(LX_OBJS) $$(L_OBJS)))' ; \
+ echo 'FILES_FLAGS_UP_TO_DATE += $@' ; \
+ echo 'endif' \
+ ) > .$@.flags
endif
#
# This make dependencies quickly
#
fastdep: dummy
- $(TOPDIR)/scripts/mkdep *.[chS] > .depend
+ $(TOPDIR)/scripts/mkdep $(wildcard *.[chS] local.h.master) > .depend
ifdef ALL_SUB_DIRS
set -e; for i in $(ALL_SUB_DIRS); do $(MAKE) -C $$i fastdep; done
endif
ifneq "$(strip $(ALL_MOBJS))" ""
echo $(PDWN)
cd $$TOPDIR/modules; for i in $(ALL_MOBJS); do \
- ln -sf ../$(PDWN)/$$i .; done
+ ln -sf ../$(PDWN)/$$i $$i; done
endif
#
ifneq "$(strip $(SYMTAB_OBJS))" ""
$(SYMTAB_OBJS): $(TOPDIR)/include/linux/modversions.h $(SYMTAB_OBJS:.o=.c)
- $(CC) $(CFLAGS) -DEXPORT_SYMTAB -c $(@:.o=.c)
+ $(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -DEXPORT_SYMTAB -c $(@:.o=.c)
+ @ ( \
+ echo 'ifeq ($(strip $(CFLAGS) $(EXTRA_CFLAGS) $(CFLAGS_$@) -DEXPORT_SYMTAB),$$(strip $$(CFLAGS) $$(EXTRA_CFLAGS) $$(CFLAGS_$@) -DEXPORT_SYMTAB))' ; \
+ echo 'FILES_FLAGS_UP_TO_DATE += $@' ; \
+ echo 'endif' \
+ ) > .$@.flags
endif
endif # CONFIG_MODULES
#
-# include dependency files they exist
+# include dependency files if they exist
#
-ifeq (.depend,$(wildcard .depend))
+ifneq ($(wildcard .depend),)
include .depend
endif
-ifeq ($(TOPDIR)/.hdepend,$(wildcard $(TOPDIR)/.hdepend))
+ifneq ($(wildcard $(TOPDIR)/.hdepend),)
include $(TOPDIR)/.hdepend
endif
+
+#
+# Find files whose flags have changed and force recompilation.
+# For safety, this works in the converse direction:
+# every file is forced, except those whose flags are positively up-to-date.
+#
+FILES_FLAGS_UP_TO_DATE :=
+
+FILES_FLAGS_EXIST := $(wildcard .*.flags)
+ifneq ($(FILES_FLAGS_EXIST),)
+include $(FILES_FLAGS_EXIST)
+endif
+
+FILES_FLAGS_CHANGED := $(strip \
+ $(filter-out $(FILES_FLAGS_UP_TO_DATE), \
+ $(O_TARGET) $(O_OBJS) $(OX_OBJS) \
+ $(L_TARGET) $(L_OBJS) $(LX_OBJS) \
+ $(M_OBJS) $(MX_OBJS) \
+ $(MI_OBJS) $(MIX_OBJS) \
+ ))
+
+# A kludge: .S files don't get flag dependencies (yet),
+# because that will involve changing a lot of Makefiles.
+FILES_FLAGS_CHANGED := $(strip \
+ $(filter-out $(patsubst %.S, %.o, $(wildcard *.S)), \
+ $(FILES_FLAGS_CHANGED)))
+
+ifneq ($(FILES_FLAGS_CHANGED),)
+$(FILES_FLAGS_CHANGED): dummy
+endif
endmenu
# Conditionally compile in the Uniform CD-ROM driver
-if [ "$CONFIG_BLK_DEV_IDECD" = "y" -o "$CONFIG_BLK_DEV_SR" = "y" -o "$CONFIG_SBPCD" = "y" -o "$CONFIG_MCD" = "y" -o "$CONFIG_CM206" = "y" -o "$CONFIG_CDU31A" = "y" ]; then
+if [ "$CONFIG_BLK_DEV_IDECD" = "y" -o "$CONFIG_BLK_DEV_SR" = "y" -o "$CONFIG_SBPCD" = "y" -o "$CONFIG_MCD" = "y" -o "$CONFIG_MCDX" = "y" -o "$CONFIG_CM206" = "y" -o "$CONFIG_CDU31A" = "y" ]; then
define_bool CONFIG_CDROM y
else
- if [ "$CONFIG_BLK_DEV_IDECD" = "m" -o "$CONFIG_BLK_DEV_SR" = "m" -o "$CONFIG_SBPCD" = "m" -o "$CONFIG_MCD" = "m" -o "$CONFIG_CM206" = "m" -o "$CONFIG_CDU31A" = "m" ]; then
+ if [ "$CONFIG_BLK_DEV_IDECD" = "m" -o "$CONFIG_BLK_DEV_SR" = "m" -o "$CONFIG_SBPCD" = "m" -o "$CONFIG_MCD" = "m" -o "$CONFIG_MCDX" = "m" -o "$CONFIG_CM206" = "m" -o "$CONFIG_CDU31A" = "m" ]; then
define_bool CONFIG_CDROM m
else
define_bool CONFIG_CDROM n
# CONFIG_NTFS_FS is not set
# CONFIG_SYSV_FS is not set
# CONFIG_AFFS_FS is not set
+# CONFIG_HFS_FS is not set
# CONFIG_ROMFS_FS is not set
CONFIG_AUTOFS_FS=y
# CONFIG_UFS_FS is not set
* unless you have a patch to fix it. I am working on it...)
* -Implement ide_cdrom_select_speed using the generic cdrom interface
* -Fix ide_cdrom_reset so that it works (it does nothing right now)
- *
- * MOSTLY DONE LIST:
- * Query the drive to find what features are available
- * before trying to use them.
+ * -Query the drive to find what features are available before trying to
+ * use them (like trying to close the tray in drives that can't).
*
*
* ----------------------------------
* 4.07 Dec 17, 1997 -- fallback to set pc->stat on "tray open"
* 4.08 Dec 18, 1997 -- spew less noise when tray is empty
* -- fix speed display for ACER 24X, 18X
+ * 4.09 Jan 04, 1998 -- fix handling of the last block so we return
+ * an end of file instead of an I/O error (Gadi)
*
*************************************************************************/
-#define IDECD_VERSION "4.07"
+#define IDECD_VERSION "4.09"
#include <linux/config.h>
#include <linux/module.h>
if (stat) toc->capacity = 0x1fffff;
HWIF(drive)->gd->sizes[drive->select.b.unit << PARTN_BITS]
- = toc->capacity * SECTORS_PER_FRAME;
+ = (toc->capacity * SECTORS_PER_FRAME) >> (BLOCK_SIZE_BITS - 9);
drive->part[0].nr_sects = toc->capacity * SECTORS_PER_FRAME;
/* Remember that we've read this stuff. */
/* linux/drivers/cdrom/cdrom.c.
Copyright (c) 1996, 1997 David A. van Leeuwen.
- Copyright (c) 1997 Erik Andersen (andersee@debian.org)
+ Copyright (c) 1997, 1998 Erik Andersen (andersee@debian.org)
May be copied or modified under the terms of the GNU General Public
License. See linux/COPYING for more information.
#include <asm/uaccess.h>
-#define VERSION "$Id: cdrom.c,v 2.1 1997/12/28 15:11:47 david Exp $"
-#define REVISION "$Revision: 2.1 $"
+#define VERSION "$Id: cdrom.c,v 2.11 1998/01/04 01:11:18 erik Exp $"
+#define REVISION "Revision: 2.11"
#define FM_WRITE 0x2 /* file mode write bit */
-/* When VERBOSE_STATUS_INFO is not defined, the debugging printks don't
- get compiled in */
-#define VERBOSE_STATUS_INFO
-
/* I use an error-log mask to give fine grain control over the type of
error messages dumped to the system logs. The available masks include: */
#define CD_WARNING 0x1
#define CD_DO_IOCTL 0x4
#define CD_OPEN 0x8
#define CD_CLOSE 0x10
+#define CD_COUNT_TRACKS 0x20
+
+/* When VERBOSE_STATUS_INFO is not defined, the debugging printks don't
+ get compiled in at all */
+#define VERBOSE_STATUS_INFO
#define ERRLOGMASK (CD_WARNING)
-/* #define ERRLOGMASK (CD_WARNING|CD_OPEN|CD_CLOSE) */
+/* #define ERRLOGMASK (CD_WARNING|CD_OPEN|CD_COUNT_TRACKS|CD_CLOSE) */
/* #define ERRLOGMASK (CD_WARNING|CD_REG_UNREG|CD_DO_IOCTL|CD_OPEN|CD_CLOSE) */
#ifdef VERBOSE_STATUS_INFO
tracks->cdi=0;
tracks->xa=0;
tracks->error=0;
- cdinfo(CD_OPEN, "entering cdrom_count_tracks\n");
+ cdinfo(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n");
if (!(cdi->ops->capability & CDC_PLAY_AUDIO)) {
tracks->error=CDS_NO_INFO;
return;
tracks->data++;
} else
tracks->audio++;
- cdinfo(CD_OPEN, "track %d: format=%d, ctrl=%d\n",
+ cdinfo(CD_COUNT_TRACKS, "track %d: format=%d, ctrl=%d\n",
i, entry.cdte_format, entry.cdte_ctrl);
}
- cdinfo(CD_OPEN, "disc has %d tracks: %d=audio %d=data %d=Cd-I %d=XA\n",
+ cdinfo(CD_COUNT_TRACKS, "disc has %d tracks: %d=audio %d=data %d=Cd-I %d=XA\n",
header.cdth_trk1, tracks->audio, tracks->data,
tracks->cdi, tracks->xa);
}
return -EINVAL;
}
- return sony_spun_up ? CDS_DISC_OK : CDS_DRIVE_NOT_READY;
+ /*return sony_spun_up ? CDS_DISC_OK : CDS_DRIVE_NOT_READY;*/
+ return sony_spun_up ? CDS_DISC_OK : CDS_TRAY_OPEN;
}
static inline void
volatile int val;
-#if DEBUG
+#if 0*DEBUG
printk("Entering handle_sony_cd_attention\n");
#endif
if (is_attention())
}
num_consecutive_attentions = 0;
-#if DEBUG
+#if 0*DEBUG
printk("Leaving handle_sony_cd_attention at %d\n", __LINE__);
#endif
return(0);
sony_audio_status = CDROM_AUDIO_INVALID;
return do_sony_cd_cmd_chk("EJECT",SONY_EJECT_CMD, NULL, 0, res_reg, &res_size);
- } else
- return 0;
+ } else {
+ if (0 == scd_spinup())
+ sony_spun_up = 1;
+ return 0;
+ }
}
/*
printk("CDU31A: Unable to set XA params: 0x%2.2x\n", res_reg[1]);
}
sony_xa_mode = 1;
-printk("sony_xa_mode is set\n");
}
/* A non-XA disk. Set the parms back if necessary. */
else if (sony_xa_mode)
printk("CDU31A: Unable to reset XA params: 0x%2.2x\n", res_reg[1]);
}
sony_xa_mode = 0;
-printk("sony_xa_mode is reset\n");
}
sony_spun_up = 1;
scd_reset, /* hard reset */
scd_audio_ioctl, /* audio ioctl */
scd_dev_ioctl, /* device-specific ioctl */
- CDC_OPEN_TRAY | CDC_LOCK | CDC_SELECT_SPEED | CDC_MULTI_SESSION |
+ CDC_OPEN_TRAY | CDC_CLOSE_TRAY | CDC_LOCK | CDC_SELECT_SPEED | CDC_MULTI_SESSION |
CDC_MULTI_SESSION | CDC_MCN | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO |
CDC_RESET | CDC_IOCTLS | CDC_DRIVE_STATUS, /* capability */
1, /* number of minor devices */
cdu31a_abort_timer.function = handle_abort_timeout;
scd_info.mask = deficiency;
+ strncpy(scd_info.name, "cdu31a", sizeof(scd_info.name));
if (register_cdrom(&scd_info))
{
#define mcdx_drive_map mcdx
#include "mcdx.h"
-#define MCDX_QUIET 0
-
-
#ifndef HZ
#error HZ not defined
#endif
NULL, /* hard reset */
mcdx_audio_ioctl, /* audio ioctl */
NULL, /* device-specific ioctl */
- CDC_OPEN_TRAY | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO
+ CDC_OPEN_TRAY | CDC_LOCK | CDC_MEDIA_CHANGED | CDC_PLAY_AUDIO
| CDC_DRIVE_STATUS, /* capability */
0, /* number of minor devices */
};
static struct cdrom_subchnl SC;
static struct cdrom_volctrl volctrl;
static struct cdrom_read_audio read_audio;
-static struct cdrom_multisession ms_info;
static unsigned char msgnum=0;
static char msgbuf[80];
}
i=cmd_out();
msg(DBG_LCS,"p_door_closed bit %d after\n", st_door_closed);
+
+ i=cc_ReadError();
+ flags_cmd_out |= f_respo2;
+ cc_ReadStatus(); /* command: give 1-byte status */
+ i=ResponseStatus();
+ if (famT_drive&&(i<0))
+ {
+ cc_DriveReset();
+ i=ResponseStatus();
+#if 0
+ sbp_sleep(HZ);
+#endif 0
+ i=ResponseStatus();
+ }
+ if (i<0)
+ {
+ msg(DBG_INF,"sbpcd cc_CloseTray: ResponseStatus timed out (%d).\n",i);
+ }
+ if (!(famT_drive))
+ {
+ if (!st_spinning)
+ {
+ cc_SpinUp();
+ if (st_check) i=cc_ReadError();
+ flags_cmd_out |= f_respo2;
+ cc_ReadStatus();
+ i=ResponseStatus();
+ } else {
+ }
+ }
+ i=DiskInfo();
return (i);
}
static int sbpcd_tray_move(struct cdrom_device_info *cdi, int position)
{
- return position ? cc_CloseTray() : 0;
+ int i;
+ i = MINOR(cdi->dev);
+
+ switch_drive(i);
+ if (position == 1) {
+ cc_SpinDown();
+ } else {
+ return cc_CloseTray();
+ }
+ return 0;
}
/*==========================================================================*/
if (famLV_drive) D_S[d].CDsize_frm=D_S[d].size_blk+1;
}
D_S[d].diskstate_flags |= toc_bit;
- msg(DBG_TOC,"TocDesc: %02X %02X %02X %08X\n",
+ msg(DBG_TOC,"TocDesc: xa %02X firstt %02X lastt %02X size %08X firstses %02X lastsess %02X\n",
D_S[d].xa_byte,
D_S[d].n_first_track,
D_S[d].n_last_track,
- D_S[d].size_msf);
+ D_S[d].size_msf,
+ D_S[d].first_session,
+ D_S[d].last_session);
return (0);
}
/*==========================================================================*/
msg(DBG_000,"DiskInfo entered.\n");
for (j=1;j<LOOP_COUNT;j++)
{
+#if 0
i=SetSpeed();
if (i<0)
{
msg(DBG_INF,"DiskInfo: cc_ModeSense returns %d\n", i);
continue;
}
+#endif
i=cc_ReadCapacity();
if (i>=0) break;
msg(DBG_INF,"DiskInfo: ReadCapacity #%d returns %d\n", j, i);
+#if 0
i=cc_DriveReset();
+#endif
+ if (!fam0_drive && j == 2) break;
}
if (j==LOOP_COUNT) return (-33); /* give up */
static int sbpcd_drive_status(struct cdrom_device_info *cdi, int slot_nr)
{
- if (CDSL_CURRENT != slot_nr) {
- /* we have no changer support */
- return -EINVAL;
- }
+ int st;
+
+ if (CDSL_CURRENT != slot_nr) {
+ /* we have no changer support */
+ return -EINVAL;
+ }
+
+ cc_ReadStatus();
+ st=ResponseStatus();
+ if (st<0)
+ {
+ msg(DBG_INF,"sbpcd_drive_status: timeout.\n");
+ return (0);
+ }
+ msg(DBG_000,"Drive Status: door_locked =%d.\n", st_door_locked);
+ msg(DBG_000,"Drive Status: door_closed =%d.\n", st_door_closed);
+ msg(DBG_000,"Drive Status: caddy_in =%d.\n", st_caddy_in);
+ msg(DBG_000,"Drive Status: disk_ok =%d.\n", st_diskok);
+ msg(DBG_000,"Drive Status: spinning =%d.\n", st_spinning);
+ msg(DBG_000,"Drive Status: busy =%d.\n", st_busy);
+#if 0
+ if (!(D_S[MINOR(cdi->dev)].status_bits & p_door_closed)) return CDS_TRAY_OPEN;
+ if (D_S[MINOR(cdi->dev)].status_bits & p_disk_ok) return CDS_DISC_OK;
+ if (D_S[MINOR(cdi->dev)].status_bits & p_disk_in) return CDS_DRIVE_NOT_READY;
- return D_S[d].status_bits & p1_disk_ok ? CDS_DISC_OK : CDS_DRIVE_NOT_READY;
+ return CDS_NO_DISC;
+#else
+ if (D_S[MINOR(cdi->dev)].status_bits & p_spinning) return CDS_DISC_OK;
+ return CDS_TRAY_OPEN;
+#endif
}
static int sbpcd_get_last_session(struct cdrom_device_info *cdi, struct cdrom_multisession *ms_infp)
{
ms_infp->addr_format = CDROM_LBA;
- ms_infp->addr.lba = D_S[d].lba_multi;
- if (D_S[d].f_multisession)
+ ms_infp->addr.lba = D_S[MINOR(cdi->dev)].lba_multi;
+ if (D_S[MINOR(cdi->dev)].f_multisession)
ms_infp->xa_flag=1; /* valid redirection address */
else
ms_infp->xa_flag=0; /* invalid redirection address */
- return 1;
+ return 0;
}
/*==========================================================================*/
error_flag=0;
p = D_S[d].aud_buf;
if (sbpro_type==1) OUT(CDo_sel_i_d,1);
- if (do_16bit) insw(CDi_data, p, read_audio.nframes*(CD_FRAMESIZE_RAW>>1));
- else insb(CDi_data, p, read_audio.nframes*CD_FRAMESIZE_RAW);
+ if (do_16bit)
+ {
+ u_short *p2 = (u_short *) p;
+
+ for (; (u_char *) p2 < D_S[d].aud_buf + read_audio.nframes*CD_FRAMESIZE_RAW;)
+ {
+ if ((inb_p(CDi_status)&s_not_data_ready)) continue;
+
+ /* get one sample */
+ *p2++ = inw_p(CDi_data);
+ *p2++ = inw_p(CDi_data);
+ }
+ } else {
+ for (; p < D_S[d].aud_buf + read_audio.nframes*CD_FRAMESIZE_RAW;)
+ {
+ if ((inb_p(CDi_status)&s_not_data_ready)) continue;
+
+ /* get one sample */
+ *p++ = inb_p(CDi_data);
+ *p++ = inb_p(CDi_data);
+ *p++ = inb_p(CDi_data);
+ *p++ = inb_p(CDi_data);
+ }
+ }
if (sbpro_type==1) OUT(CDo_sel_i_d,0);
data_retrying = 0;
}
if(arg > 0xff) RETURN_UP(-EINVAL);
read_ahead[MAJOR(cdi->dev)] = arg;
RETURN_UP(0);
-#if 0
- case CDROMEJECT:
- msg(DBG_IOC,"ioctl: CDROMEJECT entered.\n");
- if (fam0_drive) return (0);
- if (D_S[d].open_count>1) RETURN_UP(-EBUSY);
- i=UnLockDoor();
- D_S[d].open_count=-9; /* to get it locked next time again */
- i=cc_SpinDown();
- msg(DBG_IOX,"ioctl: cc_SpinDown returned %d.\n", i);
- msg(DBG_TEA,"ioctl: cc_SpinDown returned %d.\n", i);
- if (i<0) RETURN_UP(-EIO);
- D_S[d].CD_changed=0xFF;
- D_S[d].diskstate_flags=0;
- D_S[d].audio_state=0;
- RETURN_UP(0);
-
- case CDROMEJECT_SW:
- msg(DBG_IOC,"ioctl: CDROMEJECT_SW entered.\n");
- if (fam0_drive) RETURN_UP(0);
- D_S[d].f_eject=arg;
- RETURN_UP(0);
-#endif
default:
msg(DBG_IOC,"ioctl: unknown function request %04X\n", cmd);
RETURN_UP(-EINVAL);
static int sbpcd_open(struct cdrom_device_info *cdi, int purpose)
{
int i;
-
+
i = MINOR(cdi->dev);
- if ((i<0) || (i>=NR_SBPCD) || (D_S[i].drv_id==-1))
- {
- msg(DBG_INF, "open: bad device: %04X\n", cdi->dev);
- return (-ENXIO); /* no such drive */
- }
-
+
MOD_INC_USE_COUNT;
down(&ioctl_read_sem);
switch_drive(i);
-
- i=cc_ReadError();
- flags_cmd_out |= f_respo2;
- cc_ReadStatus(); /* command: give 1-byte status */
- i=ResponseStatus();
- if (famT_drive&&(i<0))
- {
- cc_DriveReset();
- i=ResponseStatus();
-#if 0
- sbp_sleep(HZ);
-#endif 0
- i=ResponseStatus();
- }
- if (i<0)
- {
- msg(DBG_INF,"sbpcd_open: ResponseStatus timed out (%d).\n",i);
- MOD_DEC_USE_COUNT;
- RETURN_UP(-EIO); /* drive doesn't respond */
- }
- if (famT_drive) msg(DBG_TEA,"sbpcd_open: ResponseStatus=%02X\n", i);
- if (!(famT_drive))
- if (!st_spinning)
- {
- cc_SpinUp();
- flags_cmd_out |= f_respo2;
- cc_ReadStatus();
- i=ResponseStatus();
- }
- if (famT_drive) msg(DBG_TEA,"sbpcd_open: status %02X\n", D_S[d].status_bits);
- if (!st_door_closed||!st_caddy_in)
- {
- msg(DBG_INF, "sbpcd_open: no disk in drive.\n");
- D_S[d].open_count=0;
- MOD_DEC_USE_COUNT;
- RETURN_UP(-ENXIO);
- }
+
/*
* try to keep an "open" counter here and lock the door if 0->1.
*/
/*
*
*/
-#if 0
-static struct file_operations sbpcd_fops =
-{
- NULL, /* lseek - default */
- block_read, /* read - general block-dev read */
- block_write, /* write - general block-dev write */
- NULL, /* readdir - bad */
- NULL, /* poll */
- sbpcd_ioctl, /* ioctl */
- NULL, /* mmap */
- sbpcd_open, /* open */
- sbpcd_release, /* release */
- NULL, /* fsync */
- NULL, /* fasync */
- sbpcd_chk_disk_change, /* media_change */
- NULL /* revalidate */
-};
-#endif
static int sbpcd_media_changed( struct cdrom_device_info *cdi, int disc_nr);
static struct cdrom_device_ops sbpcd_dops = {
sbpcd_open, /* open */
sbpcd_audio_ioctl, /* audio ioctl */
sbpcd_dev_ioctl, /* device-specific ioctl */
CDC_CLOSE_TRAY | CDC_OPEN_TRAY | CDC_LOCK | CDC_MULTI_SESSION |
- CDC_MEDIA_CHANGED | CDC_MCN | CDC_PLAY_AUDIO, /* capability */
+ CDC_MEDIA_CHANGED | CDC_MCN | CDC_PLAY_AUDIO | CDC_IOCTLS, /* capability */
1, /* number of minor devices */
};
int i=0, j=0;
int addr[2]={1, CDROM_PORT};
int port_index;
-
+
sti();
msg(DBG_INF,"sbpcd.c %s\n", VERSION);
check_datarate();
msg(DBG_INI,"check_datarate done.\n");
-#if 0
- if (!famL_drive)
- {
- OUT(CDo_reset,0);
- sbp_sleep(HZ);
- }
-#endif 0
-
for (j=0;j<NR_SBPCD;j++)
{
if (D_S[j].drv_id==-1) continue;
msg(DBG_CHK,"media_check (%d) called\n", MINOR(full_dev));
i=MINOR(full_dev);
- if ( (i<0) || (i>=NR_SBPCD) || (D_S[i].drv_id==-1) )
- {
- msg(DBG_INF, "media_check: invalid device %04X.\n", full_dev);
- return (-1);
- }
if (D_S[i].CD_changed==0xFF)
{
#define JUKEBOX 0
#else
#define JUKEBOX 1
-#endif DISTRIBUTION
+#endif /* DISTRIBUTION */
/* tray control: eject tray after last use */
#if DISTRIBUTION
#define EJECT 0
#else
#define EJECT 1
-#endif DISTRIBUTION
+#endif /* DISTRIBUTION */
/* max. number of audio frames to read with one */
/* request (allocates n* 2352 bytes kernel memory!) */
resume (pr=80) audio playing
Mode Select:
- 84 00 nn-nn ??-?? 00 (0) nn-nn: 2048 or 2340
+ 84 00 nn-nn ??.?? 00 (0) nn-nn: 2048 or 2340
possibly defines transfer size
set_vol: 84 83 00 00 sw le 00. (0) sw(itch): lrxxxxxx (off=1)
seek: 01 02 mm-ss-ff 00 00. (0)
Read Data:
-read: 02 xx-xx-xx nn-nn fl. (??) read nn-nn blocks of 2048 bytes,
+read: 02 xx-xx-xx nn-nn fl. (?) read nn-nn blocks of 2048 bytes,
starting at block xx-xx-xx
fl=0: "lba"-, =2:"msf-bcd"-coded xx-xx-xx
Read XA-Data:
-read: 03 xx-xx-xx nn-nn fl. (??) read nn-nn blocks of 2340 bytes,
+read: 03 xx-xx-xx nn-nn fl. (?) read nn-nn blocks of 2340 bytes,
starting at block xx-xx-xx
fl=0: "lba"-, =2:"msf-bcd"-coded xx-xx-xx
/*==========================================================================*/
/*==========================================================================*/
-#endif _LINUX_SBPCD_H
+#endif /* _LINUX_SBPCD_H */
/*==========================================================================*/
/*
* Overrides for Emacs so that we follow Linus's tabbing style.
M_OBJS = $(O_TARGET)
-include $(TOPDIR)/Rules.make
-
-#
-# sorry, a special rule.
-#
-lzrw3.o: lzrw3.c
- $(CC) $(CFLAGS) -O6 -funroll-all-loops -c $<
+CFLAGS_lzrw3.o := -O6 -funroll-all-loops
+include $(TOPDIR)/Rules.make
# The 8390 drivers share the EI_DEBUG setting.
# General options for Space.c
-OPTS = # -DETH0_ADDR=0x300 -DETH0_IRQ=11
-
-WD_OPTS = #-DWD_SHMEM=0xDD000
-EL2_OPTS = #-DEL2_AUI
-NE_OPTS =
-HP_OPTS =
-PLIP_OPTS =
-DEPCA_OPTS =
-EWRK3_OPTS =
-DE4X5_OPTS =
-DEFXX_OPTS =
-ELP_OPTS =
-TULIP_OPTS =
-CS89x0_OPTS =
+CONFIG_Space.o = # -DETH0_ADDR=0x300 -DETH0_IRQ=11
+CONFIG_3c503.o = # -DEL2_AUI
+CONFIG_wd.o = # -DWD_SHMEM=0xDD000
clean:
rm -f core *.o *.a *.s
-wd.o: wd.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(WD_OPTS) -c $<
-
-3c503.o: 3c503.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(EL2_OPTS) -c $<
-
-3c505.o: 3c505.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(ELP_OPTS) -c $<
-
-de4x5.o: de4x5.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(DE4X5_OPTS) -c $<
-
-ewrk3.o: ewrk3.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(EWRK3_OPTS) -c $<
-
-depca.o: depca.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(DEPCA_OPTS) -c $<
-
-Space.o: Space.c ../../include/linux/autoconf.h CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(OPTS) -c $<
-
-net_init.o: ../../include/linux/autoconf.h
-
-ne.o: ne.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(NE_OPTS) -c $<
-
-hp.o: hp.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(HP_OPTS) -c $<
-
-plip.o: plip.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(PLIP_OPTS) -c $<
-
-slip.o: slip.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) -c $<
-
-strip.o: strip.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) -c $<
-
-dummy.o: dummy.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) -c $<
-
-de600.o: de600.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(DE600_OPTS) -c $<
-
-de620.o: de620.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(DE620_OPTS) -c $<
-
-lance.o: lance.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(LANCE_OPTS) -c $<
-
-8390.o: 8390.c 8390.h CONFIG
-
-sdla.o: sdla.c CONFIG
-
-dlci.o: dlci.c CONFIG
-
-sdladrv.o: sdladrv.c CONFIG
-
wanpipe.o: $(WANPIPE_OBJS)
ld -r -o $@ $(WANPIPE_OBJS)
-
-sdlamain.o: sdlamain.c CONFIG
-
-sdla_x25.o: sdla_x25.c CONFIG
-
-sdla_fr.o: sdla_fr.c CONFIG
-
-sdla_ppp.o: sdla_ppp.c CONFIG
-
-dgrs.o: dgrs.c dgrs.h CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) -c $<
-
-ltpc.o: ltpc.c ltpc.h CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) -c $<
-
-tulip.o: tulip.c CONFIG
- $(CC) $(CPPFLAGS) $(CFLAGS) $(TULIP_OPTS) -c $<
MOD_LIST_NAME := SCSI_MODULES
SCSI_SRCS = $(wildcard $(L_OBJS:%.o=%.c))
-AHA152X = -DDEBUG_AHA152X -DAUTOCONF
-GDTH = #-DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ -DGDTH_STATISTICS
+CFLAGS_aha152x.o = -DDEBUG_AHA152X -DAUTOCONF
+CFLAGS_gdth.o = # -DDEBUG_GDTH=2 -D__SERIAL__ -D__COM2__ -DGDTH_STATISTICS
+CFLAGS_seagate.o = -DARBITRATE -DSLOW_HANDSHAKE -DFAST32 -DPARITY
.SUFFIXES:
.SUFFIXES: .c .o .h .a
include $(TOPDIR)/Rules.make
-BusLogic.o: BusLogic.c FlashPoint.c
+# This gives correct output but uses old-style "excessive compilation".
+# This will be fixed soon (about December 1997 or January 1998).
+BusLogic.o: BusLogic.c FlashPoint.c ../../include/linux/autoconf.h
$(CC) $(CFLAGS) -c BusLogic.c -o BusLogic.O
$(CC) $(CFLAGS) -c FlashPoint.c -o FlashPoint.O
$(LD) -r -o BusLogic.o BusLogic.O FlashPoint.O
rm -f BusLogic.O FlashPoint.O
-aha152x.o: aha152x.c
- $(CC) $(CFLAGS) $(AHA152X) -c aha152x.c
-
-gdth.o: gdth.c gdth.h gdth_proc.c gdth_proc.h
- $(CC) $(CFLAGS) $(GDTH) -c gdth.c
-
-aic7xxx.o: aic7xxx.c aic7xxx_seq.h aic7xxx_reg.h
- $(CC) $(CFLAGS) -c -o $@ aic7xxx.c
-
-seagate.o: seagate.c
- $(CC) $(CFLAGS) -DARBITRATE -DSLOW_HANDSHAKE -DFAST32 -DPARITY -c seagate.c
-
53c8xx_d.h 53c8xx_u.h : 53c7,8xx.scr script_asm.pl
ln -sf 53c7,8xx.scr fake.c
$(CPP) -traditional -DCHIP=810 fake.c | grep -v '^#' | perl script_asm.pl
int val;
if (cmd == SOUND_MIXER_PRIVATE1) {
- if (__get_user(val, (int *)arg))
+ if (get_user(val, (int *)arg))
return -EFAULT;
if (val != 0xffff) {
ad_write(devc, 26, ad_read(devc, 26) | 0x40); /* Mute mono out */
}
val = devc->mixer_output_port;
- return __put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
}
if (((cmd >> 8) & 0xff) == 'M') {
if (_SIOC_DIR(cmd) & _SIOC_WRITE)
switch (cmd & 0xff) {
case SOUND_MIXER_RECSRC:
- if (__get_user(val, (int *)arg))
+ if (get_user(val, (int *)arg))
return -EFAULT;
val = ad1848_set_recmask(devc, val);
- return __put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
default:
- if (__get_user(val, (int *)arg))
+ if (get_user(val, (int *)arg))
return -EFAULT;
val = ad1848_mixer_set(devc, cmd & 0xff, val);
- return __put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
}
else
switch (cmd & 0xff) {
case SOUND_MIXER_RECSRC:
val = devc->recmask;
- return __put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
case SOUND_MIXER_DEVMASK:
val = devc->supported_devices;
- return __put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
case SOUND_MIXER_STEREODEVS:
val = devc->supported_devices;
if (devc->model != MD_C930)
val &= ~(SOUND_MASK_SPEAKER | SOUND_MASK_IMIX);
- return __put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
case SOUND_MIXER_RECMASK:
val = devc->supported_rec_devices;
- return __put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
case SOUND_MIXER_CAPS:
- return __put_user(SOUND_CAP_EXCL_INPUT, (int *)arg);
+ return put_user(SOUND_CAP_EXCL_INPUT, (int *)arg);
default:
val = ad1848_mixer_get(devc, cmd & 0xff);
- return __put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
}
} else
return -EINVAL;
int gus_default_mixer_ioctl(int dev, unsigned int cmd, caddr_t arg)
{
- int vol, voice, val;
-
- if (((cmd >> 8) & 0xff) == 'M') {
- if (_SIOC_DIR(cmd) & _SIOC_WRITE)
- switch (cmd & 0xff) {
- case SOUND_MIXER_RECSRC:
- if (__get_user(gus_recmask, (int *)arg))
- return -EFAULT;
- gus_recmask &= MIX_DEVS;
- if (!(gus_recmask & (SOUND_MASK_MIC | SOUND_MASK_LINE)))
- gus_recmask = SOUND_MASK_MIC;
- /* Note! Input volumes are updated during next open for recording */
- return __put_user(gus_recmask, (int *)arg);
-
- case SOUND_MIXER_MIC:
- if (__get_user(vol, (int *)arg))
- return -EFAULT;
- vol &= 0xff;
- if (vol < 0)
- vol = 0;
- if (vol > 100)
- vol = 100;
- gus_mic_vol = vol;
- set_input_volumes();
- vol |= (vol << 8);
- return __put_user(vol, (int *)arg);
+ int vol, val;
+
+ if (((cmd >> 8) & 0xff) != 'M')
+ return -EINVAL;
+
+ if (!access_ok(VERIFY_WRITE, (int *)arg, sizeof(int)))
+ return -EFAULT;
+
+ if (_SIOC_DIR(cmd) & _SIOC_WRITE) {
+ if (__get_user(val, (int *) arg))
+ return -EFAULT;
+
+ switch (cmd & 0xff) {
+ case SOUND_MIXER_RECSRC:
+ gus_recmask = val & MIX_DEVS;
+ if (!(gus_recmask & (SOUND_MASK_MIC | SOUND_MASK_LINE)))
+ gus_recmask = SOUND_MASK_MIC;
+ /* Note! Input volumes are updated during next open for recording */
+ val = gus_recmask;
+ break;
+
+ case SOUND_MIXER_MIC:
+ vol = val & 0xff;
+ if (vol < 0)
+ vol = 0;
+ if (vol > 100)
+ vol = 100;
+ gus_mic_vol = vol;
+ set_input_volumes();
+ vol |= (vol << 8);
+ val = vol;
+ break;
- case SOUND_MIXER_LINE:
- if (__get_user(vol, (int *)arg))
- return -EFAULT;
- vol &= 0xff;
- if (vol < 0)
- vol = 0;
- if (vol > 100)
- vol = 100;
- gus_line_vol = vol;
- set_input_volumes();
- vol |= (vol << 8);
- return __put_user(vol, (int *)arg);
-
- case SOUND_MIXER_PCM:
- if (__get_user(gus_pcm_volume, (int *)arg))
- return -EFAULT;
- gus_pcm_volume &= 0xff;
- if (gus_pcm_volume < 0)
- gus_pcm_volume = 0;
- if (gus_pcm_volume > 100)
- gus_pcm_volume = 100;
- gus_audio_update_volume();
- gus_pcm_volume |= (gus_pcm_volume << 8);
- return __put_user(gus_pcm_volume, (int *)arg);
-
- case SOUND_MIXER_SYNTH:
- if (__get_user(gus_wave_volume, (int *)arg))
- return -EFAULT;
- gus_wave_volume &= 0xff;
- if (gus_wave_volume < 0)
- gus_wave_volume = 0;
- if (gus_wave_volume > 100)
- gus_wave_volume = 100;
- if (active_device == GUS_DEV_WAVE)
- for (voice = 0; voice < nr_voices; voice++)
- dynamic_volume_change(voice); /* Apply the new vol */
- gus_wave_volume |= (gus_wave_volume << 8);
- return __put_user(gus_wave_volume, (int *)arg);
-
- default:
- return -EINVAL;
- } else
- switch (cmd & 0xff) {
- /*
- * Return parameters
- */
- case SOUND_MIXER_RECSRC:
- return __put_user(gus_recmask, (int *)arg);
+ case SOUND_MIXER_LINE:
+ vol = val & 0xff;
+ if (vol < 0)
+ vol = 0;
+ if (vol > 100)
+ vol = 100;
+ gus_line_vol = vol;
+ set_input_volumes();
+ vol |= (vol << 8);
+ val = vol;
+ break;
+
+ case SOUND_MIXER_PCM:
+ gus_pcm_volume = val & 0xff;
+ if (gus_pcm_volume < 0)
+ gus_pcm_volume = 0;
+ if (gus_pcm_volume > 100)
+ gus_pcm_volume = 100;
+ gus_audio_update_volume();
+ gus_pcm_volume |= (gus_pcm_volume << 8);
+ val = gus_pcm_volume;
+ break;
+
+ case SOUND_MIXER_SYNTH:
+ gus_wave_volume = val & 0xff;
+ if (gus_wave_volume < 0)
+ gus_wave_volume = 0;
+ if (gus_wave_volume > 100)
+ gus_wave_volume = 100;
+ if (active_device == GUS_DEV_WAVE) {
+ int voice;
+ for (voice = 0; voice < nr_voices; voice++)
+ dynamic_volume_change(voice); /* Apply the new vol */
+ }
+ gus_wave_volume |= (gus_wave_volume << 8);
+ val = gus_wave_volume;
+ break;
+
+ default:
+ return -EINVAL;
+ }
+
+ } else {
+ switch (cmd & 0xff) {
+ /*
+ * Return parameters
+ */
+ case SOUND_MIXER_RECSRC:
+ val = gus_recmask;
+ break;
- case SOUND_MIXER_DEVMASK:
- return __put_user(MIX_DEVS, (int *)arg);
+ case SOUND_MIXER_DEVMASK:
+ val = MIX_DEVS;
+ break;
- case SOUND_MIXER_STEREODEVS:
- return __put_user(0, (int *)arg);
+ case SOUND_MIXER_STEREODEVS:
+ val = 0;
+ break;
- case SOUND_MIXER_RECMASK:
- val = SOUND_MASK_MIC | SOUND_MASK_LINE;
- return __put_user(val, (int *)arg);
+ case SOUND_MIXER_RECMASK:
+ val = SOUND_MASK_MIC | SOUND_MASK_LINE;
+ break;
- case SOUND_MIXER_CAPS:
- return __put_user(0, (int *)arg);
+ case SOUND_MIXER_CAPS:
+ val = 0;
+ break;
- case SOUND_MIXER_MIC:
- val = gus_mic_vol | (gus_mic_vol << 8);
- return __put_user(val, (int *)arg);
+ case SOUND_MIXER_MIC:
+ val = gus_mic_vol | (gus_mic_vol << 8);
+ break;
- case SOUND_MIXER_LINE:
- val = gus_line_vol | (gus_line_vol << 8);
- return __put_user(val, (int *)arg);
+ case SOUND_MIXER_LINE:
+ val = gus_line_vol | (gus_line_vol << 8);
+ break;
- case SOUND_MIXER_PCM:
- val = gus_pcm_volume | (gus_pcm_volume << 8);
- return __put_user(val, (int *)arg);
+ case SOUND_MIXER_PCM:
+ val = gus_pcm_volume | (gus_pcm_volume << 8);
+ break;
- case SOUND_MIXER_SYNTH:
- return __put_user(gus_wave_volume | (gus_wave_volume << 8), (int *)arg);
+ case SOUND_MIXER_SYNTH:
+ val = gus_wave_volume | (gus_wave_volume << 8);
+ break;
- default:
- return -EINVAL;
- }
- } else
- return -EINVAL;
+ default:
+ return -EINVAL;
+ }
+ }
+
+ return __put_user(val, (int *)arg);
}
static struct mixer_operations gus_mixer_operations =
if (((cmd >> 8) & 0xff) == 'M') {
if (_SIOC_DIR(cmd) & _SIOC_WRITE) {
- if (__get_user(val, (int *)arg))
+ if (get_user(val, (int *)arg))
return -EFAULT;
switch (cmd & 0xff) {
case SOUND_MIXER_RECSRC:
default:
return -EINVAL;
}
- return __put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
} else {
switch (cmd & 0xff) {
/*
default:
return -EINVAL;
}
- return __put_user(val, (int *)arg);
+ return put_user(val, (int *)arg);
}
}
return -EINVAL;
TOPDIR=/usr/src/linux
endif
-.c.o:
- $(CC) $(CFLAGS) -c $<
-
lowlevel.o: $(OBJS)
$(LD) -r -o lowlevel.o $(OBJS)
extern void sound_free_dma(int chn);
extern void sound_close_dma(int chn);
-extern void reporgram_timer(void);
+extern void reprogram_timer(void);
#define RUNTIME_DMA_ALLOC
#define USE_AUTOINIT_DMA
DEB(printk("pas2_mixer.c: int pas_mixer_ioctl(unsigned int cmd = %X, unsigned int arg = %X)\n", cmd, arg));
if (cmd == SOUND_MIXER_PRIVATE1) { /* Set loudness bit */
- if (__get_user(level, (int *)arg))
+ if (get_user(level, (int *)arg))
return -EFAULT;
if (level == -1) /* Return current settings */
level = (mode_control & 0x04);
set_mode(mode_control);
}
level = !!level;
- return __put_user(level, (int *)arg);
+ return put_user(level, (int *)arg);
}
if (cmd == SOUND_MIXER_PRIVATE2) { /* Set enhance bit */
- if (__get_user(level, (int *)arg))
+ if (get_user(level, (int *)arg))
return -EFAULT;
if (level == -1) { /* Return current settings */
if (!(mode_control & 0x03))
i = (i + 1) * 20;
level = i;
}
- return __put_user(level, (int *)arg);
+ return put_user(level, (int *)arg);
}
if (cmd == SOUND_MIXER_PRIVATE3) { /* Set mute bit */
- if (__get_user(level, (int *)arg))
+ if (get_user(level, (int *)arg))
return -EFAULT;
if (level == -1) /* Return current settings */
level = !(pas_read(0x0B8A) & 0x20);
level = !(pas_read(0x0B8A) & 0x20);
}
- return __put_user(level, (int *)arg);
+ return put_user(level, (int *)arg);
}
if (((cmd >> 8) & 0xff) == 'M') {
- if (__get_user(v, (int *)arg))
+ if (get_user(v, (int *)arg))
return -EFAULT;
if (_SIOC_DIR(cmd) & _SIOC_WRITE) {
v = pas_mixer_set(cmd & 0xff, v);
break;
}
}
- return __put_user(v, (int *)arg);
+ return put_user(v, (int *)arg);
}
return -EINVAL;
}
* Use ioctl(fd, SOUND_MIXER_PRIVATE1, &mode) to turn AGC off (0) or on (1).
*/
if (cmd == SOUND_MIXER_PRIVATE1 && devc->model == MDL_SB16) {
- if (__get_user(val, (int *)arg))
+ if (get_user(val, (int *)arg))
return -EFAULT;
sb_setmixer(devc, 0x43, (~val) & 0x01);
return 0;
}
if (((cmd >> 8) & 0xff) == 'M') {
if (_SIOC_DIR(cmd) & _SIOC_WRITE) {
- if (__get_user(val, (int *)arg))
+ if (get_user(val, (int *)arg))
return -EFAULT;
switch (cmd & 0xff) {
case SOUND_MIXER_RECSRC:
ret = sb_mixer_get(devc, cmd & 0xff);
break;
}
- return __put_user(ret, (int *)arg);
+ return put_user(ret, (int *)arg);
} else
return -EINVAL;
}
M_OBJS := $(O_TARGET)
# If you want debugging output, please uncomment the following line
-
# EXTRA_CFLAGS += -DDEBUG_NCP=1
-include $(TOPDIR)/Rules.make
+CFLAGS_ncplib_kernel.o := -finline-functions
-ncplib_kernel.o: ncplib_kernel.c ncplib_kernel.h
- $(CC) $(CFLAGS) $(EXTRA_CFLAGS) -finline-functions -c -o $@ $<
+include $(TOPDIR)/Rules.make
return result;
}
+/*
+ * This pretty-prints the pathname of a dentry,
+ * clarifying sockets etc.
+ */
+static int do_proc_readlink(struct dentry *dentry, char * buffer, int buflen)
+{
+ struct inode * inode;
+ char * tmp = (char*)__get_free_page(GFP_KERNEL), *path, *pattern;
+ int len;
+
+ /* Check for special dentries.. */
+ pattern = NULL;
+ inode = dentry->d_inode;
+ if (inode && dentry->d_parent == dentry) {
+ if (inode->i_sock)
+ pattern = "socket:[%lu]";
+ if (inode->i_pipe)
+ pattern = "pipe:[%lu]";
+ }
+
+ if (pattern) {
+ len = sprintf(tmp, pattern, inode->i_ino);
+ path = tmp;
+ } else {
+ path = d_path(dentry, tmp, PAGE_SIZE);
+ len = tmp + PAGE_SIZE - path;
+ }
+
+ if (len < buflen)
+ buflen = len;
+ dput(dentry);
+ copy_to_user(buffer, path, buflen);
+ free_page((unsigned long)tmp);
+ return buflen;
+}
+
static int proc_readlink(struct dentry * dentry, char * buffer, int buflen)
{
int error;
if (!IS_ERR(dentry)) {
error = -ENOENT;
if (dentry) {
- char * tmp = (char*)__get_free_page(GFP_KERNEL), *path;
- int len;
-
- path = d_path(dentry, tmp, PAGE_SIZE);
- len = tmp + PAGE_SIZE - path;
-
- if (len < buflen)
- buflen = len;
- dput(dentry);
- copy_to_user(buffer, path, buflen);
- free_page((unsigned long)tmp);
- error = buflen;
+ error = do_proc_readlink(dentry, buffer, buflen);
}
}
return error;
* Copyright (C) 1992 David Giller, rafetmad@oxy.edu
* 1994, 1995 Eberhard Moenkeberg, emoenke@gwdg.de
* 1996 David van Leeuwen, david@tm.tno.nl
- * 1997 Erik Andersen, andersee@debian.org
+ * 1997, 1998 Erik Andersen, andersee@debian.org
*/
#ifndef _LINUX_CDROM_H
extern int unregister_cdrom(struct cdrom_device_info *cdi);
#endif /* End of kernel only stuff */
-#endif _LINUX_CDROM_H
+#endif /* _LINUX_CDROM_H */
#include <linux/autoconf.h>
-/*
- * Defines for what uname() should return
- */
-#ifndef UTS_SYSNAME
-#define UTS_SYSNAME "Linux"
-#endif
-
-#ifndef UTS_MACHINE
-#define UTS_MACHINE "unknown"
-#endif
-
-#ifndef UTS_NODENAME
-#define UTS_NODENAME "(none)" /* set by sethostname() */
-#endif
-
-#ifndef UTS_DOMAINNAME
-#define UTS_DOMAINNAME "(none)" /* set by setdomainname() */
-#endif
-
-/*
- * The definitions for UTS_RELEASE and UTS_VERSION are now defined
- * in linux/version.h, and should only be used by linux/version.c
- */
-
#endif
#include <linux/ufs_fs_i.h>
#include <linux/romfs_fs_i.h>
#include <linux/smb_fs_i.h>
+#include <linux/hfs_fs_i.h>
/*
* Attribute flags. These should be or-ed together to figure out what
struct ufs_inode_info ufs_i;
struct romfs_inode_info romfs_i;
struct smb_inode_info smbfs_i;
+ struct hfs_inode_info hfs_i;
struct socket socket_i;
void *generic_ip;
} u;
#include <linux/ufs_fs_sb.h>
#include <linux/romfs_fs_sb.h>
#include <linux/smb_fs_sb.h>
+#include <linux/hfs_fs_sb.h>
struct super_block {
kdev_t s_dev;
struct ufs_sb_info ufs_sb;
struct romfs_sb_info romfs_sb;
struct smb_sb_info smbfs_sb;
+ struct hfs_sb_info hfs_sb;
void *generic_sbp;
} u;
};
#ifdef __KERNEL__
-#include <linux/version.h>
+#if defined(CONFIG_HFS_FS) || defined(CONFIG_HFS_FS_MODULE)
-#if (LINUX_VERSION_CODE < 0x020001)
-#error "Linux kernel version 2.0.1 or newer is required."
-#endif
-
-#if (LINUX_VERSION_CODE < 0x020100) && !defined(__alpha__)
-typedef int hfs_rwret_t;
-typedef int hfs_rwarg_t;
-#else
typedef ssize_t hfs_rwret_t;
typedef size_t hfs_rwarg_t;
-#endif
-
-#if (LINUX_VERSION_CODE < 0x020104)
-# define copy_to_user memcpy_tofs
-# define copy_from_user memcpy_fromfs
-#endif
-
-#if (LINUX_VERSION_CODE < 0x020106)
-# include <asm/segment.h>
-#else
-# include <asm/uaccess.h>
-#endif
-#if (LINUX_VERSION_CODE < 0x020105)
-extern inline void clear_user(char *addr, off_t count)
-{ while (count--) { put_user(0, addr++); } }
-#endif
+#include <asm/uaccess.h>
/* Some forward declarations */
struct hfs_fork;
extern int hfs_mac2alpha(char *, const struct hfs_name *);
extern int hfs_mac2triv(char *, const struct hfs_name *);
-#ifdef MODULE /* The kernel may or may not know about HFS */
-extern __inline__ struct hfs_inode_info *HFS_I(struct inode *inode) {
- return (struct hfs_inode_info *)(&inode->u);
-}
-
-extern __inline__ struct hfs_sb_info *HFS_SB(struct super_block *super) {
- return (struct hfs_sb_info *)(&super->u);
-}
-#else
-# define HFS_I(X) (&((X)->u.hfs_i))
-# define HFS_SB(X) (&((X)->u.hfs_sb))
-#endif
+#define HFS_I(X) (&((X)->u.hfs_i))
+#define HFS_SB(X) (&((X)->u.hfs_sb))
extern __inline__ void hfs_nameout(struct inode *dir, struct hfs_name *out,
const char *in, int len) {
}
}
}
+
+#endif
#endif /* __KERNEL__ */
#endif
--- /dev/null
+#ifndef _LINUX_UTS_H
+#define _LINUX_UTS_H
+
+/*
+ * Defines for what uname() should return
+ */
+#ifndef UTS_SYSNAME
+#define UTS_SYSNAME "Linux"
+#endif
+
+#ifndef UTS_MACHINE
+#define UTS_MACHINE "unknown"
+#endif
+
+#ifndef UTS_NODENAME
+#define UTS_NODENAME "(none)" /* set by sethostname() */
+#endif
+
+#ifndef UTS_DOMAINNAME
+#define UTS_DOMAINNAME "(none)" /* set by setdomainname() */
+#endif
+
+#endif
* May be freely distributed as part of Linux.
*/
-#include <linux/config.h>
+#include <linux/uts.h>
#include <linux/utsname.h>
#include <linux/version.h>
#include <linux/compile.h>
-/* make the "checkconfig" script happy: we really need to include config.h */
-#ifdef CONFIG_BOGUS
-#endif
-
#define version(a) Version_ ## a
#define version_string(a) version(a)
OX_OBJS += ksyms.o
endif
-include $(TOPDIR)/Rules.make
+CFLAGS_sched.o := $(PROFILING) -fno-omit-frame-pointer
-sched.o: sched.c
- $(CC) $(CFLAGS) $(PROFILING) -fno-omit-frame-pointer -c $<
+include $(TOPDIR)/Rules.make
${HOSTCC} -o tkparse tkparse.o tkcond.o tkgen.o
tkparse.o: tkparse.c tkparse.h
- $(HOSTCC) $(HOSTCFLAGS) -c -o tkparse.o tkparse.c
tkcond.o: tkcond.c tkparse.h
- $(HOSTCC) $(HOSTCFLAGS) -c -o tkcond.o tkcond.c
tkgen.o: tkgen.c tkparse.h
- $(HOSTCC) $(HOSTCFLAGS) -c -o tkgen.o tkgen.c
+
+tkparse.o tkcond.o tkgen.o:
+ $(HOSTCC) $(HOSTCFLAGS) -c -o $@ $(@:.o=.c)
clean:
- rm -f *~ kconfig.tk *.o tkparse
+ rm -f *~ kconfig.tk *.o tkparse mkdep split-include
include $(TOPDIR)/Rules.make
# 081297 Pavel Machek (pavel@atrey.karlin.mff.cuni.cz) - better error
# handling
#
+# 131197 Michael Chastain (mec@shout.net) - output all lines for a
+# choice list, not just the selected one. This makes the output
+# the same as Configure output, which is important for smart config
+# dependencies.
+#
# 101297 Michael Chastain (mec@shout.net) - remove sound driver cruft.
#
# 221297 Michael Chastain (mec@shout.net) - make define_bool actually
: ${current:=$default}
#
- # Then extract the actual option from the list of choices.
+ # Output all choices (to be compatible with other configs).
#
- current=${choices#*$current} ; set $current
-
- define_bool "$1" "y"
+ set -- $choices
+ while [ -n "$2" ]
+ do
+ if eval [ "$1" = "$current" ]
+ then
+ define_bool "$2" "y"
+ else
+ define_bool "$2" "n"
+ fi
+ shift ; shift
+ done
}
function mainmenu_name () {
--- /dev/null
+#! /usr/bin/perl
+#
+# checkconfig: find uses of CONFIG_* names without matching definitions.
+
+use integer;
+
+foreach $file (@ARGV)
+{
+ # Open this file.
+ open(FILE, $file) || die "Can't open $file: $!\n";
+
+ # Initialize variables.
+ my $fInComment = 0;
+ my $fUseConfig = 0;
+ my $iLinuxConfig = 0;
+ my %configList = ();
+
+ LINE: while ( <FILE> )
+ {
+ # Strip comments.
+ $fInComment && (s+^.*?\*/+ +o ? ($fInComment = 0) : next);
+ m+/\*+o && (s+/\*.*?\*/+ +go, (s+/\*.*$+ +o && ($fInComment = 1)));
+
+ # Pick up definitions.
+ if ( m/^#/o )
+ {
+ $iLinuxConfig = $. if m/^#\s*include\s+<linux\/config\.h>/o;
+ $configList{uc $1} = 1 if m/^#\s*include\s+<config\/(\S*)\.h>/o;
+ $configList{$1} = 1 if m/^#\s*define\s+CONFIG_(\w*)/o;
+ $configList{$1} = 1 if m/^#\s*undef\s+CONFIG_(\w*)/o;
+ }
+
+ # Look for usages.
+ next unless m/CONFIG_/o;
+ WORD: while ( m/\bCONFIG_(\w*)/og )
+ {
+ $fUseConfig = 1;
+ last LINE if $iLinuxConfig;
+ next WORD if exists $configList{$1};
+ print "$file: $.: need CONFIG_$1.\n";
+ $configList{$1} = 0;
+ }
+ }
+
+ # Report superfluous includes.
+ if ( $iLinuxConfig && ! $fUseConfig )
+ { print "$file: $iLinuxConfig: <linux/config.h> not needed.\n"; }
+
+ close(FILE);
+}
+++ /dev/null
-# This is an awk script which does dependencies. We do NOT want it to
-# recursively follow #include directives.
-#
-# The HPATH environment variable should be set to indicate where to look
-# for include files. The -I in front of the path is optional.
-
-#
-# Surely there is a more elegant way to see if a file exists. Anyone know
-# what it is?
-#
-function fileExists(f, TMP, dummy, result) {
- if(result=FILEHASH[f]) {
- if(result=="Yes") {
- return "Yes"
- } else {return ""}
- }
- ERRNO = getline dummy < f
- if(ERRNO >= 0) {
- close(f)
- return FILEHASH[f]="Yes"
- } else {
- FILEHASH[f]="No"
- return ""
- }
-}
-
-function endfile(f) {
- if (hasconfig && !needsconfig) {
- printf "%s doesn't need config\n",f > "/dev/stderr"
- }
- if (hasdep) {
- print cmd
- }
-}
-
-BEGIN{
- hasdep=0
- hasconfig=0
- needsconfig=0
- incomment=0
- if(!(TOPDIR=ENVIRON["TOPDIR"])) {
- print "Environment variable TOPDIR is not set"
- exit 1
- }
- split(ENVIRON["HPATH"],parray," ")
- for(path in parray) {
- sub("^-I","",parray[path])
- sub("[/ ]*$","",parray[path])
- }
-}
-
-# eliminate comments
-{
- # remove all comments fully contained on a single line
- gsub("\\/\\*.*\\*\\/", "")
- if (incomment) {
- if ($0 ~ /\*\//) {
- incomment = 0;
- gsub(".*\\*\\/", "")
- } else {
- next
- }
- } else {
- # start of multi-line comment
- if ($0 ~ /\/\*/)
- {
- incomment = 1;
- sub("\\/\\*.*", "")
- } else if ($0 ~ /\*\//) {
- incomment = 0;
- sub(".*\\*\\/", "")
- }
- }
-}
-
-/^[ ]*#[ ]*if.*[^A-Za-z_]CONFIG_/ {
- needsconfig=1
- if (!hasconfig) {
- printf "%s needs config but has not included config file\n",FILENAME > "/dev/stderr"
- # only say it once per file..
- hasconfig = 1
- }
-}
-
-/^[ ]*#[ ]*include[ ]*[<"][^ ]*[>"]/{
- found=0
- if(LASTFILE!=FILENAME) {
- endfile(LASTFILE)
- hasdep=0
- hasconfig=0
- needsconfig=0
- incomment=0
- cmd=""
- LASTFILE=FILENAME
- depname=FILENAME
- relpath=FILENAME
- sub("\\.c$",".o: ",depname)
- sub("\\.S$",".o: ",depname)
- if (depname==FILENAME) {
- cmd="\n\t@touch "depname
- }
- sub("\\.h$",".h: ",depname)
- if(relpath ~ "^\\." ) {
- sub("[^/]*$","", relpath)
- relpath=relpath"/"
- sub("//","/", relpath)
- } else {
- relpath=""
- }
- }
- fname=$0
- sub("^#[ ]*include[ ]*[<\"]","",fname)
- sub("[>\"].*","",fname)
- if (fname=="linux/config.h") {
- hasconfig=1
- }
- rfname=relpath""fname
- if(fileExists(rfname)) {
- found=1
- if (!hasdep) {
- printf "%s", depname
- }
- hasdep=1
- printf " \\\n %s", rfname
- if(fname ~ "^\\." ) {
- fnd=0;
- for(i in ARGV) {
- if(ARGV[i]==rfname) {
- fnd=1
- }
- }
- if(fnd==0) {
- ARGV[ARGC]=rfname
- ++ARGC
- }
- }
- } else {
- for(path in parray) {
- if(fileExists(parray[path]"/"fname)) {
- shortp=parray[path]
- found=1
- if (!hasdep) {
- printf "%s", depname
- }
- hasdep=1
- printf " \\\n %s", parray[path]"/"fname
- }
- }
- }
-}
-
-END{
- endfile(FILENAME)
-}
proc write_tristate { file1 file2 varname variable dep } {
if { $variable == 0 } \
then { puts $file1 "# $varname is not set"; \
- puts $file2 "#undef $varname"} \
+ puts $file2 "#undef $varname"} \
elseif { $variable == 2 || ($dep == 2 && $variable == 1) } \
then { puts $file1 "$varname=m"; \
- puts $file2 "#undef $varname"; \
+ puts $file2 "#undef $varname"; \
puts $file2 "#define ${varname}_MODULE 1" } \
elseif { $variable == 1 && $dep != 2 } \
then { puts $file1 "$varname=y"; \
proc write_int { file1 file2 varname variable dep } {
if { $dep == 0 } \
then { puts $file1 "# $varname is not set"; \
- puts $file2 "#undef $varname"} \
+ puts $file2 "#undef $varname"} \
else {
puts $file1 "$varname=$variable"; \
puts $file2 "#define $varname $variable"; \
proc write_hex { file1 file2 varname variable dep } {
if { $dep == 0 } \
then { puts $file1 "# $varname is not set"; \
- puts $file2 "#undef $varname"} \
+ puts $file2 "#undef $varname"} \
else {
puts $file1 "$varname=$variable"; \
puts $file2 "#define $varname 0x$variable"; \
proc write_string { file1 file2 varname variable dep } {
if { $dep == 0 } \
then { puts $file1 "# $varname is not set"; \
- puts $file2 "#undef $varname"} \
+ puts $file2 "#undef $varname"} \
else {
puts $file1 "$varname=\"$variable\""; \
puts $file2 "#define $varname \"$variable\""; \
+++ /dev/null
-#!/bin/sh
-#
-# This script looks to see if a directory contains .h files
-#
-for dir in $@; do
- for hfile in $dir/*.h; do
- if [ -f $hfile ]; then echo $dir; fi
- break
- done
-done
-exit 0
+/*
+ * Originally by Linus Torvalds.
+ * Smart CONFIG_* processing by Werner Almesberger, Michael Chastain.
+ *
+ * Usage: mkdep file ...
+ *
+ * Read source files and output makefile dependency lines for them.
+ * I make simple dependency lines for #include <*.h> and #include "*.h".
+ * I also find instances of CONFIG_FOO and generate dependencies
+ * like include/config/foo.h.
+ */
+
+#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
-
-#include <errno.h>
#include <string.h>
-#include <sys/types.h>
-#include <sys/stat.h>
#include <unistd.h>
+
#include <sys/fcntl.h>
#include <sys/mman.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+
-char *filename, *command, __depname[256] = "\n\t@touch ";
-int needsconfig, hasconfig, hasmodules, hasdep;
+char __depname[512] = "\n\t@touch ";
#define depname (__depname+9)
+int hasdep;
struct path_struct {
int len;
{ 0, "" }
};
-static void handle_include(int type, char *name, int len)
+
+
+/*
+ * This records all the configuration options seen.
+ * In perl this would be a hash, but here it's a long string
+ * of values separated by newlines. This is simple and
+ * extremely fast.
+ */
+char * str_config = NULL;
+int size_config = 0;
+int len_config = 0;
+
+
+
+/*
+ * Grow the configuration string to a desired length.
+ * Usually the first growth is plenty.
+ */
+void grow_config(int len)
+{
+ if (str_config == NULL) {
+ len_config = 0;
+ size_config = 4096;
+ str_config = malloc(4096);
+ if (str_config == NULL)
+ { perror("malloc"); exit(1); }
+ }
+
+ while (len_config + len > size_config) {
+ str_config = realloc(str_config, size_config *= 2);
+ if (str_config == NULL)
+ { perror("malloc"); exit(1); }
+ }
+}
+
+
+
+/*
+ * Lookup a value in the configuration string.
+ */
+int is_defined_config(const char * name, int len)
+{
+ const char * pconfig;
+ const char * plast = str_config + len_config - len;
+ for ( pconfig = str_config + 1; pconfig < plast; pconfig++ ) {
+ if (pconfig[ -1] == '\n'
+ && pconfig[len] == '\n'
+ && !memcmp(pconfig, name, len))
+ return 1;
+ }
+ return 0;
+}
+
+
+
+/*
+ * Add a new value to the configuration string.
+ */
+void define_config(int convert, const char * name, int len)
+{
+ grow_config(len + 1);
+
+ memcpy(str_config+len_config, name, len);
+
+ if (convert) {
+ int i;
+ for (i = 0; i < len; i++) {
+ char c = str_config[len_config+i];
+ if (isupper(c)) c = tolower(c);
+ if (c == '_') c = '/';
+ str_config[len_config+i] = c;
+ }
+ }
+
+ len_config += len;
+ str_config[len_config++] = '\n';
+}
+
+
+
+/*
+ * Clear the set of configuration strings.
+ */
+void clear_config( )
+{
+ len_config = 0;
+ define_config(0, "", 0);
+}
+
+
+
+/*
+ * Handle an #include line.
+ */
+void handle_include(int type, const char * name, int len)
{
- int plen;
struct path_struct *path = path_array+type;
- if (len == 14)
- if (!memcmp(name, "linux/config.h", len))
- hasconfig = 1;
- else if (!memcmp(name, "linux/module.h", len))
- hasmodules = 1;
-
- plen = path->len;
- memcpy(path->buffer+plen, name, len);
- len += plen;
- path->buffer[len] = '\0';
- if (access(path->buffer, F_OK))
+ if (len == 14 && !memcmp(name, "linux/config.h", len))
+ return;
+
+ if (len >= 7 && !memcmp(name, "config/", 7))
+ define_config(0, name+7, len-7-2);
+
+ memcpy(path->buffer+path->len, name, len);
+ path->buffer[path->len+len] = '\0';
+ if (access(path->buffer, F_OK) != 0)
return;
if (!hasdep) {
printf(" \\\n %s", path->buffer);
}
-static void handle_config(void)
+
+
+/*
+ * Record the use of a CONFIG_* word.
+ */
+void use_config(const char * name, int len)
{
- needsconfig = 1;
- if (!hasconfig)
- fprintf(stderr,
- "%s needs config but has not included config file\n",
- filename);
+ char *pc;
+ int i;
+
+ pc = path_array[0].buffer + path_array[0].len;
+ memcpy(pc, "config/", 7);
+ pc += 7;
+
+ for (i = 0; i < len; i++) {
+ char c = name[i];
+ if (isupper(c)) c = tolower(c);
+ if (c == '_') c = '/';
+ pc[i] = c;
+ }
+ pc[len] = '\0';
+
+ if (is_defined_config(pc, len))
+ return;
+
+ define_config(0, pc, len);
+
+ if (!hasdep) {
+ hasdep = 1;
+ printf("%s: ", depname);
+ }
+ printf(" \\\n $(wildcard %s.h)", path_array[0].buffer);
}
+
+
+/*
+ * Macros for stunningly fast map-based character access.
+ * __buf is a register which holds the current word of the input.
+ * Thus, there is one memory access per sizeof(unsigned long) characters.
+ */
+
#if defined(__alpha__) || defined(__i386__)
#define LE_MACHINE
#endif
#endif
#define GETNEXT { \
-next_byte(__buf); \
-if (!__nrbuf) { \
- __buf = *(unsigned long *) next; \
- __nrbuf = sizeof(unsigned long); \
- if (!__buf) \
- break; \
-} next++; __nrbuf--; }
+ next_byte(__buf); \
+ if ((unsigned long) next % sizeof(unsigned long) == 0) { \
+ __buf = * (unsigned long *) next; \
+ if (!__buf) \
+ break; \
+ } \
+ next++; \
+}
+
+/*
+ * State machine macros.
+ */
#define CASE(c,label) if (current == c) goto label
#define NOTCASE(c,label) if (current != c) goto label
-static void state_machine(register char *next)
+/*
+ * Yet another state machine speedup.
+ */
+#define MAX2(a,b) ((a)>(b)?(a):(b))
+#define MIN2(a,b) ((a)<(b)?(a):(b))
+#define MAX5(a,b,c,d,e) (MAX2(a,MAX2(b,MAX2(c,MAX2(d,e)))))
+#define MIN5(a,b,c,d,e) (MIN2(a,MIN2(b,MIN2(c,MIN2(d,e)))))
+
+
+
+/*
+ * The state machine looks for (approximately) these Perl regular expressions:
+ *
+ * m|\/\*.*?\*\/|
+ * m|'.*?'|
+ * m|".*?"|
+ * m|#\s*include\s*"(.*?)"|
+ * m|#\s*include\s*<(.*?>"|
+ * m|#\s*(?define|undef)\s*CONFIG_(\w*)|
+ * m|(?!\w)CONFIG_|
+ *
+ * About 98% of the CPU time is spent here, and most of that is in
+ * the 'start' paragraph. Because the current characters are
+ * in a register, the start loop usually eats 4 or 8 characters
+ * per memory read. The MAX5 and MIN5 tests dispose of most
+ * input characters with 1 or 2 comparisons.
+ */
+void state_machine(const char * map)
{
- for(;;) {
- register unsigned long __buf = 0;
- register unsigned long __nrbuf = 0;
+ const char * next = map;
+ const char * map_dot;
+ unsigned long __buf = 0;
-normal:
+ for (;;) {
+start:
GETNEXT
-__normal:
- CASE('/',slash);
- CASE('"',string);
- CASE('\'',char_const);
- CASE('#',preproc);
- goto normal;
-
+__start:
+ if (current > MAX5('/','\'','"','#','C')) goto start;
+ if (current < MIN5('/','\'','"','#','C')) goto start;
+ CASE('/', slash);
+ CASE('\'', squote);
+ CASE('"', dquote);
+ CASE('#', pound);
+ CASE('C', cee);
+ goto start;
+
+/* / */
slash:
GETNEXT
- CASE('*',comment);
- goto __normal;
-
-string:
+ NOTCASE('*', __start);
+slash_star_dot_star:
GETNEXT
- CASE('"',normal);
- NOTCASE('\\',string);
+__slash_star_dot_star:
+ NOTCASE('*', slash_star_dot_star);
GETNEXT
- goto string;
+ NOTCASE('/', __slash_star_dot_star);
+ goto start;
-char_const:
+/* '.*?' */
+squote:
GETNEXT
- CASE('\'',normal);
- NOTCASE('\\',char_const);
+ CASE('\'', start);
+ NOTCASE('\\', squote);
GETNEXT
- goto char_const;
+ goto squote;
-comment:
+/* ".*?" */
+dquote:
GETNEXT
-__comment:
- NOTCASE('*',comment);
+ CASE('"', start);
+ NOTCASE('\\', dquote);
GETNEXT
- CASE('/',normal);
- goto __comment;
+ goto dquote;
-preproc:
+/* #\s* */
+pound:
GETNEXT
- CASE('\n',normal);
- CASE(' ',preproc);
- CASE('\t',preproc);
- CASE('i',i_preproc);
- CASE('e',e_preproc);
+ CASE(' ', pound);
+ CASE('\t', pound);
+ CASE('i', pound_i);
+ CASE('d', pound_d);
+ CASE('u', pound_u);
+ goto __start;
+
+/* #\s*i */
+pound_i:
+ GETNEXT NOTCASE('n', __start);
+ GETNEXT NOTCASE('c', __start);
+ GETNEXT NOTCASE('l', __start);
+ GETNEXT NOTCASE('u', __start);
+ GETNEXT NOTCASE('d', __start);
+ GETNEXT NOTCASE('e', __start);
+ goto pound_include;
+
+/* #\s*include\s* */
+pound_include:
GETNEXT
-
-skippreproc:
- CASE('\n',normal);
- CASE('\\',skippreprocslash);
+ CASE(' ', pound_include);
+ CASE('\t', pound_include);
+ map_dot = next;
+ CASE('"', pound_include_dquote);
+ CASE('<', pound_include_langle);
+ goto __start;
+
+/* #\s*include\s*"(.*)" */
+pound_include_dquote:
GETNEXT
- goto skippreproc;
-
-skippreprocslash:
- GETNEXT;
- GETNEXT;
- goto skippreproc;
+ CASE('\n', start);
+ NOTCASE('"', pound_include_dquote);
+ handle_include(1, map_dot, next - map_dot - 1);
+ goto start;
-e_preproc:
+/* #\s*include\s*<(.*)> */
+pound_include_langle:
GETNEXT
- NOTCASE('l',skippreproc);
+ CASE('\n', start);
+ NOTCASE('>', pound_include_langle);
+ handle_include(0, map_dot, next - map_dot - 1);
+ goto start;
+
+/* #\s*d */
+pound_d:
+ GETNEXT NOTCASE('e', __start);
+ GETNEXT NOTCASE('f', __start);
+ GETNEXT NOTCASE('i', __start);
+ GETNEXT NOTCASE('n', __start);
+ GETNEXT NOTCASE('e', __start);
+ goto pound_define_undef;
+
+/* #\s*u */
+pound_u:
+ GETNEXT NOTCASE('n', __start);
+ GETNEXT NOTCASE('d', __start);
+ GETNEXT NOTCASE('e', __start);
+ GETNEXT NOTCASE('f', __start);
+ goto pound_define_undef;
+
+/* #\s*(define|undef)\s*CONFIG_(\w*) */
+pound_define_undef:
GETNEXT
- NOTCASE('i',skippreproc);
+ CASE(' ', pound_define_undef);
+ CASE('\t', pound_define_undef);
+
+ NOTCASE('C', __start);
+ GETNEXT NOTCASE('O', __start);
+ GETNEXT NOTCASE('N', __start);
+ GETNEXT NOTCASE('F', __start);
+ GETNEXT NOTCASE('I', __start);
+ GETNEXT NOTCASE('G', __start);
+ GETNEXT NOTCASE('_', __start);
+
+ map_dot = next;
+pound_define_undef_CONFIG_word:
GETNEXT
- CASE('f',if_line);
- goto skippreproc;
-
-i_preproc:
- GETNEXT
- CASE('f',if_line);
- NOTCASE('n',skippreproc);
- GETNEXT
- NOTCASE('c',skippreproc);
- GETNEXT
- NOTCASE('l',skippreproc);
- GETNEXT
- NOTCASE('u',skippreproc);
- GETNEXT
- NOTCASE('d',skippreproc);
- GETNEXT
- NOTCASE('e',skippreproc);
-
-/* "# include" found */
-include_line:
- GETNEXT
- CASE('\n',normal);
- CASE('<', std_include_file);
- NOTCASE('"', include_line);
-
-/* "local" include file */
-{
- char *incname = next;
-local_include_name:
- GETNEXT
- CASE('\n',normal);
- NOTCASE('"', local_include_name);
- handle_include(1, incname, next-incname-1);
- goto skippreproc;
-}
-
-/* <std> include file */
-std_include_file:
-{
- char *incname = next;
-std_include_name:
+ if (isalnum(current) || current == '_')
+ goto pound_define_undef_CONFIG_word;
+ define_config(1, map_dot, next - map_dot - 1);
+ goto __start;
+
+/* \<CONFIG_(\w*) */
+cee:
+ if (next >= map+2 && (isalnum(next[-2]) || next[-2] == '_'))
+ goto start;
+ GETNEXT NOTCASE('O', __start);
+ GETNEXT NOTCASE('N', __start);
+ GETNEXT NOTCASE('F', __start);
+ GETNEXT NOTCASE('I', __start);
+ GETNEXT NOTCASE('G', __start);
+ GETNEXT NOTCASE('_', __start);
+
+ map_dot = next;
+cee_CONFIG_word:
GETNEXT
- CASE('\n',normal);
- NOTCASE('>', std_include_name);
- handle_include(0, incname, next-incname-1);
- goto skippreproc;
+ if (isalnum(current) || current == '_')
+ goto cee_CONFIG_word;
+ use_config(map_dot, next - map_dot - 1);
+ goto __start;
+ }
}
-if_line:
- if (needsconfig)
- goto skippreproc;
-if_start:
- GETNEXT
- CASE('C', config);
- CASE('\n', normal);
- CASE('_', if_middle);
- if (current >= 'a' && current <= 'z')
- goto if_middle;
- if (current < 'A' || current > 'Z')
- goto if_start;
-config:
- GETNEXT
- NOTCASE('O', __if_middle);
- GETNEXT
- NOTCASE('N', __if_middle);
- GETNEXT
- NOTCASE('F', __if_middle);
- GETNEXT
- NOTCASE('I', __if_middle);
- GETNEXT
- NOTCASE('G', __if_middle);
- GETNEXT
- NOTCASE('_', __if_middle);
- handle_config();
- goto skippreproc;
-if_middle:
- GETNEXT
-__if_middle:
- CASE('\n', normal);
- CASE('_', if_middle);
- if (current >= 'a' && current <= 'z')
- goto if_middle;
- if (current < 'A' || current > 'Z')
- goto if_start;
- goto if_middle;
- }
-}
-static void do_depend(void)
+/*
+ * Generate dependencies for one file.
+ */
+void do_depend(const char * filename, const char * command)
{
- char *map;
int mapsize;
int pagesizem1 = getpagesize()-1;
- int fd = open(filename, O_RDONLY);
+ int fd;
struct stat st;
+ char * map;
+ fd = open(filename, O_RDONLY);
if (fd < 0) {
- if (errno != ENOENT)
- perror(filename);
+ perror(filename);
return;
}
+
fstat(fd, &st);
if (st.st_size == 0) {
fprintf(stderr,"%s is empty\n",filename);
+ close(fd);
return;
}
+
mapsize = st.st_size + 2*sizeof(unsigned long);
mapsize = (mapsize+pagesizem1) & ~pagesizem1;
map = mmap(NULL, mapsize, PROT_READ, MAP_PRIVATE, fd, 0);
- if (-1 == (long)map) {
+ if ((long) map == -1) {
perror("mkdep: mmap");
close(fd);
return;
}
- close(fd);
+ if ((unsigned long) map % sizeof(unsigned long) != 0)
+ {
+ fprintf(stderr, "do_depend: map not aligned\n");
+ exit(1);
+ }
+
+ hasdep = 0;
+ clear_config();
state_machine(map);
- munmap(map, mapsize);
if (hasdep)
puts(command);
+
+ munmap(map, mapsize);
+ close(fd);
}
+
+
+/*
+ * Generate dependencies for all files.
+ */
int main(int argc, char **argv)
{
int len;
- char * hpath;
+ char *hpath;
hpath = getenv("HPATH");
if (!hpath)
hpath = "/usr/src/linux/include";
len = strlen(hpath);
memcpy(path_array[0].buffer, hpath, len);
- if (len && hpath[len-1] != '/') {
- path_array[0].buffer[len] = '/';
- len++;
- }
+ if (len && hpath[len-1] != '/')
+ path_array[0].buffer[len++] = '/';
path_array[0].buffer[len] = '\0';
path_array[0].len = len;
while (--argc > 0) {
- int len;
- char *name = *++argv;
-
- filename = name;
- len = strlen(name);
- memcpy(depname, name, len+1);
- command = __depname;
- if (len > 2 && name[len-2] == '.') {
- switch (name[len-1]) {
- case 'c':
- case 'S':
- depname[len-1] = 'o';
- command = "";
+ const char * filename = *++argv;
+ const char * command = __depname;
+ len = strlen(filename);
+ memcpy(depname, filename, len+1);
+ if (len > 2 && filename[len-2] == '.') {
+ if (filename[len-1] == 'c' || filename[len-1] == 'S') {
+ depname[len-1] = 'o';
+ command = "";
}
}
- needsconfig = hasconfig = hasmodules = hasdep = 0;
- do_depend();
- if (hasconfig && !hasmodules && !needsconfig)
- fprintf(stderr, "%s doesn't need config\n", filename);
+ do_depend(filename, command);
}
return 0;
}
--- /dev/null
+/*
+ * split-include.c
+ *
+ * Copyright abandoned, Michael Chastain, <mailto:mec@shout.net>.
+ * This is a C version of syncdep.pl by Werner Almesberger.
+ *
+ * This program takes autoconf.h as input and outputs a directory full
+ * of one-line include files, merging onto the old values.
+ *
+ * Think of the configuration options as key-value pairs. Then there
+ * are five cases:
+ *
+ * key old value new value action
+ *
+ * KEY-1 VALUE-1 VALUE-1 leave file alone
+ * KEY-2 VALUE-2A VALUE-2B write VALUE-2B into file
+ * KEY-3 - VALUE-3 write VALUE-3 into file
+ * KEY-4 VALUE-4 - write an empty file
+ * KEY-5 (empty) - leave old empty file alone
+ */
+
+#include <sys/stat.h>
+#include <sys/types.h>
+
+#include <ctype.h>
+#include <errno.h>
+#include <fcntl.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <unistd.h>
+
+#define ERROR_EXIT(strExit) \
+ { \
+ const int errnoSave = errno; \
+ fprintf(stderr, "%s: ", str_my_name); \
+ errno = errnoSave; \
+ perror((strExit)); \
+ exit(1); \
+ }
+
+
+
+int main(int argc, const char * argv [])
+{
+ const char * str_my_name;
+ const char * str_file_autoconf;
+ const char * str_dir_config;
+
+ FILE * fp_config;
+ FILE * fp_target;
+ FILE * fp_find;
+
+ int buffer_size;
+
+ char * line;
+ char * old_line;
+ char * list_target;
+ char * ptarget;
+
+ struct stat stat_buf;
+
+ /* Check arg count. */
+ if (argc != 3)
+ {
+ fprintf(stderr, "%s: wrong number of arguments.\n", argv[0]);
+ exit(1);
+ }
+
+ str_my_name = argv[0];
+ str_file_autoconf = argv[1];
+ str_dir_config = argv[2];
+
+ /* Find a buffer size. */
+ if (stat(str_file_autoconf, &stat_buf) != 0)
+ ERROR_EXIT(str_file_autoconf);
+ buffer_size = 2 * stat_buf.st_size + 4096;
+
+ /* Allocate buffers. */
+ if ( (line = malloc(buffer_size)) == NULL
+ || (old_line = malloc(buffer_size)) == NULL
+ || (list_target = malloc(buffer_size)) == NULL )
+ ERROR_EXIT(str_file_autoconf);
+
+ /* Open autoconfig file. */
+ if ((fp_config = fopen(str_file_autoconf, "r")) == NULL)
+ ERROR_EXIT(str_file_autoconf);
+
+ /* Make output directory if needed. */
+ if (stat(str_dir_config, &stat_buf) != 0)
+ {
+ if (mkdir(str_dir_config, 0755) != 0)
+ ERROR_EXIT(str_dir_config);
+ }
+
+ /* Change to output directory. */
+ if (chdir(str_dir_config) != 0)
+ ERROR_EXIT(str_dir_config);
+
+ /* Put initial separator into target list. */
+ ptarget = list_target;
+ *ptarget++ = '\n';
+
+ /* Read config lines. */
+ while (fgets(line, buffer_size, fp_config))
+ {
+ const char * str_config;
+ int is_same;
+ int itarget;
+
+ if (line[0] != '#')
+ continue;
+ if ((str_config = strstr(line, "CONFIG_")) == NULL)
+ continue;
+
+ /* Make the output file name. */
+ str_config += sizeof("CONFIG_") - 1;
+ for (itarget = 0; !isspace(str_config[itarget]); itarget++)
+ {
+ char c = str_config[itarget];
+ if (isupper(c)) c = tolower(c);
+ if (c == '_') c = '/';
+ ptarget[itarget] = c;
+ }
+ ptarget[itarget++] = '.';
+ ptarget[itarget++] = 'h';
+ ptarget[itarget++] = '\0';
+
+ /* Check for existing file. */
+ is_same = 0;
+ if ((fp_target = fopen(ptarget, "r")) != NULL)
+ {
+ fgets(old_line, buffer_size, fp_target);
+ if (fclose(fp_target) != 0)
+ ERROR_EXIT(ptarget);
+ if (!strcmp(line, old_line))
+ is_same = 1;
+ }
+
+ if (!is_same)
+ {
+ /* Auto-create directories. */
+ int islash;
+ for (islash = 0; islash < itarget; islash++)
+ {
+ if (ptarget[islash] == '/')
+ {
+ ptarget[islash] = '\0';
+ if (stat(ptarget, &stat_buf) != 0
+ && mkdir(ptarget, 0755) != 0)
+ ERROR_EXIT( ptarget );
+ ptarget[islash] = '/';
+ }
+ }
+
+ /* Write the file. */
+ if ((fp_target = fopen(ptarget, "w" )) == NULL)
+ ERROR_EXIT(ptarget);
+ fputs(line, fp_target);
+ if (ferror(fp_target) || fclose(fp_target) != 0)
+ ERROR_EXIT(ptarget);
+ }
+
+ /* Update target list */
+ ptarget += itarget;
+ *(ptarget-1) = '\n';
+ }
+
+ /*
+ * Close autoconfig file.
+ * Terminate the target list.
+ */
+ if (fclose(fp_config) != 0)
+ ERROR_EXIT(str_file_autoconf);
+ *ptarget = '\0';
+
+ /*
+ * Fix up existing files which have no new value.
+ * This is Case 4 and Case 5.
+ *
+ * I re-read the tree and filter it against list_target.
+ * This is crude. But it avoids data copies. Also, list_target
+ * is compact and contiguous, so it easily fits into cache.
+ *
+ * Notice that list_target contains strings separated by \n,
+ * with a \n before the first string and after the last.
+ * fgets gives the incoming names a terminating \n.
+ * So by having an initial \n, strstr will find exact matches.
+ */
+
+ fp_find = popen("find * -type f -print", "r");
+ if (fp_find == 0)
+ ERROR_EXIT( "find" );
+
+ line[0] = '\n';
+ while (fgets(line+1, buffer_size, fp_find))
+ {
+ if (strstr(list_target, line) == NULL)
+ {
+ /*
+ * This is an old file with no CONFIG_* flag in autoconf.h.
+ */
+
+ /* First strip the \n. */
+ line[strlen(line)-1] = '\0';
+
+ /* Grab size. */
+ if (stat(line+1, &stat_buf) != 0)
+ ERROR_EXIT(line);
+
+ /* If file is not empty, make it empty and give it a fresh date. */
+ if (stat_buf.st_size != 0)
+ {
+ if ((fp_target = fopen(line+1, "w")) == NULL)
+ ERROR_EXIT(line);
+ if (fclose(fp_target) != 0)
+ ERROR_EXIT(line);
+ }
+ }
+ }
+
+ if (pclose(fp_find) != 0)
+ ERROR_EXIT("find");
+
+ return 0;
+}
* 1997 12 08
* Michael Chastain - Remove sound driver special cases.
*
+ * 1997 11 15
+ * Michael Chastain - For choice buttons, write values for all options,
+ * not just the single chosen one. This is compatible
+ * with 'make config' and 'make oldconfig', and is
+ * needed so smart-config dependencies work if the
+ * user switches from one configuration method to
+ * another.
+ *
* TO DO:
* - clean up - there are useless ifdef's everywhere.
* - better comments throughout - C code generating tcl is really cryptic.
cfg1 != NULL && cfg1->tok == tok_choice;
cfg1 = cfg1->next)
{
- printf("\tif { $%s == \"%s\" } then { write_tristate $cfg $autocfg %s 1 $notmod }\n",
+ printf("\tif { $%s == \"%s\" } then { write_tristate $cfg $autocfg %s 1 $notmod } else { write_tristate $cfg $autocfg %s 0 $notmod }\n",
cfg->optionname,
cfg1->label,
+ cfg1->optionname,
cfg1->optionname);
}
}