On Wed, Mar 02, 2005 at 08:25:40AM -0600, Art Mason wrote:
>
>Vinny Abello wrote:
>>
>>At 05:50 PM 3/1/2005, Art Mason wrote:
>>>
>>>Indeed, just installed on a customer's server last night, and I build 
>>>SMP support into the GENERIC kernel this morning.  Only issues I 
>>>encountered has to do w/ recognizing the full 4GB of RAM, but this 
>>>apparently has some compatibility issues w/ the amr driver.
>>>As per Holger's comments about disabling USB in BIOS, this is a good 
>>>suggestion, since the DRAC apparently causes some IRQ issues w/ the 
>>>PS/2 keyboard controller, or something along those lines.  Regardless, 
>>>these 2850 boxes are stupid fast, and I'm looking forward to 
>>>benchmarking 5.3 on them.
>>
>>
>>FYI, the architecture of the 2850 (assuming it is similar to your 2800) 
>>requires that you enable PAE support in your kernel of whatever OS you 
>>run to address the full 4GB of RAM. This is due in some part because of 
>>the memory mapping that was done for the PCI express bus and/or onboard 
>>Perc controller (per Dell tech support). We've run into this with all of 
>>our 2850's with various OS's and enabling PAE (per Dell's advice) fixes it.
>
>
>Yeah, I cam across that on some mailing list archives, but saw some 
>additional references that this can cause issues with the amr driver. 
>Have you experienced any instability issues with the amr driver and PAE 
>enabled?  If not, then I'll give this a shot on one of our lab boxes for 
>testing.  Thanks for the suggestion, BTW.


On my 2850 the upper 1GB of RAM cannot be addressed without PAE support
in the kernel.  However, amr in 4.11-RELEASE does indeed seem to have
trouble with PAE.  The result being that with the option in the kernel,
the root device (ufs:/dev/amrd0s1a) cannot be found.

I backported scottl's amr PAE fixes from RELENG_5; the diffs applied
cleanly (with offsets).  I'm happy to report that my 2850 can now
address its full 4GB and see its amr volumes.

The diff against 4.11-RELEASE is attached, hopefully someone will be
willing to commit it to RELENG_4.

*** sys/dev/amr/amr.c.orig      Thu Jul 22 09:35:18 2004
--- sys/dev/amr/amr.c   Tue Mar  8 15:11:33 2005
***************
*** 132,143 ****
   * Command processing.
   */
  static int    amr_bio_command(struct amr_softc *sc, struct amr_command **acp);
! static int    amr_wait_command(struct amr_command *ac);
  static int    amr_getslot(struct amr_command *ac);
! static void   amr_mapcmd(struct amr_command *ac);
  static void   amr_unmapcmd(struct amr_command *ac);
  static int    amr_start(struct amr_command *ac);
  static void   amr_complete(void *context, int pending);
  
  /*
   * Status monitoring
--- 132,146 ----
   * Command processing.
   */
  static int    amr_bio_command(struct amr_softc *sc, struct amr_command **acp);
! static int    amr_wait_command(struct amr_command *ac) __unused;
  static int    amr_getslot(struct amr_command *ac);
! static int    amr_mapcmd(struct amr_command *ac);
  static void   amr_unmapcmd(struct amr_command *ac);
  static int    amr_start(struct amr_command *ac);
+ static int    amr_start1(struct amr_softc *sc, struct amr_command *ac);
  static void   amr_complete(void *context, int pending);
+ static void   amr_setup_dmamap(void *arg, bus_dma_segment_t *segs, int 
nsegments, int error);
+ static void   amr_setup_data_dmamap(void *arg, bus_dma_segment_t *segs, int 
nsegments, int error);
  
  /*
   * Status monitoring
***************
*** 150,155 ****
--- 153,159 ----
  static int    amr_quartz_submit_command(struct amr_softc *sc);
  static int    amr_quartz_get_work(struct amr_softc *sc, struct amr_mailbox 
*mbsave);
  static int    amr_quartz_poll_command(struct amr_command *ac);
+ static int    amr_quartz_poll_command1(struct amr_softc *sc, struct 
amr_command *ac);
  
  static int    amr_std_submit_command(struct amr_softc *sc);
  static int    amr_std_get_work(struct amr_softc *sc, struct amr_mailbox 
*mbsave);
***************
*** 217,222 ****
--- 221,227 ----
        sc->amr_submit_command = amr_quartz_submit_command;
        sc->amr_get_work       = amr_quartz_get_work;
        sc->amr_poll_command   = amr_quartz_poll_command;
+       sc->amr_poll_command1  = amr_quartz_poll_command1;
      } else {
        sc->amr_submit_command = amr_std_submit_command;
        sc->amr_get_work       = amr_std_get_work;
***************
*** 681,690 ****
      if ((ac = amr_alloccmd(sc)) == NULL)
        goto out;
      /* allocate the response structure */
!     if ((result = malloc(bufsize, M_DEVBUF, M_NOWAIT)) == NULL)
        goto out;
      /* set command flags */
!     ac->ac_flags |= AMR_CMD_PRIORITY | AMR_CMD_DATAOUT;
      
      /* point the command at our data */
      ac->ac_data = result;
--- 686,696 ----
      if ((ac = amr_alloccmd(sc)) == NULL)
        goto out;
      /* allocate the response structure */
!     if ((result = malloc(bufsize, M_DEVBUF, M_ZERO|M_NOWAIT)) == NULL)
        goto out;
      /* set command flags */
! 
!     ac->ac_flags |= AMR_CMD_PRIORITY | AMR_CMD_DATAIN;
      
      /* point the command at our data */
      ac->ac_data = result;
***************
*** 794,799 ****
--- 800,809 ----
      /* spin until something prevents us from doing any work */
      for (;;) {
  
+       /* Don't bother to queue commands no bounce buffers are available. */
+       if (sc->amr_state & AMR_STATE_QUEUE_FRZN)
+           break;
+ 
        /* try to get a ready command */
        ac = amr_dequeue_ready(sc);
  
***************
*** 967,972 ****
--- 977,993 ----
      return(error);
  }
  
+ static void
+ amr_setup_polled_dmamap(void *arg, bus_dma_segment_t *segs, int nsegs, int 
err)
+ {
+     struct amr_command *ac = arg;
+     struct amr_softc *sc = ac->ac_sc;
+ 
+     amr_setup_dmamap(arg, segs, nsegs, err);
+     bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,BUS_DMASYNC_PREREAD);
+     sc->amr_poll_command1(sc, ac);
+ }
+ 
  
