From d43cc577d88cd2729ed2f4dd72fc1cf33a6fcfa0 Mon Sep 17 00:00:00 2001 From: Linus Torvalds Date: Fri, 23 Nov 2007 15:09:58 -0500 Subject: [PATCH] Import 1.2.7 --- Makefile | 2 +- arch/alpha/config.in | 10 ++-- arch/i386/config.in | 10 ++-- arch/i386/kernel/signal.c | 4 +- arch/mips/config.in | 10 ++-- arch/sparc/config.in | 10 ++-- drivers/block/ide-cd.c | 42 ++++++++++++-- drivers/char/ChangeLog | 13 +++++ drivers/char/serial.c | 1 + drivers/char/tty_io.c | 33 +++++------ drivers/net/3c503.c | 1 + drivers/net/8390.c | 96 ++++++++++++++++++------------ drivers/net/8390.h | 9 ++- drivers/net/Makefile | 4 +- drivers/net/ne.c | 106 +++++++++++++++++++++++++++------- drivers/net/wd.c | 1 + drivers/scsi/53c7,8xx.c | 16 ++--- drivers/scsi/53c7,8xx.h | 2 +- drivers/scsi/ChangeLog | 10 ++-- fs/buffer.c | 2 +- include/asm-alpha/byteorder.h | 5 ++ include/asm-i386/byteorder.h | 5 ++ 22 files changed, 269 insertions(+), 123 deletions(-) diff --git a/Makefile b/Makefile index 7e41d2985c3e..b7c3bf274339 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ VERSION = 1 PATCHLEVEL = 2 -SUBLEVEL = 6 +SUBLEVEL = 7 ARCH = i386 diff --git a/arch/alpha/config.in b/arch/alpha/config.in index 794f280127f8..2bd47c1e0616 100644 --- a/arch/alpha/config.in +++ b/arch/alpha/config.in @@ -43,10 +43,10 @@ else comment 'SCSI support type (disk, tape, CDrom)' -bool 'Scsi disk support' CONFIG_BLK_DEV_SD y -bool 'Scsi tape support' CONFIG_CHR_DEV_ST n -bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR n -bool 'Scsi generic support' CONFIG_CHR_DEV_SG n +bool 'SCSI disk support' CONFIG_BLK_DEV_SD y +bool 'SCSI tape support' CONFIG_CHR_DEV_ST n +bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR n +bool 'SCSI generic support' CONFIG_CHR_DEV_SG n comment 'SCSI low-level drivers' @@ -233,5 +233,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then int ' Profile shift count' CONFIG_PROFILE_SHIFT 2 fi if [ "$CONFIG_SCSI" = "y" ]; then -bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y +bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y fi diff --git a/arch/i386/config.in b/arch/i386/config.in index e619e4835d1f..26a80d7efac1 100644 --- a/arch/i386/config.in +++ b/arch/i386/config.in @@ -69,10 +69,10 @@ else comment 'SCSI support type (disk, tape, CDrom)' -bool 'Scsi disk support' CONFIG_BLK_DEV_SD y -bool 'Scsi tape support' CONFIG_CHR_DEV_ST n -bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR n -bool 'Scsi generic support' CONFIG_CHR_DEV_SG n +bool 'SCSI disk support' CONFIG_BLK_DEV_SD y +bool 'SCSI tape support' CONFIG_CHR_DEV_ST n +bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR n +bool 'SCSI generic support' CONFIG_CHR_DEV_SG n comment 'Some SCSI devices (e.g. CD jukebox) support multiple LUNs' @@ -267,5 +267,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then int ' Profile shift count' CONFIG_PROFILE_SHIFT 2 fi if [ "$CONFIG_SCSI" = "y" ]; then -bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y +bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y fi diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c index 0dbe2715b64c..c14279b81856 100644 --- a/arch/i386/kernel/signal.c +++ b/arch/i386/kernel/signal.c @@ -151,10 +151,10 @@ asmlinkage int do_signal(unsigned long oldmask, struct pt_regs * regs) struct sigaction * sa; while ((signr = current->signal & mask)) { - __asm__("bsf %2,%1\n\t" + __asm__("bsf %3,%1\n\t" "btrl %1,%0" :"=m" (current->signal),"=r" (signr) - :"1" (signr)); + :"0" (current->signal), "1" (signr)); sa = current->sigaction + signr; signr++; if ((current->flags & PF_PTRACED) && signr != SIGKILL) { diff --git a/arch/mips/config.in b/arch/mips/config.in index 14c7554f58c8..999775db75f9 100644 --- a/arch/mips/config.in +++ b/arch/mips/config.in @@ -63,10 +63,10 @@ else comment 'SCSI support type (disk, tape, CDrom)' -bool 'Scsi disk support' CONFIG_BLK_DEV_SD y -bool 'Scsi tape support' CONFIG_CHR_DEV_ST y -bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR y -bool 'Scsi generic support' CONFIG_CHR_DEV_SG y +bool 'SCSI disk support' CONFIG_BLK_DEV_SD y +bool 'SCSI tape support' CONFIG_CHR_DEV_ST y +bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR y +bool 'SCSI generic support' CONFIG_CHR_DEV_SG y comment 'SCSI low-level drivers' @@ -252,5 +252,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then int ' Profile shift count' CONFIG_PROFILE_SHIFT 2 fi if [ "$CONFIG_SCSI" = "y" ]; then -bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y +bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y fi diff --git a/arch/sparc/config.in b/arch/sparc/config.in index 767ead214b8c..be9336eedd00 100644 --- a/arch/sparc/config.in +++ b/arch/sparc/config.in @@ -50,10 +50,10 @@ else comment 'SCSI support type (disk, tape, CDrom)' -bool 'Scsi disk support' CONFIG_BLK_DEV_SD y -bool 'Scsi tape support' CONFIG_CHR_DEV_ST n -bool 'Scsi CDROM support' CONFIG_BLK_DEV_SR n -bool 'Scsi generic support' CONFIG_CHR_DEV_SG n +bool 'SCSI disk support' CONFIG_BLK_DEV_SD y +bool 'SCSI tape support' CONFIG_CHR_DEV_ST n +bool 'SCSI CDROM support' CONFIG_BLK_DEV_SR n +bool 'SCSI generic support' CONFIG_CHR_DEV_SG n comment 'SCSI low-level drivers' @@ -242,5 +242,5 @@ if [ "$CONFIG_PROFILE" = "y" ]; then int ' Profile shift count' CONFIG_PROFILE_SHIFT 2 fi if [ "$CONFIG_SCSI" = "y" ]; then -bool 'Verbose scsi error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y +bool 'Verbose SCSI error reporting (kernel size +=12K)' CONFIG_SCSI_CONSTANTS y fi diff --git a/drivers/block/ide-cd.c b/drivers/block/ide-cd.c index c3f83cdc5157..15c646d6acbd 100644 --- a/drivers/block/ide-cd.c +++ b/drivers/block/ide-cd.c @@ -1,5 +1,5 @@ /* - * linux/drivers/block/ide-cd.c (BETA) + * linux/drivers/block/ide-cd.c * * 1.00 Oct 31, 1994 -- Initial version. * 1.01 Nov 2, 1994 -- Fixed problem with starting request in @@ -20,10 +20,17 @@ * 2.03 Jan 10, 1995 -- Rewrite block read routines to handle block sizes * other than 2k and to move multiple sectors in a * single transaction. + * 2.04 Apr 21, 1995 -- Add work-around for Creative Labs CD220E drives. + * Thanks to Nick Saw for + * help in figuring this out. Ditto for Acer and + * Aztech drives, which seem to have the same problem. + * * * ATAPI cd-rom driver. To be used with ide.c. * * Copyright (C) 1994, 1995 scott snyder + * May be copied or modified under the terms of the GNU General Public License + * (../../COPYING). */ #include @@ -88,7 +95,8 @@ struct ide_cd_flags { unsigned media_changed : 1; /* Driver has noticed a media change. */ unsigned toc_valid : 1; /* Saved TOC information is current. */ - unsigned reserved : 4; + unsigned no_lba_toc : 1; /* Drive cannot return TOC info in LBA format */ + unsigned reserved : 3; }; #define CDROM_FLAGS(dev) ((struct ide_cd_flags *)&((dev)->bios_sect)) @@ -1094,6 +1102,7 @@ cdrom_read_tocentry (ide_dev_t *dev, int trackno, int msf_flag, static int cdrom_read_toc (ide_dev_t *dev) { + int msf_flag; int stat, ntracks, i; struct atapi_toc *toc = cdrom_info[dev->hwif][dev->select.b.drive].toc; @@ -1118,8 +1127,11 @@ cdrom_read_toc (ide_dev_t *dev) if (CDROM_FLAGS (dev)->toc_valid) return 0; + /* Some drives can't return TOC data in LBA format. */ + msf_flag = (CDROM_FLAGS (dev)->no_lba_toc); + /* First read just the header, so we know how long the TOC is. */ - stat = cdrom_read_tocentry (dev, 0, 0, (char *)toc, + stat = cdrom_read_tocentry (dev, 0, msf_flag, (char *)toc, sizeof (struct atapi_toc_header) + sizeof (struct atapi_toc_entry)); if (stat) return stat; @@ -1129,13 +1141,21 @@ cdrom_read_toc (ide_dev_t *dev) if (ntracks > MAX_TRACKS) ntracks = MAX_TRACKS; /* Now read the whole schmeer. */ - stat = cdrom_read_tocentry (dev, 0, 0, (char *)toc, + stat = cdrom_read_tocentry (dev, 0, msf_flag, (char *)toc, sizeof (struct atapi_toc_header) + (ntracks+1) * sizeof (struct atapi_toc_entry)); if (stat) return stat; byte_swap_word (&toc->hdr.toc_length); for (i=0; i<=ntracks; i++) - byte_swap_long (&toc->ent[i].lba); + { + if (msf_flag) + { + byte *adr = (byte *)&(toc->ent[i].lba); + toc->ent[i].lba = msf_to_lba (adr[1], adr[2], adr[3]); + } + else + byte_swap_long (&toc->ent[i].lba); + } /* Remember that we've read this stuff. */ CDROM_FLAGS (dev)->toc_valid = 1; @@ -1618,8 +1638,20 @@ static void cdrom_setup (ide_dev_t *dev) CDROM_FLAGS (dev)->toc_valid = 0; CDROM_FLAGS (dev)->no_playaudio12 = 0; + CDROM_FLAGS (dev)->no_lba_toc = 0; CDROM_FLAGS (dev)->drq_interrupt = ((dev->id->config & 0x0060) == 0x20); + /* Accommodate some broken drives... */ + if (strcmp (dev->id->model, "CD220E") == 0) /* Creative Labs */ + CDROM_FLAGS (dev)->no_lba_toc = 1; + + else if (strcmp (dev->id->model, "TO-ICSLYAL") == 0 || /* Acer CD525E */ + strcmp (dev->id->model, "OTI-SCYLLA") == 0) + CDROM_FLAGS (dev)->no_lba_toc = 1; + + else if (strcmp (dev->id->model, "CDA26803I SE") == 0) /* Aztech */ + CDROM_FLAGS (dev)->no_lba_toc = 1; + cdrom_info[dev->hwif][dev->select.b.drive].toc = NULL; cdrom_info[dev->hwif][dev->select.b.drive].sector_buffer = NULL; cdrom_info[dev->hwif][dev->select.b.drive].sector_buffered = 0; diff --git a/drivers/char/ChangeLog b/drivers/char/ChangeLog index a6a54c15421e..8356e7a6d297 100644 --- a/drivers/char/ChangeLog +++ b/drivers/char/ChangeLog @@ -1,3 +1,16 @@ +Wed Apr 26 10:23:44 1995 Theodore Y. Ts'o + + * tty_io.c (release_dev): Try to shutdown the line discpline + *before* decrementing the tty count variable; this removes + a potential race condition which occurs when the line + discpline close blocks, and another process then tries + open the same serial port. + + * serial.c (rs_hangup): When hanging up, flush the output buffer + befure shutting down the UART. Otherwise the line + discpline close blocks waiting for the characters to get + flushed, which never happens until the serial port gets reused. + Wed Apr 12 08:06:16 1995 Theodore Y. Ts'o * serial.c (do_serial_hangup, do_softint, check_modem_status, diff --git a/drivers/char/serial.c b/drivers/char/serial.c index d424d4f6ace3..6dec4c9795f5 100644 --- a/drivers/char/serial.c +++ b/drivers/char/serial.c @@ -2090,6 +2090,7 @@ void rs_hangup(struct tty_struct *tty) if (serial_paranoia_check(info, tty->device, "rs_hangup")) return; + rs_flush_buffer(tty); shutdown(info); info->event = 0; info->count = 0; diff --git a/drivers/char/tty_io.c b/drivers/char/tty_io.c index d6c7234137f0..baf3f4a9e205 100644 --- a/drivers/char/tty_io.c +++ b/drivers/char/tty_io.c @@ -1006,6 +1006,22 @@ static void release_dev(struct file * filp) tty->link->count = 0; } } + if (tty->count <= 1) { + /* + * Shutdown the current line discipline, and reset it + * to N_TTY. + */ + if (tty->ldisc.close) + (tty->ldisc.close)(tty); + tty->ldisc = ldiscs[N_TTY]; + tty->termios->c_line = N_TTY; + if (o_tty && o_tty->count <= 0) { + if (o_tty->ldisc.close) + (o_tty->ldisc.close)(o_tty); + o_tty->ldisc = ldiscs[N_TTY]; + o_tty->termios->c_line = N_TTY; + } + } if (--tty->count < 0) { printk("release_dev: bad tty->count (%d) for %s\n", tty->count, tty_name(tty)); @@ -1039,23 +1055,6 @@ static void release_dev(struct file * filp) (*p)->tty = NULL; } - /* - * Shutdown the current line discipline, and reset it to - * N_TTY. - */ - if (tty->ldisc.close) - (tty->ldisc.close)(tty); - tty->ldisc = ldiscs[N_TTY]; - tty->termios->c_line = N_TTY; - if (o_tty) { - if (o_tty->ldisc.close) - (o_tty->ldisc.close)(o_tty); - o_tty->ldisc = ldiscs[N_TTY]; -#if 0 /* No way! We just released the termios struct! */ - o_tty->termios->c_line = N_TTY; -#endif - } - tty->driver.table[idx] = NULL; if (tty->driver.flags & TTY_DRIVER_RESET_TERMIOS) { tty->driver.termios[idx] = NULL; diff --git a/drivers/net/3c503.c b/drivers/net/3c503.c index 5eb20c09a5ad..2c3ab0351647 100644 --- a/drivers/net/3c503.c +++ b/drivers/net/3c503.c @@ -317,6 +317,7 @@ el2_close(struct device *dev) outb(EGACFR_IRQOFF, E33G_GACFR); /* disable interrupts. */ NS8390_init(dev, 0); + dev->start = 0; return 0; } diff --git a/drivers/net/8390.c b/drivers/net/8390.c index 55db9f08595f..74f8efb4dbae 100644 --- a/drivers/net/8390.c +++ b/drivers/net/8390.c @@ -15,6 +15,11 @@ This is the chip-specific code for many 8390-based ethernet adaptors. This is not a complete driver, it must be combined with board-specific code such as ne.c, wd.c, 3c503.c, etc. + + 13/04/95 -- Don't blindly swallow ENISR_RDC interrupts for non-shared + memory cards. We need to follow these closely for neX000 cards. + Plus other minor cleanups. -- Paul Gortmaker + */ static char *version = @@ -83,7 +88,7 @@ int ei_debug = 1; #endif /* Max number of packets received at one Intr. - Current this may only be examined by a kernel debugger. */ + Currently this may only be examined by a kernel debugger. */ static int high_water_mark = 0; /* Index to functions. */ @@ -124,16 +129,18 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev) int e8390_base = dev->base_addr; struct ei_device *ei_local = (struct ei_device *) dev->priv; int length, send_length; + unsigned long flags; - /* We normally shouldn't be called if dev->tbusy is set, but the - existing code does anyway. - If it has been too long (> 100 or 150ms.) since the last Tx we assume - the board has died and kick it. */ - +/* + * We normally shouldn't be called if dev->tbusy is set, but the + * existing code does anyway. If it has been too long since the + * last Tx, we assume the board has died and kick it. + */ + if (dev->tbusy) { /* Do timeouts, just like the 8003 driver. */ int txsr = inb(e8390_base+EN0_TSR), isr; int tickssofar = jiffies - dev->trans_start; - if (tickssofar < 10 || (tickssofar < 15 && ! (txsr & ENTSR_PTX))) { + if (tickssofar < TX_TIMEOUT || (tickssofar < (TX_TIMEOUT+5) && ! (txsr & ENTSR_PTX))) { return 1; } isr = inb(e8390_base+EN0_ISR); @@ -170,15 +177,22 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev) if (skb->len <= 0) return 0; - /* Block a timer-based transmit from overlapping. */ - if (set_bit(0, (void*)&dev->tbusy) != 0) { - printk("%s: Transmitter access conflict.\n", dev->name); - return 1; - } + save_flags(flags); + cli(); + + /* Block a timer-based transmit from overlapping. */ + if ((set_bit(0, (void*)&dev->tbusy) != 0) || ei_local->irqlock) { + printk("%s: Tx access conflict. irq=%d lock=%d tx1=%d tx2=%d last=%d\n", + dev->name, dev->interrupt, ei_local->irqlock, ei_local->tx1, + ei_local->tx2, ei_local->lasttx); + restore_flags(flags); + return 1; + } /* Mask interrupts from the ethercard. */ - outb(0x00, e8390_base + EN0_IMR); + outb(0x00, e8390_base + EN0_IMR); ei_local->irqlock = 1; + restore_flags(flags); send_length = ETH_ZLEN < length ? length : ETH_ZLEN; @@ -200,28 +214,30 @@ static int ei_start_xmit(struct sk_buff *skb, struct device *dev) ei_local->txing); } else { /* We should never get here. */ if (ei_debug) - printk("%s: No packet buffer space for ping-pong use.\n", - dev->name); + printk("%s: No Tx buffers free. irq=%d tx1=%d tx2=%d last=%d\n", + dev->name, dev->interrupt, ei_local->tx1, + ei_local->tx2, ei_local->lasttx); ei_local->irqlock = 0; dev->tbusy = 1; - outb_p(ENISR_ALL, e8390_base + EN0_IMR); + outb_p(ENISR_ALL, e8390_base + EN0_IMR); return 1; } ei_block_output(dev, length, skb->data, output_page); if (! ei_local->txing) { + ei_local->txing = 1; NS8390_trigger_send(dev, send_length, output_page); dev->trans_start = jiffies; if (output_page == ei_local->tx_start_page) ei_local->tx1 = -1, ei_local->lasttx = -1; else ei_local->tx2 = -1, ei_local->lasttx = -2; - ei_local->txing = 1; } else ei_local->txqueue++; dev->tbusy = (ei_local->tx1 && ei_local->tx2); } else { /* No pingpong, just a single Tx buffer. */ ei_block_output(dev, length, skb->data, ei_local->tx_start_page); + ei_local->txing = 1; NS8390_trigger_send(dev, send_length, ei_local->tx_start_page); dev->trans_start = jiffies; dev->tbusy = 1; @@ -242,7 +258,7 @@ void ei_interrupt(int irq, struct pt_regs * regs) { struct device *dev = (struct device *)(irq2dev_map[irq]); int e8390_base; - int interrupts, boguscount = 0; + int interrupts, nr_serviced = 0; struct ei_device *ei_local; if (dev == NULL) { @@ -253,7 +269,6 @@ void ei_interrupt(int irq, struct pt_regs * regs) ei_local = (struct ei_device *) dev->priv; if (dev->interrupt || ei_local->irqlock) { /* The "irqlock" check is only for testing. */ - sti(); printk(ei_local->irqlock ? "%s: Interrupted while interrupts are masked! isr=%#2x imr=%#2x.\n" : "%s: Reentering the interrupt handler! isr=%#2x imr=%#2x.\n", @@ -263,7 +278,6 @@ void ei_interrupt(int irq, struct pt_regs * regs) } dev->interrupt = 1; - sti(); /* Allow other interrupts. */ /* Change to page 0 and read the intr status reg. */ outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD); @@ -273,16 +287,12 @@ void ei_interrupt(int irq, struct pt_regs * regs) /* !!Assumption!! -- we stay in page 0. Don't break this. */ while ((interrupts = inb_p(e8390_base + EN0_ISR)) != 0 - && ++boguscount < 9) { + && ++nr_serviced < MAX_SERVICE) { if (dev->start == 0) { printk("%s: interrupt from stopped card\n", dev->name); interrupts = 0; break; } - if (interrupts & ENISR_RDC) { - /* Ack meaningless DMA complete. */ - outb_p(ENISR_RDC, e8390_base + EN0_ISR); - } if (interrupts & ENISR_OVER) { ei_rx_overrun(dev); } else if (interrupts & (ENISR_RX+ENISR_RX_ERR)) { @@ -303,17 +313,25 @@ void ei_interrupt(int irq, struct pt_regs * regs) if (interrupts & ENISR_TX_ERR) { outb_p(ENISR_TX_ERR, e8390_base + EN0_ISR); /* Ack intr. */ } + + if (interrupts & ENISR_RDC) { + if (dev->mem_start) + outb_p(ENISR_RDC, e8390_base + EN0_ISR); + } + outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD); } - if (interrupts && ei_debug) { - if (boguscount == 9) + if ((interrupts & ~ENISR_RDC) && ei_debug) { + outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD); + if (nr_serviced == MAX_SERVICE) { printk("%s: Too much work at interrupt, status %#2.2x\n", dev->name, interrupts); - else + outb_p(ENISR_ALL, e8390_base + EN0_ISR); /* Ack. most intrs. */ + } else { printk("%s: unknown interrupt %#2x\n", dev->name, interrupts); - outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, e8390_base + E8390_CMD); - outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */ + outb_p(0xff, e8390_base + EN0_ISR); /* Ack. all intrs. */ + } } dev->interrupt = 0; return; @@ -338,9 +356,9 @@ static void ei_tx_intr(struct device *dev) ei_local->tx1 = 0; dev->tbusy = 0; if (ei_local->tx2 > 0) { + ei_local->txing = 1; NS8390_trigger_send(dev, ei_local->tx2, ei_local->tx_start_page + 6); dev->trans_start = jiffies; - ei_local->txing = 1; ei_local->tx2 = -1, ei_local->lasttx = 2; } else @@ -352,9 +370,9 @@ static void ei_tx_intr(struct device *dev) ei_local->tx2 = 0; dev->tbusy = 0; if (ei_local->tx1 > 0) { + ei_local->txing = 1; NS8390_trigger_send(dev, ei_local->tx1, ei_local->tx_start_page); dev->trans_start = jiffies; - ei_local->txing = 1; ei_local->tx1 = -1; ei_local->lasttx = 1; } else @@ -402,7 +420,7 @@ static void ei_receive(struct device *dev) rxing_page = inb_p(e8390_base + EN1_CURPAG); outb_p(E8390_NODMA+E8390_PAGE0, e8390_base + E8390_CMD); - /* Remove one frame from the ring. Boundary is alway a page behind. */ + /* Remove one frame from the ring. Boundary is always a page behind. */ this_frame = inb_p(e8390_base + EN0_BOUNDARY) + 1; if (this_frame >= ei_local->stop_page) this_frame = ei_local->rx_start_page; @@ -475,12 +493,12 @@ static void ei_receive(struct device *dev) /* This _should_ never happen: it's here for avoiding bad clones. */ if (next_frame >= ei_local->stop_page) { - printk("%s: next frame inconsistency, %#2x..", dev->name, + printk("%s: next frame inconsistency, %#2x\n", dev->name, next_frame); next_frame = ei_local->rx_start_page; } ei_local->current_page = next_frame; - outb(next_frame-1, e8390_base+EN0_BOUNDARY); + outb_p(next_frame-1, e8390_base+EN0_BOUNDARY); } /* If any worth-while packets have been received, dev_rint() has done a mark_bh(NET_BH) for us and will work on them @@ -539,6 +557,9 @@ static struct enet_statistics *get_stats(struct device *dev) short ioaddr = dev->base_addr; struct ei_device *ei_local = (struct ei_device *) dev->priv; + /* If the card is stopped, just return the present stats. */ + if (dev->start == 0) return &ei_local->stat; + /* Read the counter registers, assuming we are in page 0. */ ei_local->stat.rx_frame_errors += inb_p(ioaddr + EN0_COUNTER0); ei_local->stat.rx_crc_errors += inb_p(ioaddr + EN0_COUNTER1); @@ -610,6 +631,7 @@ void NS8390_init(struct device *dev, int startp) struct ei_device *ei_local = (struct ei_device *) dev->priv; int i; int endcfg = ei_local->word16 ? (0x48 | ENDCFG_WTS) : 0x48; + unsigned long flags; /* Follow National Semi's recommendations for initing the DP83902. */ outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base); /* 0x21 */ @@ -633,6 +655,7 @@ void NS8390_init(struct device *dev, int startp) /* Copy the station address into the DS8390 registers, and set the multicast hash bitmap to receive all multicasts. */ + save_flags(flags); cli(); outb_p(E8390_NODMA + E8390_PAGE1 + E8390_STOP, e8390_base); /* 0x61 */ for(i = 0; i < 6; i++) { @@ -645,7 +668,7 @@ void NS8390_init(struct device *dev, int startp) outb_p(ei_local->rx_start_page, e8390_base + EN1_CURPAG); outb_p(E8390_NODMA+E8390_PAGE0+E8390_STOP, e8390_base); - sti(); + restore_flags(flags); dev->tbusy = 0; dev->interrupt = 0; ei_local->tx1 = ei_local->tx2 = 0; @@ -667,7 +690,6 @@ static void NS8390_trigger_send(struct device *dev, unsigned int length, { int e8390_base = dev->base_addr; - ei_status.txing = 1; outb_p(E8390_NODMA+E8390_PAGE0, e8390_base); if (inb_p(e8390_base) & E8390_TRANS) { diff --git a/drivers/net/8390.h b/drivers/net/8390.h index 72e63249264e..13b7b86a9011 100644 --- a/drivers/net/8390.h +++ b/drivers/net/8390.h @@ -44,14 +44,13 @@ struct ei_device { unsigned open:1; unsigned word16:1; /* We have the 16-bit (vs 8-bit) version of the card. */ unsigned txing:1; /* Transmit Active */ - unsigned dmaing:2; /* Remote DMA Active */ unsigned irqlock:1; /* 8390's intrs disabled when '1'. */ unsigned pingpong:1; /* Using the ping-pong driver */ unsigned char tx_start_page, rx_start_page, stop_page; unsigned char current_page; /* Read pointer in buffer */ unsigned char interface_num; /* Net port (AUI, 10bT.) to use. */ unsigned char txqueue; /* Tx Packet buffer queue length. */ - unsigned char in_interrupt; + unsigned char dmaing; /* Remote DMA (Tx/Rx/Active) */ short tx1, tx2; /* Packet lengths for ping-pong tx. */ short lasttx; /* Alpha version consistency check. */ unsigned char reg0; /* Register '0' in a WD8013 */ @@ -61,6 +60,12 @@ struct ei_device { struct enet_statistics stat; }; +/* The maximum number of 8390 interrupt serivce routines called per IRQ. */ +#define MAX_SERVICE 12 + +/* The maximum number of jiffies waited before assuming a Tx failed. */ +#define TX_TIMEOUT 20 + #define ei_status (*(struct ei_device *)(dev->priv)) /* Some generic ethernet register configurations. */ diff --git a/drivers/net/Makefile b/drivers/net/Makefile index 2637c424515d..5a91f745f39f 100644 --- a/drivers/net/Makefile +++ b/drivers/net/Makefile @@ -11,8 +11,8 @@ include CONFIG MODULES := NETDRV_OBJS := Space.o auto_irq.o net_init.o loopback.o -CFLAGS := $(CFLAGS) -I../../net/inet -CPP := $(CPP) -I../../net/inet +override CFLAGS := $(CFLAGS) -I../../net/inet +override CPP := $(CPP) -I../../net/inet .c.o: $(CC) $(CFLAGS) -c $< diff --git a/drivers/net/ne.c b/drivers/net/ne.c index fe50f8a70a8a..7d224efc9285 100644 --- a/drivers/net/ne.c +++ b/drivers/net/ne.c @@ -1,4 +1,3 @@ -#define rw_bugfix /* ne.c: A general non-shared-memory NS8390 ethernet driver for linux. */ /* Written 1992-94 by Donald Becker. @@ -14,8 +13,16 @@ Code 930.5, Goddard Space Flight Center, Greenbelt MD 20771 This driver should work with many programmed-I/O 8390-based ethernet - boards. Currently it support the NE1000, NE2000, many clones, + boards. Currently it supports the NE1000, NE2000, many clones, and some Cabletron products. + + 13/04/95 -- Change in philosophy. We now monitor ENISR_RDC for + handshaking the Tx PIO xfers. If we don't get a RDC within a + reasonable period of time, we know the 8390 has gone south, and we + kick the board before it locks the system. Also use set_bit() to + create atomic locks on the PIO xfers, and added some defines + that the end user can play with to save memory. -- Paul Gortmaker + */ /* Routines for the NatSemi-based designs (NE[12]000). */ @@ -31,6 +38,20 @@ static char *version = #include #include "8390.h" + +/* Some defines that people can play with if so inclined. */ + +/* Do we support clones that don't adhere to 14,15 of the SAprom ? */ +#define CONFIG_NE_BAD_CLONES + +/* Do we perform extra sanity checks on stuff ? */ +/* #define CONFIG_NE_SANITY */ + +/* Do we implement the read before write bugfix ? */ +/* #define CONFIG_NE_RW_BUGFIX */ + +/* ---- No user-servicable parts below ---- */ + extern struct device *init_etherdev(struct device *dev, int sizeof_private, unsigned long *mem_startp); @@ -39,6 +60,7 @@ extern struct device *init_etherdev(struct device *dev, int sizeof_private, static unsigned int netcard_portlist[] = { 0x300, 0x280, 0x320, 0x340, 0x360, 0}; +#ifdef CONFIG_NE_BAD_CLONES /* A list of bad clones that we none-the-less recognize. */ static struct { char *name8, *name16; unsigned char SAprefix[4];} bad_clone_list[] = { @@ -46,8 +68,12 @@ bad_clone_list[] = { {"DE120", "DE220", {0x00, 0x80, 0xc8,}}, {"DFI1000", "DFI2000", {'D', 'F', 'I',}}, /* Original, eh? */ {"EtherNext UTP8", "EtherNext UTP16", {0x00, 0x00, 0x79}}, + {"NE1000","NE2000-invalid", {0x00, 0x00, 0xd8}}, /* Ancient real NE1000. */ + {"NN1000", "NN2000", {0x08, 0x03, 0x08}}, /* Outlaw no-name clone. */ + {"4-DIM8","4-DIM16", {0x00,0x00,0x4d,}}, /* Outlaw 4-Dimension cards. */ {0,} }; +#endif #define NE_BASE (dev->base_addr) #define NE_CMD 0x00 @@ -60,6 +86,8 @@ bad_clone_list[] = { #define NESM_START_PG 0x40 /* First page of TX buffer */ #define NESM_STOP_PG 0x80 /* Last page +1 of RX ring */ +#define NE_RDC_TIMEOUT 0x03 /* Max wait in jiffies for Tx RDC */ + int ne_probe(struct device *dev); static int ne_probe1(struct device *dev, int ioaddr); @@ -126,9 +154,9 @@ static int ne_probe1(struct device *dev, int ioaddr) char *name = NULL; int start_page, stop_page; int neX000, ctron; - int reg0 = inb(ioaddr); + int reg0 = inb_p(ioaddr); - if ( reg0 == 0xFF) + if (reg0 == 0xFF) return ENODEV; /* Do a preliminary verification that we have a 8390. */ @@ -140,7 +168,7 @@ static int ne_probe1(struct device *dev, int ioaddr) inb_p(ioaddr + EN0_COUNTER0); /* Clear the counter by reading. */ if (inb_p(ioaddr + EN0_COUNTER0) != 0) { outb_p(reg0, ioaddr); - outb(regd, ioaddr + 0x0d); /* Restore the old values. */ + outb_p(regd, ioaddr + 0x0d); /* Restore the old values. */ return ENODEV; } } @@ -169,6 +197,7 @@ static int ne_probe1(struct device *dev, int ioaddr) }; for (i = 0; i < sizeof(program_seq)/sizeof(program_seq[0]); i++) outb_p(program_seq[i].value, ioaddr + program_seq[i].offset); + } for(i = 0; i < 32 /*sizeof(SA_prom)*/; i+=2) { SA_prom[i] = inb(ioaddr + NE_DATAPORT); @@ -208,6 +237,7 @@ static int ne_probe1(struct device *dev, int ioaddr) start_page = 0x01; stop_page = (wordlength == 2) ? 0x40 : 0x20; } else { +#ifdef CONFIG_NE_BAD_CLONES /* Ack! Well, there might be a *bad* NE*000 clone there. Check for total bogus addresses. */ for (i = 0; bad_clone_list[i].name8; i++) { @@ -227,6 +257,11 @@ static int ne_probe1(struct device *dev, int ioaddr) SA_prom[14], SA_prom[15]); return ENXIO; } +#else + printk(" not found.\n"); + return ENXIO; +#endif + } @@ -242,7 +277,7 @@ static int ne_probe1(struct device *dev, int ioaddr) outb_p(0x00, ioaddr + EN0_IMR); /* Mask it again. */ dev->irq = autoirq_report(0); if (ei_debug > 2) - printk(" autoirq is %d", dev->irq); + printk(" autoirq is %d\n", dev->irq); } else if (dev->irq == 2) /* Fixup for users that don't know that IRQ 2 is really IRQ 9, or don't know which one to set. */ @@ -251,7 +286,7 @@ static int ne_probe1(struct device *dev, int ioaddr) /* Snarf the interrupt now. There's no point in waiting since we cannot share and the board will usually be enabled. */ { - int irqval = request_irq (dev->irq, ei_interrupt, 0, "ne"); + int irqval = request_irq (dev->irq, ei_interrupt, 0, wordlength==2 ? "ne2000":"ne1000"); if (irqval) { printk (" unable to get IRQ %d (irqval=%d).\n", dev->irq, irqval); return EAGAIN; @@ -260,7 +295,7 @@ static int ne_probe1(struct device *dev, int ioaddr) dev->base_addr = ioaddr; - request_region(ioaddr, NE_IO_EXTENT,"ne2000"); + request_region(ioaddr, NE_IO_EXTENT, wordlength==2 ? "ne2000":"ne1000"); for(i = 0; i < ETHER_ADDR_LEN; i++) dev->dev_addr[i] = SA_prom[i]; @@ -318,10 +353,13 @@ ne_reset_8390(struct device *dev) static int ne_block_input(struct device *dev, int count, char *buf, int ring_offset) { +#ifdef CONFIG_NE_SANITY int xfer_count = count; +#endif int nic_base = dev->base_addr; - if (ei_status.dmaing) { + /* This *shouldn't* happen. If it does, it's the last thing you'll see */ + if (set_bit(0,(void*)&ei_status.dmaing)) { if (ei_debug > 0) printk("%s: DMAing conflict in ne_block_input " "[DMAstat:%d][irqlock:%d][intr:%d].\n", @@ -329,7 +367,7 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset) dev->interrupt); return 0; } - ei_status.dmaing |= 0x01; + ei_status.dmaing |= 0x02; outb_p(E8390_NODMA+E8390_PAGE0+E8390_START, nic_base+ NE_CMD); outb_p(count & 0xff, nic_base + EN0_RCNTLO); outb_p(count >> 8, nic_base + EN0_RCNTHI); @@ -338,14 +376,18 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset) outb_p(E8390_RREAD+E8390_START, nic_base + NE_CMD); if (ei_status.word16) { insw(NE_BASE + NE_DATAPORT,buf,count>>1); - if (count & 0x01) - buf[count-1] = inb(NE_BASE + NE_DATAPORT), xfer_count++; + if (count & 0x01) { + buf[count-1] = inb(NE_BASE + NE_DATAPORT); +#ifdef CONFIG_NE_SANITY + xfer_count++; +#endif + } } else { insb(NE_BASE + NE_DATAPORT, buf, count); } /* This was for the ALPHA version only, but enough people have - encountering problems that it is still here. If you see + been encountering problems so it is still here. If you see this message you either 1) have a slightly incompatible clone or 2) have noise/speed problems with your bus. */ #ifdef CONFIG_NE_SANITY @@ -353,7 +395,7 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset) int addr, tries = 20; do { /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here - -- it's broken! Check the "DMA" address instead. */ + -- it's broken for Rx on some cards! */ int high = inb_p(nic_base + EN0_RSARHI); int low = inb_p(nic_base + EN0_RSARLO); addr = (high << 8) + low; @@ -366,7 +408,8 @@ ne_block_input(struct device *dev, int count, char *buf, int ring_offset) dev->name, ring_offset + xfer_count, addr); } #endif - ei_status.dmaing &= ~0x01; + outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */ + ei_status.dmaing &= ~0x03; return ring_offset + count; } @@ -374,15 +417,20 @@ static void ne_block_output(struct device *dev, int count, const unsigned char *buf, const int start_page) { +#ifdef CONFIG_NE_SANITY int retries = 0; +#endif int nic_base = NE_BASE; + unsigned long dma_start; /* Round the count up for word writes. Do we need to do this? What effect will an odd byte count have on the 8390? I should check someday. */ if (ei_status.word16 && (count & 0x01)) count++; - if (ei_status.dmaing) { + + /* This *shouldn't* happen. If it does, it's the last thing you'll see */ + if (set_bit(0,(void*)&ei_status.dmaing)) { if (ei_debug > 0) printk("%s: DMAing conflict in ne_block_output." "[DMAstat:%d][irqlock:%d][intr:%d]\n", @@ -390,12 +438,15 @@ ne_block_output(struct device *dev, int count, dev->interrupt); return; } - ei_status.dmaing |= 0x02; + ei_status.dmaing |= 0x04; /* We should already be in page 0, but to be safe... */ outb_p(E8390_PAGE0+E8390_START+E8390_NODMA, nic_base + NE_CMD); +#ifdef CONFIG_NE_SANITY retry: -#if defined(rw_bugfix) +#endif + +#ifdef CONFIG_NE_RW_BUGFIX /* Handle the read-before-write bug the same way as the Crynwr packet driver -- the NatSemi method doesn't work. Actually this doesn't always work either, but if you have @@ -411,6 +462,9 @@ ne_block_output(struct device *dev, int count, SLOW_DOWN_IO; #endif /* rw_bugfix */ + dma_start = jiffies; + outb_p(ENISR_RDC, nic_base + EN0_ISR); + /* Now the normal output. */ outb_p(count & 0xff, nic_base + EN0_RCNTLO); outb_p(count >> 8, nic_base + EN0_RCNTHI); @@ -426,12 +480,10 @@ ne_block_output(struct device *dev, int count, #ifdef CONFIG_NE_SANITY /* This was for the ALPHA version only, but enough people have - encountering problems that it is still here. */ + been encountering problems so it is still here. */ if (ei_debug > 1) { /* DMA termination address check... */ int addr, tries = 20; do { - /* DON'T check for 'inb_p(EN0_ISR) & ENISR_RDC' here - -- it's broken! Check the "DMA" address instead. */ int high = inb_p(nic_base + EN0_RSARHI); int low = inb_p(nic_base + EN0_RSARLO); addr = (high << 8) + low; @@ -447,7 +499,17 @@ ne_block_output(struct device *dev, int count, } } #endif - ei_status.dmaing &= ~0x02; + + while ((inb_p(nic_base + EN0_ISR) & ENISR_RDC) == 0) + if (jiffies - dma_start > NE_RDC_TIMEOUT) { + printk("%s: timeout waiting for Tx RDC.\n", dev->name); + ne_reset_8390(dev); + NS8390_init(dev,1); + break; + } + + outb_p(ENISR_RDC, nic_base + EN0_ISR); /* Ack intr. */ + ei_status.dmaing &= ~0x05; return; } diff --git a/drivers/net/wd.c b/drivers/net/wd.c index 783d7a515afb..d59a68ab8bba 100644 --- a/drivers/net/wd.c +++ b/drivers/net/wd.c @@ -368,6 +368,7 @@ wd_close_card(struct device *dev) if (ei_debug > 1) printk("%s: Shutting down ethercard.\n", dev->name); NS8390_init(dev, 0); + dev->start = 0; /* Change from 16-bit to 8-bit shared memory so reboot works. */ outb(ei_status.reg5, wd_cmdreg + WD_CMDREG5 ); diff --git a/drivers/scsi/53c7,8xx.c b/drivers/scsi/53c7,8xx.c index a03e1019d84f..100af346e891 100644 --- a/drivers/scsi/53c7,8xx.c +++ b/drivers/scsi/53c7,8xx.c @@ -740,7 +740,7 @@ static int normal_init (Scsi_Host_Template *tpnt, int board, int chip, So, we stick it past the end of our hostdata structure. ASSUMPTION : - Irregardless of how many simultaenous SCSI commands we allow, + Regardless of how many simultaneous SCSI commands we allow, the probe code only executes a _single_ instruction at a time, so we only need one here, and don't need to allocate NCR53c7x0_cmd structures for each target until we are no longer in scan_scsis @@ -2304,8 +2304,8 @@ NCR53c8x0_soft_reset (struct Scsi_Host *host) { /* * Function static struct NCR53c7x0_cmd *create_cmd (Scsi_Cmnd *cmd) * - * Purpose : If we have not allready allocated enough NCR53c7x0_cmd - * structures to satisfy any allowable number of simultaenous + * Purpose : If we have not already allocated enough NCR53c7x0_cmd + * structures to satisfy any allowable number of simultaneous * commands for this host; do so (using either scsi_malloc() * or kmalloc() depending on configuration), and add them to the * hostdata free list. Take the first structure off the free list, @@ -2339,9 +2339,9 @@ create_cmd (Scsi_Cmnd *cmd) { unsigned long flags; NCR53c7x0_local_setup(cmd->host); -/* FIXME : when we start doing multiple simultaenous commands per LUN, +/* FIXME : when we start doing multiple simultaneous commands per LUN, we will need to either - - Do an attach_slave() and detach_slave() the right way (alocate + - Do an attach_slave() and detach_slave() the right way (allocate memory in attach_slave() as we do in scsi_register). - Make sure this code works with the former being cleaner. At the same time, we can also go with @@ -2355,7 +2355,7 @@ create_cmd (Scsi_Cmnd *cmd) { !(hostdata->cmd_allocated[cmd->target] & (1 << cmd->lun))) { for (i = host->hostt->cmd_per_lun - 1; i >= 0 --i) { #ifdef SCSI_MALLOC - /* scsi_malloc must allocate with a 512 byte granularity, but allways + /* scsi_malloc must allocate with a 512 byte granularity, but always returns buffers which are aligned on a 512 boundary */ size = (hostdata->max_cmd_size + 511) / 512 * 512; tmp = (struct NCR53c7x0_cmd *) scsi_malloc (size); @@ -3815,7 +3815,7 @@ NCR53c7xx_reset (Scsi_Cmnd *cmd) { save_flags(flags); halt (host); NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST); - udelay(25); /* Minimum ammount of time to assert RST */ + udelay(25); /* Minimum amount of time to assert RST */ NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST); for (c = (struct NCR53c7x0_cmd *) hostdata->running_list, found = 0; c; c = (struct NCR53c7x0_cmd *) c->next) { @@ -3899,7 +3899,7 @@ shutdown (struct Scsi_Host *host) { * reset. */ NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST); - udelay(25); /* Minimum ammount of time to assert RST */ + udelay(25); /* Minimum amount of time to assert RST */ NCR53c7x0_write8(SCNTL1_REG, SCNTL1_RST); restore_flags (flags); return 0; diff --git a/drivers/scsi/53c7,8xx.h b/drivers/scsi/53c7,8xx.h index a216b02c5b1a..6a36159140cb 100644 --- a/drivers/scsi/53c7,8xx.h +++ b/drivers/scsi/53c7,8xx.h @@ -59,7 +59,7 @@ extern int NCR53c7xx_release(struct Scsi_Host *); #endif #define NCR53c7xx {NULL, NULL, "NCR53c{7,8}xx (rel 4)", NCR53c7xx_detect, \ - NULL, /* info */ NULL, /* command, depricated */ NULL, \ + NULL, /* info */ NULL, /* command, deprecated */ NULL, \ NCR53c7xx_queue_command, NCR53c7xx_abort, NCR53c7xx_reset, \ NULL /* slave attach */, scsicam_bios_param, /* can queue */ 1, \ /* id */ 7, 127 /* old SG_ALL */, /* cmd per lun */ 1 , \ diff --git a/drivers/scsi/ChangeLog b/drivers/scsi/ChangeLog index 7a381fef0ed9..7c81c77609a8 100644 --- a/drivers/scsi/ChangeLog +++ b/drivers/scsi/ChangeLog @@ -89,7 +89,7 @@ Mon Feb 20 08:57:17 1995 Eric Youngdale (eric@andante) * 53c7,8xx.c: crash on AEN fixed, SCSI reset is no longer a NOP, NULL pointer panic on odd UDCs fixed, two bugs in diagnostic output fixed, should initialize correctly if left running, now loadable, - new memory allocation, extraneous diagnostic output supressed, + new memory allocation, extraneous diagnostic output suppressed, splx() replaced with save/restore flags. [ Drew ] * hosts.c, hosts.h, scsi_ioctl.c, sd.c, sd_ioctl.c, sg.c, sr.c, @@ -111,7 +111,7 @@ Mon Feb 20 08:57:17 1995 Eric Youngdale (eric@andante) * sr.c: More photo-cd hacks to make sure we get the xa stuff right. * sr.h, sr.c: Change is_xa to xa_flags field. - * st.c: Diable retries for write operations. + * st.c: Disable retries for write operations. Wed Feb 15 10:52:56 1995 Eric Youngdale (eric@andante) @@ -181,7 +181,7 @@ Wed Feb 1 09:20:45 1995 Eric Youngdale (eric@andante) * Linux 1.1.89 released. - * Makefile, u14-34f.c: Modulariz.e + * Makefile, u14-34f.c: Modularize. * Makefile, eata.c: Modularize. Now version 1.14 @@ -202,7 +202,7 @@ Wed Feb 1 09:20:45 1995 Eric Youngdale (eric@andante) * scsi.h: Define QUEUE_FULL condition. - * sd.c: Do not check for non-existant partition until after + * sd.c: Do not check for non-existent partition until after new media check. * sg.c: Undo previous change which was wrong. @@ -281,7 +281,7 @@ Wed Jan 18 23:33:09 1995 Eric Youngdale (eric@andante) * scsi.c: Make RECOVERED_ERROR a SUGGEST_IS_OK. - * sd.c: Fail if we are opening a non-existant partition. + * sd.c: Fail if we are opening a non-existent partition. * sr.c: Bump SR_TIMEOUT to 15000. Do not probe for media size at boot time(hard on changers). diff --git a/fs/buffer.c b/fs/buffer.c index 161a2ba39e69..239e46e1b9e8 100644 --- a/fs/buffer.c +++ b/fs/buffer.c @@ -1849,7 +1849,7 @@ asmlinkage int sys_bdflush(int func, long data) /* If there are still a lot of dirty buffers around, skip the sleep and flush some more */ - if(nr_buffers_type[BUF_DIRTY] < (nr_buffers - nr_buffers_type[BUF_SHARED]) * + if(nr_buffers_type[BUF_DIRTY] <= (nr_buffers - nr_buffers_type[BUF_SHARED]) * bdf_prm.b_un.nfract/100) { if (current->signal & (1 << (SIGKILL-1))) { bdflush_running--; diff --git a/include/asm-alpha/byteorder.h b/include/asm-alpha/byteorder.h index c54bb983c653..02902df90ad4 100644 --- a/include/asm-alpha/byteorder.h +++ b/include/asm-alpha/byteorder.h @@ -6,8 +6,13 @@ #undef htonl #undef htons +#ifndef LITTLE_ENDIAN #define LITTLE_ENDIAN +#endif + +#ifndef LITTLE_ENDIAN_BITFIELD #define LITTLE_ENDIAN_BITFIELD +#endif extern unsigned long int ntohl(unsigned long int); extern unsigned short int ntohs(unsigned short int); diff --git a/include/asm-i386/byteorder.h b/include/asm-i386/byteorder.h index 600ce124d3f5..03eb42f8ebfb 100644 --- a/include/asm-i386/byteorder.h +++ b/include/asm-i386/byteorder.h @@ -6,8 +6,13 @@ #undef htonl #undef htons +#ifndef LITTLE_ENDIAN #define LITTLE_ENDIAN 1234 +#endif + +#ifndef LITTLE_ENDIAN_BITFIELD #define LITTLE_ENDIAN_BITFIELD +#endif extern unsigned long int ntohl(unsigned long int); extern unsigned short int ntohs(unsigned short int); -- 2.39.5