]> git.neil.brown.name Git - history.git/commitdiff
Import 2.3.99pre10-2 2.3.99pre10-2
authorLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:35:10 +0000 (15:35 -0500)
committerLinus Torvalds <torvalds@linuxfoundation.org>
Fri, 23 Nov 2007 20:35:10 +0000 (15:35 -0500)
arch/i386/defconfig
arch/i386/kernel/apic.c
arch/i386/kernel/smp.c
arch/i386/kernel/smpboot.c
include/asm-i386/apic.h

index e00ac753a26cf7faf36c7e6ef3ffe67455bfe852..9253118875157f8ff4a7adac02c3fd60ea7cc211 100644 (file)
@@ -19,6 +19,7 @@ CONFIG_UID16=y
 # CONFIG_M586 is not set
 # CONFIG_M586TSC is not set
 CONFIG_M686=y
+# CONFIG_M686FX is not set
 # CONFIG_MK6 is not set
 # CONFIG_MK7 is not set
 CONFIG_X86_WP_WORKS_OK=y
@@ -194,7 +195,6 @@ CONFIG_IDEPCI_SHARE_IRQ=y
 # CONFIG_BLK_DEV_OFFBOARD is not set
 # CONFIG_IDEDMA_PCI_AUTO is not set
 # CONFIG_BLK_DEV_IDEDMA is not set
-# CONFIG_IDEDMA_PCI_EXPERIMENTAL is not set
 # CONFIG_IDEDMA_PCI_WIP is not set
 # CONFIG_IDEDMA_NEW_DRIVE_LISTINGS is not set
 # CONFIG_BLK_DEV_AEC62XX is not set
index eab365e260e10787089937483454fba11e5eaf59..0a19bb758be610f22c1f877e9e0f31255a8c3dd3 100644 (file)
@@ -128,6 +128,11 @@ void disable_local_APIC(void)
 
 void __init sync_Arb_IDs(void)
 {
+       /*
+        * Wait for idle.
+        */
+       apic_wait_icr_idle();
+
        Dprintk("Synchronizing Arb IDs.\n");
        apic_write_around(APIC_ICR, APIC_DEST_ALLINC | APIC_INT_LEVELTRIG
                                | APIC_DM_INIT);
index 94ba5c49f70df048a6494feba39ed372d152af01..e08418fe067583af20096fa15b3acbf0867beb2d 100644 (file)
@@ -132,6 +132,11 @@ static inline void __send_IPI_shortcut(unsigned int shortcut, int vector)
         */
        unsigned int cfg;
 
+       /*
+        * Wait for idle.
+        */
+       apic_wait_icr_idle();
+
        /*
         * No need to touch the target chip field
         */
@@ -172,6 +177,11 @@ static inline void send_IPI_mask(int mask, int vector)
        __save_flags(flags);
        __cli();
 
+       /*
+        * Wait for idle.
+        */
+       apic_wait_icr_idle();
+
        /*
         * prepare target chip field
         */
index ae84ff2b574929f84e0e547f9a8c9d8dd5569fa8..e0ae38b28e42b61bbf5ad95b0599944fa16f545e 100644 (file)
@@ -502,6 +502,11 @@ static inline void inquire_remote_apic(int apicid)
        for (i = 0; i < sizeof(regs) / sizeof(*regs); i++) {
                printk("... APIC #%d %s: ", apicid, names[i]);
 
+               /*
+                * Wait for idle.
+                */
+               apic_wait_icr_idle();
+
                apic_write_around(APIC_ICR2, SET_APIC_DEST_FIELD(apicid));
                apic_write_around(APIC_ICR, APIC_DM_REMRD | regs[i]);
 
index 9ee2363363045c15e67e686eeee57de35f1306e2..ce1662409a63d52a2caa1ae7427ea6fb6ba148cc 100644 (file)
@@ -34,6 +34,11 @@ extern __inline unsigned long apic_read(unsigned long reg)
        return *((volatile unsigned long *)(APIC_BASE+reg));
 }
 
+static __inline__ void apic_wait_icr_idle(void)
+{
+       do { } while ( apic_read( APIC_ICR ) & APIC_ICR_BUSY );
+}
+
 extern unsigned int apic_timer_irqs [NR_CPUS];
 
 #ifdef CONFIG_X86_GOOD_APIC