/********************************************************************************
   * Take a command, submit it to the controller and busy-wait for it to return.
   * Returns nonzero on error.  Can be safely called with interrupts enabled.
***************
*** 975,989 ****
  amr_quartz_poll_command(struct amr_command *ac)
  {
      struct amr_softc  *sc = ac->ac_sc;
!     int                       s;
!     int                       error,count;
  
      debug_called(2);
  
      /* now we have a slot, we can map the command (unmapped in amr_complete) 
*/
!     amr_mapcmd(ac);
  
!     s = splbio();
  
      if ((sc->amr_state & AMR_STATE_CRASHDUMP) == 0) {
        count=0;
--- 996,1026 ----
  amr_quartz_poll_command(struct amr_command *ac)
  {
      struct amr_softc  *sc = ac->ac_sc;
!     int                       s, error;
  
      debug_called(2);
  
+     s = splbio();
+     error = 0;
+ 
      /* now we have a slot, we can map the command (unmapped in amr_complete) 
*/
!     if (ac->ac_data != 0) {
!       if (bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_dmamap, ac->ac_data,
!           ac->ac_length, amr_setup_polled_dmamap, ac, BUS_DMA_NOWAIT) != 0) {
!           error = 1;
!       }
!     } else {
!       error = amr_quartz_poll_command1(sc, ac);
!     }
  
!     splx(s);
!     return (error);
! }
! 
! static int
! amr_quartz_poll_command1(struct amr_softc *sc, struct amr_command *ac)
! {
!     int count, error;
  
      if ((sc->amr_state & AMR_STATE_CRASHDUMP) == 0) {
        count=0;
***************
*** 996,1003 ****
  
        if(sc->amr_busyslots) {
            device_printf(sc->amr_dev, "adapter is busy\n");
!           splx(s);
!           amr_unmapcmd(ac);
            ac->ac_status=0;
            return(1);
          }
--- 1033,1040 ----
  
        if(sc->amr_busyslots) {
            device_printf(sc->amr_dev, "adapter is busy\n");
!           if (ac->ac_data != NULL)
!               bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_dmamap);
            ac->ac_status=0;
            return(1);
          }
***************
*** 1027,1036 ****
      AMR_QPUT_IDB(sc, sc->amr_mailboxphys | AMR_QIDB_ACK);
      while(AMR_QGET_IDB(sc) & AMR_QIDB_ACK);
  
-     splx(s);
- 
      /* unmap the command's data buffer */
!     amr_unmapcmd(ac);
  
      return(error);
  }
