diff --git a/sys/dev/amr/amr.c b/sys/dev/amr/amr.c index 379c67f34e08..55caeb17fabf 100644 --- a/sys/dev/amr/amr.c +++ b/sys/dev/amr/amr.c @@ -24,12 +24,34 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * Copyright (c) 2002 Eric Moore + * Copyright (c) 2002 LSI Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * 3. The party using or redistributing the source code and binary forms - * agrees to the above disclaimer and the terms and conditions set forth + * agrees to the disclaimer below and the terms and conditions set forth * herein. * - * Additional Copyright (c) 2002 by Eric Moore under same license. - * Additional Copyright (c) 2002 LSI Logic Corporation + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * * * $FreeBSD$ */ @@ -99,6 +121,7 @@ static int amr_query_controller(struct amr_softc *sc); static void *amr_enquiry(struct amr_softc *sc, size_t bufsize, u_int8_t cmd, u_int8_t cmdsub, u_int8_t cmdqual); static void amr_completeio(struct amr_command *ac); +static int amr_support_ext_cdb(struct amr_softc *sc); /* * Command buffer allocation. @@ -547,6 +570,15 @@ amr_query_controller(struct amr_softc *sc) if (sc->amr_maxio == 0) sc->amr_maxio = 2; + /* + * Greater than 10 byte cdb support + */ + sc->support_ext_cdb = amr_support_ext_cdb(sc); + + if(sc->support_ext_cdb) { + debug(2,"supports extended CDBs."); + } + /* * Try to issue an ENQUIRY3 command */ @@ -701,6 +733,44 @@ amr_flush(struct amr_softc *sc) return(error); } +/******************************************************************************** + * Detect extented cdb >> greater than 10 byte cdb support + * returns '1' means this support exist + * returns '0' means this support doesn't exist + */ +static int +amr_support_ext_cdb(struct amr_softc *sc) +{ + struct amr_command *ac; + u_int8_t *mbox; + int error; + + /* get ourselves a command buffer */ + error = 0; + if ((ac = amr_alloccmd(sc)) == NULL) + goto out; + /* set command flags */ + ac->ac_flags |= AMR_CMD_PRIORITY | AMR_CMD_DATAOUT; + + /* build the command proper */ + mbox = (u_int8_t *)&ac->ac_mailbox; /* XXX want a real structure for this? */ + mbox[0] = 0xA4; + mbox[2] = 0x16; + + + /* we have to poll, as the system may be going down or otherwise damaged */ + if (amr_poll_command(ac)) + goto out; + if( ac->ac_status == AMR_STATUS_SUCCESS ) { + error = 1; + } + +out: + if (ac != NULL) + amr_releasecmd(ac); + return(error); +} + /******************************************************************************** * Try to find I/O work for the controller from one or more of the work queues. * @@ -982,29 +1052,48 @@ amr_setup_ccbmap(void *arg, bus_dma_segment_t *segs, int nsegments, int error) struct amr_softc *sc = ac->ac_sc; struct amr_sgentry *sg; struct amr_passthrough *ap = (struct amr_passthrough *)ac->ac_data; + struct amr_ext_passthrough *aep = (struct amr_passthrough *)ac->ac_data; int i; /* get base address of s/g table */ sg = sc->amr_sgtable + (ac->ac_slot * AMR_NSEG); /* decide whether we need to populate the s/g table */ - if (nsegments < 2) { - ap->ap_no_sg_elements = 0; - ap->ap_data_transfer_address = segs[0].ds_addr; - } 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++) { + if( ac->ac_mailbox.mb_command == AMR_CMD_EXTPASS ) { + if (nsegments < 2) { + aep->ap_no_sg_elements = 0; + aep->ap_data_transfer_address = segs[0].ds_addr; + } 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; + ap->ap_data_transfer_address = segs[0].ds_addr; + } 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); } - - 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 diff --git a/sys/dev/amr/amr_cam.c b/sys/dev/amr/amr_cam.c index 0a6eda864fda..37412b6d5a8d 100644 --- a/sys/dev/amr/amr_cam.c +++ b/sys/dev/amr/amr_cam.c @@ -24,12 +24,34 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * Copyright (c) 2002 Eric Moore + * Copyright (c) 2002 LSI Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * 3. The party using or redistributing the source code and binary forms - * agrees to the above disclaimer and the terms and conditions set forth + * agrees to the disclaimer below and the terms and conditions set forth * herein. * - * Additional Copyright (c) 2002 by Eric Moore under same license. - * Additional Copyright (c) 2002 LSI Logic Corporation + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * * * $FreeBSD$ */ @@ -64,6 +86,7 @@ static void amr_cam_action(struct cam_sim *sim, union ccb *ccb); static void amr_cam_poll(struct cam_sim *sim); static void amr_cam_complete(struct amr_command *ac); +static void amr_cam_complete_extcdb(struct amr_command *ac); /******************************************************************************** @@ -203,7 +226,10 @@ amr_cam_action(struct cam_sim *sim, union ccb *ccb) ccbh->status = CAM_REQ_INPROG; /* check the CDB length */ - if (csio->cdb_len > AMR_MAX_CDB_LEN) + if (csio->cdb_len > AMR_MAX_EXTCDB_LEN) + ccbh->status = CAM_REQ_CMP_ERR; + + if ((csio->cdb_len > AMR_MAX_CDB_LEN) && (sc->support_ext_cdb == 0 )) ccbh->status = CAM_REQ_CMP_ERR; /* check that the CDB pointer is not to a physical address */ @@ -355,13 +381,15 @@ int amr_cam_command(struct amr_softc *sc, struct amr_command **acp) { struct amr_command *ac; - struct amr_passthrough *ap; - struct ccb_scsiio *csio; + struct amr_passthrough *ap; + struct amr_ext_passthrough *aep; + struct ccb_scsiio *csio; int bus, target, error; error = 0; ac = NULL; ap = NULL; + aep = NULL; /* check to see if there is a ccb for us to work with */ if ((csio = (struct ccb_scsiio *)amr_dequeue_ccb(sc)) == NULL) @@ -376,28 +404,54 @@ amr_cam_command(struct amr_softc *sc, struct amr_command **acp) */ /* construct passthrough */ - if ((ap = malloc(sizeof(*ap), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) { - error = ENOMEM; - goto out; - } - ap->ap_timeout = 0; - ap->ap_ars = 1; - ap->ap_request_sense_length = 14; - ap->ap_islogical = 0; - ap->ap_channel = bus; - ap->ap_scsi_id = target; - ap->ap_logical_drive_no = csio->ccb_h.target_lun; - ap->ap_cdb_length = csio->cdb_len; - ap->ap_data_transfer_length = csio->dxfer_len; - if (csio->ccb_h.flags & CAM_CDB_POINTER) { - bcopy(csio->cdb_io.cdb_ptr, ap->ap_cdb, csio->cdb_len); - } else { - bcopy(csio->cdb_io.cdb_bytes, ap->ap_cdb, csio->cdb_len); - } - /* we leave the data s/g list and s/g count to the map routine later */ + if (sc->support_ext_cdb ) { + if ((aep = malloc(sizeof(*aep), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) { + error = ENOMEM; + goto out; + } + aep->ap_timeout = 2; + aep->ap_ars = 1; + aep->ap_request_sense_length = 14; + aep->ap_islogical = 0; + aep->ap_channel = bus; + aep->ap_scsi_id = target; + aep->ap_logical_drive_no = csio->ccb_h.target_lun; + aep->ap_cdb_length = csio->cdb_len; + aep->ap_data_transfer_length = csio->dxfer_len; + if (csio->ccb_h.flags & CAM_CDB_POINTER) { + bcopy(csio->cdb_io.cdb_ptr, aep->ap_cdb, csio->cdb_len); + } else { + bcopy(csio->cdb_io.cdb_bytes, aep->ap_cdb, csio->cdb_len); + } + /* we leave the data s/g list and s/g count to the map routine later */ - debug(2, " COMMAND %x/%d+%d to %d:%d:%d", ap->ap_cdb[0], ap->ap_cdb_length, csio->dxfer_len, - ap->ap_channel, ap->ap_scsi_id, ap->ap_logical_drive_no); + debug(2, " COMMAND %x/%d+%d to %d:%d:%d", aep->ap_cdb[0], aep->ap_cdb_length, csio->dxfer_len, + aep->ap_channel, aep->ap_scsi_id, aep->ap_logical_drive_no); + + } else { + if ((ap = malloc(sizeof(*ap), M_DEVBUF, M_NOWAIT | M_ZERO)) == NULL) { + error = ENOMEM; + goto out; + } + ap->ap_timeout = 0; + ap->ap_ars = 1; + ap->ap_request_sense_length = 14; + ap->ap_islogical = 0; + ap->ap_channel = bus; + ap->ap_scsi_id = target; + ap->ap_logical_drive_no = csio->ccb_h.target_lun; + ap->ap_cdb_length = csio->cdb_len; + ap->ap_data_transfer_length = csio->dxfer_len; + if (csio->ccb_h.flags & CAM_CDB_POINTER) { + bcopy(csio->cdb_io.cdb_ptr, ap->ap_cdb, csio->cdb_len); + } else { + bcopy(csio->cdb_io.cdb_bytes, ap->ap_cdb, csio->cdb_len); + } + /* we leave the data s/g list and s/g count to the map routine later */ + + debug(2, " COMMAND %x/%d+%d to %d:%d:%d", ap->ap_cdb[0], ap->ap_cdb_length, csio->dxfer_len, + ap->ap_channel, ap->ap_scsi_id, ap->ap_logical_drive_no); + } /* construct command */ if ((ac = amr_alloccmd(sc)) == NULL) { @@ -405,8 +459,6 @@ amr_cam_command(struct amr_softc *sc, struct amr_command **acp) goto out; } - ac->ac_data = ap; - ac->ac_length = sizeof(*ap); ac->ac_flags |= AMR_CMD_DATAOUT; ac->ac_ccb_data = csio->data_ptr; @@ -416,9 +468,18 @@ amr_cam_command(struct amr_softc *sc, struct amr_command **acp) if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) ac->ac_flags |= AMR_CMD_CCB_DATAOUT; - ac->ac_complete = amr_cam_complete; ac->ac_private = csio; - ac->ac_mailbox.mb_command = AMR_CMD_PASS; + if ( sc->support_ext_cdb ) { + ac->ac_data = aep; + ac->ac_length = sizeof(*aep); + ac->ac_complete = amr_cam_complete_extcdb; + ac->ac_mailbox.mb_command = AMR_CMD_EXTPASS; + } else { + ac->ac_data = ap; + ac->ac_length = sizeof(*ap); + ac->ac_complete = amr_cam_complete; + ac->ac_mailbox.mb_command = AMR_CMD_PASS; + } out: if (error != 0) { @@ -426,6 +487,8 @@ amr_cam_command(struct amr_softc *sc, struct amr_command **acp) amr_releasecmd(ac); if (ap != NULL) free(ap, M_DEVBUF); + if (aep != NULL) + free(aep, M_DEVBUF); if (csio != NULL) /* put it back and try again later */ amr_requeue_ccb(sc, (union ccb *)csio); } @@ -442,7 +505,7 @@ amr_cam_poll(struct cam_sim *sim) amr_done(cam_sim_softc(sim)); } -/******************************************************************************** + /******************************************************************************** * Handle completion of a command submitted via CAM. */ static void @@ -504,3 +567,65 @@ amr_cam_complete(struct amr_command *ac) amr_releasecmd(ac); } +/******************************************************************************** + * Handle completion of a command submitted via CAM. + * Completion for extended cdb + */ +static void +amr_cam_complete_extcdb(struct amr_command *ac) +{ + struct amr_ext_passthrough *aep = (struct amr_ext_passthrough *)ac->ac_data; + struct ccb_scsiio *csio = (struct ccb_scsiio *)ac->ac_private; + struct scsi_inquiry_data *inq = (struct scsi_inquiry_data *)csio->data_ptr; + + /* 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. + * + * If the configuration provides a mechanism to mark a disk a "not managed", we + * could add handling for that to allow disks to be selectively visible. + */ + + if ((aep->ap_cdb[0] == INQUIRY) && (SID_TYPE(inq) == T_DIRECT)) { + bzero(csio->data_ptr, csio->dxfer_len); + if (aep->ap_scsi_status == 0xf0) { + csio->ccb_h.status = CAM_SCSI_STATUS_ERROR; + } else { + csio->ccb_h.status = CAM_DEV_NOT_THERE; + } + } else { + + /* handle passthrough SCSI status */ + switch(aep->ap_scsi_status) { + case 0: /* completed OK */ + csio->ccb_h.status = CAM_REQ_CMP; + break; + + case 0x02: + csio->ccb_h.status = CAM_SCSI_STATUS_ERROR; + csio->scsi_status = SCSI_STATUS_CHECK_COND; + bcopy(aep->ap_request_sense_area, &csio->sense_data, AMR_MAX_REQ_SENSE_LEN); + csio->sense_len = AMR_MAX_REQ_SENSE_LEN; + csio->ccb_h.status |= CAM_AUTOSNS_VALID; + break; + + case 0x08: + csio->ccb_h.status = CAM_SCSI_BUSY; + break; + + case 0xf0: + case 0xf4: + default: + csio->ccb_h.status = CAM_REQ_CMP_ERR; + break; + } + } + free(aep, M_DEVBUF); + if ((csio->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) + debug(2, "%*D\n", imin(csio->dxfer_len, 16), csio->data_ptr, " "); + xpt_done((union ccb *)csio); + amr_releasecmd(ac); +} diff --git a/sys/dev/amr/amr_compat.h b/sys/dev/amr/amr_compat.h index be538679d697..9bd5dc8248e8 100644 --- a/sys/dev/amr/amr_compat.h +++ b/sys/dev/amr/amr_compat.h @@ -24,12 +24,34 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * Copyright (c) 2002 Eric Moore + * Copyright (c) 2002 LSI Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * 3. The party using or redistributing the source code and binary forms - * agrees to the above disclaimer and the terms and conditions set forth + * agrees to the disclaimer below and the terms and conditions set forth * herein. * - * Additional Copyright (c) 2002 by Eric Moore under same license. - * Additional Copyright (c) 2002 LSI Logic Corporation + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * * * $FreeBSD$ */ diff --git a/sys/dev/amr/amr_disk.c b/sys/dev/amr/amr_disk.c index 9f4e343879cb..d6d139a0c41d 100644 --- a/sys/dev/amr/amr_disk.c +++ b/sys/dev/amr/amr_disk.c @@ -25,12 +25,34 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * Copyright (c) 2002 Eric Moore + * Copyright (c) 2002 LSI Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * 3. The party using or redistributing the source code and binary forms - * agrees to the above disclaimer and the terms and conditions set forth + * agrees to the disclaimer below and the terms and conditions set forth * herein. * - * Additional Copyright (c) 2002 by Eric Moore under same license. - * Additional Copyright (c) 2002 LSI Logic Corporation + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * * * $FreeBSD$ */ diff --git a/sys/dev/amr/amr_pci.c b/sys/dev/amr/amr_pci.c index 8c7995ea2fb1..18141bdf6eae 100644 --- a/sys/dev/amr/amr_pci.c +++ b/sys/dev/amr/amr_pci.c @@ -24,12 +24,34 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * Copyright (c) 2002 Eric Moore + * Copyright (c) 2002 LSI Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * 3. The party using or redistributing the source code and binary forms - * agrees to the above disclaimer and the terms and conditions set forth + * agrees to the disclaimer below and the terms and conditions set forth * herein. * - * Additional Copyright (c) 2002 by Eric Moore under same license. - * Additional Copyright (c) 2002 LSI Logic Corporation + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * * * $FreeBSD$ */ @@ -408,10 +430,10 @@ amr_pci_free(struct amr_softc *sc) /* free and destroy DMA memory and tag for mailbox */ if (sc->amr_mailbox) { p = (u_int8_t *)(uintptr_t)(volatile void *)sc->amr_mailbox; - bus_dmamem_free(sc->amr_sg_dmat, p - 16, sc->amr_sg_dmamap); + bus_dmamem_free(sc->amr_mailbox_dmat, p - 16, sc->amr_mailbox_dmamap); } - if (sc->amr_sg_dmat) - bus_dma_tag_destroy(sc->amr_sg_dmat); + if (sc->amr_mailbox_dmat) + bus_dma_tag_destroy(sc->amr_mailbox_dmat); /* disconnect the interrupt handler */ if (sc->amr_intr) @@ -547,13 +569,13 @@ amr_setup_mbox(struct amr_softc *sc) * Allocate the mailbox structure and permanently map it into * controller-visible space. */ - error = bus_dmamem_alloc(sc->amr_mailbox_dmat, (void **)&p, BUS_DMA_NOWAIT, + error = bus_dmamem_alloc(sc->amr_mailbox_dmat, (void **)&p, BUS_DMA_NOWAIT, &sc->amr_mailbox_dmamap); if (error) { device_printf(sc->amr_dev, "can't allocate mailbox memory\n"); return(ENOMEM); } - bus_dmamap_load(sc->amr_mailbox_dmat, sc->amr_mailbox_dmamap, p, + bus_dmamap_load(sc->amr_mailbox_dmat, sc->amr_mailbox_dmamap, p, sizeof(struct amr_mailbox64), amr_setup_mbox_helper, sc, 0); /* * Conventional mailbox is inside the mailbox64 region. diff --git a/sys/dev/amr/amr_tables.h b/sys/dev/amr/amr_tables.h index f2ce1d370161..b1a4e441af42 100644 --- a/sys/dev/amr/amr_tables.h +++ b/sys/dev/amr/amr_tables.h @@ -24,12 +24,34 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * Copyright (c) 2002 Eric Moore + * Copyright (c) 2002 LSI Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * 3. The party using or redistributing the source code and binary forms - * agrees to the above disclaimer and the terms and conditions set forth + * agrees to the disclaimer below and the terms and conditions set forth * herein. * - * Additional Copyright (c) 2002 by Eric Moore under same license. - * Additional Copyright (c) 2002 LSI Logic Corporation + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * * * $FreeBSD$ */ diff --git a/sys/dev/amr/amrio.h b/sys/dev/amr/amrio.h index e319573c4605..48ec4e8c59d9 100644 --- a/sys/dev/amr/amrio.h +++ b/sys/dev/amr/amrio.h @@ -23,12 +23,34 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * Copyright (c) 2002 Eric Moore + * Copyright (c) 2002 LSI Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * 3. The party using or redistributing the source code and binary forms - * agrees to the above disclaimer and the terms and conditions set forth + * agrees to the disclaimer below and the terms and conditions set forth * herein. * - * Additional Copyright (c) 2002 by Eric Moore under same license. - * Additional Copyright (c) 2002 LSI Logic Corporation + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * * * $FreeBSD$ */ diff --git a/sys/dev/amr/amrreg.h b/sys/dev/amr/amrreg.h index 7abfe0f103cb..07850382f0a6 100644 --- a/sys/dev/amr/amrreg.h +++ b/sys/dev/amr/amrreg.h @@ -24,12 +24,34 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * Copyright (c) 2002 Eric Moore + * Copyright (c) 2002 LSI Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * 3. The party using or redistributing the source code and binary forms - * agrees to the above disclaimer and the terms and conditions set forth + * agrees to the disclaimer below and the terms and conditions set forth * herein. * - * Additional Copyright (c) 2002 by Eric Moore under same license. - * Additional Copyright (c) 2002 LSI Logic Corporation + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * * * $FreeBSD$ */ @@ -49,7 +71,12 @@ * cleanly fit more than 16 entries in without a page boundary. But is this a concern, * since we allocate the s/g maps contiguously anyway? */ -#define AMR_NSEG 16 +/* + * emoore - Oct 21, 2002 + * firmware doesn't have sglist boundary restrictions. + * The sgelem can be set to 26 + */ +#define AMR_NSEG 26 #define AMR_MAXCMD 255 /* ident = 0 not allowed */ #define AMR_LIMITCMD 120 /* maximum count of outstanding commands */ @@ -61,6 +88,7 @@ #define AMR_MAX_SCSI_CMDS (15 * AMR_MAX_CHANNELS) /* one for every target? */ #define AMR_MAX_CDB_LEN 0x0a +#define AMR_MAX_EXTCDB_LEN 0x10 #define AMR_MAX_REQ_SENSE_LEN 0x20 #define AMR_BLKSIZE 512 /* constant for all controllers */ @@ -96,6 +124,7 @@ #define AMR_CONFIG_ENQ3_SOLICITED_NOTIFY 0x01 #define AMR_CONFIG_ENQ3_SOLICITED_FULL 0x02 #define AMR_CONFIG_ENQ3_UNSOLICITED 0x03 +#define AMR_CMD_EXTPASS 0xe3 /* * Command results @@ -435,6 +464,31 @@ struct amr_passthrough u_int32_t ap_data_transfer_length; } __packed; +struct amr_ext_passthrough +{ + u_int8_t ap_timeout:3; + u_int8_t ap_ars:1; + u_int8_t ap_rsvd1:1; + u_int8_t ap_cd_rom:1; + u_int8_t ap_rsvd2:1; + u_int8_t ap_islogical:1; + u_int8_t ap_logical_drive_no; + u_int8_t ap_channel; + u_int8_t ap_scsi_id; + u_int8_t ap_queue_tag; + u_int8_t ap_queue_action; + u_int8_t ap_cdb_length; + u_int8_t ap_rsvd3; + u_int8_t ap_cdb[AMR_MAX_EXTCDB_LEN]; + u_int8_t ap_no_sg_elements; + u_int8_t ap_scsi_status; + u_int8_t ap_request_sense_length; + u_int8_t ap_request_sense_area[AMR_MAX_REQ_SENSE_LEN]; + u_int8_t ap_rsvd4; + u_int32_t ap_data_transfer_address; + u_int32_t ap_data_transfer_length; +} __packed; + #ifdef _KERNEL /******************************************************************************** ******************************************************************************** diff --git a/sys/dev/amr/amrvar.h b/sys/dev/amr/amrvar.h index 2c54824bfb43..d3e1e8875710 100644 --- a/sys/dev/amr/amrvar.h +++ b/sys/dev/amr/amrvar.h @@ -24,12 +24,34 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * Copyright (c) 2002 Eric Moore + * Copyright (c) 2002 LSI Logic Corporation + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. * 3. The party using or redistributing the source code and binary forms - * agrees to the above disclaimer and the terms and conditions set forth + * agrees to the disclaimer below and the terms and conditions set forth * herein. * - * Additional Copyright (c) 2002 by Eric Moore under same license. - * Additional Copyright (c) 2002 LSI Logic Corporation + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * * * $FreeBSD$ */ @@ -189,6 +211,7 @@ struct amr_softc #define AMR_IS_40LD(sc) ((sc)->amr_type & AMR_TYPE_40LD) int (* amr_submit_command)(struct amr_softc *sc); int (* amr_get_work)(struct amr_softc *sc, struct amr_mailbox *mbsave); + int support_ext_cdb; /* greater than 10 byte cdb support */ /* misc glue */ struct intr_config_hook amr_ich; /* wait-for-interrupts probe hook */