Subject: Re: PCI DMA lockups in 3.2 (3.3 maybe?)
In-Reply-To: Your message of "Tue, 07 Dec 1999 20:01:39 +0800."
             <[EMAIL PROTECTED]> 
Mime-Version: 1.0
Content-Type: text/plain; charset=us-ascii
--------
I just reviewed the (so far) working 3.3 test system.  I was mistaken
about the 4.0 driver; looks like you didn't get around to that.  You
have a wrapper around ncr_intr() that sets up guard areas--and a call
to splcam() that might well be what's stabilizing things.  Here are
the diffs (preceded by the CVS ident string):

** $FreeBSD: src/sys/pci/ncr.c,v 1.141.2.4 1999/08/29 16:31:53 peter Exp $

% diff /tmp/ncr.c ncr.c
*** /tmp/ncr.c  Tue Dec  7 15:37:50 1999
--- ncr.c       Thu Oct 28 11:41:56 1999
***************
*** 3314,3319 ****
--- 3314,3325 ----
        
        found = -1;
        for (i = 0; i < sizeof(ncr_chip_table)/sizeof(ncr_chip_table[0]); i++) {
+ /*
+  *  Ignore chips that support LOAD/STORE, so the sym_hipd driver will 
+  *  attach them without any conflict.
+  */
+               if (ncr_chip_table[i].features & FE_LDSTR)
+                       continue;
                if (device_id   == ncr_chip_table[i].device_id &&
                    ncr_chip_table[i].minrevid <= revision_id) {
                        if (found < 0 || 
***************
*** 3872,3883 ****
  **==========================================================
  */
  
  static void
! ncr_intr(vnp)
        void *vnp;
  {
        ncb_p np = vnp;
-       int oldspl = splcam();
  
        if (DEBUG_FLAGS & DEBUG_TINY) printf ("[");
  
--- 3878,3890 ----
  **==========================================================
  */
  
+ int ncr_int_count = 0;
+ 
  static void
! ncr_intr1(vnp)
        void *vnp;
  {
        ncb_p np = vnp;
  
        if (DEBUG_FLAGS & DEBUG_TINY) printf ("[");
  
***************
*** 3893,3900 ****
        };
  
        if (DEBUG_FLAGS & DEBUG_TINY) printf ("]\n");
  
!       splx (oldspl);
  }
  
  /*==========================================================
--- 3900,3932 ----
        };
  
        if (DEBUG_FLAGS & DEBUG_TINY) printf ("]\n");
+ }
+ 
+ #define GUARDS 16
  
! static void
! ncr_intr(vnp)
!       void *vnp;
! {
!       int i;
!       int clobber;
!       int guard[GUARDS];
! 
!       clobber = 0;
!       for (i = 0; i < GUARDS; i++)
!               guard[i] = 0xcafebabe;
! 
!       ncr_int_count++;
!       ncr_intr1(vnp);
! 
!       for (i = 0; i < GUARDS; i++) {
!               if (guard[i] != 0xcafebabe) {
!                       printf("guard[%d] = 0x%x\n", i, guard[i]);
!                       clobber++;
!               }
!       }
!       if (clobber != 0)
!               panic("ncr_intr: stack clobber 0x%x\n", clobber);
  }
  
  /*==========================================================
***************
*** 4878,4884 ****
--- 4910,4920 ----
  static void
  ncr_poll(struct cam_sim *sim)
  {       
+       int oldspl;
+ 
+       oldspl = splcam();
        ncr_intr(cam_sim_softc(sim));  
+       splx(oldspl);
  }
  



To Unsubscribe: send mail to [EMAIL PROTECTED]
with "unsubscribe freebsd-hackers" in the body of the message

Reply via email to