--- 1064,1072 ----
      AMR_QPUT_IDB(sc, sc->amr_mailboxphys | AMR_QIDB_ACK);
      while(AMR_QGET_IDB(sc) & AMR_QIDB_ACK);
  
      /* unmap the command's data buffer */
!     bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_dmamap, BUS_DMASYNC_POSTREAD);
!     bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_dmamap);
  
      return(error);
  }
***************
*** 1113,1124 ****
      } else {
          ac->ac_mailbox.mb_nsgelem = nsegments;
        *sgc = nsegments;
!       ac->ac_mailbox.mb_physaddr = sc->amr_sgbusaddr + (ac->ac_slot * 
AMR_NSEG * sizeof(struct amr_sgentry));
        for (i = 0; i < nsegments; i++, sg++) {
            sg->sg_addr = segs[i].ds_addr;
            sg->sg_count = segs[i].ds_len;
        }
      }
  }
  
  static void
--- 1149,1162 ----
      } else {
          ac->ac_mailbox.mb_nsgelem = nsegments;
        *sgc = nsegments;
!       ac->ac_mailbox.mb_physaddr = sc->amr_sgbusaddr +
!           (ac->ac_slot * AMR_NSEG * sizeof(struct amr_sgentry));
        for (i = 0; i < nsegments; i++, sg++) {
            sg->sg_addr = segs[i].ds_addr;
            sg->sg_count = segs[i].ds_len;
        }
      }
+ 
  }
  
  static void
***************
*** 1142,1157 ****
        } else {
            /* save s/g table information in passthrough */
            aep->ap_no_sg_elements = nsegments;
!           aep->ap_data_transfer_address = sc->amr_sgbusaddr + (ac->ac_slot * 
AMR_NSEG * sizeof(struct amr_sgentry));
!           /* populate s/g table (overwrites previous call which mapped the 
passthrough) */
            for (i = 0; i < nsegments; i++, sg++) {
                sg->sg_addr = segs[i].ds_addr;
                sg->sg_count = segs[i].ds_len;
                debug(3, " %d: 0x%x/%d", i, sg->sg_addr, sg->sg_count);
            }
        }
