Commit 83257356 authored by Linus Torvalds's avatar Linus Torvalds

Import 2.0.5

parent f44f1554
......@@ -26,9 +26,11 @@ S: CH-1015 Lausanne
S: Switzerland
N: H. Peter Anvin
E: Peter.Anvin@linux.org
E: hpa@zytor.com
W: http://www.zytor.com/~hpa/
P: 2047/2A960705 BA 03 D3 2C 14 A8 A8 BD 1E DF FE 69 EE 35 BD 74
D: Author of the SYSLINUX boot loader, maintainer of the linux.* news
D: hierarchy, responsible for various console and other hacks
D: hierarchy and the Linux Device List; various kernel hacks
S: 4390 Albany Dr. #46
S: San Jose CA 95129
S: USA
......@@ -886,11 +888,11 @@ S: Germany
N: Nigel Metheringham
E: Nigel.Metheringham@ThePLAnet.net
P: 1024/31455639 B7 99 BD B8 00 17 BD 46 C1 15 B8 AB 87 BC 25 FA
D: IP Masquerading work and minor fixes
S: Planet Online
S: The White House, Melbourne Street, LEEDS
S: LS2 7PS, UK
P: 1024/31455639 B7 99 BD B8 00 17 BD 46 C1 15 B8 AB 87 BC 25 FA
N: Craig Metz
E: cmetz@tjhsst.edu
......@@ -1242,8 +1244,8 @@ S: USA
N: Leo Spiekman
E: spiekman@et.tudelft.nl
D: Optics Storage 8000AT cdrom driver
W: http://dutettk.et.tudelft.nl/~spiekman
D: Optics Storage 8000AT cdrom driver
S: Utrecht
S: The Netherlands
......@@ -1258,13 +1260,13 @@ S: DK-1860 Frederiksberg C
S: Denmark
N: Drew Sullivan
W: http://www.ss.org/
E: drew@ss.org
W: http://www.ss.org/
P: 1024/ACFFA969 5A 9C 42 AB E4 24 82 31 99 56 00 BF D3 2B 25 46
D: iBCS2 developer
S: 22 Irvington Cres.
S: Willowdale, Ontario
S: Canada M2N 2Z1
P: 1024/ACFFA969 5A 9C 42 AB E4 24 82 31 99 56 00 BF D3 2B 25 46
N: Tommy Thorn
E: Tommy.Thorn@irisa.fr
......
......@@ -42,7 +42,7 @@ foo \kill}%
%
\title{{\bf Linux Allocated Devices}}
\author{Maintained by H. Peter Anvin $<$hpa@zytor.com$>$}
\date{Last revised: June 9, 1996}
\date{Last revised: July 9, 1996}
\maketitle
%
\noindent
......@@ -64,7 +64,9 @@ To have a major number allocated, or a minor number in situations
where that applies (e.g.\ busmice), please contact me with the
appropriate device information. Also, if you have additional
information regarding any of the devices listed below, or if I have
made a mistake, I would greatly appreciate a note.
made a mistake, I would greatly appreciate a note. When sending me
mail, please include the word ``device'' in the subject so your mail
won't accidentally get buried!
Allocations marked (68k/Amiga) apply to Linux/68k on the Amiga
platform only. Allocations marked (68k/Atari) apply to Linux/68k on
......@@ -163,6 +165,7 @@ reply.
\major{40}{}{char }{Matrox Meteor frame grabber}
\major{ }{}{block}{Syquest EZ135 parallel port removable drive}
\major{41}{}{char }{Yet Another Micro Monitor}
\major{ }{}{block}{MicroSolutions BackPack parallel port CD-ROM}
\major{42}{}{}{Demo/sample use}
\major{43}{}{char }{isdn4linux virtual modem}
\major{44}{}{char }{isdn4linux virtual modem -- alternate devices}
......@@ -175,7 +178,8 @@ reply.
\major{51}{}{char }{Baycom radio modem}
\major{52}{}{char }{Spellcaster DataComm/BRI ISDN card}
\major{53}{}{char }{BDM interface for remote debugging MC683xx microcontrollers}
\major{54}{--59}{}{Unallocated}
\major{54}{}{char }{Electrocardiognosis Holter serial card}
\major{55}{--59}{}{Unallocated}
\major{60}{--63}{}{Local/experimental use}
\major{64}{--119}{}{Unallocated}
\major{120}{--127}{}{Local/experimental use}
......@@ -460,6 +464,7 @@ physical disks.
\minor{136}{/dev/qcam0}{QuickCam on {\file lp0}}
\minor{137}{/dev/qcam1}{QuickCam on {\file lp1}}
\minor{138}{/dev/qcam2}{QuickCam on {\file lp2}}
\minor{139}{/dev/openprom}{SPARC OpenBoot PROM}
\end{devicelist}
\noindent
......@@ -989,6 +994,9 @@ Partitions are handled the same way as for IDE disks (see major number
\begin{devicelist}
\major{41}{}{char }{Yet Another Micro Monitor}
\minor{0}{/dev/yamm}{Yet Another Micro Monitor}
\\
\major{ }{}{block}{MicroSolutions BackPack parallel port CD-ROM}
\minor{0}{/dev/bpcd}{BackPack CD-ROM}
\end{devicelist}
\begin{devicelist}
......@@ -1096,7 +1104,19 @@ interface. PD is the Motorola Public Domain Interface and ICD is the
commercial interface by P\&E.
\begin{devicelist}
\major{54}{--59}{}{Unallocated}
\major{54}{Electrocardiognosis Holter serial card}
\minor{0}{/dev/holter0}{First Holter port}
\minor{1}{/dev/holter1}{Second Holter port}
\minor{2}{/dev/holter2}{Third Holter port}
\end{devicelist}
\noindent
A custom serial card used by Electrocardiognosis SRL
$<$mseritan@ottonel.pub.ro$>$ to transfer data from Holter 24-hour
heart monitoring equipment.
\begin{devicelist}
\major{55}{--59}{}{Unallocated}
\end{devicelist}
\begin{devicelist}
......
......@@ -2,7 +2,7 @@
Maintained by H. Peter Anvin <hpa@zytor.com>
Last revised: June 9, 1996
Last revised: July 9, 1996
This list is the successor to Rick Miller's Linux Device List, which
he stopped maintaining when he got busy with other things in 1993. It
......@@ -21,7 +21,9 @@ To have a major number allocated, or a minor number in situations
where that applies (e.g. busmice), please contact me with the
appropriate device information. Also, if you have additional
information regarding any of the devices listed below, or if I have
made a mistake, I would greatly appreciate a note.
made a mistake, I would greatly appreciate a note. When sending me
mail, please include the word "device" in the subject so your mail
won't accidentally get buried!
Allocations marked (68k/Amiga) apply to Linux/68k on the Amiga
platform only. Allocations marked (68k/Atari) apply to Linux/68k on
......@@ -278,6 +280,7 @@ reply.
136 = /dev/qcam0 QuickCam on lp0
137 = /dev/qcam1 QuickCam on lp1
138 = /dev/qcam2 QuickCam on lp2
139 = /dev/openprom SPARC OpenBoot PROM
11 char Raw keyboard device
0 = /dev/kbd Raw keyboard device
......@@ -689,6 +692,8 @@ reply.
41 char Yet Another Micro Monitor
0 = /dev/yamm Yet Another Micro Monitor
block MicroSolutions BackPack parallel port CD-ROM
0 = /dev/bpcd BackPack CD-ROM
42 Demo/sample use
......@@ -771,7 +776,16 @@ reply.
Domain Interface and ICD is the commercial interface
by P&E.
54-59 UNALLOCATED
54 char Electrocardiognosis Holter serial card
0 = /dev/holter0 First Holter port
1 = /dev/holter1 Second Holter port
2 = /dev/holter2 Third Holter port
A custom serial card used by Electrocardiognosis SRL
<mseritan@ottonel.pub.ro> to transfer data from Holter
24-hour heart monitoring equipment.
55-59 UNALLOCATED
60-63 LOCAL/EXPERIMENTAL USE
Allocated for local/experimental use. For devices not
......
VERSION = 2
PATCHLEVEL = 0
SUBLEVEL = 4
SUBLEVEL = 5
ARCH = i386
......
......@@ -56,7 +56,7 @@ vmlinux.nh: tools/build
vmlinux: $(TOPDIR)/vmlinux
cp $(TOPDIR)/vmlinux vmlinux
quickstrip vmlinux
strip vmlinux
tools/lxboot: tools/build
tools/build > tools/lxboot
......
......@@ -82,7 +82,7 @@ then
define_bool CONFIG_ALPHA_AVANTI y
fi
bool 'Echo console messages on /dev/ttyS1' CONFIG_SERIAL_ECHO
bool 'Echo console messages on /dev/ttyS0 (COM1)' CONFIG_SERIAL_ECHO
if [ "$CONFIG_PCI" = "y" ]; then
bool 'TGA Console Support' CONFIG_TGA_CONSOLE
if [ "$CONFIG_EXPERIMENTAL" = "y" ]; then
......
......@@ -491,27 +491,30 @@ void apecs_machine_check(unsigned long vector, unsigned long la_ptr,
struct pt_regs * regs)
{
struct el_common *mchk_header;
struct el_procdata *mchk_procdata;
struct el_apecs_sysdata_mcheck *mchk_sysdata;
unsigned long *ptr;
int i;
mchk_header = (struct el_common *)la_ptr;
mchk_header = (struct el_common *)la_ptr;
mchk_procdata = (struct el_procdata *)
(la_ptr + mchk_header->proc_offset - sizeof(mchk_procdata->paltemp));
mchk_sysdata =
(struct el_apecs_sysdata_mcheck *)(la_ptr + mchk_header->sys_offset);
DBG(("apecs_machine_check: vector=0x%lx la_ptr=0x%lx\n", vector, la_ptr));
DBG((" pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
regs->pc, mchk_header->size, mchk_header->proc_offset, mchk_header->sys_offset));
DBG(("apecs_machine_check: expected %d DCSR 0x%lx PEAR 0x%lx\n",
apecs_mcheck_expected, mchk_sysdata->epic_dcsr, mchk_sysdata->epic_pear));
#ifdef DEBUG
{
unsigned long *ptr;
int i;
ptr = (unsigned long *)la_ptr;
for (i = 0; i < mchk_header->size / sizeof(long); i += 2) {
printk("apecs_machine_check: vector=0x%lx la_ptr=0x%lx\n",
vector, la_ptr);
printk(" pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
regs->pc, mchk_header->size, mchk_header->proc_offset,
mchk_header->sys_offset);
printk("apecs_machine_check: expected %d DCSR 0x%lx PEAR 0x%lx\n",
apecs_mcheck_expected, mchk_sysdata->epic_dcsr,
mchk_sysdata->epic_pear);
ptr = (unsigned long *)la_ptr;
for (i = 0; i < mchk_header->size / sizeof(long); i += 2) {
printk(" +%lx %lx %lx\n", i*sizeof(long), ptr[i], ptr[i+1]);
}
}
#endif /* DEBUG */
......@@ -520,9 +523,13 @@ void apecs_machine_check(unsigned long vector, unsigned long la_ptr,
* ignore the machine check.
*/
#ifdef CONFIG_ALPHA_MIKASA
/* for now on MIKASA, if it was expected, ignore it */
/* we need the details of the mcheck frame to really know... */
if (apecs_mcheck_expected) {
#define MCHK_NO_DEVSEL 0x205L
#define MCHK_NO_TABT 0x204L
if (apecs_mcheck_expected &&
(((unsigned int)mchk_procdata->paltemp[0] == MCHK_NO_DEVSEL) ||
((unsigned int)mchk_procdata->paltemp[0] == MCHK_NO_TABT))
)
{
#else
if (apecs_mcheck_expected && (mchk_sysdata->epic_dcsr && 0x0c00UL)) {
#endif
......@@ -534,7 +541,33 @@ void apecs_machine_check(unsigned long vector, unsigned long la_ptr,
wrmces(0x7);
mb();
draina();
DBG(("apecs_machine_check: EXPECTED\n"));
}
else if (vector == 0x620 || vector == 0x630) {
wrmces(0x1f); /* disable correctable from now on */
mb();
draina();
printk("apecs_machine_check: HW correctable (0x%lx)\n", vector);
}
else {
printk("APECS machine check:\n");
printk(" vector=0x%lx la_ptr=0x%lx\n",
vector, la_ptr);
printk(" pc=0x%lx size=0x%x procoffset=0x%x sysoffset 0x%x\n",
regs->pc, mchk_header->size, mchk_header->proc_offset,
mchk_header->sys_offset);
printk(" expected %d DCSR 0x%lx PEAR 0x%lx\n",
apecs_mcheck_expected, mchk_sysdata->epic_dcsr,
mchk_sysdata->epic_pear);
ptr = (unsigned long *)la_ptr;
for (i = 0; i < mchk_header->size / sizeof(long); i += 2) {
printk(" +%lx %lx %lx\n", i*sizeof(long), ptr[i], ptr[i+1]);
}
#if 0
/* doesn't work with MILO */
show_regs(regs);
#endif
}
}
#endif /* CONFIG_ALPHA_APECS */
......@@ -446,6 +446,41 @@ static inline void cabriolet_and_eb66p_device_interrupt(unsigned long vector,
restore_flags(flags);
}
static inline void mikasa_device_interrupt(unsigned long vector,
struct pt_regs * regs)
{
unsigned long pld;
unsigned int i;
unsigned long flags;
save_flags(flags);
cli();
/* read the interrupt summary registers */
pld = (((unsigned long) (~inw(0x534)) & 0x0000ffffUL) << 16) |
(((unsigned long) inb(0xa0)) << 8) |
((unsigned long) inb(0x20));
#if 0
printk("[0x%08lx]", pld);
#endif
/*
* Now for every possible bit set, work through them and call
* the appropriate interrupt handler.
*/
while (pld) {
i = ffz(~pld);
pld &= pld - 1; /* clear least bit set */
if (i < 16) {
isa_device_interrupt(vector, regs);
} else {
device_interrupt(i, i, regs);
}
}
restore_flags(flags);
}
static inline void eb66_and_eb64p_device_interrupt(unsigned long vector,
struct pt_regs * regs)
{
......@@ -622,12 +657,10 @@ asmlinkage void do_entInt(unsigned long type, unsigned long vector, unsigned lon
srm_device_interrupt(vector, &regs);
#elif NR_IRQS == 33
cabriolet_and_eb66p_device_interrupt(vector, &regs);
#elif defined(CONFIG_ALPHA_MIKASA)
mikasa_device_interrupt(vector, &regs);
#elif NR_IRQS == 32
# ifdef CONFIG_ALPHA_MIKASA
# error we got a problem here Charlie MIKASA should be SRM console
# else
eb66_and_eb64p_device_interrupt(vector, &regs);
# endif
#elif NR_IRQS == 16
isa_device_interrupt(vector, &regs);
#endif
......
......@@ -19,6 +19,7 @@
/*
* Changes by tytso to allow root device specification
* High loaded stuff by Hans Lermen & Werner Almesberger, Feb. 1996
* Cross compiling fixes by Gertjan van Wingerde, July 1996
*/
#include <stdio.h> /* fprintf */
......@@ -56,6 +57,7 @@ static int GCC_HEADER = sizeof(struct exec);
#define STRINGIFY(x) #x
typedef union {
int i;
long l;
short s[2];
char b[4];
......@@ -72,6 +74,17 @@ long intel_long(long l)
return t.l;
}
int intel_int(int i)
{
conv t;
t.b[0] = i & 0xff; i >>= 8;
t.b[1] = i & 0xff; i >>= 8;
t.b[2] = i & 0xff; i >>= 8;
t.b[3] = i & 0xff; i >>= 8;
return t.i;
}
short intel_short(short l)
{
conv t;
......@@ -94,8 +107,8 @@ void usage(void)
int main(int argc, char ** argv)
{
int i,c,id, sz;
unsigned long sys_size;
int i,c,id,sz,tmp_int;
unsigned long sys_size, tmp_long;
char buf[1024];
#ifndef __BFD__
struct exec *ex = (struct exec *)buf;
......@@ -180,12 +193,17 @@ int main(int argc, char ** argv)
#ifdef __BIG_KERNEL__
{
if (!i) {
if (*((long *)(&buf[2])) != 0x53726448 )
/* Working with memcpy because of alignment constraints
on Sparc - Gertjan */
memcpy(&tmp_long, &buf[2], sizeof(long));
if (tmp_long != intel_long(0x53726448) )
die("Wrong magic in loader header of 'setup'");
if (*((int *)(&buf[6])) < 0x200 )
memcpy(&tmp_int, &buf[6], sizeof(int));
if (tmp_int < intel_int(0x200))
die("Wrong version of loader header of 'setup'");
buf[0x11] = 1; /* LOADED_HIGH */
*((long *)(&buf[0x14])) = 0x100000; /* code32_start */
tmp_long = intel_long(0x100000);
memcpy(&buf[0x14], &tmp_long, sizeof(long)); /* code32_start */
}
#endif
if (write(1,buf,c)!=c)
......
......@@ -104,6 +104,7 @@
* from Ben Galliart <bgallia@luc.edu> with
* special help from Jeff Lightfoot
* <jeffml@netcom.com>
* 3.15a July 9, 1996 -- Improved Sanyo 3 CD changer identification
*
* NOTE: Direct audio reads will only work on some types of drive.
* So far, i've received reports of success for Sony and Toshiba drives.
......@@ -2657,7 +2658,8 @@ void ide_cdrom_setup (ide_drive_t *drive)
/* Sanyo 3 CD changer uses a non-standard command
for CD changing */
else if (strcmp (drive->id->model, "CD-ROM CDR-C3 G") == 0) {
else if ((strcmp(drive->id->model, "CD-ROM CDR-C3 G") == 0) ||
(strcmp(drive->id->model, "CD-ROM CDR-C3G") == 0)) {
/* uses CD in slot 0 when value is set to 3 */
CDROM_STATE_FLAGS (drive)->sanyo_slot = 3;
}
......
......@@ -457,7 +457,7 @@ int cdrom_ioctl(struct inode *ip, struct file *fp,
}
case CDROMPLAYMSF: {
struct cdrom_msf msf;
GETARG(struct cdrom_mdf, msf);
GETARG(struct cdrom_msf, msf);
return cdo->audio_ioctl(dev, cmd, &msf);
}
case CDROMPLAYTRKIND: {
......@@ -467,13 +467,13 @@ int cdrom_ioctl(struct inode *ip, struct file *fp,
}
case CDROMVOLCTRL: {
struct cdrom_volctrl volume;
GETARG(struct cdrom_volctl, volume);
GETARG(struct cdrom_volctrl, volume);
return cdo->audio_ioctl(dev, cmd, &volume);
}
case CDROMVOLREAD: {
struct cdrom_volctrl volume;
if (!cdo->audio_ioctl(dev, cmd, &volume)) {
PUTARG(struct cdrom_volctl, volume);
PUTARG(struct cdrom_volctrl, volume);
return 0;
}
return -EINVAL;
......
......@@ -1918,12 +1918,8 @@ dc21040_autoconf(struct device *dev)
break;
case NC:
#ifndef __alpha__
/* default to TP for all */
reset_init_sia(dev, 0x8f01, 0xffff, 0x0000);
#else
/* JAE: for Alpha, default to BNC/AUI, *not* TP */
reset_init_sia(dev, 0x8f09, 0x0705, 0x0006);
#endif /* i386 */
if (lp->media != lp->c_media) {
de4x5_dbg_media(dev);
lp->c_media = lp->media;
......
......@@ -29,6 +29,7 @@ Written by Gerard Roudier <groudier@club-internet.fr>
14. Control commands under linux-1.2.13
15. Known problems
15.1 Tagged commands with Iomega Jaz device
15.2 Tagged command queueing cannot be disabled at run time
===============================================================================
......@@ -189,8 +190,9 @@ Chip Device id Revision Id
The profiling informations are updated upon completion of scsi commands.
The data structure is allocated and zeroed when the host adapter is
attached. So, if the driver is a module you can reset the profiling data
by unloading and reloading the driver.
attached. So, if the driver is a module, the profile counters are cleared each
time the driver is loaded.
The "clearprof" command allow to clear these counters at any time.
The following counters are available:
("num" prefix means "number of", "ms" means milli-seconds)
......@@ -290,6 +292,7 @@ Available commands:
target: target number
tags: number of concurrent tagged commands
must not be greater than SCSI_NCR_MAX_TAGS (default: 4)
must not be lower that 1 (see: known problems)
8.4 Set order type for tagged command
......@@ -316,10 +319,10 @@ Available commands:
tiny: print minimal debugging informations
timing: print timing informations of the ncr chip.
nego: print informations about scsi negotiations
phase: printf informations on script interruptions
phase: print informations on script interruptions
8.5 Clear profile counters
8.6 Clear profile counters
clearprof
......@@ -556,5 +559,12 @@ The other problems that may appear are timeouts. The only way to avoid timeouts
seems to edit linux/drivers/scsi/sd.c and to increase the current timeout
values.
15.2 Tagged command queuing cannot be disabled at run time
Once Tagged command queuing has been enabled, the driver will not allow to
disable this feature ("settags <target> 0" is not supported).
This problem is due to some limitations of the code added to the Linux version
of the driver.
===============================================================================
End of NCR53C8XX driver README file
/*
* eata.c - Low-level driver for EATA/DMA SCSI host adapters.
*
* 09 Jul 1996 rev. 2.11 for linux 2.0.4
* Number of internal retries is now limited.
*
* 16 Apr 1996 rev. 2.10 for linux 1.3.90
* New argument "reset_flags" to the reset routine.
*
......@@ -156,6 +159,7 @@ struct proc_dir_entry proc_scsi_eata2x = {
#define MAX_BOARDS 18
#define MAX_MAILBOXES 64
#define MAX_SGLIST 64
#define MAX_INTERNAL_RETRIES 64
#define MAX_CMD_PER_LUN 2
#define FALSE 0
......@@ -313,6 +317,8 @@ struct hostdata {
int in_reset; /* True if board is doing a reset */
int target_time_out[MAX_TARGET]; /* N. of timeout errors on target */
int target_reset[MAX_TARGET]; /* If TRUE redo operation on target */
unsigned int retries; /* Number of internal retries */
unsigned long last_retried_pid; /* Pid of last retried command */
unsigned char subversion; /* Bus type, either ISA or ESA */
unsigned char protocol_rev; /* EATA 2.0 rev., 'A' or 'B' or 'C' */
struct mssp sp[MAX_MAILBOXES]; /* Returned status for this board */
......@@ -802,6 +808,8 @@ int eata2x_reset (Scsi_Cmnd *SCarg, unsigned int reset_flags) {
return SCSI_RESET_ERROR;
}
HD(j)->retries = 0;
for (k = 0; k < MAX_TARGET; k++) HD(j)->target_reset[k] = TRUE;
for (k = 0; k < MAX_TARGET; k++) HD(j)->target_time_out[k] = 0;
......@@ -1008,6 +1016,8 @@ static void eata2x_interrupt_handler(int irq, void *dev_id, struct pt_regs * reg
HD(j)->target_time_out[SCpnt->target] = 0;
if (HD(j)->last_retried_pid == SCpnt->pid) HD(j)->retries = 0;
break;
case ASST: /* Selection Time Out */
case 0x02: /* Command Time Out */
......@@ -1020,17 +1030,23 @@ static void eata2x_interrupt_handler(int irq, void *dev_id, struct pt_regs * reg
}
break;
/* Perform a limited number of internal retries */
case 0x03: /* SCSI Bus Reset Received */
case 0x04: /* Initial Controller Power-up */
if (SCpnt->device->type != TYPE_TAPE)
status = DID_BUS_BUSY << 16;
else
status = DID_ERROR << 16;
for (k = 0; k < MAX_TARGET; k++)
HD(j)->target_reset[k] = TRUE;
if (SCpnt->device->type != TYPE_TAPE
&& HD(j)->retries < MAX_INTERNAL_RETRIES) {
status = DID_BUS_BUSY << 16;
HD(j)->retries++;
HD(j)->last_retried_pid = SCpnt->pid;
}
else
status = DID_ERROR << 16;
break;
case 0x07: /* Bus Parity Error */
case 0x0c: /* Controller Ram Parity */
......@@ -1058,7 +1074,7 @@ static void eata2x_interrupt_handler(int irq, void *dev_id, struct pt_regs * reg
spp->adapter_status != ASST && HD(j)->iocount <= 1000) ||
do_trace)
#endif
printk("%s: ihdlr, mbox %d, err 0x%x:%x,"\
printk("%s: ihdlr, mbox %2d, err 0x%x:%x,"\
" target %d:%d, pid %ld, count %d.\n",
BN(j), i, spp->adapter_status, spp->target_status,
SCpnt->target, SCpnt->lun, SCpnt->pid, HD(j)->iocount);
......
......@@ -11,7 +11,7 @@ int eata2x_queuecommand(Scsi_Cmnd *, void (*done)(Scsi_Cmnd *));
int eata2x_abort(Scsi_Cmnd *);
int eata2x_reset(Scsi_Cmnd *, unsigned int);
#define EATA_VERSION "2.10.00"
#define EATA_VERSION "2.11.00"
#define EATA { \
......
......@@ -8165,7 +8165,7 @@ printf("ncr_user_command: retv=%d\n", retv);
#endif
}
else {
if (*start)
if (start)
*start = buffer;
retv = ncr_host_info(ncb, buffer, offset, length);
}
......
......@@ -63,7 +63,7 @@
the latest firmware provided by QLogic. This may be an earlier/later
revision than supplied by your board. */
#define RELOAD_FIRMWARE 0
#define RELOAD_FIRMWARE 1
/* Set the following macro to 1 to reload the ISP1020's defaults from nvram.
If you are not sure of your settings, leave this alone, the driver will
......
......@@ -92,7 +92,7 @@ static int update_timeout (Scsi_Cmnd *, int);
static void print_inquiry(unsigned char *data);
static void scsi_times_out (Scsi_Cmnd * SCpnt);
static int scan_scsis_single (int channel,int dev,int lun,int * max_scsi_dev ,
Scsi_Device ** SDpnt, Scsi_Cmnd * SCpnt,
int * sparse_lun, Scsi_Device ** SDpnt, Scsi_Cmnd * SCpnt,
struct Scsi_Host *shpnt, char * scsi_result);
void scsi_build_commandblocks(Scsi_Device * SDpnt);
......@@ -226,6 +226,7 @@ static void scsi_dump_status(void);
#define BLIST_KEY 0x08
#define BLIST_SINGLELUN 0x10
#define BLIST_NOTQ 0x20
#define BLIST_SPARSELUN 0x40
struct dev_info{
const char * vendor;
......@@ -292,7 +293,8 @@ static struct dev_info device_list[] =
{"NRC","MBR-7","*", BLIST_FORCELUN | BLIST_SINGLELUN},
{"PIONEER","CD-ROM DRM-602X","*", BLIST_FORCELUN | BLIST_SINGLELUN},
{"PIONEER","CD-ROM DRM-604X","*", BLIST_FORCELUN | BLIST_SINGLELUN},
{"EMULEX","MD21/S2 ESDI","*",BLIST_SINGLELUN},
{"EMULEX","MD21/S2 ESDI","*", BLIST_SINGLELUN},
{"CANON","IPUBJD","*", BLIST_SPARSELUN},
/*
* Must be at end of list...
*/
......@@ -415,7 +417,7 @@ static void scan_scsis (struct Scsi_Host *shpnt, unchar hardcoded,
unsigned char scsi_result0[256];
unsigned char *scsi_result;
Scsi_Device *SDpnt;
int max_dev_lun;
int max_dev_lun, sparse_lun;
Scsi_Cmnd *SCpnt;
SCpnt = (Scsi_Cmnd *) scsi_init_malloc (sizeof (Scsi_Cmnd), GFP_ATOMIC | GFP_DMA);
......@@ -449,8 +451,8 @@ static void scan_scsis (struct Scsi_Host *shpnt, unchar hardcoded,
if(dev >= shpnt->max_id) goto leave;
lun = hlun;
if(lun >= shpnt->max_lun) goto leave;
scan_scsis_single (channel, dev, lun, &max_dev_lun,
&SDpnt, SCpnt, shpnt, scsi_result);
scan_scsis_single (channel, dev, lun, &max_dev_lun, &sparse_lun,
&SDpnt, SCpnt, shpnt, scsi_result);
if(SDpnt!=oldSDpnt) {
/* it could happen the blockdevice hasn't yet been inited */
......@@ -483,9 +485,12 @@ static void scan_scsis (struct Scsi_Host *shpnt, unchar hardcoded,
*/
max_dev_lun = (max_scsi_luns < shpnt->max_lun ?
max_scsi_luns : shpnt->max_lun);
sparse_lun = 0;
for (lun = 0; lun < max_dev_lun; ++lun) {
if (!scan_scsis_single (channel, dev, lun, &max_dev_lun,
&SDpnt, SCpnt, shpnt, scsi_result))
&sparse_lun, &SDpnt, SCpnt, shpnt,
scsi_result)
&& !sparse_lun)
break; /* break means don't probe further for luns!=0 */
} /* for lun ends */
} /* if this_id != id ends */
......@@ -528,8 +533,8 @@ static void scan_scsis (struct Scsi_Host *shpnt, unchar hardcoded,
* Global variables used : scsi_devices(linked list)
*/
int scan_scsis_single (int channel, int dev, int lun, int *max_dev_lun,
Scsi_Device **SDpnt2, Scsi_Cmnd * SCpnt, struct Scsi_Host * shpnt,
char *scsi_result)
int *sparse_lun, Scsi_Device **SDpnt2, Scsi_Cmnd * SCpnt,
struct Scsi_Host * shpnt, char *scsi_result)
{
unsigned char scsi_cmd[12];
struct Scsi_Device_Template *sdtpnt;
......@@ -795,6 +800,16 @@ int scan_scsis_single (int channel, int dev, int lun, int *max_dev_lun,
if (bflags & BLIST_SINGLELUN)
SDpnt->single_lun = 1;
/*
* If this device is known to support sparse multiple units, override the
* other settings, and scan all of them.
*/
if (bflags & BLIST_SPARSELUN) {
*max_dev_lun = 8;
*sparse_lun = 1;
return 1;
}
/*
* If this device is known to support multiple units, override the other
* settings, and scan all of them.
......
......@@ -1054,7 +1054,7 @@ static int sd_init_onedisk(int i)
* Issue command to spin up drive for these cases. */
if(the_result && !rscsi_disks[i].device->removable &&
SCpnt->sense_buffer[2] == NOT_READY) {
int time1;
unsigned long time1;
if(!spintime){
printk( "sd%c: Spinning up disk...", 'a' + i );
cmd[0] = START_STOP;
......@@ -1081,8 +1081,8 @@ static int sd_init_onedisk(int i)
spintime = jiffies;
}
time1 = jiffies;
while(jiffies < time1 + HZ); /* Wait 1 second for next try */
time1 = jiffies + HZ;
while(jiffies < time1); /* Wait 1 second for next try */
printk( "." );
}
} while(the_result && spintime && spintime+100*HZ > jiffies);
......
/*
* u14-34f.c - Low-level driver for UltraStor 14F/34F SCSI host adapters.
*
* 09 Jul 1996 rev. 2.11 for linux 2.0.4
* "Data over/under-run" no longer implies a redo on all targets.
* Number of internal retries is now limited.
*
* 16 Apr 1996 rev. 2.10 for linux 1.3.90
* New argument "reset_flags" to the reset routine.
*
......@@ -199,6 +203,7 @@ struct proc_dir_entry proc_scsi_u14_34f = {
#define MAX_MAILBOXES 16
#define MAX_SGLIST 32
#define MAX_SAFE_SGLIST 16
#define MAX_INTERNAL_RETRIES 64
#define MAX_CMD_PER_LUN 2
#define FALSE 0
......@@ -280,6 +285,8 @@ struct hostdata {
int in_reset; /* True if board is doing a reset */
int target_time_out[MAX_TARGET]; /* N. of timeout errors on target */
int target_reset[MAX_TARGET]; /* If TRUE redo operation on target */
unsigned int retries; /* Number of internal retries */
unsigned long last_retried_pid; /* Pid of last retried command */
unsigned char subversion; /* Bus type, either ISA or ESA */
unsigned char heads;
unsigned char sectors;
......@@ -763,6 +770,8 @@ int u14_34f_reset(Scsi_Cmnd * SCarg, unsigned int reset_flags) {
return SCSI_RESET_ERROR;
}
HD(j)->retries = 0;
for (k = 0; k < MAX_TARGET; k++) HD(j)->target_reset[k] = TRUE;
for (k = 0; k < MAX_TARGET; k++) HD(j)->target_time_out[k] = 0;
......@@ -972,6 +981,8 @@ static void u14_34f_interrupt_handler(int irq, void *dev_id, struct pt_regs * re
HD(j)->target_time_out[SCpnt->target] = 0;
if (HD(j)->last_retried_pid == SCpnt->pid) HD(j)->retries = 0;
break;
case ASST: /* Selection Time Out */
......@@ -983,20 +994,27 @@ static void u14_34f_interrupt_handler(int irq, void *dev_id, struct pt_regs * re
}
break;
case 0x92: /* Data over/under-run */
/* Perform a limited number of internal retries */
case 0x93: /* Unexpected bus free */
case 0x94: /* Target bus phase sequence failure */
case 0x96: /* Illegal SCSI command */
case 0xa3: /* SCSI bus reset error */
if (SCpnt->device->type != TYPE_TAPE)
status = DID_BUS_BUSY << 16;
else
status = DID_ERROR << 16;
for (k = 0; k < MAX_TARGET; k++)
HD(j)->target_reset[k] = TRUE;
case 0x92: /* Data over/under-run */
if (SCpnt->device->type != TYPE_TAPE
&& HD(j)->retries < MAX_INTERNAL_RETRIES) {
status = DID_BUS_BUSY << 16;
HD(j)->retries++;
HD(j)->last_retried_pid = SCpnt->pid;
}
else
status = DID_ERROR << 16;
break;
case 0x01: /* Invalid command */
case 0x02: /* Invalid parameters */
......@@ -1023,7 +1041,7 @@ static void u14_34f_interrupt_handler(int irq, void *dev_id, struct pt_regs * re
spp->adapter_status != ASST && HD(j)->iocount <= 1000) ||
do_trace)
#endif
printk("%s: ihdlr, mbox %d, err 0x%x:%x,"\
printk("%s: ihdlr, mbox %2d, err 0x%x:%x,"\
" target %d:%d, pid %ld, count %d.\n",
BN(j), i, spp->adapter_status, spp->target_status,
SCpnt->target, SCpnt->lun, SCpnt->pid, HD(j)->iocount);
......
......@@ -10,7 +10,7 @@ int u14_34f_abort(Scsi_Cmnd *);
int u14_34f_reset(Scsi_Cmnd *, unsigned int);
int u14_34f_biosparam(Disk *, kdev_t, int *);
#define U14_34F_VERSION "2.10.00"
#define U14_34F_VERSION "2.11.00"
#define ULTRASTOR_14_34F { \
NULL, /* Ptr for modules */ \
......
......@@ -1549,7 +1549,7 @@ guswave_start_note2 (int dev, int voice, int note_num, int volume)
gus_write_addr (0x02, sample_ptrs[sample] + samples[sample].loop_start,
samples[sample].fractions & 0x0f,
is16bits); /* Loop start location */
gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].len,
gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].loop_end,
(samples[sample].fractions >> 4) & 0x0f,
is16bits); /* Loop end location */
}
......@@ -1560,7 +1560,7 @@ guswave_start_note2 (int dev, int voice, int note_num, int volume)
voices[voice].loop_irq_parm = 1;
gus_write_addr (0x02, sample_ptrs[sample],
0, is16bits); /* Loop start location */
gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].loop_end - 1,
gus_write_addr (0x04, sample_ptrs[sample] + samples[sample].len - 1,
(samples[sample].fractions >> 4) & 0x0f,
is16bits); /* Loop end location */
}
......
......@@ -130,14 +130,14 @@ sbintr (int irq, void *dev_id, struct pt_regs *dummy)
sb_devc *devc = irq2devc[irq];
devc->irq_ok = 1;
if (devc == NULL || devc->irq != irq)
{
DEB (printk ("sbintr: Bogus interrupt IRQ%d\n", irq));
return;
}
devc->irq_ok = 1;
if (devc->model == MDL_SB16)
{
......@@ -671,10 +671,14 @@ sb_dsp_init (struct address_info *hw_config)
devc->dev = num_audiodevs;
devc->caps = hw_config->driver_use_1;
irq2devc[hw_config->irq] = devc;
devc->irq_ok = 0;
if (snd_set_irq_handler (hw_config->irq,
sbintr, "sound blaster", devc->osp) < 0)
{
printk ("SB: Can't allocate IRQ%d\n", hw_config->irq);
irq2devc[hw_config->irq] = NULL;
return;
}
......@@ -697,9 +701,6 @@ sb_dsp_init (struct address_info *hw_config)
}
}
irq2devc[hw_config->irq] = devc;
devc->irq_ok = 0;
for (n = 0; n < 3 && devc->irq_ok == 0; n++)
if (sb_dsp_command (devc, 0xf2)) /* Cause interrupt immediately */
{
......@@ -1173,7 +1174,7 @@ probe_sbmpu (struct address_info *hw_config)
}
hw_config->name = "Sound Blaster 16";
hw_config->irq = -devc->irq;
sb16_set_mpu_port(devc, hw_config)
sb16_set_mpu_port(devc, hw_config);
break;
case MDL_ESS:
......
......@@ -163,10 +163,12 @@ int ext2_lookup (struct inode * dir, const char * name, int len,
return -ENOENT;
if (!S_ISDIR(dir->i_mode)) {
iput (dir);
return -ENOENT;
return -ENOTDIR;
}
if (len > EXT2_NAME_LEN)
if (len > EXT2_NAME_LEN) {
iput (dir);
return -ENAMETOOLONG;
}
if (dcache_lookup(dir, name, len, &ino)) {
if (!ino) {
iput(dir);
......@@ -407,8 +409,10 @@ int ext2_mknod (struct inode * dir, const char * name, int len, int mode,
if (!dir)
return -ENOENT;
if (len > EXT2_NAME_LEN)
if (len > EXT2_NAME_LEN) {
iput (dir);
return -ENAMETOOLONG;
}
bh = ext2_find_entry (dir, name, len, &de);
if (bh) {
brelse (bh);
......@@ -472,8 +476,10 @@ int ext2_mkdir (struct inode * dir, const char * name, int len, int mode)
if (!dir)
return -ENOENT;
if (len > EXT2_NAME_LEN)
if (len > EXT2_NAME_LEN) {
iput (dir);
return -ENAMETOOLONG;
}
bh = ext2_find_entry (dir, name, len, &de);
if (bh) {
brelse (bh);
......@@ -611,8 +617,10 @@ int ext2_rmdir (struct inode * dir, const char * name, int len)
if (!dir)
return -ENOENT;
inode = NULL;
if (len > EXT2_NAME_LEN)
if (len > EXT2_NAME_LEN) {
iput (dir);
return -ENAMETOOLONG;
}
bh = ext2_find_entry (dir, name, len, &de);
retval = -ENOENT;
if (!bh)
......@@ -699,8 +707,10 @@ int ext2_unlink (struct inode * dir, const char * name, int len)
return -ENOENT;
retval = -ENOENT;
inode = NULL;
if (len > EXT2_NAME_LEN)
if (len > EXT2_NAME_LEN) {
iput (dir);
return -ENAMETOOLONG;
}
bh = ext2_find_entry (dir, name, len, &de);
if (!bh)
goto end_unlink;
......
......@@ -599,7 +599,7 @@ ncp_request(struct ncp_server *server, int function)
if (server->has_subfunction != 0)
{
*(__u16 *)&(h->data[0]) = request_size - 2;
*(__u16 *)&(h->data[0]) = htons(request_size - 2);
}
h->type = NCP_REQUEST;
......
......@@ -414,6 +414,77 @@ extern unsigned long apecs_init (unsigned long mem_start,
/*
* Data structure for handling APECS machine checks:
*/
#ifdef CONFIG_ALPHA_MIKASA
struct el_apecs_sysdata_mcheck {
unsigned long coma_gcr;
unsigned long coma_edsr;
unsigned long coma_ter;
unsigned long coma_elar;
unsigned long coma_ehar;
unsigned long coma_ldlr;
unsigned long coma_ldhr;
unsigned long coma_base0;
unsigned long coma_base1;
unsigned long coma_base2;
unsigned long coma_base3;
unsigned long coma_cnfg0;
unsigned long coma_cnfg1;
unsigned long coma_cnfg2;
unsigned long coma_cnfg3;
unsigned long epic_dcsr;
unsigned long epic_pear;
unsigned long epic_sear;
unsigned long epic_tbr1;
unsigned long epic_tbr2;
unsigned long epic_pbr1;
unsigned long epic_pbr2;
unsigned long epic_pmr1;
unsigned long epic_pmr2;
unsigned long epic_harx1;
unsigned long epic_harx2;
unsigned long epic_pmlt;
unsigned long epic_tag0;
unsigned long epic_tag1;
unsigned long epic_tag2;
unsigned long epic_tag3;
unsigned long epic_tag4;
unsigned long epic_tag5;
unsigned long epic_tag6;
unsigned long epic_tag7;
unsigned long epic_data0;
unsigned long epic_data1;
unsigned long epic_data2;
unsigned long epic_data3;
unsigned long epic_data4;
unsigned long epic_data5;
unsigned long epic_data6;
unsigned long epic_data7;
unsigned long pceb_vid;
unsigned long pceb_did;
unsigned long pceb_revision;
unsigned long pceb_command;
unsigned long pceb_status;
unsigned long pceb_latency;
unsigned long pceb_control;
unsigned long pceb_arbcon;
unsigned long pceb_arbpri;
unsigned long esc_id;
unsigned long esc_revision;
unsigned long esc_int0;
unsigned long esc_int1;
unsigned long esc_elcr0;
unsigned long esc_elcr1;
unsigned long esc_last_eisa;
unsigned long esc_nmi_stat;
unsigned long pci_ir;
unsigned long pci_imr;
unsigned long svr_mgr;
};
#else /* CONFIG_ALPHA_MIKASA */
/* this for the normal APECS machines */
struct el_apecs_sysdata_mcheck {
unsigned long coma_gcr;
unsigned long coma_edsr;
......@@ -457,6 +528,31 @@ struct el_apecs_sysdata_mcheck {
unsigned long epic_data6;
unsigned long epic_data7;
};
#endif /* CONFIG_ALPHA_MIKASA */
struct el_procdata {
unsigned long paltemp[32]; /* PAL TEMP REGS. */
/* EV4-specific fields */
unsigned long exc_addr; /* Address of excepting instruction. */
unsigned long exc_sum; /* Summary of arithmetic traps. */
unsigned long exc_mask; /* Exception mask (from exc_sum). */
unsigned long iccsr; /* IBox hardware enables. */
unsigned long pal_base; /* Base address for PALcode. */
unsigned long hier; /* Hardware Interrupt Enable. */
unsigned long hirr; /* Hardware Interrupt Request. */
unsigned long csr; /* D-stream fault info. */
unsigned long dc_stat; /* D-cache status (ECC/Parity Err). */
unsigned long dc_addr; /* EV3 Phys Addr for ECC/DPERR. */
unsigned long abox_ctl; /* ABox Control Register. */
unsigned long biu_stat; /* BIU Status. */
unsigned long biu_addr; /* BUI Address. */
unsigned long biu_ctl; /* BIU Control. */
unsigned long fill_syndrome;/* For correcting ECC errors. */
unsigned long fill_addr; /* Cache block which was being read */
unsigned long va; /* Effective VA of fault or miss. */
unsigned long bc_tag; /* Backup Cache Tag Probe Results.*/
};
#define RTC_PORT(x) (0x70 + (x))
#define RTC_ADDR(x) (0x80 | (x))
......
......@@ -3,7 +3,7 @@
struct dirent {
long d_ino;
off_t d_off;
__kernel_off_t d_off;
unsigned short d_reclen;
char d_name[256]; /* We must not include limits.h! */
};
......
......@@ -102,6 +102,7 @@ struct msghdr
#define IPTOS_LOWDELAY 0x10
#define IPTOS_THROUGHPUT 0x08
#define IPTOS_RELIABILITY 0x04
#define IPTOS_MINCOST 0x02
#define IP_TTL 2
#define IP_HDRINCL 3
#define IP_OPTIONS 4
......
......@@ -109,7 +109,7 @@ static inline int try_to_swap_out(struct task_struct * tsk, struct vm_area_struc
if (page_map->count != 1)
return 0;
if (!(entry = get_swap_page()))
return 0;
return -1; /* Aieee!!! Out of swap space! */
vma->vm_mm->rss--;
flush_cache_page(vma, address);
set_pte(page_table, __pte(entry));
......@@ -312,6 +312,8 @@ static int swap_out(unsigned int priority, int dma, int wait)
if (!--p->swap_cnt)
swap_task++;
switch (swap_out_process(p, dma, wait)) {
case -1:
return 0;
case 0:
if (p->swap_cnt)
swap_task++;
......
......@@ -842,6 +842,8 @@ int ip_build_xmit(struct sock *sk,
NULL, NULL, 0)>0)
skb->arp=1;
}
else
skb->arp = 1;
/*
* Find where to start putting bytes.
......
......@@ -178,17 +178,18 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
kfree_s(old_opt, sizeof(struct optlen) + old_opt->optlen);
return 0;
}
case IP_TOS: /* This sets both TOS and Precedence */
if (val<0 || val>63) /* Reject setting of unused bits */
case IP_TOS: /* This sets both TOS and Precedence */
if (val & ~0xfe) /* Reject setting of unused bits */
return -EINVAL;
if ((val&7) > 4 && !suser()) /* Only root can set Prec>4 */
if ((val>>5) > 4 && !suser()) /* Only root can set Prec>4 */
return -EPERM;
sk->ip_tos=val;
switch (val & 0x38) {
switch (val & 0x1E) {
case IPTOS_LOWDELAY:
sk->priority=SOPRI_INTERACTIVE;
break;
case IPTOS_THROUGHPUT:
case IPTOS_MINCOST:
sk->priority=SOPRI_BACKGROUND;
break;
default:
......@@ -270,7 +271,6 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
* FIXME: Add/Del membership should have a semaphore protecting them from re-entry
*/
struct ip_mreq mreq;
__u32 route_src;
struct rtable *rt;
struct device *dev=NULL;
......@@ -295,9 +295,8 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
*/
if((rt=ip_rt_route(mreq.imr_multiaddr.s_addr,0))!=NULL)
{
dev=rt->rt_dev;
route_src = rt->rt_src;
atomic_dec(&rt->rt_use);
dev=rt->u.dst.dev;
atomic_dec(&rt->u.dst.use);
ip_rt_put(rt);
}
}
......@@ -328,7 +327,6 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
{
struct ip_mreq mreq;
struct rtable *rt;
__u32 route_src;
struct device *dev=NULL;
/*
......@@ -349,9 +347,8 @@ int ip_setsockopt(struct sock *sk, int level, int optname, char *optval, int opt
{
if((rt=ip_rt_route(mreq.imr_multiaddr.s_addr,0))!=NULL)
{
dev=rt->rt_dev;
atomic_dec(&rt->rt_use);
route_src = rt->rt_src;
dev=rt->u.dst.dev;
atomic_dec(&rt->u.dst.use);
ip_rt_put(rt);
}
}
......
......@@ -733,7 +733,7 @@ EOM
# Create a menu item to load an alternate configuration file.
#
g_alt_config () {
echo -n "get_alt_config 'Load an Alternate Configuration File' "\
echo -n "get_alt_config 'Load an Alternate Configuration File' "\
>>MCmenu
}
......@@ -742,6 +742,8 @@ g_alt_config () {
# configuration from it.
#
get_alt_config () {
set -f ## Switch file expansion OFF
while true
do
ALT_CONFIG="${ALT_CONFIG:-$DEFAULTS}"
......@@ -759,9 +761,9 @@ last retrieved. Leave blank to abort."\
[ "_" = "_$ALT_CONFIG" ] && break
if [ -r "$ALT_CONFIG" ]
if eval [ -r "$ALT_CONFIG" ]
then
load_config_file "$ALT_CONFIG"
eval load_config_file "$ALT_CONFIG"
break
else
echo -ne "\007"
......@@ -789,6 +791,7 @@ EOM
fi
done
set +f ## Switch file expansion ON
rm -f help.out MCdialog.out
}
......@@ -796,7 +799,7 @@ EOM
# Create a menu item to store an alternate config file.
#
s_alt_config () {
echo -n "save_alt_config 'Store an Alternate Configuration File' "\
echo -n "save_alt_config 'Save Configuration to an Alternate File' "\
>>MCmenu
}
......@@ -805,6 +808,8 @@ s_alt_config () {
# configuration to it.
#
save_alt_config () {
set -f ## Switch file expansion OFF
while true
do
$DIALOG --backtitle "$backtitle" \
......@@ -818,10 +823,10 @@ as an alternate. Leave blank to abort."\
ALT_CONFIG=`cat MCdialog.out`
[ "_" = "_$ALT_CONFIG" ] && break
if touch $ALT_CONFIG 2>/dev/null
if eval touch $ALT_CONFIG 2>/dev/null
then
save_configuration $ALT_CONFIG
eval save_configuration $ALT_CONFIG
load_functions ## RELOAD
break
else
......@@ -844,11 +849,12 @@ If you are uncertain what all this means then you should probably
leave this blank.
EOM
$DIALOG --backtitle "$backtitle"\
--title "Store Alternate Configuration"\
--title "Save Alternate Configuration"\
--textbox help.out $ROWS $COLS
fi
done
set +f ## Switch file expansion ON
rm -f help.out MCdialog.out
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment