diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/CREDITS linux.15p6/CREDITS
--- linux.vanilla/CREDITS Tue Jan 4 21:18:37 2000
+++ linux.15p6/CREDITS Mon Feb 7 12:29:21 2000
@@ -1408,7 +1408,7 @@
S: Netherlands
N: David S. Miller
-E:
[email protected]
+E:
[email protected]
D: Sparc and blue box hacker
D: Vger Linux mailing list co-maintainer
D: Linux Emacs elf/qmagic support + other libc/gcc things
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/Documentation/Configure.help linux.15p6/Documentation/Configure.help
--- linux.vanilla/Documentation/Configure.help Tue Jan 4 21:18:37 2000
+++ linux.15p6/Documentation/Configure.help Mon Feb 7 12:30:39 2000
@@ -10584,8 +10661,14 @@
inserted in and removed from the running kernel whenever you want),
say M and read Documentation/modules.txt. If unsure, say Y.
-#Mostek real time clock support
-#CONFIG_SUN_MOSTEK_RTC
+Mostek real time clock support
+CONFIG_SUN_MOSTEK_RTC
+ The Mostek RTC chip is used on all knows Sun computers except
+ some JavaStation-s. For a JavaStation you need to say Y both here
+ and to CONFIG_RTC.
+
+ Say Y here unless you are building a special purpose kernel.
+
#
#Siemens SAB82532 serial support
#CONFIG_SAB82532
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc/config.in linux.15p6/arch/sparc/config.in
--- linux.vanilla/arch/sparc/config.in Wed Oct 20 01:12:33 1999
+++ linux.15p6/arch/sparc/config.in Mon Feb 7 12:20:21 2000
@@ -103,6 +103,25 @@
if [ "$CONFIG_NET" = "y" ]; then
source net/Config.in
+ mainmenu_option next_comment
+ comment 'Amateur Radio support'
+ bool 'Amateur Radio support' CONFIG_HAMRADIO
+ if [ "$CONFIG_HAMRADIO" != "n" ] ; then
+ comment 'Packet Radio protocols'
+ tristate 'Amateur Radio AX.25 Level 2 protocol' CONFIG_AX25
+ if [ "$CONFIG_AX25" != "n" ]; then
+ bool ' AX.25 DAMA Slave support' CONFIG_AX25_DAMA_SLAVE
+# bool ' AX.25 DAMA Master support' CONFIG_AX25_DAMA_MASTER
+ dep_tristate ' Amateur Radio NET/ROM protocol' CONFIG_NETROM $CONFIG_AX25
+ dep_tristate ' Amateur Radio X.25 PLP (Rose)' CONFIG_ROSE $CONFIG_AX25
+
+ comment 'AX.25 network device drivers'
+ dep_tristate 'Serial port KISS driver' CONFIG_MKISS $CONFIG_AX25
+ dep_tristate 'Serial port 6PACK driver' CONFIG_6PACK $CONFIG_AX25
+ fi
+ fi
+
+ endmenu
fi
mainmenu_option next_comment
@@ -139,7 +158,7 @@
mainmenu_option next_comment
comment 'SCSI low-level drivers'
- bool 'Sparc ESP Scsi Driver' CONFIG_SCSI_SUNESP $CONFIG_SCSI
+ tristate 'Sparc ESP Scsi Driver' CONFIG_SCSI_SUNESP $CONFIG_SCSI
tristate 'PTI Qlogic,ISP Driver' CONFIG_SCSI_QLOGICPTI $CONFIG_SCSI
endmenu
fi
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc/defconfig linux.15p6/arch/sparc/defconfig
--- linux.vanilla/arch/sparc/defconfig Wed Oct 20 01:12:33 1999
+++ linux.15p6/arch/sparc/defconfig Mon Feb 7 12:20:21 2000
@@ -146,6 +146,11 @@
# CONFIG_NET_SCHED is not set
#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
# ISDN subsystem
#
# CONFIG_ISDN is not set
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc/kernel/ebus.c linux.15p6/arch/sparc/kernel/ebus.c
--- linux.vanilla/arch/sparc/kernel/ebus.c Tue Oct 27 17:52:20 1998
+++ linux.15p6/arch/sparc/kernel/ebus.c Fri Jan 21 17:50:17 2000
@@ -1,9 +1,10 @@
-/* $Id: ebus.c,v 1.2 1998/10/07 11:35:16 jj Exp $
+/* $Id: ebus.c,v 1.2.2.1 2000/01/21 01:05:35 davem Exp $
* ebus.c: PCI to EBus bridge device.
*
* Copyright (C) 1997 Eddie C. Dost (
[email protected])
*
* Adopted for sparc by V. Roganov and G. Raiko.
+ * Fixes for different platforms by Pete Zaitcev.
*/
#include <linux/config.h>
@@ -25,9 +26,9 @@
#undef DEBUG_FILL_EBUS_DEV
#ifdef PROM_DEBUG
-#define dprintf prom_printf
+#define dprintk prom_printf
#else
-#define dprintf printk
+#define dprintk printk
#endif
struct linux_ebus *ebus_chain = 0;
@@ -48,6 +49,9 @@
extern int envctrl_init(void);
#endif
+/* We are together with pcic.c under CONFIG_PCI. */
+extern unsigned int pcic_pin_to_irq(unsigned int, char *name);
+
static inline unsigned long ebus_alloc(size_t size)
{
return (unsigned long)kmalloc(size, GFP_ATOMIC);
@@ -66,6 +70,7 @@
strcpy(dev->prom_name, lbuf);
len = prom_getproperty(node, "reg", (void *)regs, sizeof(regs));
+ if (len == -1) len = 0;
dev->num_addrs = len / sizeof(regs[0]);
for (i = 0; i < dev->num_addrs; i++) {
@@ -77,22 +82,36 @@
dev->base_address[i] = dev->parent->base_address[regs[i]];
}
+ /*
+ * Houston, we have a problem...
+ * Sometimes PROM supplies absolutely meaningless properties.
+ * Still, we take what it gives since we have nothing better.
+ * Children of ebus may be wired on any input pin of PCIC.
+ */
len = prom_getproperty(node, "interrupts", (char *)&irqs, sizeof(irqs));
if ((len == -1) || (len == 0)) {
dev->num_irqs = 0;
- /*
- * Oh, well, some PROMs don't export interrupts
- * property to children of EBus devices...
- *
- * Be smart about PS/2 keyboard and mouse.
- */
- if (!strcmp(dev->parent->prom_name, "8042")) {
+ dev->irqs[0] = 0;
+ if (dev->parent->num_irqs != 0) {
dev->num_irqs = 1;
dev->irqs[0] = dev->parent->irqs[0];
+/* P3 remove */ printk("EBUS: dev %s irq %d from parent\n", dev->prom_name, dev->irqs[0]);
}
} else {
dev->num_irqs = len / sizeof(irqs[0]);
- printk("FIXME: %s irq(%d)\n", dev->prom_name, irqs[0]);
+ if (irqs[0] == 0 || irqs[0] >= 8) {
+ /*
+ * XXX Zero is a valid pin number...
+ * This works as long as Ebus is not wired to INTA#.
+ */
+ printk("EBUS: %s got bad irq %d from PROM\n",
+ dev->prom_name, irqs[0]);
+ dev->num_irqs = 0;
+ dev->irqs[0] = 0;
+ } else {
+ dev->irqs[0] = pcic_pin_to_irq(irqs[0], dev->prom_name);
+/* P3 remove */ printk("EBUS: dev %s irq %d from PROM\n", dev->prom_name, dev->irqs[0]);
+ }
}
#ifdef DEBUG_FILL_EBUS_DEV
@@ -131,7 +150,30 @@
dev->num_addrs = len / sizeof(struct linux_prom_registers);
for (i = 0; i < dev->num_addrs; i++) {
- n = (regs[i].which_io - 0x10) >> 2;
+ /*
+ * XXX Collect JE-1 PROM
+ *
+ * Example - JS-E with 3.11:
+ * /ebus
+ * regs
+ * 0x00000000, 0x0, 0x00000000, 0x0, 0x00000000,
+ * 0x82000010, 0x0, 0xf0000000, 0x0, 0x01000000,
+ * 0x82000014, 0x0, 0x38800000, 0x0, 0x00800000,
+ * ranges
+ * 0x00, 0x00000000, 0x02000010, 0x0, 0x0, 0x01000000,
+ * 0x01, 0x01000000, 0x02000014, 0x0, 0x0, 0x00800000,
+ * /ebus/8042
+ * regs
+ * 0x00000001, 0x00300060, 0x00000008,
+ * 0x00000001, 0x00300060, 0x00000008,
+ */
+ n = regs[i].which_io;
+ if (n >= 4) {
+ /* XXX This is copied from old JE-1 by Gleb. */
+ n = (regs[i].which_io - 0x10) >> 2;
+ } else {
+ ;
+ }
dev->base_address[i] = dev->bus->self->base_address[n];
dev->base_address[i] += regs[i].phys_addr;
@@ -141,8 +183,14 @@
(unsigned long)sparc_alloc_io (dev->base_address[i], 0,
regs[i].reg_size,
dev->prom_name, 0, 0);
+#if 0
+/*
+ * This release_region() screwes those who do sparc_alloc_io().
+ * Change drivers which do check_region(). See drivers/block/floppy.c.
+ */
/* Some drivers call 'check_region', so we release it */
release_region(dev->base_address[i] & PAGE_MASK, PAGE_SIZE);
+#endif
if (dev->base_address[i] == 0 ) {
panic("ebus: unable sparc_alloc_io for dev %s",
@@ -154,12 +202,22 @@
len = prom_getproperty(node, "interrupts", (char *)&irqs, sizeof(irqs));
if ((len == -1) || (len == 0)) {
dev->num_irqs = 0;
+ if ((dev->irqs[0] = dev->bus->self->irq) != 0) {
+ dev->num_irqs = 1;
+/* P3 remove */ printk("EBUS: child %s irq %d from parent\n", dev->prom_name, dev->irqs[0]);
+ }
} else {
- dev->num_irqs = len / sizeof(irqs[0]);
-
-#define IRQ_8042 7
- if (irqs[0] == 4) dev->irqs[0] = IRQ_8042;
- printk("FIXME: %s irq(%d)\n", dev->prom_name, irqs[0]);
+ dev->num_irqs = 1; /* dev->num_irqs = len / sizeof(irqs[0]); */
+ if (irqs[0] == 0 || irqs[0] >= 8) {
+ /* See above for the parent. XXX */
+ printk("EBUS: %s got bad irq %d from PROM\n",
+ dev->prom_name, irqs[0]);
+ dev->num_irqs = 0;
+ dev->irqs[0] = 0;
+ } else {
+ dev->irqs[0] = pcic_pin_to_irq(irqs[0], dev->prom_name);
+/* P3 remove */ printk("EBUS: child %s irq %d from PROM\n", dev->prom_name, dev->irqs[0]);
+ }
}
#ifdef DEBUG_FILL_EBUS_DEV
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc/kernel/entry.S linux.15p6/arch/sparc/kernel/entry.S
--- linux.vanilla/arch/sparc/kernel/entry.S Tue Jan 4 21:18:41 2000
+++ linux.15p6/arch/sparc/kernel/entry.S Fri Jan 21 17:50:17 2000
@@ -1,4 +1,4 @@
-/* $Id: entry.S,v 1.159.2.6 1999/10/11 08:24:35 davem Exp $
+/* $Id: entry.S,v 1.159.2.7 2000/01/21 01:05:35 davem Exp $
* arch/sparc/kernel/entry.S: Sparc trap low-level entry points.
*
* Copyright (C) 1995 David S. Miller (
[email protected])
@@ -1898,5 +1898,53 @@
LOAD_CURRENT(g6, o0)
retl
nop
+
+#ifdef CONFIG_PCI
+#include <asm/pcic.h>
+
+ .align 4
+ .globl linux_trap_ipi15_pcic
+linux_trap_ipi15_pcic:
+ rd %wim, %l3
+ SAVE_ALL
+
+ /*
+ * First deactivate NMI
+ * or we cannot drop ET, cannot get window spill traps.
+ * The busy loop is necessary because the PIO error
+ * sometimes does not go away quickly and we trap again.
+ */
+ sethi %hi(C_LABEL(pcic_regs)), %o1
+ ld [%o1 + %lo(C_LABEL(pcic_regs))], %o2
+
+ ! Get pending status for printouts later.
+ ld [%o2 + PCI_SYS_INT_PENDING], %o0
+
+ mov PCI_SYS_INT_PENDING_CLEAR_ALL, %o1
+ stb %o1, [%o2 + PCI_SYS_INT_PENDING_CLEAR]
+1:
+ ld [%o2 + PCI_SYS_INT_PENDING], %o1
+ andcc %o1, ((PCI_SYS_INT_PENDING_PIO|PCI_SYS_INT_PENDING_PCI)>>24), %g0
+ bne 1b
+ nop
+
+ or %l0, PSR_PIL, %l4
+ wr %l4, 0x0, %psr
+ WRITE_PAUSE
+ wr %l4, PSR_ET, %psr
+ WRITE_PAUSE
+
+ call C_LABEL(pcic_nmi)
+ add %sp, REGWIN_SZ, %o1 ! struct pt_regs *regs
+ RESTORE_ALL
+
+ .globl C_LABEL(pcic_nmi_trap_patch)
+C_LABEL(pcic_nmi_trap_patch):
+ sethi %hi(linux_trap_ipi15_pcic), %l3
+ jmpl %l3 + %lo(linux_trap_ipi15_pcic), %g0
+ rd %psr, %l0
+ .word 0
+
+#endif /* CONFIG_PCI */
/* End of entry.S */
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc/kernel/head.S linux.15p6/arch/sparc/kernel/head.S
--- linux.vanilla/arch/sparc/kernel/head.S Tue Jan 4 21:18:41 2000
+++ linux.15p6/arch/sparc/kernel/head.S Fri Jan 21 17:50:17 2000
@@ -1,8 +1,8 @@
-/* $Id: head.S,v 1.95.2.5 1999/12/02 11:51:56 davem Exp $
+/* $Id: head.S,v 1.95.2.6 2000/01/21 01:05:39 davem Exp $
* head.S: The initial boot code for the Sparc port of Linux.
*
* Copyright (C) 1995 David S. Miller (
[email protected])
- * Copyright (C) 1995 Peter Zaitcev (
[email protected])
+ * Copyright (C) 1995,1999 Pete Zaitcev (
[email protected])
* Copyright (C) 1996 Miguel de Icaza (
[email protected])
* Copyright (C) 1997 Jakub Jelinek (
[email protected])
* Copyright (C) 1997 Michael A. Griffith (
[email protected])
@@ -116,10 +116,10 @@
t_irq12:TRAP_ENTRY_INTERRUPT(12) /* IRQ Zilog serial chip */
t_irq13:TRAP_ENTRY_INTERRUPT(13) /* IRQ Audio Intr. */
t_irq14:TRAP_ENTRY_INTERRUPT(14) /* IRQ Timer #2 */
+ .globl t_nmi
#ifndef __SMP__
t_nmi: NMI_TRAP /* Level 15 (NMI) */
#else
- .globl t_nmi
t_nmi: TRAP_ENTRY(0x1f, linux_trap_ipi15_sun4m)
#endif
t_racc: TRAP_ENTRY(0x20, do_reg_access) /* General Register Access Error */
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc/kernel/pcic.c linux.15p6/arch/sparc/kernel/pcic.c
--- linux.vanilla/arch/sparc/kernel/pcic.c Sat Aug 14 02:27:15 1999
+++ linux.15p6/arch/sparc/kernel/pcic.c Fri Jan 21 17:50:17 2000
@@ -1,10 +1,12 @@
-/* $Id: pcic.c,v 1.5.2.1 1999/08/07 10:42:43 davem Exp $
+/* $Id: pcic.c,v 1.5.2.2 2000/01/21 01:05:41 davem Exp $
* pcic.c: Sparc/PCI controller support
*
* Copyright (C) 1998 V. Roganov and G. Raiko
*
* Code is derived from Ultra/PCI PSYCHO controller support, see that
* for author info.
+ *
+ * Support for diverse IIep based platforms by Pete Zaitcev.
*/
#include <linux/config.h>
@@ -16,20 +18,10 @@
#include <asm/ebus.h>
#include <asm/sbus.h> /* for sanity check... */
+#include <asm/swift.h> /* for cache flushing. */
#include <asm/io.h>
-#undef PROM_DEBUG
-#undef FIXUP_REGS_DEBUG
-#undef FIXUP_IRQ_DEBUG
-#undef FIXUP_VMA_DEBUG
-
-#ifdef PROM_DEBUG
-#define dprintf prom_printf
-#else
-#define dprintf printk
-#endif
-
#include <linux/ctype.h>
#include <linux/pci.h>
#include <linux/timex.h>
@@ -68,9 +60,101 @@
#else
+unsigned int pcic_pin_to_irq(unsigned int pin, char *name);
+
+/*
+ * I studied different documents and many live PROMs both from 2.30
+ * family and 3.xx versions. I came to the amazing conclusion: there is
+ * absolutely no way to route interrupts in IIep systems relying on
+ * information which PROM presents. We must hardcode interrupt routing
+ * schematics. And this actually sucks. -- zaitcev 1999/05/12
+ *
+ * To find irq for a device we determine which routing map
+ * is in effect or, in other words, on which machine we are running.
+ * We use PROM name for this although other techniques may be used
+ * in special cases (Gleb reports a PROMless IIep based system).
+ * Once we know the map we take device configuration address and
+ * find PCIC pin number where INT line goes. Then we may either program
+ * preferred irq into the PCIC or supply the preexisting irq to the device.
+ *
+ * XXX Entries for JE-1 are completely bogus. Gleb, Vladimir, please fill them.
+ */
+struct pcic_ca2irq {
+ unsigned char busno; /* PCI bus number */
+ unsigned char devfn; /* Configuration address */
+ unsigned char pin; /* PCIC external interrupt pin */
+ unsigned char irq; /* Preferred IRQ (mappable in PCIC) */
+ unsigned int force; /* Enforce preferred IRQ */
+};
+
+struct pcic_sn2list {
+ char *sysname;
+ struct pcic_ca2irq *intmap;
+ int mapdim;
+};
+
+/*
+ * XXX JE-1 is a little known beast.
+ * One rumor has the map this way: pin 0 - parallel, audio;
+ * pin 1 - Ethernet; pin 2 - su; pin 3 - PS/2 kbd and mouse.
+ * All other comparable systems tie serial and keyboard together,
+ * so we do not code this rumor just yet.
+ */
+static struct pcic_ca2irq pcic_i_je1[] = {
+ { 0, 0x01, 1, 6, 1 }, /* Happy Meal */
+};
+
+/* XXX JS-E entry is incomplete - PCI Slot 2 address (pin 7)? */
+static struct pcic_ca2irq pcic_i_jse[] = {
+ { 0, 0x00, 0, 13, 0 }, /* Ebus - serial and keyboard */
+ { 0, 0x01, 1, 6, 0 }, /* hme */
+ { 0, 0x08, 2, 9, 0 }, /* VGA - we hope not used :) */
+ { 0, 0x18, 6, 8, 0 }, /* PCI INTA# in Slot 1 */
+ { 0, 0x38, 4, 9, 0 }, /* All ISA devices. Read 8259. */
+ { 0, 0x80, 5, 11, 0 }, /* EIDE */
+ /* {0,0x88, 0,0,0} - unknown device... PMU? Probably no interrupt. */
+ { 0, 0xA0, 4, 9, 0 }, /* USB */
+ /*
+ * Some pins belong to non-PCI devices, we hardcode them in drivers.
+ * sun4m timers - irq 10, 14
+ * PC style RTC - pin 7, irq 4 ?
+ * Smart card, Parallel - pin 4 shared with USB, ISA
+ * audio - pin 3, irq 5 ?
+ */
+};
+
+/*
+ * Krups
+ * No documentation available, so we guess it, based on Espresso layout.
+ * Since we always run PROLL on Krups we may put map in there.
+ */
+static struct pcic_ca2irq pcic_i_jk[] = {
+ { 0, 0x00, 0, 13, 0 }, /* Ebus - serial and keyboard */
+ { 0, 0x01, 1, 6, 0 }, /* hme */
+};
+
+/*
+ * Several entries in this list may point to the same routing map
+ * as several PROMs may be installed on the same physical board.
+ */
+#define SN2L_INIT(name, map) \
+ { name, map, sizeof(map)/sizeof(struct pcic_ca2irq) }
+
+static struct pcic_sn2list pcic_known_sysnames[] = {
+ SN2L_INIT("JE-1-name", pcic_i_je1), /* XXX Gleb, put name here, pls */
+ SN2L_INIT("SUNW,JS-E", pcic_i_jse), /* PROLL JavaStation-E */
+ SN2L_INIT("SUNW,JS-NC", pcic_i_jk), /* PROLL JavaStation-NC */
+ SN2L_INIT("SUNW,JSIIep", pcic_i_jk), /* OBP JavaStation-NC */
+ { NULL, NULL, 0 }
+};
+
static struct linux_pcic PCIC;
static struct linux_pcic *pcic = NULL;
+unsigned int pcic_regs;
+volatile int pcic_speculative;
+volatile int pcic_trapped;
+
static void pci_do_gettimeofday(struct timeval *tv);
static void pci_do_settimeofday(struct timeval *tv);
@@ -100,7 +184,7 @@
"from PROM.\n");
prom_halt();
}
-
+
pcic = &PCIC;
pcic->pcic_regs = (unsigned long)sparc_alloc_io(regs[0].phys_addr, NULL,
@@ -146,8 +230,39 @@
pbm = &pcic->pbm;
pbm->prom_node = node;
- prom_getstring(node, "name", namebuf, sizeof(namebuf));
+ prom_getstring(node, "name", namebuf, 63); namebuf[63] = 0;
strcpy(pbm->prom_name, namebuf);
+
+ {
+ extern volatile int t_nmi[1];
+ extern int pcic_nmi_trap_patch[1];
+
+ t_nmi[0] = pcic_nmi_trap_patch[0];
+ t_nmi[1] = pcic_nmi_trap_patch[1];
+ t_nmi[2] = pcic_nmi_trap_patch[2];
+ t_nmi[3] = pcic_nmi_trap_patch[3];
+ swift_flush_dcache();
+ pcic_regs = pcic->pcic_regs;
+ }
+
+ prom_getstring(prom_root_node, "name", namebuf, 63); namebuf[63] = 0;
+ {
+ struct pcic_sn2list *p;
+
+ for (p = pcic_known_sysnames; p->sysname != NULL; p++) {
+ if (strcmp(namebuf, p->sysname) == 0)
+ break;
+ }
+ pcic->pcic_imap = p->intmap;
+ pcic->pcic_imdim = p->mapdim;
+ }
+ if (pcic->pcic_imap == NULL) {
+ /*
+ * We do not panic here for the sake of embedded systems.
+ */
+ printk("PCIC: System %s is unknown, cannot route interrupts\n",
+ namebuf);
+ }
}
__initfunc(void pcibios_init(void))
@@ -165,20 +280,15 @@
pcic->pcic_regs, pcic->pcic_io);
/*
- * FIXME:
* Switch off IOTLB translation.
- * It'll be great to use IOMMU to handle HME's rings
- * but we couldn't. Thus, we have to flush CPU cache
- * in HME.
*/
writeb(PCI_DVMA_CONTROL_IOTLB_DISABLE,
pcic->pcic_regs+PCI_DVMA_CONTROL);
/*
- * FIXME:
* Increase mapped size for PCI memory space (DMA access).
* Should be done in that order (size first, address second).
- * Why we couldn't set up 4GB and forget about it ?
+ * Why we couldn't set up 4GB and forget about it? XXX
*/
writel(0xF0000000UL, pcic->pcic_regs+PCI_SIZE_0);
writel(0+PCI_BASE_ADDRESS_SPACE_MEMORY,
@@ -203,7 +313,7 @@
if(err != 0 && err != -1) {
unsigned long devfn = (regs[0].which_io >> 8) & 0xff;
if(devfn == pdev->devfn)
- return node; /* Match */
+ return node;
}
node = prom_getsibling(node);
}
@@ -215,10 +325,14 @@
return kmalloc(sizeof(struct pcidev_cookie), GFP_ATOMIC);
}
-
-static void pcic_map_pci_device (struct pci_dev *dev) {
- int node, pcinode;
+static void pcic_map_pci_device (struct pci_dev *dev, int node) {
+ char namebuf[64];
+ struct linux_prom_pci_assigned_addresses addrs[6];
+ int addrlen;
+ unsigned long address;
+ int length;
int i, j;
+ int nmem = 0, nio = 0;
/* Is any valid address present ? */
i = 0;
@@ -226,103 +340,165 @@
if (dev->base_address[j]) i++;
if (!i) return; /* nothing to do */
+ if (node == 0 || node == -1) {
+ printk("PCIC: no prom node for device (%x,%x)\n",
+ dev->device, dev->vendor);
+ return;
+ }
+ prom_getstring(node, "name", namebuf, 63); namebuf[63] = 0;
+
/*
* find related address and get it's window length
*/
- pcinode = prom_getchild(prom_root_node);
- pcinode = prom_searchsiblings(pcinode, "pci");
- if (!pcinode)
- panic("PCIC: failed to locate 'pci' node");
-
-
- for (node = prom_getchild(pcinode); node;
- node = prom_getsibling(node)) {
- struct linux_prom_pci_assigned_addresses addrs[6];
- int addrlen = prom_getproperty(node,"assigned-addresses",
+ addrlen = prom_getproperty(node,"assigned-addresses",
(char*)addrs, sizeof(addrs));
- if (addrlen == -1)
- continue;
-
- addrlen /= sizeof(struct linux_prom_pci_assigned_addresses);
- for (i = 0; i < addrlen; i++ )
- for (j = 0; j < 6; j++) {
- if (!dev->base_address[j] || !addrs[i].phys_lo)
- continue;
- if (addrs[i].phys_lo == dev->base_address[j]) {
- unsigned long address = dev->base_address[j];
- int length = addrs[i].size_lo;
- char namebuf[128] = { 0, };
- unsigned long mapaddr, addrflags;
-
- prom_getstring(node, "name",
- namebuf, sizeof(namebuf));
-
- /* FIXME:
- * failure in allocation too large space
- */
- if (length > 0x200000) {
- length = 0x200000;
- prom_printf("PCIC: map window for device '%s' "
- "reduced to 2MB !\n", namebuf);
- }
-
- /*
- * Be careful with MEM/IO address flags
- */
- if ((address & PCI_BASE_ADDRESS_SPACE) ==
- PCI_BASE_ADDRESS_SPACE_IO) {
- mapaddr = address & PCI_BASE_ADDRESS_IO_MASK;
- } else {
- mapaddr = address & PCI_BASE_ADDRESS_MEM_MASK;
- }
- addrflags = address ^ mapaddr;
-
- dev->base_address[j] =
- (unsigned long)sparc_alloc_io(address, 0,
- length,
- namebuf, 0, 0);
- if ( dev->base_address[j] == 0 )
- panic("PCIC: failed make mapping for "
- "pci device '%s' with address %lx\n",
- namebuf, address);
+ if (addrlen == -1) {
+ /*
+ * We could live without this property. Address and size
+ * can be determined from PCI Configuration space registers.
+ * We use "assigned-addresses" to gather length, which
+ * is typically less than otherwise would be needed.
+ */
+ printk("PCIC: no \"assigned-addresses\" for device (%x,%x)\n",
+ dev->device, dev->vendor);
+ return;
+ }
- dev->base_address[j] ^= addrflags;
- return;
+ addrlen /= sizeof(struct linux_prom_pci_assigned_addresses);
+ for (j = 0; j < 6; j++) { /* changing data goes first */
+ address = dev->base_address[j];
+ if (address == 0) break; /* are sequential */
+ if ((address & PCI_BASE_ADDRESS_SPACE) == PCI_BASE_ADDRESS_SPACE_IO) {
+ if (address < 0x10000) {
+ /*
+ * Under 64K I/O - use fixed map.
+ * We expect ALL devices to get here.
+ *
+ * CheerIO converts PCI memory transactions
+ * into IOW/IOR transactions for us, forget it.
+ *
+ * Note that check_region()/request_region()
+ * work for these devices.
+ */
+ dev->base_address[j] += pcic->pcic_io;
+ nio++;
+ } else {
+ /*
+ * OOPS... PCI Spec allows this. Sun does
+ * not have any devices getting above 64K
+ * so it must be user with a weird I/O
+ * board in a PCI slot. We must remap it
+ * under 64K but it is not done yet. XXX
+ */
+ printk("PCIC: Skipping I/O space at 0x%x,"
+ "this will Oops if a driver attaches;"
+ "device '%s' (%x,%x)\n", address, namebuf,
+ dev->device, dev->vendor);
+ }
+ } else {
+ /*
+ * Memory we must map, as Gleb did this originally.
+ */
+
+ for (i = 0; i < addrlen; i++) {
+ if (addrs[i].phys_lo == 0) continue;
+ if (addrs[i].phys_lo !=
+ (address & PCI_BASE_ADDRESS_MEM_MASK))
+ continue;
+
+ length = addrs[i].size_lo;
+
+ /*
+ * failure in allocation too large space
+ */
+ if (length > 0x200000) {
+ length = 0x200000;
+ prom_printf("PCIC: map window for "
+ "device '%s' reduced to 2MB !\n",
+ namebuf);
+ }
+
+ dev->base_address[j] =
+ (unsigned long)sparc_alloc_io(
+ address & PCI_BASE_ADDRESS_MEM_MASK,
+ 0, length, namebuf, 0, 0);
+
+ if (dev->base_address[j] == 0) {
+ panic("PCIC: failed to map "
+ "device '%s' (%x,%x) at %lx\n",
+ namebuf, dev->device, dev->vendor,
+ address);
+ }
+ dev->base_address[j] |= address & PCI_BASE_ADDRESS_MEM_TYPE_MASK;
+ nmem++;
}
}
}
- panic("PCIC: unable to locate prom node for pci device (%x,%x) \n",
- dev->device, dev->vendor);
+ if (nio == 0 && nmem == 0) {
+ printk("PCIC: not mapped device '%s' (%x,%x)\n",
+ namebuf, dev->device, dev->vendor);
+ }
}
-/*
- * Assign IO space for a device.
- * This is a chance for devices which have the same IO and Mem Space to
- * fork access to IO and Mem.
- *
- * Now, we assume there is one such device only (IGA 1682) but code below
- * should work in cases when space of all such devices is less then 16MB.
- */
-unsigned long pcic_alloc_io( unsigned long* addr )
-{
- unsigned long paddr = *addr;
- unsigned long offset;
+static void pcic_fill_irq(struct pci_dev *dev, int node) {
+ struct pcic_ca2irq *p;
+ int i, ivec;
+ char namebuf[64]; /* P3 remove */
- if(pcic->pcic_mapped_io == 0) {
- pcic->pcic_mapped_io = paddr & ~(PCI_SPACE_SIZE-1) ;
- writeb((pcic->pcic_mapped_io>>24) & 0xff,
- pcic->pcic_regs+PCI_PIBAR);
- writeb((pcic->pcic_io_phys>>24) & PCI_SIBAR_ADDRESS_MASK,
- pcic->pcic_regs+PCI_SIBAR);
- writeb(PCI_ISIZE_16M, pcic->pcic_regs+PCI_ISIZE);
- }
- if(paddr < pcic->pcic_mapped_io ||
- paddr > pcic->pcic_mapped_io + PCI_SPACE_SIZE)
- return 0;
- offset = paddr - pcic->pcic_mapped_io;
- *addr = pcic->pcic_io_phys + offset;
- return pcic->pcic_io + offset;
+ if (node == -1) {
+ strcpy(namebuf, "???");
+ } else {
+ prom_getstring(node, "name", namebuf, sizeof(namebuf)); /* P3 remove */
+ }
+
+ if ((p = pcic->pcic_imap) == 0) {
+ dev->irq = 0;
+ return;
+ }
+ for (i = 0; i < pcic->pcic_imdim; i++) {
+ if (p->busno == dev->bus->number && p->devfn == dev->devfn)
+ break;
+ p++;
+ }
+ if (i >= pcic->pcic_imdim) {
+ printk("PCIC: device %s devfn %02x:%02x not found in %d\n",
+ namebuf, dev->bus->number, dev->devfn, pcic->pcic_imdim);
+ dev->irq = 0;
+ return;
+ }
+
+ i = p->pin;
+ if (i >= 0 && i < 4) {
+ ivec = readw(pcic->pcic_regs+PCI_INT_SELECT_LO);
+ dev->irq = ivec >> (i << 2) & 0xF;
+ } else if (i >= 4 && i < 8) {
+ ivec = readw(pcic->pcic_regs+PCI_INT_SELECT_HI);
+ dev->irq = ivec >> ((i-4) << 2) & 0xF;
+ } else { /* Corrupted map */
+ printk("PCIC: BAD PIN %d\n", i); for (;;) {}
+ }
+/* P3 remove later */ printk("PCIC: device %s pin %d ivec 0x%x irq %x\n", namebuf, i, ivec, dev->irq);
+
+ /*
+ * dev->irq=0 means PROM did not bothered to program the upper
+ * half of PCIC. This happens on JS-E with PROM 3.11, for instance.
+ */
+ if (dev->irq == 0 || p->force) {
+ if (p->irq == 0 || p->irq >= 15) { /* Corrupted map */
+ printk("PCIC: BAD IRQ %d\n", p->irq); for (;;) {}
+ }
+ printk("PCIC: setting irq %x for device (%x,%x)\n",
+ p->irq, dev->device, dev->vendor);
+ dev->irq = p->irq;
+
+ ivec = readw(pcic->pcic_regs+PCI_INT_SELECT_HI);
+ ivec &= ~(0xF << ((p->pin - 4) << 2));
+ ivec |= p->irq << ((p->pin - 4) << 2);
+ writew(ivec, pcic->pcic_regs+PCI_INT_SELECT_HI);
+ }
+
+ return;
}
/*
@@ -333,6 +509,9 @@
struct pci_dev *dev;
int i, has_io, has_mem;
unsigned short cmd;
+ struct linux_pbm_info* pbm = &pcic->pbm;
+ int node;
+ struct pcidev_cookie *pcp;
if(pcic == NULL) {
prom_printf("PCI: Error, PCIC not found.\n");
@@ -358,47 +537,61 @@
}
pci_read_config_word(dev, PCI_COMMAND, &cmd);
if (has_io && !(cmd & PCI_COMMAND_IO)) {
- printk("PCI: Enabling I/O for device %02x:%02x\n",
+ printk("PCIC: Enabling I/O for device %02x:%02x\n",
dev->bus->number, dev->devfn);
cmd |= PCI_COMMAND_IO;
pci_write_config_word(dev, PCI_COMMAND, cmd);
}
if (has_mem && !(cmd & PCI_COMMAND_MEMORY)) {
- printk("PCI: Enabling memory for device %02x:%02x\n",
+ printk("PCIC: Enabling memory for device %02x:%02x\n",
dev->bus->number, dev->devfn);
cmd |= PCI_COMMAND_MEMORY;
pci_write_config_word(dev, PCI_COMMAND, cmd);
}
+ node = pdev_to_pnode(pbm, dev);
+ if(node == 0)
+ node = -1;
+
/* cookies */
- {
- struct pcidev_cookie *pcp;
- struct linux_pbm_info* pbm = &pcic->pbm;
- int node = pdev_to_pnode(pbm, dev);
-
- if(node == 0)
- node = -1;
- pcp = pci_devcookie_alloc();
- pcp->pbm = pbm;
- pcp->prom_node = node;
- dev->sysdata = pcp;
- }
+ pcp = pci_devcookie_alloc();
+ pcp->pbm = pbm;
+ pcp->prom_node = node;
+ dev->sysdata = pcp;
/* memory mapping */
- if (!(dev->vendor == PCI_VENDOR_ID_SUN &&
- dev->device == PCI_DEVICE_ID_SUN_EBUS)) {
- pcic_map_pci_device(dev);
- }
-
- /* irq */
-#define SETIRQ(vend,devid,irqn) \
- if (dev->vendor==vend && dev->device==devid) dev->irq = irqn;
+ if ((dev->class>>16) != PCI_BASE_CLASS_BRIDGE)
+ pcic_map_pci_device(dev, node);
- SETIRQ(PCI_VENDOR_ID_SUN,PCI_DEVICE_ID_SUN_HAPPYMEAL,3);
+ pcic_fill_irq(dev, node);
}
+
ebus_init();
}
+/*
+ * pcic_pin_to_irq() is exported to ebus.c.
+ */
+unsigned int
+pcic_pin_to_irq(unsigned int pin, char *name)
+{
+ unsigned int irq;
+ unsigned int ivec;
+
+ if (pin < 4) {
+ ivec = readw(pcic->pcic_regs+PCI_INT_SELECT_LO);
+ irq = ivec >> (pin << 2) & 0xF;
+ } else if (pin < 8) {
+ ivec = readw(pcic->pcic_regs+PCI_INT_SELECT_HI);
+ irq = ivec >> ((pin-4) << 2) & 0xF;
+ } else { /* Corrupted map */
+ printk("PCIC: BAD PIN %d FOR %s\n", pin, name);
+ for (;;) {} /* XXX Cannot panic properly in case of PROLL */
+ }
+/* P3 remove later */ printk("PCIC: dev %s pin %d ivec 0x%x irq %x\n", name, pin, ivec, irq);
+ return irq;
+}
+
/* Makes compiler happy */
static volatile int pcic_timer_dummy;
@@ -538,26 +731,38 @@
unsigned char where, unsigned int *value)
{
unsigned long flags;
- if (where&3) return PCIBIOS_BAD_REGISTER_NUMBER;
- if (bus != 0 ||
- (device_fn != 0 && device_fn != 1 && device_fn != 0x80)) {
- *value = 0xffffffff;
- return PCIBIOS_SUCCESSFUL;
- }
- /* FIXME: IGA haven't got high config memory addresses !!! */
- if (device_fn == 0x80 && where > PCI_INTERRUPT_LINE) {
- *value = 0xffffffff;
- return PCIBIOS_SUCCESSFUL;
- }
+ if (where&3) return PCIBIOS_BAD_REGISTER_NUMBER;
save_and_cli(flags);
+#if 0
+ pcic_speculative = 1;
+ pcic_trapped = 0;
+#endif
writel(CONFIG_CMD(bus,device_fn,where), pcic->pcic_config_space_addr);
+#if 0
+ nop();
+ if (pcic_trapped) {
+ restore_flags(flags);
+ *value = ~0;
+ return PCIBIOS_SUCCESSFUL;
+ }
+#endif
+ pcic_speculative = 2;
+ pcic_trapped = 0;
*value = readl(pcic->pcic_config_space_data + (where&4));
+ nop();
+ if (pcic_trapped) {
+ pcic_speculative = 0;
+ restore_flags(flags);
+ *value = ~0;
+ return PCIBIOS_SUCCESSFUL;
+ }
+ pcic_speculative = 0;
restore_flags(flags);
return PCIBIOS_SUCCESSFUL;
}
-
+
int pcibios_write_config_byte (unsigned char bus, unsigned char devfn,
unsigned char where, unsigned char value)
{
@@ -585,8 +790,8 @@
unsigned char where, unsigned int value)
{
unsigned long flags;
- if ((where&3) || bus != 0 || (devfn != 0 && devfn != 1 && devfn != 0x80))
- return PCIBIOS_BAD_REGISTER_NUMBER;
+
+ if (where&3) return PCIBIOS_BAD_REGISTER_NUMBER;
save_and_cli(flags);
writel(CONFIG_CMD(bus,devfn,where),pcic->pcic_config_space_addr);
@@ -598,6 +803,29 @@
__initfunc(char *pcibios_setup(char *str))
{
return str;
+}
+
+/*
+ * NMI
+ */
+void pcic_nmi(unsigned int pend, struct pt_regs *regs)
+{
+
+ pend = flip_dword(pend);
+
+ if (!pcic_speculative || (pend & PCI_SYS_INT_PENDING_PIO) == 0) {
+ /*
+ * XXX On CP-1200 PCI #SERR may happen, we do not know
+ * what to do about it yet.
+ */
+ printk("Aiee, NMI pend 0x%x pc 0x%x spec %d, hanging\n",
+ pend, (int)regs->pc, pcic_speculative);
+ for (;;) { }
+ }
+ pcic_speculative = 0;
+ pcic_trapped = 1;
+ regs->pc = regs->npc;
+ regs->npc += 4;
}
/*
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc/kernel/sys_sunos.c linux.15p6/arch/sparc/kernel/sys_sunos.c
--- linux.vanilla/arch/sparc/kernel/sys_sunos.c Tue Jan 4 21:18:41 2000
+++ linux.15p6/arch/sparc/kernel/sys_sunos.c Fri Jan 21 17:50:17 2000
@@ -1,4 +1,4 @@
-/* $Id: sys_sunos.c,v 1.94.2.3 1999/10/04 10:36:20 davem Exp $
+/* $Id: sys_sunos.c,v 1.94.2.4 2000/01/17 21:28:27 davem Exp $
* sys_sunos.c: SunOS specific syscall compatibility support.
*
* Copyright (C) 1995 David S. Miller (
[email protected])
@@ -370,6 +370,7 @@
spin_lock_irq(¤t->sigmask_lock);
old = current->blocked.sig[0];
current->blocked.sig[0] |= (blk_mask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
return old;
}
@@ -381,6 +382,7 @@
spin_lock_irq(¤t->sigmask_lock);
retval = current->blocked.sig[0];
current->blocked.sig[0] = (newmask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
return retval;
}
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc/mm/srmmu.c linux.15p6/arch/sparc/mm/srmmu.c
--- linux.vanilla/arch/sparc/mm/srmmu.c Tue Jan 4 21:18:42 2000
+++ linux.15p6/arch/sparc/mm/srmmu.c Fri Jan 14 15:56:16 2000
@@ -1,4 +1,4 @@
-/* $Id: srmmu.c,v 1.187.2.7 1999/11/16 06:29:44 davem Exp $
+/* $Id: srmmu.c,v 1.187.2.8 1999/12/23 01:58:38 davem Exp $
* srmmu.c: SRMMU specific routines for memory management.
*
* Copyright (C) 1995 David S. Miller (
[email protected])
@@ -1662,7 +1662,8 @@
srmmu_map[srmmu_bank].vbase = vbase;
srmmu_map[srmmu_bank].pbase = sp_banks[sp_entry].base_addr;
srmmu_map[srmmu_bank].size = sp_banks[sp_entry].num_bytes;
- srmmu_bank++;
+ if (srmmu_map[srmmu_bank].size)
+ srmmu_bank++;
map_spbank_last_pa = pstart - SRMMU_PGDIR_SIZE;
return vstart;
}
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/config.in linux.15p6/arch/sparc64/config.in
--- linux.vanilla/arch/sparc64/config.in Tue Jan 4 21:18:42 2000
+++ linux.15p6/arch/sparc64/config.in Mon Feb 7 12:20:21 2000
@@ -131,6 +131,25 @@
if [ "$CONFIG_NET" = "y" ]; then
source net/Config.in
+ mainmenu_option next_comment
+ comment 'Amateur Radio support'
+ bool 'Amateur Radio support' CONFIG_HAMRADIO
+ if [ "$CONFIG_HAMRADIO" != "n" ] ; then
+ comment 'Packet Radio protocols'
+ tristate 'Amateur Radio AX.25 Level 2 protocol' CONFIG_AX25
+ if [ "$CONFIG_AX25" != "n" ]; then
+ bool ' AX.25 DAMA Slave support' CONFIG_AX25_DAMA_SLAVE
+# bool ' AX.25 DAMA Master support' CONFIG_AX25_DAMA_MASTER
+ dep_tristate ' Amateur Radio NET/ROM protocol' CONFIG_NETROM $CONFIG_AX25
+ dep_tristate ' Amateur Radio X.25 PLP (Rose)' CONFIG_ROSE $CONFIG_AX25
+
+ comment 'AX.25 network device drivers'
+ dep_tristate 'Serial port KISS driver' CONFIG_MKISS $CONFIG_AX25
+ dep_tristate 'Serial port 6PACK driver' CONFIG_6PACK $CONFIG_AX25
+ fi
+ fi
+
+ endmenu
fi
mainmenu_option next_comment
@@ -158,7 +177,7 @@
mainmenu_option next_comment
comment 'SCSI low-level drivers'
- bool 'Sparc ESP Scsi Driver' CONFIG_SCSI_SUNESP $CONFIG_SCSI
+ tristate 'Sparc ESP Scsi Driver' CONFIG_SCSI_SUNESP $CONFIG_SCSI
tristate 'PTI Qlogic,ISP Driver' CONFIG_SCSI_QLOGICPTI $CONFIG_SCSI
if [ "$CONFIG_PCI" != "n" ]; then
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/defconfig linux.15p6/arch/sparc64/defconfig
--- linux.vanilla/arch/sparc64/defconfig Tue Jan 4 21:18:42 2000
+++ linux.15p6/arch/sparc64/defconfig Mon Feb 7 12:20:21 2000
@@ -176,6 +176,11 @@
# CONFIG_NET_SCHED is not set
#
+# Amateur Radio support
+#
+# CONFIG_HAMRADIO is not set
+
+#
# SCSI support
#
CONFIG_SCSI=y
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/binfmt_elf32.c linux.15p6/arch/sparc64/kernel/binfmt_elf32.c
--- linux.vanilla/arch/sparc64/kernel/binfmt_elf32.c Sun Oct 4 18:22:43 1998
+++ linux.15p6/arch/sparc64/kernel/binfmt_elf32.c Mon Feb 7 12:29:22 2000
@@ -1,7 +1,7 @@
/*
* binfmt_elf32.c: Support 32-bit Sparc ELF binaries on Ultra.
*
- * Copyright (C) 1995, 1996, 1997, 1998 David S. Miller (
[email protected])
+ * Copyright (C) 1995, 1996, 1997, 1998 David S. Miller (
[email protected])
* Copyright (C) 1995, 1996, 1997, 1998 Jakub Jelinek (
[email protected])
*/
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/dtlb_backend.S linux.15p6/arch/sparc64/kernel/dtlb_backend.S
--- linux.vanilla/arch/sparc64/kernel/dtlb_backend.S Tue Jan 4 21:18:42 2000
+++ linux.15p6/arch/sparc64/kernel/dtlb_backend.S Mon Feb 7 12:29:22 2000
@@ -1,8 +1,8 @@
-/* $Id: dtlb_backend.S,v 1.7.2.1 1999/12/05 10:41:57 davem Exp $
+/* $Id: dtlb_backend.S,v 1.7.2.2 2000/01/31 05:02:35 davem Exp $
* dtlb_backend.S: Back end to DTLB miss replacement strategy.
* This is included directly into the trap table.
*
- * Copyright (C) 1996,1998 David S. Miller (
[email protected])
+ * Copyright (C) 1996,1998 David S. Miller (
[email protected])
* Copyright (C) 1997,1998 Jakub Jelinek (
[email protected])
*/
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/dtlb_base.S linux.15p6/arch/sparc64/kernel/dtlb_base.S
--- linux.vanilla/arch/sparc64/kernel/dtlb_base.S Wed Aug 5 00:03:35 1998
+++ linux.15p6/arch/sparc64/kernel/dtlb_base.S Mon Feb 7 12:29:22 2000
@@ -1,8 +1,8 @@
-/* $Id: dtlb_base.S,v 1.4 1998/06/15 16:59:30 jj Exp $
+/* $Id: dtlb_base.S,v 1.4.2.1 2000/01/31 05:02:35 davem Exp $
* dtlb_base.S: Front end to DTLB miss replacement strategy.
* This is included directly into the trap table.
*
- * Copyright (C) 1996,1998 David S. Miller (
[email protected])
+ * Copyright (C) 1996,1998 David S. Miller (
[email protected])
* Copyright (C) 1997,1998 Jakub Jelinek (
[email protected])
*/
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/dtlb_prot.S linux.15p6/arch/sparc64/kernel/dtlb_prot.S
--- linux.vanilla/arch/sparc64/kernel/dtlb_prot.S Thu Mar 11 00:53:37 1999
+++ linux.15p6/arch/sparc64/kernel/dtlb_prot.S Mon Feb 7 12:29:22 2000
@@ -1,8 +1,8 @@
-/* $Id: dtlb_prot.S,v 1.18 1999/03/02 15:42:14 jj Exp $
+/* $Id: dtlb_prot.S,v 1.18.2.1 2000/01/31 05:02:35 davem Exp $
* dtlb_prot.S: DTLB protection trap strategy.
* This is included directly into the trap table.
*
- * Copyright (C) 1996,1998 David S. Miller (
[email protected])
+ * Copyright (C) 1996,1998 David S. Miller (
[email protected])
* Copyright (C) 1997,1998 Jakub Jelinek (
[email protected])
*/
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/ioctl32.c linux.15p6/arch/sparc64/kernel/ioctl32.c
--- linux.vanilla/arch/sparc64/kernel/ioctl32.c Tue Jan 4 21:18:43 2000
+++ linux.15p6/arch/sparc64/kernel/ioctl32.c Tue Jan 18 00:49:39 2000
@@ -1,4 +1,4 @@
-/* $Id: ioctl32.c,v 1.62.2.8 1999/11/16 23:59:31 davem Exp $
+/* $Id: ioctl32.c,v 1.62.2.9 2000/01/15 04:40:57 davem Exp $
* ioctl32.c: Conversion between 32bit and 64bit native ioctls.
*
* Copyright (C) 1997 Jakub Jelinek (
[email protected])
@@ -37,6 +37,7 @@
#include <linux/ext2_fs.h>
#include <linux/videodev.h>
#include <linux/netdevice.h>
+#include <linux/smb_fs.h>
#include <scsi/scsi.h>
/* Ugly hack. */
@@ -1692,6 +1693,24 @@
return 0;
}
+static int do_smb_getmountuid(unsigned int fd, unsigned int cmd, unsigned long arg)
+{
+ mm_segment_t old_fs = get_fs();
+ __kernel_uid_t kuid;
+ int err;
+
+ cmd = SMB_IOC_GETMOUNTUID;
+
+ set_fs(KERNEL_DS);
+ err = sys_ioctl(fd, cmd, (unsigned long)&kuid);
+ set_fs(old_fs);
+
+ if (err >= 0)
+ err = put_user(kuid, (__kernel_uid_t32 *)arg);
+
+ return err;
+}
+
asmlinkage int sys32_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg)
{
struct file * filp;
@@ -1878,6 +1897,11 @@
error = do_video_ioctl(fd, cmd, arg);
goto out;
+ /* One SMB ioctl needs translations. */
+ case _IOR('u', 1, __kernel_uid_t32): /* SMB_IOC_GETMOUNTUID */
+ error = do_smb_getmountuid(fd, cmd, arg);
+ goto out;
+
/* List here exlicitly which ioctl's are known to have
* compatable types passed or none at all...
*/
@@ -2393,6 +2417,9 @@
/* Raw devices */
case _IO(0xac, 0): /* RAW_SETBIND */
case _IO(0xac, 1): /* RAW_GETBIND */
+
+ /* SMB ioctls which do not need any translations */
+ case SMB_IOC_NEWCONN:
error = sys_ioctl (fd, cmd, arg);
goto out;
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/itlb_base.S linux.15p6/arch/sparc64/kernel/itlb_base.S
--- linux.vanilla/arch/sparc64/kernel/itlb_base.S Thu Mar 11 00:53:37 1999
+++ linux.15p6/arch/sparc64/kernel/itlb_base.S Mon Feb 7 12:29:22 2000
@@ -1,8 +1,8 @@
-/* $Id: itlb_base.S,v 1.7 1999/03/02 15:42:12 jj Exp $
+/* $Id: itlb_base.S,v 1.7.2.1 2000/01/31 05:02:35 davem Exp $
* itlb_base.S: Front end to ITLB miss replacement strategy.
* This is included directly into the trap table.
*
- * Copyright (C) 1996,1998 David S. Miller (
[email protected])
+ * Copyright (C) 1996,1998 David S. Miller (
[email protected])
* Copyright (C) 1997,1998 Jakub Jelinek (
[email protected])
*/
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/signal32.c linux.15p6/arch/sparc64/kernel/signal32.c
--- linux.vanilla/arch/sparc64/kernel/signal32.c Sat Aug 14 02:26:47 1999
+++ linux.15p6/arch/sparc64/kernel/signal32.c Fri Jan 14 15:56:16 2000
@@ -1,4 +1,4 @@
-/* $Id: signal32.c,v 1.47.2.1 1999/06/14 00:36:24 davem Exp $
+/* $Id: signal32.c,v 1.47.2.3 1999/12/20 01:14:06 davem Exp $
* arch/sparc64/kernel/signal32.c
*
* Copyright (C) 1991, 1992 Linus Torvalds
@@ -1033,6 +1033,62 @@
err |= __put_user(0, &sf->fpu_save);
}
+ /* Update the siginfo structure. Is this good? */
+ if (info->si_code == 0) {
+ info->si_signo = signr;
+ info->si_errno = 0;
+
+ switch (signr) {
+ case SIGSEGV:
+ case SIGILL:
+ case SIGFPE:
+ case SIGBUS:
+ case SIGEMT:
+ info->si_code = current->tss.sig_desc;
+ info->si_addr = (void *)current->tss.sig_address;
+ info->si_trapno = 0;
+ break;
+ default:
+ break;
+ }
+ }
+
+ err = __put_user (info->si_signo, &sf->info.si_signo);
+ err |= __put_user (info->si_errno, &sf->info.si_errno);
+ err |= __put_user (info->si_code, &sf->info.si_code);
+ if (info->si_code < 0)
+ err |= __copy_to_user (sf->info._sifields._pad, info->_sifields._pad, SI_PAD_SIZE);
+ else {
+ i = info->si_signo;
+ if (info->si_code == SI_USER)
+ i = SIGRTMIN;
+ switch (i) {
+ case SIGPOLL:
+ err |= __put_user (info->si_band, &sf->info.si_band);
+ err |= __put_user (info->si_fd, &sf->info.si_fd);
+ break;
+ case SIGCHLD:
+ err |= __put_user (info->si_pid, &sf->info.si_pid);
+ err |= __put_user (info->si_uid, &sf->info.si_uid);
+ err |= __put_user (info->si_status, &sf->info.si_status);
+ err |= __put_user (info->si_utime, &sf->info.si_utime);
+ err |= __put_user (info->si_stime, &sf->info.si_stime);
+ break;
+ case SIGSEGV:
+ case SIGILL:
+ case SIGFPE:
+ case SIGBUS:
+ case SIGEMT:
+ err |= __put_user ((long)info->si_addr, &sf->info.si_addr);
+ err |= __put_user (info->si_trapno, &sf->info.si_trapno);
+ break;
+ default:
+ err |= __put_user (info->si_pid, &sf->info.si_pid);
+ err |= __put_user (info->si_uid, &sf->info.si_uid);
+ break;
+ }
+ }
+
/* Setup sigaltstack */
err |= __put_user(current->sas_ss_sp, &sf->stack.ss_sp);
err |= __put_user(sas_ss_flags(regs->u_regs[UREG_FP]), &sf->stack.ss_flags);
@@ -1048,7 +1104,7 @@
case 1: seta.sig[1] = (oldset->sig[0] >> 32);
seta.sig[0] = oldset->sig[0];
}
- err |= __copy_to_user(&sf->mask, &seta, sizeof(sigset_t));
+ err |= __copy_to_user(&sf->mask, &seta, sizeof(sigset_t32));
err |= copy_in_user((u32 *)sf,
(u32 *)(regs->u_regs[UREG_FP]),
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/starfire.c linux.15p6/arch/sparc64/kernel/starfire.c
--- linux.vanilla/arch/sparc64/kernel/starfire.c Thu Mar 11 00:53:37 1999
+++ linux.15p6/arch/sparc64/kernel/starfire.c Mon Feb 7 12:29:22 2000
@@ -1,7 +1,7 @@
-/* $Id: starfire.c,v 1.2 1998/12/09 18:53:11 davem Exp $
+/* $Id: starfire.c,v 1.2.2.1 2000/01/31 05:02:35 davem Exp $
* starfire.c: Starfire/E10000 support.
*
- * Copyright (C) 1998 David S. Miller (
[email protected])
+ * Copyright (C) 1998 David S. Miller (
[email protected])
*/
#include <linux/kernel.h>
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/sys32.S linux.15p6/arch/sparc64/kernel/sys32.S
--- linux.vanilla/arch/sparc64/kernel/sys32.S Mon Nov 16 18:37:28 1998
+++ linux.15p6/arch/sparc64/kernel/sys32.S Wed Jan 26 23:03:00 2000
@@ -1,4 +1,4 @@
-/* $Id: sys32.S,v 1.8 1998/10/28 08:10:37 jj Exp $
+/* $Id: sys32.S,v 1.8.2.1 2000/01/24 11:36:55 jj Exp $
* sys32.S: I-cache tricks for 32-bit compatability layer simple
* conversions.
*
@@ -20,7 +20,7 @@
.align 32
.globl sys32_lseek
- .globl sys32_chmod, sys32_chown, sys32_lchown, sys32_mknod
+ .globl sys32_chmod, sys32_mknod
sys32_lseek:
sra %o1, 0, %o1
sethi %hi(sys_lseek), %g1
@@ -32,20 +32,6 @@
orcc %g2, %lo(0xffff), %g2
jmpl %g1 + %lo(sys_chmod), %g0
and %o1, %g2, %o1
-sys32_chown:
- sethi %hi(0xffff), %g2
- sethi %hi(sys_chown), %g1
- orcc %g2, %lo(0xffff), %g2
- and %o1, %g2, %o1
- jmpl %g1 + %lo(sys_chown), %g0
- and %o2, %g2, %o2
-sys32_lchown:
- sethi %hi(0xffff), %g2
- sethi %hi(sys_lchown), %g1
- orcc %g2, %lo(0xffff), %g2
- and %o1, %g2, %o1
- jmpl %g1 + %lo(sys_lchown), %g0
- and %o2, %g2, %o2
sys32_mknod:
sethi %hi(0xffff), %g2
sethi %hi(sys_mknod), %g1
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/sys_sparc32.c linux.15p6/arch/sparc64/kernel/sys_sparc32.c
--- linux.vanilla/arch/sparc64/kernel/sys_sparc32.c Tue Jan 4 21:18:43 2000
+++ linux.15p6/arch/sparc64/kernel/sys_sparc32.c Wed Jan 26 23:03:00 2000
@@ -1,4 +1,4 @@
-/* $Id: sys_sparc32.c,v 1.107.2.5 1999/11/12 11:17:47 davem Exp $
+/* $Id: sys_sparc32.c,v 1.107.2.7 2000/01/24 11:36:50 jj Exp $
* sys_sparc32.c: Conversion between 32bit and 64bit native syscalls.
*
* Copyright (C) 1997,1998 Jakub Jelinek (
[email protected])
@@ -1890,15 +1890,14 @@
return ret;
}
+#define low2highuid(uid) ((uid) == (u16)-1) ? (uid_t)-1 : (uid_t)(uid)
+#define low2highgid(gid) ((gid) == (u16)-1) ? (gid_t)-1 : (gid_t)(gid)
+
extern asmlinkage int sys_setreuid(uid_t ruid, uid_t euid);
asmlinkage int sys32_setreuid(__kernel_uid_t32 ruid, __kernel_uid_t32 euid)
{
- uid_t sruid, seuid;
-
- sruid = (ruid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)ruid);
- seuid = (euid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)euid);
- return sys_setreuid(sruid, seuid);
+ return sys_setreuid(low2highuid(ruid), low2highuid(euid));
}
extern asmlinkage int sys_setresuid(uid_t ruid, uid_t euid, uid_t suid);
@@ -1907,12 +1906,7 @@
__kernel_uid_t32 euid,
__kernel_uid_t32 suid)
{
- uid_t sruid, seuid, ssuid;
-
- sruid = (ruid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)ruid);
- seuid = (euid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)euid);
- ssuid = (suid == (__kernel_uid_t32)-1) ? ((uid_t)-1) : ((uid_t)suid);
- return sys_setresuid(sruid, seuid, ssuid);
+ return sys_setresuid(low2highuid(ruid), low2highuid(euid), low2highuid(suid));
}
extern asmlinkage int sys_getresuid(uid_t *ruid, uid_t *euid, uid_t *suid);
@@ -1935,11 +1929,7 @@
asmlinkage int sys32_setregid(__kernel_gid_t32 rgid, __kernel_gid_t32 egid)
{
- gid_t srgid, segid;
-
- srgid = (rgid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)rgid);
- segid = (egid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)egid);
- return sys_setregid(srgid, segid);
+ return sys_setregid(low2highgid(rgid), low2highgid(egid));
}
extern asmlinkage int sys_setresgid(gid_t rgid, gid_t egid, gid_t sgid);
@@ -1948,12 +1938,7 @@
__kernel_gid_t32 egid,
__kernel_gid_t32 sgid)
{
- gid_t srgid, segid, ssgid;
-
- srgid = (rgid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)rgid);
- segid = (egid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)egid);
- ssgid = (sgid == (__kernel_gid_t32)-1) ? ((gid_t)-1) : ((gid_t)sgid);
- return sys_setresgid(srgid, segid, ssgid);
+ return sys_setresgid(low2highgid(rgid), low2highgid(egid), low2highgid(sgid));
}
extern asmlinkage int sys_getresgid(gid_t *rgid, gid_t *egid, gid_t *sgid);
@@ -1975,6 +1960,25 @@
return ret;
}
+extern asmlinkage long sys_chown(const char *, uid_t,gid_t);
+extern asmlinkage long sys_lchown(const char *, uid_t,gid_t);
+extern asmlinkage long sys_fchown(unsigned int, uid_t,gid_t);
+
+asmlinkage long sys32_chown16(const char * filename, u16 user, u16 group)
+{
+ return sys_chown(filename, low2highuid(user), low2highgid(group));
+}
+
+asmlinkage long sys32_lchown16(const char * filename, u16 user, u16 group)
+{
+ return sys_lchown(filename, low2highuid(user), low2highgid(group));
+}
+
+asmlinkage long sys32_fchown16(unsigned int fd, u16 user, u16 group)
+{
+ return sys_fchown(fd, low2highuid(user), low2highgid(group));
+}
+
struct tms32 {
__kernel_clock_t32 tms_utime;
__kernel_clock_t32 tms_stime;
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/sys_sunos32.c linux.15p6/arch/sparc64/kernel/sys_sunos32.c
--- linux.vanilla/arch/sparc64/kernel/sys_sunos32.c Sat Aug 14 02:27:15 1999
+++ linux.15p6/arch/sparc64/kernel/sys_sunos32.c Fri Jan 21 17:50:17 2000
@@ -1,4 +1,4 @@
-/* $Id: sys_sunos32.c,v 1.22.2.2 1999/08/07 10:43:02 davem Exp $
+/* $Id: sys_sunos32.c,v 1.22.2.3 2000/01/17 21:28:31 davem Exp $
* sys_sunos32.c: SunOS binary compatability layer on sparc64.
*
* Copyright (C) 1995, 1996, 1997 David S. Miller (
[email protected])
@@ -327,6 +327,7 @@
spin_lock_irq(¤t->sigmask_lock);
old = (u32) current->blocked.sig[0];
current->blocked.sig[0] |= (blk_mask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
return old;
}
@@ -338,6 +339,7 @@
spin_lock_irq(¤t->sigmask_lock);
retval = (u32) current->blocked.sig[0];
current->blocked.sig[0] = (newmask & _BLOCKABLE);
+ recalc_sigpending(current);
spin_unlock_irq(¤t->sigmask_lock);
return retval;
}
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/systbls.S linux.15p6/arch/sparc64/kernel/systbls.S
--- linux.vanilla/arch/sparc64/kernel/systbls.S Wed Oct 20 01:12:34 1999
+++ linux.15p6/arch/sparc64/kernel/systbls.S Wed Jan 26 23:03:00 2000
@@ -1,4 +1,4 @@
-/* $Id: systbls.S,v 1.53.2.1 1999/09/22 11:37:39 jj Exp $
+/* $Id: systbls.S,v 1.53.2.3 2000/01/24 22:14:40 davem Exp $
* systbls.S: System call entry point tables for OS compatibility.
* The native Linux system call table lives here also.
*
@@ -21,8 +21,8 @@
sys_call_table32:
/*0*/ .word sys_nis_syscall, sparc_exit, sys_fork, sys_read, sys_write
/*5*/ .word sys_open, sys_close, sys32_wait4, sys_creat, sys_link
-/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys32_chown, sys32_mknod
-/*15*/ .word sys32_chmod, sys32_lchown, sparc_brk, sys_perfctr, sys32_lseek
+/*10*/ .word sys_unlink, sunos_execv, sys_chdir, sys32_chown16, sys32_mknod
+/*15*/ .word sys32_chmod, sys32_lchown16, sparc_brk, sys_perfctr, sys32_lseek
/*20*/ .word sys_getpid, sys_capget, sys_capset, sys_setuid, sys_getuid
/*25*/ .word sys_time, sys_ptrace, sys_alarm, sys32_sigaltstack, sys32_pause
/*30*/ .word sys32_utime, sys_nis_syscall, sys_nis_syscall, sys_access, sys_nice
@@ -43,7 +43,7 @@
.word sys32_rt_sigtimedwait, sys32_rt_sigqueueinfo, sys32_rt_sigsuspend, sys_nis_syscall, sys_nis_syscall
/*110*/ .word sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
.word sys_nis_syscall, sys32_gettimeofday, sys32_getrusage, sys_nis_syscall, sys_getcwd
-/*120*/ .word sys32_readv, sys32_writev, sys32_settimeofday, sys_fchown, sys_fchmod
+/*120*/ .word sys32_readv, sys32_writev, sys32_settimeofday, sys32_fchown16, sys_fchmod
.word sys_nis_syscall, sys32_setreuid, sys32_setregid, sys_rename, sys_truncate
/*130*/ .word sys_ftruncate, sys_flock, sys_nis_syscall, sys_nis_syscall, sys_nis_syscall
.word sys_nis_syscall, sys_mkdir, sys_rmdir, sys32_utimes, sys_nis_syscall
@@ -143,7 +143,7 @@
.word sys_close, sunos_wait4, sys_creat
.word sys_link, sys_unlink, sunos_execv
.word sys_chdir, sunos_nosys, sys32_mknod
- .word sys32_chmod, sys32_lchown, sunos_brk
+ .word sys32_chmod, sys32_lchown16, sunos_brk
.word sunos_nosys, sys32_lseek, sunos_getpid
.word sunos_nosys, sunos_nosys, sunos_nosys
.word sunos_getuid, sunos_nosys, sys_ptrace
@@ -179,7 +179,7 @@
.word sys32_sigstack, sys32_recvmsg, sys32_sendmsg
.word sunos_nosys, sys32_gettimeofday, sys32_getrusage
.word sunos_getsockopt, sunos_nosys, sunos_readv
- .word sunos_writev, sys32_settimeofday, sys_fchown
+ .word sunos_writev, sys32_settimeofday, sys32_fchown16
.word sys_fchmod, sys32_recvfrom, sys32_setreuid
.word sys_setregid, sys_rename, sys_truncate
.word sys_ftruncate, sys_flock, sunos_nosys
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/kernel/traps.c linux.15p6/arch/sparc64/kernel/traps.c
--- linux.vanilla/arch/sparc64/kernel/traps.c Tue Jan 4 21:18:43 2000
+++ linux.15p6/arch/sparc64/kernel/traps.c Fri Jan 14 15:56:16 2000
@@ -1,4 +1,4 @@
-/* $Id: traps.c,v 1.58.2.2 1999/12/01 23:55:43 davem Exp $
+/* $Id: traps.c,v 1.58.2.3 1999/12/19 23:59:28 davem Exp $
* arch/sparc64/kernel/traps.c
*
* Copyright (C) 1995,1997 David S. Miller (
[email protected])
@@ -516,8 +516,22 @@
regs->tpc = regs->tnpc;
regs->tnpc += 4;
} else {
+ unsigned long fsr = current->tss.xfsr[0];
+
current->tss.sig_address = regs->tpc;
current->tss.sig_desc = SUBSIG_FPERROR;
+ if ((fsr & 0x1c000) == (1 << 14)) {
+ if (fsr & 0x01)
+ current->tss.sig_desc = SUBSIG_FPINEXACT;
+ else if (fsr & 0x02)
+ current->tss.sig_desc = SUBSIG_FPDIVZERO;
+ else if (fsr & 0x04)
+ current->tss.sig_desc = SUBSIG_FPUNFLOW;
+ else if (fsr & 0x08)
+ current->tss.sig_desc = SUBSIG_FPOVFLOW;
+ else if (fsr & 0x10)
+ current->tss.sig_desc = SUBSIG_FPINTOVFL;
+ }
send_sig(SIGFPE, current, 1);
}
}
@@ -561,7 +575,9 @@
void do_div0(struct pt_regs *regs)
{
- send_sig(SIGILL, current, 1);
+ current->tss.sig_address = regs->tpc;
+ current->tss.sig_desc = SUBSIG_IDIVZERO;
+ send_sig(SIGFPE, current, 1);
}
void instruction_dump (unsigned int *pc)
@@ -686,10 +702,12 @@
send_sig(SIGILL, current, 1);
}
-void handle_hw_divzero(struct pt_regs *regs, unsigned long pc, unsigned long npc,
- unsigned long psr)
+void handle_hw_divzero(struct pt_regs *regs, unsigned long pc,
+ unsigned long npc, unsigned long psr)
{
- send_sig(SIGILL, current, 1);
+ current->tss.sig_address = regs->tpc;
+ current->tss.sig_desc = SUBSIG_IDIVZERO;
+ send_sig(SIGFPE, current, 1);
}
/* Trap level 1 stuff or other traps we should never see... */
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/lib/debuglocks.c linux.15p6/arch/sparc64/lib/debuglocks.c
--- linux.vanilla/arch/sparc64/lib/debuglocks.c Tue Oct 27 17:52:20 1998
+++ linux.15p6/arch/sparc64/lib/debuglocks.c Mon Feb 7 12:29:21 2000
@@ -1,7 +1,7 @@
-/* $Id: debuglocks.c,v 1.2 1998/10/13 09:07:27 davem Exp $
+/* $Id: debuglocks.c,v 1.2.2.1 2000/01/31 05:02:31 davem Exp $
* debuglocks.c: Debugging versions of SMP locking primitives.
*
- * Copyright (C) 1998 David S. Miller (
[email protected])
+ * Copyright (C) 1998 David S. Miller (
[email protected])
*/
#include <linux/kernel.h>
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/lib/memscan.S linux.15p6/arch/sparc64/lib/memscan.S
--- linux.vanilla/arch/sparc64/lib/memscan.S Wed Aug 5 00:03:35 1998
+++ linux.15p6/arch/sparc64/lib/memscan.S Mon Feb 7 12:29:21 2000
@@ -1,8 +1,8 @@
-/* $Id: memscan.S,v 1.2 1998/05/21 14:42:22 jj Exp $
+/* $Id: memscan.S,v 1.2.2.1 2000/01/31 05:02:32 davem Exp $
* memscan.S: Optimized memscan for Sparc64.
*
* Copyright (C) 1997,1998 Jakub Jelinek (
[email protected])
- * Copyright (C) 1998 David S. Miller (
[email protected])
+ * Copyright (C) 1998 David S. Miller (
[email protected])
*/
#define HI_MAGIC 0x8080808080808080
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/arch/sparc64/math-emu/sfp-machine.h linux.15p6/arch/sparc64/math-emu/sfp-machine.h
--- linux.vanilla/arch/sparc64/math-emu/sfp-machine.h Tue Jan 4 21:18:43 2000
+++ linux.15p6/arch/sparc64/math-emu/sfp-machine.h Fri Jan 14 15:56:16 2000
@@ -37,7 +37,7 @@
_FP_MUL_MEAT_2_wide_3mul(_FP_WFRACBITS_Q,R,X,Y,umul_ppmm)
#define _FP_DIV_MEAT_S(R,X,Y) _FP_DIV_MEAT_1_imm(S,R,X,Y,_FP_DIV_HELP_imm)
-#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_1_udiv(D,R,X,Y)
+#define _FP_DIV_MEAT_D(R,X,Y) _FP_DIV_MEAT_1_udiv_norm(D,R,X,Y)
#define _FP_DIV_MEAT_Q(R,X,Y) _FP_DIV_MEAT_2_udiv(Q,R,X,Y)
#define _FP_NANFRAC_S ((_FP_QNANBIT_S << 1) - 1)
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/block/cmd646.c linux.15p6/drivers/block/cmd646.c
--- linux.vanilla/drivers/block/cmd646.c Tue Mar 16 00:11:29 1999
+++ linux.15p6/drivers/block/cmd646.c Mon Feb 7 12:29:22 2000
@@ -1,4 +1,4 @@
-/* $Id: cmd646.c,v 1.11 1998/12/13 08:36:54 davem Exp $
+/* $Id: cmd646.c,v 1.11.2.1 2000/01/31 05:02:39 davem Exp $
* cmd646.c: Enable interrupts at initialization time on Ultra/PCI machines.
* Note, this driver is not used at all on other systems because
* there the "BIOS" has done all of the following already.
@@ -6,7 +6,7 @@
* on the 646U2 and not on the 646U.
*
* Copyright (C) 1998 Eddie C. Dost (
[email protected])
- * Copyright (C) 1998 David S. Miller (
[email protected])
+ * Copyright (C) 1998 David S. Miller (
[email protected])
*/
#include <linux/types.h>
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/misc/parport_ax.c linux.15p6/drivers/misc/parport_ax.c
--- linux.vanilla/drivers/misc/parport_ax.c Tue Mar 16 00:11:30 1999
+++ linux.15p6/drivers/misc/parport_ax.c Fri Jan 14 15:56:16 2000
@@ -1,4 +1,4 @@
-/* $Id: parport_ax.c,v 1.17 1999/01/20 06:18:54 davem Exp $
+/* $Id: parport_ax.c,v 1.17.2.1 2000/01/09 18:29:28 ecd Exp $
* Parallel-port routines for Sun Ultra/AX architecture
*
* Author: Eddie C. Dost <
[email protected]>
@@ -30,13 +30,6 @@
#include <asm/irq.h>
-/*
- * Define this if you have Devices which don't support short
- * host read/write cycles.
- */
-#undef HAVE_SLOW_DEVICES
-
-
#define DATA 0x00
#define STATUS 0x01
#define CONTROL 0x02
@@ -513,7 +506,6 @@
struct parport tmpport, *p;
unsigned long base;
unsigned long config;
- unsigned char tmp;
int irq, dma;
/* Pointer to NS87303 Configuration Registers */
@@ -523,29 +515,15 @@
tmpport.base = dev->base_address[0];
tmpport.ops = &parport_ax_ops;
+ /* Configure IRQ to Push Pull, Level Low */
/* Enable ECP mode, set bit 2 of the CTR first */
tmpport.ops->write_control(&tmpport, 0x04);
- tmp = ns87303_readb(config, PCR);
- tmp |= (PCR_EPP_IEEE | PCR_ECP_ENABLE | PCR_ECP_CLK_ENA);
- ns87303_writeb(config, PCR, tmp);
+ ns87303_modify(config, PCR,
+ PCR_EPP_ENABLE | PCR_IRQ_ODRAIN,
+ PCR_ECP_ENABLE | PCR_ECP_CLK_ENA | PCR_IRQ_POLAR);
/* LPT CTR bit 5 controls direction of parallel port */
- tmp = ns87303_readb(config, PTR);
- tmp |= PTR_LPT_REG_DIR;
- ns87303_writeb(config, PTR, tmp);
-
- /* Configure IRQ to Push Pull, Level Low */
- tmp = ns87303_readb(config, PCR);
- tmp &= ~(PCR_IRQ_ODRAIN);
- tmp |= PCR_IRQ_POLAR;
- ns87303_writeb(config, PCR, tmp);
-
-#ifndef HAVE_SLOW_DEVICES
- /* Enable Zero Wait State for ECP */
- tmp = ns87303_readb(config, FCR);
- tmp |= FCR_ZWS_ENA;
- ns87303_writeb(config, FCR, tmp);
-#endif
+ ns87303_modify(config, PTR, 0, PTR_LPT_REG_DIR);
/*
* Now continue initializing the port
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/sbus/audio/dbri.c linux.15p6/drivers/sbus/audio/dbri.c
--- linux.vanilla/drivers/sbus/audio/dbri.c Tue Jan 4 21:18:53 2000
+++ linux.15p6/drivers/sbus/audio/dbri.c Fri Jan 14 15:56:16 2000
@@ -17,6 +17,7 @@
* - Data sheet of the T7903, a newer but very similar ISA bus equivalent
* available from the Lucent (formarly AT&T microelectronics) home
* page.
+ * -
http://www.freesoft.org/Linux/DBRI (PDF data sheet)
* - MMCODEC: Crystal Semiconductor CS4215 16 bit Multimedia Audio Codec
* Interfaces: CHI, Audio In & Out, 2 bits parallel
* Documentation: from the Crystal Semiconductor home page.
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/sbus/char/pcikbd.c linux.15p6/drivers/sbus/char/pcikbd.c
--- linux.vanilla/drivers/sbus/char/pcikbd.c Tue Jan 4 21:18:53 2000
+++ linux.15p6/drivers/sbus/char/pcikbd.c Fri Jan 21 17:50:17 2000
@@ -1,8 +1,8 @@
-/* $Id: pcikbd.c,v 1.27.2.1 1999/10/01 05:09:36 davem Exp $
+/* $Id: pcikbd.c,v 1.27.2.2 2000/01/21 01:05:45 davem Exp $
* pcikbd.c: Ultra/AX PC keyboard support.
*
* Copyright (C) 1997 Eddie C. Dost (
[email protected])
- * JavaStation(MrCoffee) support by Pete A. Zaitcev.
+ * JavaStation support by Pete A. Zaitcev.
*
* This code is mainly put together from various places in
* drivers/char, please refer to these sources for credits
@@ -30,13 +30,16 @@
#include <asm/io.h>
#include <asm/uaccess.h>
-#ifdef __sparc_v9__
-#define PCI_KB_NAME "kb_ps2"
-#define PCI_MS_NAME "kdmouse"
-#else
-#define PCI_KB_NAME "keyboard"
-#define PCI_MS_NAME "mouse"
-#endif
+/*
+ * Different platforms provide different permutations of names.
+ * AXi - kb_ps2, kdmouse.
+ * MrCoffee - keyboard, mouse.
+ * Espresso - keyboard, kdmouse.
+ */
+#define PCI_KB_NAME1 "kb_ps2"
+#define PCI_KB_NAME2 "keyboard"
+#define PCI_MS_NAME1 "kdmouse"
+#define PCI_MS_NAME2 "mouse"
#include "pcikbd.h"
#include "sunserial.h"
@@ -502,7 +505,8 @@
for_each_ebusdev(edev, ebus) {
if(!strcmp(edev->prom_name, "8042")) {
for_each_edevchild(edev, child) {
- if (!strcmp(child->prom_name, PCI_KB_NAME))
+ if (strcmp(child->prom_name, PCI_KB_NAME1) == 0 ||
+ strcmp(child->prom_name, PCI_KB_NAME2) == 0)
goto found;
}
}
@@ -513,12 +517,14 @@
found:
pcikbd_iobase = child->base_address[0];
+#ifdef __sparc_v9__
if (check_region(pcikbd_iobase, sizeof(unsigned long))) {
printk("8042: can't get region %lx, %d\n",
pcikbd_iobase, (int)sizeof(unsigned long));
return;
}
request_region(pcikbd_iobase, sizeof(unsigned long), "8042 controller");
+#endif
pcikbd_irq = child->irqs[0];
if (request_irq(pcikbd_irq, &pcikbd_interrupt,
@@ -548,7 +554,7 @@
* XXX: my 3.1.3 PROM does not give me the beeper node for the audio
* auxio register, though I know it is there... (ecd)
*
- * Both JE1 & MrCoffe have no beeper. How about Krups? --zaitcev
+ * JavaStations appear not to have beeper. --zaitcev
*/
if (!edev)
pcibeep_iobase = (pcikbd_iobase & ~(0xffffff)) | 0x722000;
@@ -575,7 +581,6 @@
}
-
/*
* Here begins the Mouse Driver.
*/
@@ -979,7 +984,8 @@
for_each_ebusdev(edev, ebus) {
if(!strcmp(edev->prom_name, "8042")) {
for_each_edevchild(edev, child) {
- if (!strcmp(child->prom_name, PCI_MS_NAME))
+ if (strcmp(child->prom_name, PCI_MS_NAME1) == 0 ||
+ strcmp(child->prom_name, PCI_MS_NAME2) == 0)
goto found;
}
}
@@ -1054,7 +1060,7 @@
__initfunc(int ps2kbd_probe(unsigned long *memory_start))
{
- int pnode, enode, node, dnode;
+ int pnode, enode, node, dnode, xnode;
int kbnode = 0, msnode = 0, bnode = 0;
int devices = 0;
char prop[128];
@@ -1134,18 +1140,20 @@
* For each '8042' on this EBus...
*/
while (node) {
+ dnode = prom_getchild(node);
+
/*
* Does it match?
*/
- dnode = prom_getchild(node);
- dnode = prom_searchsiblings(dnode, PCI_KB_NAME);
- if (dnode == kbnode) {
+ if ((xnode = prom_searchsiblings(dnode, PCI_KB_NAME1)) == kbnode) {
+ ++devices;
+ } else if ((xnode = prom_searchsiblings(dnode, PCI_KB_NAME2)) == kbnode) {
++devices;
}
- dnode = prom_getchild(node);
- dnode = prom_searchsiblings(dnode, PCI_MS_NAME);
- if (dnode == msnode) {
+ if ((xnode = prom_searchsiblings(dnode, PCI_MS_NAME1)) == msnode) {
+ ++devices;
+ } else if ((xnode = prom_searchsiblings(dnode, PCI_MS_NAME2)) == msnode) {
++devices;
}
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/sbus/char/zs.c linux.15p6/drivers/sbus/char/zs.c
--- linux.vanilla/drivers/sbus/char/zs.c Tue Jan 4 21:18:54 2000
+++ linux.15p6/drivers/sbus/char/zs.c Fri Jan 21 17:50:18 2000
@@ -1,4 +1,4 @@
-/* $Id: zs.c,v 1.41.2.4 1999/10/14 08:44:40 davem Exp $
+/* $Id: zs.c,v 1.41.2.5 2000/01/21 01:05:47 davem Exp $
* zs.c: Zilog serial port driver for the Sparc.
*
* Copyright (C) 1995 David S. Miller (
[email protected])
@@ -1855,7 +1855,7 @@
static void show_serial_version(void)
{
- char *revision = "$Revision: 1.41.2.4 $";
+ char *revision = "$Revision: 1.41.2.5 $";
char *version, *p;
version = strchr(revision, ' ');
@@ -2023,9 +2023,8 @@
/* Can use the prom for other machine types */
zsnode = prom_getchild(prom_root_node);
if (sparc_cpu_model == sun4d) {
- int node;
int no = 0;
-
+
tmpnode = zsnode;
zsnode = 0;
bbnode = 0;
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/scsi/esp.c linux.15p6/drivers/scsi/esp.c
--- linux.vanilla/drivers/scsi/esp.c Tue Jan 4 21:18:56 2000
+++ linux.15p6/drivers/scsi/esp.c Fri Jan 14 15:56:16 2000
@@ -39,6 +39,8 @@
#include <asm/idprom.h>
#include <asm/spinlock.h>
+#include <linux/module.h>
+
#define DEBUG_ESP
/* #define DEBUG_ESP_HME */
/* #define DEBUG_ESP_DATA */
@@ -4313,3 +4315,11 @@
spin_unlock_irqrestore(&io_request_lock, flags);
}
#endif
+
+#ifdef MODULE
+Scsi_Host_Template driver_template = SCSI_SPARC_ESP;
+
+#include "scsi_module.c"
+
+EXPORT_NO_SYMBOLS;
+#endif /* MODULE */
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/video/atyfb.c linux.15p6/drivers/video/atyfb.c
--- linux.vanilla/drivers/video/atyfb.c Tue Jan 4 21:18:59 2000
+++ linux.15p6/drivers/video/atyfb.c Fri Jan 14 15:56:16 2000
@@ -1,4 +1,4 @@
-/* $Id: atyfb.c,v 1.106.2.6 1999/10/14 08:44:47 davem Exp $
+/* $Id: atyfb.c,v 1.106.2.7 1999/11/19 00:12:29 davem Exp $
* linux/drivers/video/atyfb.c -- Frame buffer device for ATI Mach64
*
* Copyright (C) 1997-1998 Geert Uytterhoeven
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/video/iga.h linux.15p6/drivers/video/iga.h
--- linux.vanilla/drivers/video/iga.h Thu Oct 15 23:24:18 1998
+++ linux.15p6/drivers/video/iga.h Fri Jan 21 17:50:18 2000
@@ -1,4 +1,4 @@
-/* $Id: iga.h,v 1.1 1998/10/07 11:36:07 jj Exp $
+/* $Id: iga.h,v 1.1.2.1 2000/01/21 01:05:53 davem Exp $
* iga1682.h: Sparc/PCI iga1682 driver constants etc.
*
* Copyleft 1998 V. Roganov and G. Raiko
@@ -12,6 +12,8 @@
unsigned int total_vram;
};
+#define IGA_ATTR_CTL 0x3C0
+#define IGA_IDX_VGA_OVERSCAN 0x11
#define DAC_W_INDEX 0x03C8
#define DAC_DATA 0x03C9
#define IGA_EXT_CNTRL 0x3CE
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/drivers/video/igafb.c linux.15p6/drivers/video/igafb.c
--- linux.vanilla/drivers/video/igafb.c Sun Mar 7 18:39:03 1999
+++ linux.15p6/drivers/video/igafb.c Fri Jan 21 17:50:18 2000
@@ -659,11 +659,11 @@
info->frame_buffer_phys = addr & PCI_BASE_ADDRESS_MEM_MASK;
#ifdef __sparc__
-
- info->io_base_phys = info->frame_buffer_phys;
-
- /* Obtain virtual address and correct physical by PCIC shift */
- info->io_base = pcic_alloc_io(&info->io_base_phys);
+
+ info->io_base_phys = 0x30000000;
+
+ info->io_base = sparc_alloc_io(info->io_base_phys,
+ NULL, 0x1000, "iga", 0, 0);
if (!info->io_base) {
return;
}
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/include/asm-sparc/ethtool.h linux.15p6/include/asm-sparc/ethtool.h
--- linux.vanilla/include/asm-sparc/ethtool.h Thu Mar 11 00:53:37 1999
+++ linux.15p6/include/asm-sparc/ethtool.h Mon Feb 7 12:29:22 2000
@@ -1,7 +1,7 @@
-/* $Id: ethtool.h,v 1.1 1998/12/19 15:09:38 davem Exp $
+/* $Id: ethtool.h,v 1.1.2.1 2000/01/31 05:02:42 davem Exp $
* ethtool.h: Defines for SparcLinux ethtool.
*
- * Copyright (C) 1998 David S. Miller (
[email protected])
+ * Copyright (C) 1998 David S. Miller (
[email protected])
*/
#ifndef _SPARC_ETHTOOL_H
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/include/asm-sparc/pcic.h linux.15p6/include/asm-sparc/pcic.h
--- linux.vanilla/include/asm-sparc/pcic.h Sun Oct 4 18:22:44 1998
+++ linux.15p6/include/asm-sparc/pcic.h Fri Jan 21 17:50:18 2000
@@ -1,5 +1,5 @@
-/* $Id: pcic.h,v 1.1 1998/09/22 05:54:39 jj Exp $
- * pcic.h: JavaEngine 1 specific PCI definitions.
+/* $Id: pcic.h,v 1.1.2.1 2000/01/21 01:05:56 davem Exp $
+ * pcic.h: MicroSPARC-IIep specific PCI definitions.
*
* Copyright (C) 1998 V. Roganov and G. Raiko
*/
@@ -7,6 +7,8 @@
#ifndef __SPARC_PCIC_H
#define __SPARC_PCIC_H
+#ifndef __ASSEMBLY__
+
#include <linux/types.h>
#include <linux/smp.h>
#include <linux/smp_lock.h>
@@ -21,13 +23,17 @@
unsigned long pcic_config_space_addr;
unsigned long pcic_config_space_data;
struct linux_pbm_info pbm;
+ struct pcic_ca2irq *pcic_imap;
+ int pcic_imdim;
};
extern unsigned long pcic_alloc_io(unsigned long* addr);
extern void pcic_probe(void);
extern void sun4m_pci_init_IRQ(void);
-/* Size of PCI Space */
+#endif
+
+/* Size of PCI I/O space which we relocate. */
#define PCI_SPACE_SIZE 0x1000000 /* 16 MB */
/* PCIC Register Set. */
@@ -50,10 +56,18 @@
#define PCI_SOFTWARE_INT_CLEAR 0x6a /* 16 bits */
#define PCI_SOFTWARE_INT_SET 0x6e /* 16 bits */
#define PCI_SYS_INT_PENDING 0x70 /* 32 bits */
+#define PCI_SYS_INT_PENDING_PIO 0x40000000
+#define PCI_SYS_INT_PENDING_DMA 0x20000000
+#define PCI_SYS_INT_PENDING_PCI 0x10000000
+#define PCI_SYS_INT_PENDING_APSR 0x08000000
#define PCI_SYS_INT_TARGET_MASK 0x74 /* 32 bits */
#define PCI_SYS_INT_TARGET_MASK_CLEAR 0x78 /* 32 bits */
#define PCI_SYS_INT_TARGET_MASK_SET 0x7c /* 32 bits */
#define PCI_SYS_INT_PENDING_CLEAR 0x83 /* 8 bits */
+#define PCI_SYS_INT_PENDING_CLEAR_ALL 0x80
+#define PCI_SYS_INT_PENDING_CLEAR_PIO 0x40
+#define PCI_SYS_INT_PENDING_CLEAR_DMA 0x20
+#define PCI_SYS_INT_PENDING_CLEAR_PCI 0x10
#define PCI_IOTLB_CONTROL 0x84 /* 8 bits */
#define PCI_INT_SELECT_LO 0x88 /* 16 bits */
#define PCI_ARBITRATION_SELECT 0x8a /* 16 bits */
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/include/asm-sparc64/ethtool.h linux.15p6/include/asm-sparc64/ethtool.h
--- linux.vanilla/include/asm-sparc64/ethtool.h Thu Mar 11 00:53:38 1999
+++ linux.15p6/include/asm-sparc64/ethtool.h Mon Feb 7 12:29:22 2000
@@ -1,7 +1,7 @@
-/* $Id: ethtool.h,v 1.1 1998/12/19 15:09:40 davem Exp $
+/* $Id: ethtool.h,v 1.1.2.1 2000/01/31 05:02:43 davem Exp $
* ethtool.h: Defines for SparcLinux ethtool.
*
- * Copyright (C) 1998 David S. Miller (
[email protected])
+ * Copyright (C) 1998 David S. Miller (
[email protected])
*/
#ifndef _SPARC64_ETHTOOL_H
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/include/asm-sparc64/floppy.h linux.15p6/include/asm-sparc64/floppy.h
--- linux.vanilla/include/asm-sparc64/floppy.h Sat Aug 28 20:00:58 1999
+++ linux.15p6/include/asm-sparc64/floppy.h Fri Jan 14 15:56:16 2000
@@ -1,4 +1,4 @@
-/* $Id: floppy.h,v 1.18.2.2 1999/08/09 21:07:41 ecd Exp $
+/* $Id: floppy.h,v 1.18.2.3 2000/01/09 18:29:32 ecd Exp $
* asm-sparc64/floppy.h: Sparc specific parts of the Floppy driver.
*
* Copyright (C) 1996 David S. Miller (
[email protected])
@@ -574,7 +574,6 @@
struct linux_ebus_device *edev = 0;
unsigned long config = 0;
unsigned long auxio_reg;
- unsigned char cfg;
for_each_ebus(ebus) {
for_each_ebusdev(edev, ebus) {
@@ -678,9 +677,7 @@
return sun_floppy_types[0];
/* Enable PC-AT mode. */
- cfg = ns87303_readb(config, ASC);
- cfg |= 0xc0;
- ns87303_writeb(config, ASC, cfg);
+ ns87303_modify(config, ASC, 0, 0xc0);
#ifdef PCI_FDC_SWAP_DRIVES
/*
@@ -691,15 +688,9 @@
* Set the drive exchange bit in FCR on NS87303,
* make shure other bits are sane before doing so.
*/
- cfg = ns87303_readb(config, FER);
- cfg &= ~(FER_EDM);
- ns87303_writeb(config, FER, cfg);
- cfg = ns87303_readb(config, ASC);
- cfg &= ~(ASC_DRV2_SEL);
- ns87303_writeb(config, ASC, cfg);
- cfg = ns87303_readb(config, FCR);
- cfg |= FCR_LDE;
- ns87303_writeb(config, FCR, cfg);
+ ns87303_modify(config, FER, FER_EDM, 0);
+ ns87303_modify(config, ASC, ASC_DRV2_SEL, 0);
+ ns87303_modify(config, FCR, 0, FCR_LDE);
cfg = sun_floppy_types[0];
sun_floppy_types[0] = sun_floppy_types[1];
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/include/asm-sparc64/io.h linux.15p6/include/asm-sparc64/io.h
--- linux.vanilla/include/asm-sparc64/io.h Sun Oct 4 18:22:44 1998
+++ linux.15p6/include/asm-sparc64/io.h Fri Jan 14 15:56:16 2000
@@ -1,4 +1,4 @@
-/* $Id: io.h,v 1.19 1998/08/23 05:41:46 ecd Exp $ */
+/* $Id: io.h,v 1.19.2.1 2000/01/14 03:55:36 davem Exp $ */
#ifndef __SPARC64_IO_H
#define __SPARC64_IO_H
@@ -120,12 +120,66 @@
extern void insl(unsigned long addr, void *dst, unsigned long count);
/* Memory functions, same as I/O accesses on Ultra. */
-#define readb(addr) inb((unsigned long)(addr))
-#define readw(addr) inw((unsigned long)(addr))
-#define readl(addr) inl((unsigned long)(addr))
-#define writeb(b, addr) outb((b), (unsigned long)(addr))
-#define writew(w, addr) outw((w), (unsigned long)(addr))
-#define writel(l, addr) outl((l), (unsigned long)(addr))
+extern __inline__ unsigned int _readb(unsigned long addr)
+{
+ unsigned int ret;
+
+ __asm__ __volatile__("lduba [%1] %2, %0"
+ : "=r" (ret)
+ : "r" (addr), "i" (ASI_PL));
+
+ return ret;
+}
+
+extern __inline__ unsigned int _readw(unsigned long addr)
+{
+ unsigned int ret;
+
+ __asm__ __volatile__("lduha [%1] %2, %0"
+ : "=r" (ret)
+ : "r" (addr), "i" (ASI_PL));
+
+ return ret;
+}
+
+extern __inline__ unsigned int _readl(unsigned long addr)
+{
+ unsigned int ret;
+
+ __asm__ __volatile__("lduwa [%1] %2, %0"
+ : "=r" (ret)
+ : "r" (addr), "i" (ASI_PL));
+
+ return ret;
+}
+
+extern __inline__ void _writeb(unsigned char b, unsigned long addr)
+{
+ __asm__ __volatile__("stba %0, [%1] %2"
+ : /* no outputs */
+ : "r" (b), "r" (addr), "i" (ASI_PL));
+}
+
+extern __inline__ void _writew(unsigned short w, unsigned long addr)
+{
+ __asm__ __volatile__("stha %0, [%1] %2"
+ : /* no outputs */
+ : "r" (w), "r" (addr), "i" (ASI_PL));
+}
+
+extern __inline__ void _writel(unsigned int l, unsigned long addr)
+{
+ __asm__ __volatile__("stwa %0, [%1] %2"
+ : /* no outputs */
+ : "r" (l), "r" (addr), "i" (ASI_PL));
+}
+
+#define readb(addr) _readb((unsigned long)(addr))
+#define readw(addr) _readw((unsigned long)(addr))
+#define readl(addr) _readl((unsigned long)(addr))
+#define writeb(b, addr) _writeb((b), (unsigned long)(addr))
+#define writew(w, addr) _writew((w), (unsigned long)(addr))
+#define writel(l, addr) _writel((l), (unsigned long)(addr))
/*
* Memcpy to/from I/O space is just a regular memory operation on
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/include/asm-sparc64/ns87303.h linux.15p6/include/asm-sparc64/ns87303.h
--- linux.vanilla/include/asm-sparc64/ns87303.h Sun Oct 4 18:22:44 1998
+++ linux.15p6/include/asm-sparc64/ns87303.h Fri Jan 14 15:56:16 2000
@@ -1,4 +1,4 @@
-/* $Id: ns87303.h,v 1.2 1998/09/13 15:38:50 ecd Exp $
+/* $Id: ns87303.h,v 1.2.2.1 2000/01/09 18:29:33 ecd Exp $
* ns87303.h: Configuration Register Description for the
* National Semiconductor PC87303 (SuperIO).
*
@@ -45,7 +45,7 @@
#define FCR_LDE 0x10 /* Logical Drive Exchange */
#define FCR_ZWS_ENA 0x20 /* Enable short host read/write in ECP/EPP */
-/* Printer Controll Register (PCR) bits */
+/* Printer Control Register (PCR) bits */
#define PCR_EPP_ENABLE 0x01
#define PCR_EPP_IEEE 0x02 /* Enable EPP Version 1.9 (IEEE 1284) */
#define PCR_ECP_ENABLE 0x04
@@ -61,27 +61,51 @@
#define ASC_LPT_IRQ7 0x01 /* Allways use IRQ7 for LPT */
#define ASC_DRV2_SEL 0x02 /* Logical Drive Exchange controlled by TDR */
+#define FER_RESERVED 0x00
+#define FAR_RESERVED 0x00
+#define PTR_RESERVED 0x73
+#define FCR_RESERVED 0xc4
+#define PCR_RESERVED 0x10
+#define KRR_RESERVED 0x00
+#define PMC_RESERVED 0x98
+#define TUP_RESERVED 0xfb
+#define SIP_RESERVED 0x00
+#define ASC_RESERVED 0x18
+#define CS0CF0_RESERVED 0x00
+#define CS0CF1_RESERVED 0x08
+#define CS1CF0_RESERVED 0x00
+#define CS1CF1_RESERVED 0x08
+
#ifdef __KERNEL__
#include <asm/system.h>
#include <asm/io.h>
-static __inline__ void ns87303_writeb(unsigned long port, int index,
- unsigned char value)
+static __inline__ int ns87303_modify(unsigned long port, unsigned int index,
+ unsigned char clr, unsigned char set)
{
+ static unsigned char reserved[] = {
+ FER_RESERVED, FAR_RESERVED, PTR_RESERVED, FCR_RESERVED,
+ PCR_RESERVED, KRR_RESERVED, PMC_RESERVED, TUP_RESERVED,
+ SIP_RESERVED, ASC_RESERVED, CS0CF0_RESERVED, CS0CF1_RESERVED,
+ CS1CF0_RESERVED, CS1CF1_RESERVED
+ };
unsigned long flags;
+ unsigned char value;
+
+ if (index > 0x0d)
+ return -EINVAL;
save_flags(flags); cli();
outb(index, port);
+ value = inb(port + 1);
+ value &= ~(reserved[index] | clr);
+ value |= set;
outb(value, port + 1);
outb(value, port + 1);
restore_flags(flags);
-}
-static __inline__ unsigned char ns87303_readb(unsigned long port, int index)
-{
- outb(index, port);
- return inb(port + 1);
+ return 0;
}
#endif /* __KERNEL__ */
diff -u --new-file --exclude-from ../exclude --recursive linux.vanilla/include/math-emu/op-1.h linux.15p6/include/math-emu/op-1.h
--- linux.vanilla/include/math-emu/op-1.h Tue Jan 4 21:19:03 2000
+++ linux.15p6/include/math-emu/op-1.h Fri Jan 14 15:56:16 2000
@@ -199,25 +199,25 @@
#define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y) \
do { \
- _FP_W_TYPE _nh, _nl, _q, _r; \
+ _FP_W_TYPE _nh, _nl, _q, _r, _y; \
\
/* Normalize Y -- i.e. make the most significant bit set. */ \
- Y##_f <<= _FP_WFRACXBITS_##fs - 1; \
+ _y = Y##_f << _FP_WFRACXBITS_##fs; \
\
/* Shift X op correspondingly high, that is, up one full word. */ \
- if (X##_f <= Y##_f) \
+ if (X##_f < Y##_f) \
{ \
+ R##_e--; \
_nl = 0; \
_nh = X##_f; \
} \
else \
{ \
- R##_e++; \
- _nl = X##_f << (_FP_W_TYPE_SIZE-1); \
+ _nl = X##_f << (_FP_W_TYPE_SIZE - 1); \
_nh = X##_f >> 1; \
} \
\
- udiv_qrnnd(_q, _r, _nh, _nl, Y##_f); \
+ udiv_qrnnd(_q, _r, _nh, _nl, _y); \
R##_f = _q | (_r != 0); \
} while (0)