!       debug(3, "slot %d  %d segments at 0x%x, passthrough at 0x%x", 
ac->ac_slot,
!           aep->ap_no_sg_elements, aep->ap_data_transfer_address, 
ac->ac_dataphys);
      } else {
        if (nsegments < 2) {
            ap->ap_no_sg_elements = 0;
--- 1180,1200 ----
        } else {
            /* save s/g table information in passthrough */
            aep->ap_no_sg_elements = nsegments;
!           aep->ap_data_transfer_address = sc->amr_sgbusaddr +
!               (ac->ac_slot * AMR_NSEG * sizeof(struct amr_sgentry));
!           /*
!            * populate s/g table (overwrites previous call which mapped the
!            * passthrough)
!            */
            for (i = 0; i < nsegments; i++, sg++) {
                sg->sg_addr = segs[i].ds_addr;
                sg->sg_count = segs[i].ds_len;
                debug(3, " %d: 0x%x/%d", i, sg->sg_addr, sg->sg_count);
            }
        }
!       debug(3, "slot %d  %d segments at 0x%x, passthrough at 0x%x\n",
!           ac->ac_slot, aep->ap_no_sg_elements, aep->ap_data_transfer_address,
!           ac->ac_dataphys);
      } else {
        if (nsegments < 2) {
            ap->ap_no_sg_elements = 0;
***************
*** 1159,1178 ****
        } else {
            /* save s/g table information in passthrough */
            ap->ap_no_sg_elements = nsegments;
!           ap->ap_data_transfer_address = sc->amr_sgbusaddr + (ac->ac_slot * 
AMR_NSEG * sizeof(struct amr_sgentry));
!           /* populate s/g table (overwrites previous call which mapped the 
passthrough) */
            for (i = 0; i < nsegments; i++, sg++) {
                sg->sg_addr = segs[i].ds_addr;
                sg->sg_count = segs[i].ds_len;
                debug(3, " %d: 0x%x/%d", i, sg->sg_addr, sg->sg_count);
            }
        }
!       debug(3, "slot %d  %d segments at 0x%x, passthrough at 0x%x", 
ac->ac_slot,
!           ap->ap_no_sg_elements, ap->ap_data_transfer_address, 
ac->ac_dataphys);
!     }
  }
  
! static void
  amr_mapcmd(struct amr_command *ac)
  {
      struct amr_softc  *sc = ac->ac_sc;
--- 1202,1243 ----
        } else {
            /* save s/g table information in passthrough */
            ap->ap_no_sg_elements = nsegments;
!           ap->ap_data_transfer_address = sc->amr_sgbusaddr +
!               (ac->ac_slot * AMR_NSEG * sizeof(struct amr_sgentry));
!           /*
!            * populate s/g table (overwrites previous call which mapped the
!            * passthrough)
!            */
            for (i = 0; i < nsegments; i++, sg++) {
                sg->sg_addr = segs[i].ds_addr;
                sg->sg_count = segs[i].ds_len;
                debug(3, " %d: 0x%x/%d", i, sg->sg_addr, sg->sg_count);
            }
        }
!       debug(3, "slot %d  %d segments at 0x%x, passthrough at 0x%x",
!           ac->ac_slot, ap->ap_no_sg_elements, ap->ap_data_transfer_address,
!           ac->ac_dataphys);
!     }
!     if (ac->ac_flags & AMR_CMD_CCB_DATAIN)
!       bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap,
!           BUS_DMASYNC_PREREAD);
!     if (ac->ac_flags & AMR_CMD_CCB_DATAOUT)
!       bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap,
!           BUS_DMASYNC_PREWRITE);
!     if ((ac->ac_flags & (AMR_CMD_CCB_DATAIN | AMR_CMD_CCB_DATAOUT)) == 0)
!       panic("no direction for ccb?\n");
! 
!     if (ac->ac_flags & AMR_CMD_DATAIN)
!       bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,BUS_DMASYNC_PREREAD);
!     if (ac->ac_flags & AMR_CMD_DATAOUT)
!       bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,BUS_DMASYNC_PREWRITE);
! 
!     ac->ac_flags |= AMR_CMD_MAPPED;
! 
!     amr_start1(sc, ac);
  }
  
! static int
  amr_mapcmd(struct amr_command *ac)
  {
      struct amr_softc  *sc = ac->ac_sc;
***************
*** 1180,1207 ****
      debug_called(3);
  
      /* if the command involves data at all, and hasn't been mapped */
!     if (!(ac->ac_flags & AMR_CMD_MAPPED)) {
! 
!       if (ac->ac_data != NULL) {
            /* map the data buffers into bus space and build the s/g list */
!           bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_dmamap, ac->ac_data, 
ac->ac_length,
!                           amr_setup_dmamap, ac, 0);
!           if (ac->ac_flags & AMR_CMD_DATAIN)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_dmamap, 
BUS_DMASYNC_PREREAD);
!           if (ac->ac_flags & AMR_CMD_DATAOUT)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_dmamap, 
BUS_DMASYNC_PREWRITE);
!       }
  
