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]"