!       if (ac->ac_ccb_data != NULL) {
!           bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_ccb_dmamap, 
ac->ac_ccb_data, ac->ac_ccb_length,
!                           amr_setup_ccbmap, ac, 0);
!           if (ac->ac_flags & AMR_CMD_CCB_DATAIN)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap, 
BUS_DMASYNC_PREREAD);
!           if (ac->ac_flags & AMR_CMD_CCB_DATAOUT)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap, 
BUS_DMASYNC_PREWRITE);
        }
-       ac->ac_flags |= AMR_CMD_MAPPED;
      }
  }
  
  static void
--- 1245,1271 ----
      debug_called(3);
  
      /* if the command involves data at all, and hasn't been mapped */
!     if ((ac->ac_flags & AMR_CMD_MAPPED) == 0 && (ac->ac_data != NULL)) {
!       if (ac->ac_ccb_data == NULL) {
            /* map the data buffers into bus space and build the s/g list */
!           if (bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_dmamap, ac->ac_data,
!               ac->ac_length, amr_setup_data_dmamap, ac, 0) == EINPROGRESS) {
!               sc->amr_state |= AMR_STATE_QUEUE_FRZN;
!           }
!       } else {
  
!           if (bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_dmamap, ac->ac_data,
!               ac->ac_length, amr_setup_dmamap, ac, BUS_DMA_NOWAIT) != 0){
!               return (ENOMEM);
!           }
!           if (bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_ccb_dmamap,
!               ac->ac_ccb_data, ac->ac_ccb_length, amr_setup_ccbmap, ac,
!               0) == EINPROGRESS) {
!               sc->amr_state |= AMR_STATE_QUEUE_FRZN;
!           }
        }
      }
+     return (0);
  }
  
  static void
***************
*** 1216,1238 ****
  
        if (ac->ac_data != NULL) {
            if (ac->ac_flags & AMR_CMD_DATAIN)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_dmamap, 
BUS_DMASYNC_POSTREAD);
            if (ac->ac_flags & AMR_CMD_DATAOUT)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_dmamap, 
BUS_DMASYNC_POSTWRITE);
            bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_dmamap);
        }
  
        if (ac->ac_ccb_data != NULL) {
            if (ac->ac_flags & AMR_CMD_CCB_DATAIN)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap, 
BUS_DMASYNC_POSTREAD);
            if (ac->ac_flags & AMR_CMD_CCB_DATAOUT)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap, 
BUS_DMASYNC_POSTWRITE);
            bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_ccb_dmamap);
        }
        ac->ac_flags &= ~AMR_CMD_MAPPED;
      }
  }
  
  
/********************************************************************************
   * Take a command and give it to the controller, returns 0 if successful, or
   * EBUSY if the command should be retried later.
--- 1280,1326 ----
  
        if (ac->ac_data != NULL) {
            if (ac->ac_flags & AMR_CMD_DATAIN)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_dmamap,
!                   BUS_DMASYNC_POSTREAD);
            if (ac->ac_flags & AMR_CMD_DATAOUT)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_dmamap,
!                   BUS_DMASYNC_POSTWRITE);
            bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_dmamap);
        }
  
        if (ac->ac_ccb_data != NULL) {
            if (ac->ac_flags & AMR_CMD_CCB_DATAIN)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap,
!                   BUS_DMASYNC_POSTREAD);
            if (ac->ac_flags & AMR_CMD_CCB_DATAOUT)
!               bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap,
!                   BUS_DMASYNC_POSTWRITE);
            bus_dmamap_unload(sc->amr_buffer_dmat, ac->ac_ccb_dmamap);
+       debug(3, "slot %d  %d segments at 0x%x, passthrough at 0x%x\n",
+           ac->ac_slot, aep->ap_no_sg_elements, aep->ap_data_transfer_address,
+           ac->ac_dataphys);
        }
        ac->ac_flags &= ~AMR_CMD_MAPPED;
      }
  }
  
+ static void
+ amr_setup_data_dmamap(void *arg, bus_dma_segment_t *segs, int nsegs, int err)
+ {
+     struct amr_command *ac = arg;
+     struct amr_softc *sc = ac->ac_sc;
+ 
+     amr_setup_dmamap(arg, segs, nsegs, err);
+ 
+     if (ac->ac_flags & AMR_CMD_DATAIN)
+       bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,BUS_DMASYNC_PREREAD);
+     if (ac->ac_flags & AMR_CMD_DATAOUT)
+       bus_dmamap_sync(sc->amr_buffer_dmat,ac->ac_dmamap,BUS_DMASYNC_PREWRITE);
+     ac->ac_flags |= AMR_CMD_MAPPED;
+ 
+     amr_start1(sc, ac);
+ }
+    
  
/********************************************************************************
   * Take a command and give it to the controller, returns 0 if successful, or
   * EBUSY if the command should be retried later.
***************
*** 1240,1259 ****
  static int
  amr_start(struct amr_command *ac)
  {
!     struct amr_softc  *sc = ac->ac_sc;
!     int                       done, s, i;
  
      debug_called(3);
  
      /* mark command as busy so that polling consumer can tell */
      ac->ac_flags |= AMR_CMD_BUSY;
  
      /* get a command slot (freed in amr_done) */
      if (amr_getslot(ac))
        return(EBUSY);
  
!     /* now we have a slot, we can map the command (unmapped in amr_complete) 
*/
!     amr_mapcmd(ac);
  
      /* mark the new mailbox we are going to copy in as busy */
      ac->ac_mailbox.mb_busy = 1;
--- 1328,1364 ----
  static int
  amr_start(struct amr_command *ac)
  {
!     struct amr_softc *sc;
!     int error = 0;
  
      debug_called(3);
  
      /* mark command as busy so that polling consumer can tell */
+     sc = ac->ac_sc;
      ac->ac_flags |= AMR_CMD_BUSY;
  
      /* get a command slot (freed in amr_done) */
      if (amr_getslot(ac))
        return(EBUSY);
  
!     /* Now we have a slot, we can map the command (unmapped in amr_complete). 
*/
!     if ((error = amr_mapcmd(ac)) == ENOMEM) {
!       /*
!        * Memroy resources are short, so free the slot and let this be tried
!        * later.
!        */
!       sc->amr_busycmd[ac->ac_slot] = NULL;
!       sc->amr_busyslots--;
!     }
! 
!     return (error);
! }
! 
! 
! static int
! amr_start1(struct amr_softc *sc, struct amr_command *ac)
! {
!     int                       done, s, i;
  
      /* mark the new mailbox we are going to copy in as busy */
      ac->ac_mailbox.mb_busy = 1;
***************
*** 1363,1370 ****
            break;      /* no work */
        }
      }
!     
      /* if we've completed any commands, try posting some more */
      if (result)
        amr_startio(sc);
      
--- 1468,1476 ----
            break;      /* no work */
        }
      }
! 
      /* if we've completed any commands, try posting some more */
+     sc->amr_state &= ~AMR_STATE_QUEUE_FRZN;
      if (result)
        amr_startio(sc);
      
***************
*** 1375,1381 ****
      else
  #endif
        amr_complete(sc, 0);
!     
      return(result);
  }
  
--- 1481,1487 ----
      else
  #endif
        amr_complete(sc, 0);
! 
      return(result);
  }
  
***************
*** 1419,1424 ****
--- 1525,1531 ----
            wakeup(sc);
        }
      }
+    amr_startio(sc);
  }
  
  
/********************************************************************************
*** sys/dev/amr/amr_cam.c.orig  Mon Nov 11 05:19:10 2002
--- sys/dev/amr/amr_cam.c       Tue Mar  8 15:11:33 2005
***************
*** 458,464 ****
        goto out;
      }
  
!     ac->ac_flags |= AMR_CMD_DATAOUT;
  
      ac->ac_ccb_data = csio->data_ptr;
      ac->ac_ccb_length = csio->dxfer_len;
--- 458,464 ----
        goto out;
      }
  
!     ac->ac_flags |= AMR_CMD_DATAOUT | AMR_CMD_DATAIN;
  
      ac->ac_ccb_data = csio->data_ptr;
      ac->ac_ccb_length = csio->dxfer_len;
***************
*** 516,522 ****
  
      /* XXX note that we're ignoring ac->ac_status - good idea? */
  
!     debug(1, "status 0x%x  scsi_status 0x%x", ac->ac_status, 
ap->ap_scsi_status);
  
      /*
       * Hide disks from CAM so that they're not picked up and treated as 
'normal' disks.
--- 516,522 ----
  
      /* XXX note that we're ignoring ac->ac_status - good idea? */
  
!     debug(1, "status 0x%x  AP scsi_status 0x%x", ac->ac_status, 
ap->ap_scsi_status);
  
      /*
       * Hide disks from CAM so that they're not picked up and treated as 
'normal' disks.
***************
*** 579,585 ****
  
      /* XXX note that we're ignoring ac->ac_status - good idea? */
  
!     debug(1, "status 0x%x  scsi_status 0x%x", ac->ac_status, 
aep->ap_scsi_status);
  
      /*
       * Hide disks from CAM so that they're not picked up and treated as 
'normal' disks.
--- 579,585 ----
  
      /* XXX note that we're ignoring ac->ac_status - good idea? */
  
!     debug(1, "status 0x%x  AEP scsi_status 0x%x", ac->ac_status, 
aep->ap_scsi_status);
  
      /*
       * Hide disks from CAM so that they're not picked up and treated as 
'normal' disks.
*** sys/dev/amr/amr_pci.c.orig  Wed Dec  8 10:53:23 2004
--- sys/dev/amr/amr_pci.c       Tue Mar  8 15:11:33 2005
***************
*** 251,257 ****
                           NULL, NULL,                  /* filter, filterarg */
                           MAXBSIZE, AMR_NSEG,          /* maxsize, nsegments */
                           BUS_SPACE_MAXSIZE_32BIT,     /* maxsegsize */
!                          BUS_DMA_ALLOCNOW,            /* flags */
                           &sc->amr_parent_dmat)) {
        device_printf(dev, "can't allocate parent DMA tag\n");
        goto out;
--- 251,257 ----
                           NULL, NULL,                  /* filter, filterarg */
                           MAXBSIZE, AMR_NSEG,          /* maxsize, nsegments */
                           BUS_SPACE_MAXSIZE_32BIT,     /* maxsegsize */
!                          0,                           /* flags */
                           &sc->amr_parent_dmat)) {
        device_printf(dev, "can't allocate parent DMA tag\n");
        goto out;
***************
*** 262,273 ****
       */
      if (bus_dma_tag_create(sc->amr_parent_dmat,               /* parent */
                           1, 0,                        /* alignment, boundary 
*/
!                          BUS_SPACE_MAXADDR,           /* lowaddr */
                           BUS_SPACE_MAXADDR,           /* highaddr */
                           NULL, NULL,                  /* filter, filterarg */
                           MAXBSIZE, AMR_NSEG,          /* maxsize, nsegments */
!                          BUS_SPACE_MAXSIZE_32BIT,     /* maxsegsize */
!                          0,                           /* flags */
                           &sc->amr_buffer_dmat)) {
          device_printf(sc->amr_dev, "can't allocate buffer DMA tag\n");
        goto out;
--- 262,273 ----
       */
      if (bus_dma_tag_create(sc->amr_parent_dmat,               /* parent */
                           1, 0,                        /* alignment, boundary 
*/
!                          BUS_SPACE_MAXADDR_32BIT,     /* lowaddr */
                           BUS_SPACE_MAXADDR,           /* highaddr */
                           NULL, NULL,                  /* filter, filterarg */
                           MAXBSIZE, AMR_NSEG,          /* maxsize, nsegments */
!                          MAXBSIZE,                    /* maxsegsize */
!                          BUS_DMA_ALLOCNOW,            /* flags */
                           &sc->amr_buffer_dmat)) {
          device_printf(sc->amr_dev, "can't allocate buffer DMA tag\n");
        goto out;
***************
*** 502,508 ****
      segsize = sizeof(struct amr_sgentry) * AMR_NSEG * AMR_MAXCMD;
      error = bus_dma_tag_create(sc->amr_parent_dmat,   /* parent */
                               1, 0,                    /* alignment, boundary 
*/
!                              BUS_SPACE_MAXADDR,       /* lowaddr */
                               BUS_SPACE_MAXADDR,       /* highaddr */
                               NULL, NULL,              /* filter, filterarg */
                               segsize, 1,              /* maxsize, nsegments */
--- 502,508 ----
      segsize = sizeof(struct amr_sgentry) * AMR_NSEG * AMR_MAXCMD;
      error = bus_dma_tag_create(sc->amr_parent_dmat,   /* parent */
                               1, 0,                    /* alignment, boundary 
*/
!                              BUS_SPACE_MAXADDR_32BIT, /* lowaddr */
                               BUS_SPACE_MAXADDR,       /* highaddr */
                               NULL, NULL,              /* filter, filterarg */
                               segsize, 1,              /* maxsize, nsegments */
***************
*** 572,578 ****
       */
      error = bus_dma_tag_create(sc->amr_parent_dmat,   /* parent */
                               16, 0,                   /* alignment, boundary 
*/
!                              BUS_SPACE_MAXADDR,       /* lowaddr */
                               BUS_SPACE_MAXADDR,       /* highaddr */
                               NULL, NULL,              /* filter, filterarg */
                               sizeof(struct amr_mailbox) + 16, 1, /* maxsize, 
nsegments */
--- 572,578 ----
       */
      error = bus_dma_tag_create(sc->amr_parent_dmat,   /* parent */
                               16, 0,                   /* alignment, boundary 
*/
!                              BUS_SPACE_MAXADDR_32BIT, /* lowaddr */
                               BUS_SPACE_MAXADDR,       /* highaddr */
                               NULL, NULL,              /* filter, filterarg */
                               sizeof(struct amr_mailbox) + 16, 1, /* maxsize, 
nsegments */
*** sys/dev/amr/amrvar.h.orig   Thu Jul 22 09:35:18 2004
--- sys/dev/amr/amrvar.h        Tue Mar  8 15:11:34 2005
***************
*** 186,191 ****
--- 186,192 ----
  #define AMR_STATE_INTEN               (1<<2)
  #define AMR_STATE_SHUTDOWN    (1<<3)
  #define AMR_STATE_CRASHDUMP   (1<<4)
+ #define AMR_STATE_QUEUE_FRZN  (1<<5)
  
      /* per-controller queues */
      struct bio_queue_head     amr_bioq;               /* pending I/O with no 
commands */
***************
*** 212,217 ****
--- 213,219 ----
      int                               (* amr_submit_command)(struct amr_softc 
*sc);
      int                               (* amr_get_work)(struct amr_softc *sc, 
struct amr_mailbox *mbsave);
      int                               (*amr_poll_command)(struct amr_command 
*ac);
+     int                               (*amr_poll_command1)(struct amr_softc 
*sc, struct amr_command *ac);
      int                       support_ext_cdb;        /* greater than 10 byte 
cdb support */
  
      /* misc glue */
_______________________________________________
freebsd-stable@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-stable
To unsubscribe, send any mail to "[EMAIL PROTECTED]"

Reply via email to