diff options
Diffstat (limited to 'sys/dev/mly')
-rw-r--r-- | sys/dev/mly/mly_cam.c | 513 | ||||
-rw-r--r-- | sys/dev/mly/mly_pci.c | 590 | ||||
-rw-r--r-- | sys/dev/mly/mly_tables.h | 335 | ||||
-rw-r--r-- | sys/dev/mly/mlyreg.h | 1270 | ||||
-rw-r--r-- | sys/dev/mly/mlyvar.h | 423 |
5 files changed, 0 insertions, 3131 deletions
diff --git a/sys/dev/mly/mly_cam.c b/sys/dev/mly/mly_cam.c deleted file mode 100644 index 9175b276616df..0000000000000 --- a/sys/dev/mly/mly_cam.c +++ /dev/null @@ -1,513 +0,0 @@ -/*- - * Copyright (c) 2000 Michael Smith - * Copyright (c) 2000 BSDi - * 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. - * - * 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$ - */ -/* - * CAM interface for FreeBSD - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/bus.h> -#include <sys/devicestat.h> - -#include <cam/cam.h> -#include <cam/cam_ccb.h> -#include <cam/cam_periph.h> -#include <cam/cam_sim.h> -#include <cam/cam_xpt_sim.h> -#include <cam/scsi/scsi_all.h> - -#include <machine/resource.h> -#include <machine/bus.h> - -#include <dev/mly/mlyreg.h> -#include <dev/mly/mlyvar.h> -#include <dev/mly/mly_tables.h> - -static void mly_cam_poll(struct cam_sim *sim); -static void mly_cam_action(struct cam_sim *sim, union ccb *ccb); -static void mly_cam_complete(struct mly_command *mc); -static struct cam_periph *mly_find_periph(struct mly_softc *sc, int bus, int target); - -/******************************************************************************** - * CAM-specific queue primitives - */ -static __inline void -mly_enqueue_ccb(struct mly_softc *sc, union ccb *ccb) -{ - int s; - - s = splcam(); - TAILQ_INSERT_TAIL(&sc->mly_cam_ccbq, &ccb->ccb_h, sim_links.tqe); - splx(s); -} - -static __inline void -mly_requeue_ccb(struct mly_softc *sc, union ccb *ccb) -{ - int s; - - s = splcam(); - TAILQ_INSERT_HEAD(&sc->mly_cam_ccbq, &ccb->ccb_h, sim_links.tqe); - splx(s); -} - -static __inline union ccb * -mly_dequeue_ccb(struct mly_softc *sc) -{ - union ccb *ccb; - int s; - - s = splcam(); - if ((ccb = (union ccb *)TAILQ_FIRST(&sc->mly_cam_ccbq)) != NULL) - TAILQ_REMOVE(&sc->mly_cam_ccbq, &ccb->ccb_h, sim_links.tqe); - splx(s); - return(ccb); -} - -/******************************************************************************** - * space-fill a character string - */ -static __inline void -padstr(char *targ, char *src, int len) -{ - while (len-- > 0) { - if (*src != 0) { - *targ++ = *src++; - } else { - *targ++ = ' '; - } - } -} - -/******************************************************************************** - * Attach the real and virtual SCSI busses to CAM - */ -int -mly_cam_attach(struct mly_softc *sc) -{ - struct cam_devq *devq; - int chn, nchn; - - debug_called(1); - - /* initialise the CCB queue */ - TAILQ_INIT(&sc->mly_cam_ccbq); - - /* - * Allocate a devq for all our channels combined. - */ - if ((devq = cam_simq_alloc(sc->mly_controllerinfo->maximum_parallel_commands)) == NULL) { - mly_printf(sc, "can't allocate CAM SIM\n"); - return(ENOMEM); - } - - /* - * Iterate over channels, registering them with CAM. - */ - nchn = sc->mly_controllerinfo->physical_channels_present + - sc->mly_controllerinfo->virtual_channels_present; - for (chn = 0; chn < nchn; chn++) { - - /* allocate a sim */ - if ((sc->mly_cam_sim[chn] = cam_sim_alloc(mly_cam_action, - mly_cam_poll, - "mly", - sc, - device_get_unit(sc->mly_dev), - 1, - sc->mly_controllerinfo->maximum_parallel_commands, - devq)) == NULL) { - cam_simq_free(devq); - mly_printf(sc, "CAM SIM attach failed\n"); - return(ENOMEM); - } - - /* register the bus ID so we can get it later */ - if (xpt_bus_register(sc->mly_cam_sim[chn], chn)) { - mly_printf(sc, "CAM XPT bus registration failed\n"); - return(ENXIO); - } - debug(1, "registered sim %p bus %d", sc->mly_cam_sim[chn], chn); - - } - - return(0); -} - -/******************************************************************************** - * Detach from CAM - */ -void -mly_cam_detach(struct mly_softc *sc) -{ - int chn, nchn, first; - - debug_called(1); - - nchn = sc->mly_controllerinfo->physical_channels_present + - sc->mly_controllerinfo->virtual_channels_present; - - /* - * Iterate over channels, deregistering as we go. - */ - nchn = sc->mly_controllerinfo->physical_channels_present + - sc->mly_controllerinfo->virtual_channels_present; - for (chn = 0, first = 1; chn < nchn; chn++) { - - /* - * If a sim was registered for this channel, free it. - */ - if (sc->mly_cam_sim[chn] != NULL) { - debug(1, "deregister bus %d", chn); - xpt_bus_deregister(cam_sim_path(sc->mly_cam_sim[chn])); - debug(1, "free sim for channel %d (%sfree queue)", chn, first ? "" : "don't "); - cam_sim_free(sc->mly_cam_sim[chn], first ? TRUE : FALSE); - first = 0; - } - } -} - -/******************************************************************************** - * Handle an action requested by CAM - */ -static void -mly_cam_action(struct cam_sim *sim, union ccb *ccb) -{ - struct mly_softc *sc = cam_sim_softc(sim); - - debug_called(2); - - switch (ccb->ccb_h.func_code) { - - /* perform SCSI I/O */ - case XPT_SCSI_IO: - { - struct ccb_scsiio *csio = &ccb->csio; - int bus, target; - - bus = cam_sim_bus(sim); - target = csio->ccb_h.target_id; - - debug(2, "XPT_SCSI_IO %d:%d:%d", bus, target, ccb->ccb_h.target_lun); - - /* check for I/O attempt to a protected device */ - if (sc->mly_btl[bus][target].mb_flags & MLY_BTL_PROTECTED) { - debug(2, " device protected"); - csio->ccb_h.status = CAM_REQ_CMP_ERR; - } - - /* check for I/O attempt to nonexistent device */ - if (!(sc->mly_btl[bus][target].mb_flags & (MLY_BTL_LOGICAL | MLY_BTL_PHYSICAL))) { - debug(2, " device does not exist"); - csio->ccb_h.status = CAM_REQ_CMP_ERR; - } - - /* XXX increase if/when we support large SCSI commands */ - if (csio->cdb_len > MLY_CMD_SCSI_SMALL_CDB) { - debug(2, " command too large (%d > %d)", csio->cdb_len, MLY_CMD_SCSI_SMALL_CDB); - csio->ccb_h.status = CAM_REQ_CMP_ERR; - } - - /* check that the CDB pointer is not to a physical address */ - if ((csio->ccb_h.flags & CAM_CDB_POINTER) && (csio->ccb_h.flags & CAM_CDB_PHYS)) { - debug(2, " CDB pointer is to physical address"); - csio->ccb_h.status = CAM_REQ_CMP_ERR; - } - - /* if there is data transfer, it must be to/from a virtual address */ - if ((csio->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) { - if (csio->ccb_h.flags & CAM_DATA_PHYS) { /* we can't map it */ - debug(2, " data pointer is to physical address"); - csio->ccb_h.status = CAM_REQ_CMP_ERR; - } - if (csio->ccb_h.flags & CAM_SCATTER_VALID) { /* we want to do the s/g setup */ - debug(2, " data has premature s/g setup"); - csio->ccb_h.status = CAM_REQ_CMP_ERR; - } - } - - /* abandon aborted ccbs or those that have failed validation */ - if ((csio->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_INPROG) { - debug(2, "abandoning CCB due to abort/validation failure"); - break; - } - - /* save the channel number in the ccb */ - csio->ccb_h.sim_priv.entries[0].field = bus; - - /* enqueue the ccb and start I/O */ - mly_enqueue_ccb(sc, ccb); - mly_startio(sc); - return; - } - - /* perform geometry calculations */ - case XPT_CALC_GEOMETRY: - { - struct ccb_calc_geometry *ccg = &ccb->ccg; - u_int32_t secs_per_cylinder; - - debug(2, "XPT_CALC_GEOMETRY %d:%d:%d", cam_sim_bus(sim), ccb->ccb_h.target_id, ccb->ccb_h.target_lun); - - if (sc->mly_controllerparam->bios_geometry == MLY_BIOSGEOM_8G) { - ccg->heads = 255; - ccg->secs_per_track = 63; - } else { /* MLY_BIOSGEOM_2G */ - ccg->heads = 128; - ccg->secs_per_track = 32; - } - secs_per_cylinder = ccg->heads * ccg->secs_per_track; - ccg->cylinders = ccg->volume_size / secs_per_cylinder; - ccb->ccb_h.status = CAM_REQ_CMP; - break; - } - - /* handle path attribute inquiry */ - case XPT_PATH_INQ: - { - struct ccb_pathinq *cpi = &ccb->cpi; - - debug(2, "XPT_PATH_INQ %d:%d:%d", cam_sim_bus(sim), ccb->ccb_h.target_id, ccb->ccb_h.target_lun); - - cpi->version_num = 1; - cpi->hba_inquiry = PI_TAG_ABLE; /* XXX extra flags for physical channels? */ - cpi->target_sprt = 0; - cpi->hba_misc = 0; - cpi->max_target = MLY_MAX_TARGETS - 1; - cpi->max_lun = MLY_MAX_LUNS - 1; - cpi->initiator_id = sc->mly_controllerparam->initiator_id; - strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); - strncpy(cpi->hba_vid, "BSDi", HBA_IDLEN); - strncpy(cpi->dev_name, cam_sim_name(sim), DEV_IDLEN); - cpi->unit_number = cam_sim_unit(sim); - cpi->bus_id = cam_sim_bus(sim); - cpi->base_transfer_speed = 132 * 1024; /* XXX what to set this to? */ - ccb->ccb_h.status = CAM_REQ_CMP; - break; - } - - default: /* we can't do this */ - debug(2, "unspported func_code = 0x%x", ccb->ccb_h.func_code); - ccb->ccb_h.status = CAM_REQ_INVALID; - break; - } - - xpt_done(ccb); -} - -/******************************************************************************** - * Check for possibly-completed commands. - */ -static void -mly_cam_poll(struct cam_sim *sim) -{ - struct mly_softc *sc = cam_sim_softc(sim); - - debug_called(2); - - mly_done(sc); -} - -/******************************************************************************** - * Pull a CCB off the work queue and turn it into a command. - */ -int -mly_cam_command(struct mly_softc *sc, struct mly_command **mcp) -{ - struct mly_command *mc; - struct mly_command_scsi_small *ss; - struct ccb_scsiio *csio; - int error; - - debug_called(2); - - error = 0; - mc = NULL; - csio = NULL; - - /* check for a CCB */ - if (!(csio = (struct ccb_scsiio *)mly_dequeue_ccb(sc))) - goto out; - - /* get a command to back it */ - if (mly_alloc_command(sc, &mc)) { - error = ENOMEM; - goto out; - } - - /* build the command */ - MLY_CMD_SETSTATE(mc, MLY_CMD_SETUP); - mc->mc_data = csio->data_ptr; - mc->mc_length = csio->dxfer_len; - mc->mc_complete = mly_cam_complete; - mc->mc_private = csio; - - /* build the packet for the controller */ - ss = &mc->mc_packet->scsi_small; - ss->opcode = MDACMD_SCSI; - if (csio->ccb_h.flags * CAM_DIS_DISCONNECT) - ss->command_control.disable_disconnect = 1; - if ((csio->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) - ss->command_control.data_direction = MLY_CCB_WRITE; - ss->data_size = csio->dxfer_len; - ss->addr.phys.lun = csio->ccb_h.target_lun; - ss->addr.phys.target = csio->ccb_h.target_id; - ss->addr.phys.channel = csio->ccb_h.sim_priv.entries[0].field; - if (csio->ccb_h.timeout < (60 * 1000)) { - ss->timeout.value = csio->ccb_h.timeout / 1000; - ss->timeout.scale = MLY_TIMEOUT_SECONDS; - } else if (csio->ccb_h.timeout < (60 * 60 * 1000)) { - ss->timeout.value = csio->ccb_h.timeout / (60 * 1000); - ss->timeout.scale = MLY_TIMEOUT_MINUTES; - } else { - ss->timeout.value = csio->ccb_h.timeout / (60 * 60 * 1000); /* overflow? */ - ss->timeout.scale = MLY_TIMEOUT_HOURS; - } - ss->maximum_sense_size = csio->sense_len; - ss->cdb_length = csio->cdb_len; - if (csio->ccb_h.flags & CAM_CDB_POINTER) { - bcopy(csio->cdb_io.cdb_ptr, ss->cdb, csio->cdb_len); - } else { - bcopy(csio->cdb_io.cdb_bytes, ss->cdb, csio->cdb_len); - } - -out: - if (error != 0) { - if (mc != NULL) { - mly_release_command(mc); - mc = NULL; - } - if (csio != NULL) - mly_requeue_ccb(sc, (union ccb *)csio); - } - *mcp = mc; - return(error); -} - -/******************************************************************************** - * Handle completion of a command - pass results back through the CCB - */ -static void -mly_cam_complete(struct mly_command *mc) -{ - struct mly_softc *sc = mc->mc_sc; - struct ccb_scsiio *csio = (struct ccb_scsiio *)mc->mc_private; - struct scsi_inquiry_data *inq = (struct scsi_inquiry_data *)csio->data_ptr; - struct mly_btl *btl; - u_int8_t cmd; - int bus, target; - - debug_called(2); - - csio->scsi_status = mc->mc_status; - switch(mc->mc_status) { - case SCSI_STATUS_OK: - /* - * In order to report logical device type and status, we overwrite - * the result of the INQUIRY command to logical devices. - */ - bus = csio->ccb_h.sim_priv.entries[0].field; - if (bus >= sc->mly_controllerinfo->physical_channels_present) { - if (csio->ccb_h.flags & CAM_CDB_POINTER) { - cmd = *csio->cdb_io.cdb_ptr; - } else { - cmd = csio->cdb_io.cdb_bytes[0]; - } - if (cmd == INQUIRY) { - target = csio->ccb_h.target_id; - btl = &sc->mly_btl[bus][target]; - padstr(inq->vendor, mly_describe_code(mly_table_device_type, btl->mb_type), 8); - padstr(inq->product, mly_describe_code(mly_table_device_state, btl->mb_state), 16); - padstr(inq->revision, "", 4); - } - } - - debug(2, "SCSI_STATUS_OK"); - csio->ccb_h.status = CAM_REQ_CMP; - break; - - case SCSI_STATUS_CHECK_COND: - debug(2, "SCSI_STATUS_CHECK_COND sense %d resid %d", mc->mc_sense, mc->mc_resid); - csio->ccb_h.status = CAM_SCSI_STATUS_ERROR; - bzero(&csio->sense_data, SSD_FULL_SIZE); - bcopy(mc->mc_packet, &csio->sense_data, mc->mc_sense); - csio->sense_len = mc->mc_sense; - csio->ccb_h.status |= CAM_AUTOSNS_VALID; - csio->resid = mc->mc_resid; /* XXX this is a signed value... */ - break; - - case SCSI_STATUS_BUSY: - debug(2, "SCSI_STATUS_BUSY"); - csio->ccb_h.status = CAM_SCSI_BUSY; - break; - - default: - debug(2, "unknown status 0x%x", csio->scsi_status); - csio->ccb_h.status = CAM_REQ_CMP_ERR; - break; - } - xpt_done((union ccb *)csio); - mly_release_command(mc); -} - -/******************************************************************************** - * Find a peripheral attahed at (bus),(target) - */ -static struct cam_periph * -mly_find_periph(struct mly_softc *sc, int bus, int target) -{ - struct cam_periph *periph; - struct cam_path *path; - int status; - - status = xpt_create_path(&path, NULL, cam_sim_path(sc->mly_cam_sim[bus]), target, 0); - if (status == CAM_REQ_CMP) { - periph = cam_periph_find(path, NULL); - xpt_free_path(path); - } else { - periph = NULL; - } - return(periph); -} - -/******************************************************************************** - * Name the device at (bus)(target) - */ -int -mly_name_device(struct mly_softc *sc, int bus, int target) -{ - struct cam_periph *periph; - - if ((periph = mly_find_periph(sc, bus, target)) != NULL) { - sprintf(sc->mly_btl[bus][target].mb_name, "%s%d", periph->periph_name, periph->unit_number); - return(0); - } - sc->mly_btl[bus][target].mb_name[0] = 0; - return(ENOENT); -} diff --git a/sys/dev/mly/mly_pci.c b/sys/dev/mly/mly_pci.c deleted file mode 100644 index c0dbd457ed887..0000000000000 --- a/sys/dev/mly/mly_pci.c +++ /dev/null @@ -1,590 +0,0 @@ -/*- - * Copyright (c) 2000 Michael Smith - * Copyright (c) 2000 BSDi - * 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. - * - * 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$ - */ - -#include <sys/param.h> -#include <sys/systm.h> -#include <sys/malloc.h> -#include <sys/kernel.h> - -#include <sys/bus.h> -#include <sys/conf.h> -#include <sys/devicestat.h> -#include <sys/disk.h> - -#include <machine/bus_memio.h> -#include <machine/bus.h> -#include <machine/resource.h> -#include <sys/rman.h> - -#include <pci/pcireg.h> -#include <pci/pcivar.h> - -#include <dev/mly/mlyreg.h> -#include <dev/mly/mlyvar.h> - -static int mly_pci_probe(device_t dev); -static int mly_pci_attach(device_t dev); -static int mly_pci_detach(device_t dev); -static int mly_pci_shutdown(device_t dev); -static int mly_pci_suspend(device_t dev); -static int mly_pci_resume(device_t dev); -static void mly_pci_intr(void *arg); - -static int mly_sg_map(struct mly_softc *sc); -static void mly_sg_map_helper(void *arg, bus_dma_segment_t *segs, int nseg, int error); -static int mly_mmbox_map(struct mly_softc *sc); -static void mly_mmbox_map_helper(void *arg, bus_dma_segment_t *segs, int nseg, int error); -static void mly_free_command_cluster(struct mly_command_cluster *mcc); - -static device_method_t mly_methods[] = { - /* Device interface */ - DEVMETHOD(device_probe, mly_pci_probe), - DEVMETHOD(device_attach, mly_pci_attach), - DEVMETHOD(device_detach, mly_pci_detach), - DEVMETHOD(device_shutdown, mly_pci_shutdown), - DEVMETHOD(device_suspend, mly_pci_suspend), - DEVMETHOD(device_resume, mly_pci_resume), - { 0, 0 } -}; - -static driver_t mly_pci_driver = { - "mly", - mly_methods, - sizeof(struct mly_softc) -}; - -static devclass_t mly_devclass; -DRIVER_MODULE(mly, pci, mly_pci_driver, mly_devclass, 0, 0); - -struct mly_ident -{ - u_int16_t vendor; - u_int16_t device; - u_int16_t subvendor; - u_int16_t subdevice; - int hwif; - char *desc; -} mly_identifiers[] = { - {0x1069, 0xba56, 0x1069, 0x0040, MLY_HWIF_STRONGARM, "Mylex eXtremeRAID 2000"}, - {0x1069, 0xba56, 0x1069, 0x0030, MLY_HWIF_STRONGARM, "Mylex eXtremeRAID 3000"}, - {0x1069, 0x0050, 0x1069, 0x0050, MLY_HWIF_I960RX, "Mylex AcceleRAID 352"}, - {0x1069, 0x0050, 0x1069, 0x0052, MLY_HWIF_I960RX, "Mylex AcceleRAID 170"}, - {0x1069, 0x0050, 0x1069, 0x0054, MLY_HWIF_I960RX, "Mylex AcceleRAID 160"}, - {0, 0, 0, 0, 0, 0} -}; - -/******************************************************************************** - ******************************************************************************** - Bus Interface - ******************************************************************************** - ********************************************************************************/ - -static int -mly_pci_probe(device_t dev) -{ - struct mly_ident *m; - - debug_called(1); - - for (m = mly_identifiers; m->vendor != 0; m++) { - if ((m->vendor == pci_get_vendor(dev)) && - (m->device == pci_get_device(dev)) && - ((m->subvendor == 0) || ((m->subvendor == pci_get_subvendor(dev)) && - (m->subdevice == pci_get_subdevice(dev))))) { - - device_set_desc(dev, m->desc); - return(-10); /* allow room to be overridden */ - } - } - return(ENXIO); -} - -static int -mly_pci_attach(device_t dev) -{ - struct mly_softc *sc; - int i, error; - u_int32_t command; - - debug_called(1); - - /* - * Initialise softc. - */ - sc = device_get_softc(dev); - bzero(sc, sizeof(*sc)); - sc->mly_dev = dev; - -#ifdef MLY_DEBUG - if (device_get_unit(sc->mly_dev) == 0) - mly_softc0 = sc; -#endif - - /* assume failure is 'not configured' */ - error = ENXIO; - - /* - * Verify that the adapter is correctly set up in PCI space. - */ - command = pci_read_config(sc->mly_dev, PCIR_COMMAND, 2); - command |= PCIM_CMD_BUSMASTEREN; - pci_write_config(dev, PCIR_COMMAND, command, 2); - command = pci_read_config(sc->mly_dev, PCIR_COMMAND, 2); - if (!(command & PCIM_CMD_BUSMASTEREN)) { - mly_printf(sc, "can't enable busmaster feature\n"); - goto fail; - } - if ((command & PCIM_CMD_MEMEN) == 0) { - mly_printf(sc, "memory window not available\n"); - goto fail; - } - - /* - * Allocate the PCI register window. - */ - sc->mly_regs_rid = PCIR_MAPS; /* first base address register */ - if ((sc->mly_regs_resource = bus_alloc_resource(sc->mly_dev, SYS_RES_MEMORY, &sc->mly_regs_rid, - 0, ~0, 1, RF_ACTIVE)) == NULL) { - mly_printf(sc, "can't allocate register window\n"); - goto fail; - } - sc->mly_btag = rman_get_bustag(sc->mly_regs_resource); - sc->mly_bhandle = rman_get_bushandle(sc->mly_regs_resource); - - /* - * Allocate and connect our interrupt. - */ - sc->mly_irq_rid = 0; - if ((sc->mly_irq = bus_alloc_resource(sc->mly_dev, SYS_RES_IRQ, &sc->mly_irq_rid, - 0, ~0, 1, RF_SHAREABLE | RF_ACTIVE)) == NULL) { - mly_printf(sc, "can't allocate interrupt\n"); - goto fail; - } - if (bus_setup_intr(sc->mly_dev, sc->mly_irq, INTR_TYPE_CAM, mly_pci_intr, sc, &sc->mly_intr)) { - mly_printf(sc, "can't set up interrupt\n"); - goto fail; - } - - /* assume failure is 'out of memory' */ - error = ENOMEM; - - /* - * Allocate the parent bus DMA tag appropriate for our PCI interface. - * - * Note that all of these controllers are 64-bit capable. - */ - if (bus_dma_tag_create(NULL, /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - MAXBSIZE, MLY_MAXSGENTRIES, /* maxsize, nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - BUS_DMA_ALLOCNOW, /* flags */ - &sc->mly_parent_dmat)) { - mly_printf(sc, "can't allocate parent DMA tag\n"); - goto fail; - } - - /* - * Create DMA tag for mapping buffers into controller-addressable space. - */ - if (bus_dma_tag_create(sc->mly_parent_dmat, /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - MAXBSIZE, MLY_MAXSGENTRIES, /* maxsize, nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - &sc->mly_buffer_dmat)) { - mly_printf(sc, "can't allocate buffer DMA tag\n"); - goto fail; - } - - /* - * Initialise the DMA tag for command packets. - */ - if (bus_dma_tag_create(sc->mly_parent_dmat, /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - sizeof(union mly_command_packet) * MLY_CMD_CLUSTERCOUNT, 1, /* maxsize, nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - &sc->mly_packet_dmat)) { - mly_printf(sc, "can't allocate command packet DMA tag\n"); - goto fail; - } - - /* - * Detect the hardware interface version - */ - for (i = 0; mly_identifiers[i].vendor != 0; i++) { - if ((mly_identifiers[i].vendor == pci_get_vendor(dev)) && - (mly_identifiers[i].device == pci_get_device(dev))) { - sc->mly_hwif = mly_identifiers[i].hwif; - switch(sc->mly_hwif) { - case MLY_HWIF_I960RX: - debug(2, "set hardware up for i960RX"); - sc->mly_doorbell_true = 0x00; - sc->mly_command_mailbox = MLY_I960RX_COMMAND_MAILBOX; - sc->mly_status_mailbox = MLY_I960RX_STATUS_MAILBOX; - sc->mly_idbr = MLY_I960RX_IDBR; - sc->mly_odbr = MLY_I960RX_ODBR; - sc->mly_error_status = MLY_I960RX_ERROR_STATUS; - sc->mly_interrupt_status = MLY_I960RX_INTERRUPT_STATUS; - sc->mly_interrupt_mask = MLY_I960RX_INTERRUPT_MASK; - break; - case MLY_HWIF_STRONGARM: - debug(2, "set hardware up for StrongARM"); - sc->mly_doorbell_true = 0xff; /* doorbell 'true' is 0 */ - sc->mly_command_mailbox = MLY_STRONGARM_COMMAND_MAILBOX; - sc->mly_status_mailbox = MLY_STRONGARM_STATUS_MAILBOX; - sc->mly_idbr = MLY_STRONGARM_IDBR; - sc->mly_odbr = MLY_STRONGARM_ODBR; - sc->mly_error_status = MLY_STRONGARM_ERROR_STATUS; - sc->mly_interrupt_status = MLY_STRONGARM_INTERRUPT_STATUS; - sc->mly_interrupt_mask = MLY_STRONGARM_INTERRUPT_MASK; - break; - } - break; - } - } - - /* - * Create the scatter/gather mappings. - */ - if ((error = mly_sg_map(sc))) - goto fail; - - /* - * Allocate and map the memory mailbox - */ - if ((error = mly_mmbox_map(sc))) - goto fail; - - /* - * Do bus-independent initialisation. - */ - if ((error = mly_attach(sc))) - goto fail; - - return(0); - -fail: - mly_free(sc); - return(error); -} - -/******************************************************************************** - * Disconnect from the controller completely, in preparation for unload. - */ -static int -mly_pci_detach(device_t dev) -{ - struct mly_softc *sc = device_get_softc(dev); - int error; - - debug_called(1); - - if (sc->mly_state & MLY_STATE_OPEN) - return(EBUSY); - - if ((error = mly_pci_shutdown(dev))) - return(error); - - mly_free(sc); - - return(0); -} - -/******************************************************************************** - * Bring the controller down to a dormant state and detach all child devices. - * - * This function is called before detach or system shutdown. - * - * Note that we can assume that the camq on the controller is empty, as we won't - * allow shutdown if any device is open. - */ -static int -mly_pci_shutdown(device_t dev) -{ - struct mly_softc *sc = device_get_softc(dev); - - debug_called(1); - - mly_detach(sc); - return(0); -} - -/******************************************************************************** - * Bring the controller to a quiescent state, ready for system suspend. - * - * We can't assume that the controller is not active at this point, so we need - * to mask interrupts. - */ -static int -mly_pci_suspend(device_t dev) -{ - struct mly_softc *sc = device_get_softc(dev); - int s; - - debug_called(1); - s = splcam(); - mly_detach(sc); - splx(s); - return(0); -} - -/******************************************************************************** - * Bring the controller back to a state ready for operation. - */ -static int -mly_pci_resume(device_t dev) -{ - struct mly_softc *sc = device_get_softc(dev); - - debug_called(1); - sc->mly_state &= ~MLY_STATE_SUSPEND; - MLY_UNMASK_INTERRUPTS(sc); - return(0); -} - -/******************************************************************************* - * Take an interrupt, or be poked by other code to look for interrupt-worthy - * status. - */ -static void -mly_pci_intr(void *arg) -{ - struct mly_softc *sc = (struct mly_softc *)arg; - - debug_called(3); - - /* collect finished commands, queue anything waiting */ - mly_done(sc); -}; - -/******************************************************************************** - ******************************************************************************** - Bus-dependant Resource Management - ******************************************************************************** - ********************************************************************************/ - -/******************************************************************************** - * Allocate memory for the scatter/gather tables - */ -static int -mly_sg_map(struct mly_softc *sc) -{ - size_t segsize; - - debug_called(1); - - /* - * Create a single tag describing a region large enough to hold all of - * the s/g lists we will need. - */ - segsize = sizeof(struct mly_sg_entry) * MLY_MAXCOMMANDS * MLY_MAXSGENTRIES; - if (bus_dma_tag_create(sc->mly_parent_dmat, /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - segsize, 1, /* maxsize, nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - &sc->mly_sg_dmat)) { - mly_printf(sc, "can't allocate scatter/gather DMA tag\n"); - return(ENOMEM); - } - - /* - * Allocate enough s/g maps for all commands and permanently map them into - * controller-visible space. - * - * XXX this assumes we can get enough space for all the s/g maps in one - * contiguous slab. - */ - if (bus_dmamem_alloc(sc->mly_sg_dmat, (void **)&sc->mly_sg_table, BUS_DMA_NOWAIT, &sc->mly_sg_dmamap)) { - mly_printf(sc, "can't allocate s/g table\n"); - return(ENOMEM); - } - bus_dmamap_load(sc->mly_sg_dmat, sc->mly_sg_dmamap, sc->mly_sg_table, segsize, mly_sg_map_helper, sc, 0); - return(0); -} - -/******************************************************************************** - * Save the physical address of the base of the s/g table. - */ -static void -mly_sg_map_helper(void *arg, bus_dma_segment_t *segs, int nseg, int error) -{ - struct mly_softc *sc = (struct mly_softc *)arg; - - debug_called(2); - - /* save base of s/g table's address in bus space */ - sc->mly_sg_busaddr = segs->ds_addr; -} - -/******************************************************************************** - * Allocate memory for the memory-mailbox interface - */ -static int -mly_mmbox_map(struct mly_softc *sc) -{ - - /* - * Create a DMA tag for a single contiguous region large enough for the - * memory mailbox structure. - */ - if (bus_dma_tag_create(sc->mly_parent_dmat, /* parent */ - 1, 0, /* alignment, boundary */ - BUS_SPACE_MAXADDR, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - sizeof(struct mly_mmbox), 1, /* maxsize, nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - &sc->mly_mmbox_dmat)) { - mly_printf(sc, "can't allocate memory mailbox DMA tag\n"); - return(ENOMEM); - } - - /* - * Allocate the buffer - */ - if (bus_dmamem_alloc(sc->mly_mmbox_dmat, (void **)&sc->mly_mmbox, BUS_DMA_NOWAIT, &sc->mly_mmbox_dmamap)) { - mly_printf(sc, "can't allocate memory mailbox\n"); - return(ENOMEM); - } - bus_dmamap_load(sc->mly_mmbox_dmat, sc->mly_mmbox_dmamap, sc->mly_mmbox, sizeof(struct mly_mmbox), - mly_mmbox_map_helper, sc, 0); - bzero(sc->mly_mmbox, sizeof(*sc->mly_mmbox)); - return(0); - -} - -/******************************************************************************** - * Save the physical address of the memory mailbox - */ -static void -mly_mmbox_map_helper(void *arg, bus_dma_segment_t *segs, int nseg, int error) -{ - struct mly_softc *sc = (struct mly_softc *)arg; - - debug_called(2); - - sc->mly_mmbox_busaddr = segs->ds_addr; -} - -/******************************************************************************** - * Free all of the resources associated with (sc) - * - * Should not be called if the controller is active. - */ -void -mly_free(struct mly_softc *sc) -{ - struct mly_command_cluster *mcc; - - debug_called(1); - - /* detach from CAM */ - mly_cam_detach(sc); - - /* throw away any command buffers */ - while ((mcc = mly_dequeue_cluster(sc)) != NULL) - mly_free_command_cluster(mcc); - - /* throw away the controllerinfo structure */ - if (sc->mly_controllerinfo != NULL) - free(sc->mly_controllerinfo, M_DEVBUF); - - /* throw away the controllerparam structure */ - if (sc->mly_controllerparam != NULL) - free(sc->mly_controllerparam, M_DEVBUF); - - /* destroy data-transfer DMA tag */ - if (sc->mly_buffer_dmat) - bus_dma_tag_destroy(sc->mly_buffer_dmat); - - /* free and destroy DMA memory and tag for s/g lists */ - if (sc->mly_sg_table) { - bus_dmamap_unload(sc->mly_sg_dmat, sc->mly_sg_dmamap); - bus_dmamem_free(sc->mly_sg_dmat, sc->mly_sg_table, sc->mly_sg_dmamap); - } - if (sc->mly_sg_dmat) - bus_dma_tag_destroy(sc->mly_sg_dmat); - - /* free and destroy DMA memory and tag for memory mailbox */ - if (sc->mly_mmbox) { - bus_dmamap_unload(sc->mly_mmbox_dmat, sc->mly_mmbox_dmamap); - bus_dmamem_free(sc->mly_mmbox_dmat, sc->mly_mmbox, sc->mly_mmbox_dmamap); - } - if (sc->mly_mmbox_dmat) - bus_dma_tag_destroy(sc->mly_mmbox_dmat); - - /* disconnect the interrupt handler */ - if (sc->mly_intr) - bus_teardown_intr(sc->mly_dev, sc->mly_irq, sc->mly_intr); - if (sc->mly_irq != NULL) - bus_release_resource(sc->mly_dev, SYS_RES_IRQ, sc->mly_irq_rid, sc->mly_irq); - - /* destroy the parent DMA tag */ - if (sc->mly_parent_dmat) - bus_dma_tag_destroy(sc->mly_parent_dmat); - - /* release the register window mapping */ - if (sc->mly_regs_resource != NULL) - bus_release_resource(sc->mly_dev, SYS_RES_MEMORY, sc->mly_regs_rid, sc->mly_regs_resource); -} - -/******************************************************************************** - * Free a command cluster. - */ -static void -mly_free_command_cluster(struct mly_command_cluster *mcc) -{ - struct mly_softc *sc = mcc->mcc_command[0].mc_sc; - int i; - - debug_called(1); - - for (i = 0; i < MLY_CMD_CLUSTERCOUNT; i++) - bus_dmamap_destroy(sc->mly_buffer_dmat, mcc->mcc_command[i].mc_datamap); - - bus_dmamap_unload(sc->mly_packet_dmat, mcc->mcc_packetmap); - bus_dmamem_free(sc->mly_packet_dmat, mcc->mcc_packet, mcc->mcc_packetmap); - free(mcc, M_DEVBUF); -} - diff --git a/sys/dev/mly/mly_tables.h b/sys/dev/mly/mly_tables.h deleted file mode 100644 index 5a83f1767353e..0000000000000 --- a/sys/dev/mly/mly_tables.h +++ /dev/null @@ -1,335 +0,0 @@ -/*- - * Copyright (c) 2000 Michael Smith - * Copyright (c) 2000 BSDi - * 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. - * - * 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$ - */ - -/* - * Lookup table for code-to-text translations. - */ -struct mly_code_lookup { - char *string; - u_int32_t code; -}; - -extern char *mly_describe_code(struct mly_code_lookup *table, u_int32_t code); - -#ifndef MLY_DEFINE_TABLES -extern struct mly_code_lookup mly_table_bustype[]; -extern struct mly_code_lookup mly_table_controllertype[]; -extern struct mly_code_lookup mly_table_oemname[]; -extern struct mly_code_lookup mly_table_memorytype[]; -extern struct mly_code_lookup mly_table_cputype[]; -extern struct mly_code_lookup mly_table_event[]; -extern struct mly_code_lookup mly_table_device_state[]; -extern struct mly_code_lookup mly_table_device_type[]; -extern struct mly_code_lookup mly_table_stripe_size[]; -extern struct mly_code_lookup mly_table_cacheline_size[]; - -#else /* MLY_DEFINE_TABLES */ - -/******************************************************************************** - * Look up a text description of a numeric code and return a pointer to same. - */ -char * -mly_describe_code(struct mly_code_lookup *table, u_int32_t code) -{ - int i; - - for (i = 0; table[i].string != NULL; i++) - if (table[i].code == code) - return(table[i].string); - return(table[i+1].string); -} - -struct mly_code_lookup mly_table_bustype[] = { - {"SCSI", 0x00}, - {"FC-AL", 0x01}, - {"PCI", 0x03}, - {NULL, 0}, - {"unknown bus", 0} -}; - -struct mly_code_lookup mly_table_controllertype[] = { -#if 0 /* not supported by this driver */ - {"DAC960E", 0x01}, /* EISA */ - {"DAC960M", 0x08}, /* MCA */ - {"DAC960PD", 0x10}, /* PCI Dual */ - {"DAC960PL", 0x11}, /* PCU low-cost */ - {"DAC960PDU", 0x12}, /* PD Ultra */ - {"DAC960PE", 0x13}, /* Peregrine low-cost */ - {"DAC960PG", 0x14}, /* Peregrine high-performance */ - {"DAC960PJ", 0x15}, /* Road Runner */ - {"DAC960PTL0", 0x16}, /* Jaguar */ - {"DAC960PR", 0x17}, /* Road Runner (again?) */ - {"DAC960PRL", 0x18}, /* Tomcat */ - {"DAC960PT", 0x19}, /* Road Runner (yet again?) */ - {"DAC1164P", 0x1a}, /* Little Apple */ - {"DAC960PTL1", 0x1b}, /* Jaguar+ */ -#endif - {"EXR2000P", 0x1c}, /* Big Apple */ - {"EXR3000P", 0x1d}, /* Fibre Apple */ - {"AcceleRAID 352", 0x1e}, /* Leopard */ - {"AcceleRAID 170", 0x1f}, /* Lynx */ - {"AcceleRAID 160", 0x20}, /* Bobcat */ - {NULL, 0}, - {"unknown adapter", 0} -}; - -struct mly_code_lookup mly_table_oemname[] = { - {"Mylex", MLY_OEM_MYLEX}, - {"IBM", MLY_OEM_IBM}, - {"Hewlett-Packard", MLY_OEM_HP}, - {"DEC/Compaq", MLY_OEM_DEC}, - {"Siemens", MLY_OEM_SIEMENS}, - {"Intel", MLY_OEM_INTEL}, - {NULL, 0}, - {"unknown OEM", 0} -}; - -struct mly_code_lookup mly_table_memorytype[] = { - {"DRAM", 0x01}, - {"EDRAM", 0x02}, - {"EDO RAM", 0x03}, - {"SDRAM", 0x04}, - {NULL, 0}, - {"unknown memory", 0} -}; - -struct mly_code_lookup mly_table_cputype[] = { - {"i960CA", 0x01}, - {"i960RD", 0x02}, - {"i960RN", 0x03}, - {"i960RP", 0x04}, - {"NorthBay(?)", 0x05}, - {"StrongArm", 0x06}, - {"i960RM", 0x07}, - {NULL, 0}, - {"unknown CPU", 0} -}; - -/* - * This table is directly derived from the corresponding table in the - * Linux driver, and uses a derivative encoding for simplicity's sake. - * - * The first character of the string determines the format of the message. - * - * p "physical device <channel>:<target> <text>" (physical device status) - * s "physical device <channel>:<target> <text>" (scsi message or error) - * " sense key <key> asc <asc> ascq <ascq>" - * " info <info> csi <csi>" - * l "logical drive <unit>: <text>" (logical device status) - * m "logical drive <unit>: <text>" (logical device message) - * - * Messages which are typically suppressed have the first character capitalised. - * These messages will only be printed if bootverbose is set. - * - * The second character in the string indicates an action to be taken as a - * result of the event. - * - * r rescan the device for possible state change - * - */ -struct mly_code_lookup mly_table_event[] = { - /* physical device events (0x0000 - 0x007f) */ - {"pr online", 0x0001}, - {"pr standby", 0x0002}, - {"p automatic rebuild started", 0x0005}, - {"p manual rebuild started", 0x0006}, - {"pr rebuild completed", 0x0007}, - {"pr rebuild cancelled", 0x0008}, - {"pr rebuild failed for unknown reasons", 0x0009}, - {"pr rebuild failed due to new physical device", 0x000a}, - {"pr rebuild failed due to logical drive failure", 0x000b}, - {"sr offline", 0x000c}, - {"pr found", 0x000d}, - {"pr gone", 0x000e}, - {"p unconfigured", 0x000f}, - {"p expand capacity started", 0x0010}, - {"pr expand capacity completed", 0x0011}, - {"pr expand capacity failed", 0x0012}, - {"p parity error", 0x0016}, - {"p soft error", 0x0017}, - {"p miscellaneous error", 0x0018}, - {"p reset", 0x0019}, - {"p active spare found", 0x001a}, - {"p warm spare found", 0x001b}, - {"s sense data received", 0x001c}, - {"p initialization started", 0x001d}, - {"pr initialization completed", 0x001e}, - {"pr initialization failed", 0x001f}, - {"pr initialization cancelled", 0x0020}, - {"P write recovery failed", 0x0021}, - {"p scsi bus reset failed", 0x0022}, - {"p double check condition", 0x0023}, - {"p device cannot be accessed", 0x0024}, - {"p gross error on scsi processor", 0x0025}, - {"p bad tag from device", 0x0026}, - {"p command timeout", 0x0027}, - {"pr system reset", 0x0028}, - {"p busy status or parity error", 0x0029}, - {"pr host set device to failed state", 0x002a}, - {"pr selection timeout", 0x002b}, - {"p scsi bus phase error", 0x002c}, - {"pr device returned unknown status", 0x002d}, - {"pr device not ready", 0x002e}, - {"p device not found at startup", 0x002f}, - {"p COD write operation failed", 0x0030}, - {"p BDT write operation failed", 0x0031}, - {"p missing at startup", 0x0039}, - {"p start rebuild failed due to physical drive too small", 0x003a}, - /* logical device events (0x0080 - 0x00ff) */ - {"m consistency check started", 0x0080}, - {"mr consistency check completed", 0x0081}, - {"mr consistency check cancelled", 0x0082}, - {"mr consistency check completed with errors", 0x0083}, - {"mr consistency check failed due to logical drive failure", 0x0084}, - {"mr consistency check failed due to physical device failure", 0x0085}, - {"lr offline", 0x0086}, - {"lr critical", 0x0087}, - {"lr online", 0x0088}, - {"m automatic rebuild started", 0x0089}, - {"m manual rebuild started", 0x008a}, - {"mr rebuild completed", 0x008b}, - {"mr rebuild cancelled", 0x008c}, - {"mr rebuild failed for unknown reasons", 0x008d}, - {"mr rebuild failed due to new physical device", 0x008e}, - {"mr rebuild failed due to logical drive failure", 0x008f}, - {"l initialization started", 0x0090}, - {"lr initialization completed", 0x0091}, - {"lr initialization cancelled", 0x0092}, - {"lr initialization failed", 0x0093}, - {"lr found", 0x0094}, - {"lr gone", 0x0095}, - {"l expand capacity started", 0x0096}, - {"lr expand capacity completed", 0x0097}, - {"lr expand capacity failed", 0x0098}, - {"l bad block found", 0x0099}, - {"lr size changed", 0x009a}, - {"lr type changed", 0x009b}, - {"l bad data block found", 0x009c}, - {"l read of data block in bdt", 0x009e}, - {"l write back data for disk block lost", 0x009f}, - /* enclosure management events (0x0100 - 0x017f) */ - {"e enclosure %d fan %d failed", 0x0140}, - {"e enclosure %d fan %d ok", 0x0141}, - {"e enclosure %d fan %d not present", 0x0142}, - {"e enclosure %d power supply %d failed", 0x0143}, - {"e enclosure %d power supply %d ok", 0x0144}, - {"e enclosure %d power supply %d not present", 0x0145}, - {"e enclosure %d temperature sensor %d failed", 0x0146}, - {"e enclosure %d temperature sensor %d critical", 0x0147}, - {"e enclosure %d temperature sensor %d ok", 0x0148}, - {"e enclosure %d temperature sensor %d not present", 0x0149}, - {"e enclosure %d unit %d access critical", 0x014a}, - {"e enclosure %d unit %d access ok", 0x014b}, - {"e enclosure %d unit %d access offline", 0x014c}, - /* controller events (0x0180 - 0x01ff) */ - {"c cache write back error", 0x0181}, - {"c battery backup unit found", 0x0188}, - {"c battery backup unit charge level low", 0x0189}, - {"c battery backup unit charge level ok", 0x018a}, - {"c installation aborted", 0x0193}, - {"c mirror race recovery in progress", 0x0195}, - {"c mirror race on critical drive", 0x0196}, - {"c memory soft ecc error", 0x019e}, - {"c memory hard ecc error", 0x019f}, - {"c battery backup unit failed", 0x01a2}, - {NULL, 0}, - {"? unknown event code", 0} -}; - -/* - * Values here must be 16 characters or less, as they are packed into - * the 'product' field in the SCSI inquiry data. - */ -struct mly_code_lookup mly_table_device_state[] = { - {"offline", MLY_DEVICE_STATE_OFFLINE}, - {"unconfigured", MLY_DEVICE_STATE_UNCONFIGURED}, - {"online", MLY_DEVICE_STATE_ONLINE}, - {"critical", MLY_DEVICE_STATE_CRITICAL}, - {"writeonly", MLY_DEVICE_STATE_WRITEONLY}, - {"standby", MLY_DEVICE_STATE_STANDBY}, - {"missing", MLY_DEVICE_STATE_MISSING}, - {NULL, 0}, - {"unknown state", 0} -}; - -/* - * Values here must be 8 characters or less, as they are packed into - * the 'vendor' field in the SCSI inquiry data. - */ -struct mly_code_lookup mly_table_device_type[] = { - {"RAID 0", MLY_DEVICE_TYPE_RAID0}, - {"RAID 1", MLY_DEVICE_TYPE_RAID1}, - {"RAID 3", MLY_DEVICE_TYPE_RAID3}, /* right asymmetric parity */ - {"RAID 5", MLY_DEVICE_TYPE_RAID5}, /* right asymmetric parity */ - {"RAID 6", MLY_DEVICE_TYPE_RAID6}, /* Mylex RAID 6 */ - {"RAID 7", MLY_DEVICE_TYPE_RAID7}, /* JBOD */ - {"SPAN", MLY_DEVICE_TYPE_NEWSPAN}, /* New Mylex SPAN */ - {"RAID 3", MLY_DEVICE_TYPE_RAID3F}, /* fixed parity */ - {"RAID 3", MLY_DEVICE_TYPE_RAID3L}, /* left symmetric parity */ - {"SPAN", MLY_DEVICE_TYPE_SPAN}, /* current spanning implementation */ - {"RAID 5", MLY_DEVICE_TYPE_RAID5L}, /* left symmetric parity */ - {"RAID E", MLY_DEVICE_TYPE_RAIDE}, /* concatenation */ - {"PHYSICAL", MLY_DEVICE_TYPE_PHYSICAL}, /* physical device */ - {NULL, 0}, - {"UNKNOWN", 0} -}; - -struct mly_code_lookup mly_table_stripe_size[] = { - {"NONE", MLY_STRIPE_ZERO}, - {"512B", MLY_STRIPE_512b}, - {"1k", MLY_STRIPE_1k}, - {"2k", MLY_STRIPE_2k}, - {"4k", MLY_STRIPE_4k}, - {"8k", MLY_STRIPE_8k}, - {"16k", MLY_STRIPE_16k}, - {"32k", MLY_STRIPE_32k}, - {"64k", MLY_STRIPE_64k}, - {"128k", MLY_STRIPE_128k}, - {"256k", MLY_STRIPE_256k}, - {"512k", MLY_STRIPE_512k}, - {"1M", MLY_STRIPE_1m}, - {NULL, 0}, - {"unknown", 0} -}; - -struct mly_code_lookup mly_table_cacheline_size[] = { - {"NONE", MLY_CACHELINE_ZERO}, - {"512B", MLY_CACHELINE_512b}, - {"1k", MLY_CACHELINE_1k}, - {"2k", MLY_CACHELINE_2k}, - {"4k", MLY_CACHELINE_4k}, - {"8k", MLY_CACHELINE_8k}, - {"16k", MLY_CACHELINE_16k}, - {"32k", MLY_CACHELINE_32k}, - {"64k", MLY_CACHELINE_64k}, - {NULL, 0}, - {"unknown", 0} -}; - -#endif /* MLY_DEFINE_TABLES */ diff --git a/sys/dev/mly/mlyreg.h b/sys/dev/mly/mlyreg.h deleted file mode 100644 index 2809eb58714cb..0000000000000 --- a/sys/dev/mly/mlyreg.h +++ /dev/null @@ -1,1270 +0,0 @@ -/*- - * Copyright (c) 2000 Michael Smith - * Copyright (c) 2000 BSDi - * 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. - * - * 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$ - */ - -/* - * Section numbers in this document refer to the Mylex "Firmware Software Interface" - * document ('FSI'), revision 0.11 04/11/00 unless otherwise qualified. - * - * Reference is made to the Mylex "Programming Guide for 6.x Controllers" document - * ('PG6'), document #771242 revision 0.02, 04/11/00 - * - * Note that fields marked N/A are not supported by the PCI controllers, but are - * defined here to hold place in datastructures that are shared with the SCSI - * controllers. Items not relevant to PCI controllers are not described here. - * - * Ordering of items in this file is a little odd due to the constraints of - * nested declarations. - */ - -/* - * 2.1 (Scatter Gather List Format) - */ -struct mly_sg_entry { - u_int64_t physaddr; - u_int64_t length; -} __attribute__ ((packed)); - -/* - * 5.2 System Device Access - * - * This is corroborated by the layout of the MDACIOCTL_GETCONTROLLERINFO data - * in 21.8 - */ -#define MLY_MAX_CHANNELS 6 -#define MLY_MAX_TARGETS 16 -#define MLY_MAX_LUNS 1 - -/* - * 8.1 Different Device States - */ -#define MLY_DEVICE_STATE_OFFLINE 0x08 /* DEAD/OFFLINE */ -#define MLY_DEVICE_STATE_UNCONFIGURED 0x00 -#define MLY_DEVICE_STATE_ONLINE 0x01 -#define MLY_DEVICE_STATE_CRITICAL 0x09 -#define MLY_DEVICE_STATE_WRITEONLY 0x03 -#define MLY_DEVICE_STATE_STANDBY 0x21 -#define MLY_DEVICE_STATE_MISSING 0x04 /* or-ed with (ONLINE or WRITEONLY or STANDBY) */ - -/* - * 8.2 Device Type Field definitions - */ -#define MLY_DEVICE_TYPE_RAID0 0x0 /* RAID 0 */ -#define MLY_DEVICE_TYPE_RAID1 0x1 /* RAID 1 */ -#define MLY_DEVICE_TYPE_RAID3 0x3 /* RAID 3 right asymmetric parity */ -#define MLY_DEVICE_TYPE_RAID5 0x5 /* RAID 5 right asymmetric parity */ -#define MLY_DEVICE_TYPE_RAID6 0x6 /* RAID 6 (Mylex RAID 6) */ -#define MLY_DEVICE_TYPE_RAID7 0x7 /* RAID 7 (JBOD) */ -#define MLY_DEVICE_TYPE_NEWSPAN 0x8 /* New Mylex SPAN */ -#define MLY_DEVICE_TYPE_RAID3F 0x9 /* RAID 3 fixed parity */ -#define MLY_DEVICE_TYPE_RAID3L 0xb /* RAID 3 left symmetric parity */ -#define MLY_DEVICE_TYPE_SPAN 0xc /* current spanning implementation */ -#define MLY_DEVICE_TYPE_RAID5L 0xd /* RAID 5 left symmetric parity */ -#define MLY_DEVICE_TYPE_RAIDE 0xe /* RAID E (concatenation) */ -#define MLY_DEVICE_TYPE_PHYSICAL 0xf /* physical device */ - -/* - * 8.3 Stripe Size - */ -#define MLY_STRIPE_ZERO 0x0 /* no stripe (RAID 1, RAID 7, etc) */ -#define MLY_STRIPE_512b 0x1 -#define MLY_STRIPE_1k 0x2 -#define MLY_STRIPE_2k 0x3 -#define MLY_STRIPE_4k 0x4 -#define MLY_STRIPE_8k 0x5 -#define MLY_STRIPE_16k 0x6 -#define MLY_STRIPE_32k 0x7 -#define MLY_STRIPE_64k 0x8 -#define MLY_STRIPE_128k 0x9 -#define MLY_STRIPE_256k 0xa -#define MLY_STRIPE_512k 0xb -#define MLY_STRIPE_1m 0xc - -/* - * 8.4 Cacheline Size - */ -#define MLY_CACHELINE_ZERO 0x0 /* caching cannot be enabled */ -#define MLY_CACHELINE_512b 0x1 -#define MLY_CACHELINE_1k 0x2 -#define MLY_CACHELINE_2k 0x3 -#define MLY_CACHELINE_4k 0x4 -#define MLY_CACHELINE_8k 0x5 -#define MLY_CACHELINE_16k 0x6 -#define MLY_CACHELINE_32k 0x7 -#define MLY_CACHELINE_64k 0x8 - -/* - * 8.5 Read/Write control - */ -#define MLY_RWCtl_INITTED (1<<7) /* if set, the logical device is initialised */ - /* write control */ -#define MLY_RWCtl_WCD (0) /* write cache disabled */ -#define MLY_RWCtl_WDISABLE (1<<3) /* writing disabled */ -#define MLY_RWCtl_WCE (2<<3) /* write cache enabled */ -#define MLY_RWCtl_IWCE (3<<3) /* intelligent write cache enabled */ - /* read control */ -#define MLY_RWCtl_RCD (0) /* read cache is disabled */ -#define MLY_RWCtl_RCE (1) /* read cache enabled */ -#define MLY_RWCtl_RAHEAD (2) /* readahead enabled */ -#define MLY_RWCtl_IRAHEAD (3) /* intelligent readahead enabled */ - -/* - * 9.0 LUN Map Format - */ -struct mly_lun_map { - u_int8_t res1:4; - u_int8_t host_port_mapped:1; /* this system drive visibile to host on this controller/port combination */ - u_int8_t tid_valid:1; /* target ID valid */ - u_int8_t hid_valid:1; /* host ID valid */ - u_int8_t lun_valid:1; /* LUN valid */ - u_int8_t res2; - u_int8_t lun; /* LUN */ - u_int8_t tid; /* TID */ - u_int8_t hid[32]; /* HID (one bit for each host) */ -} __attribute__ ((packed)); - -/* - * 10.1 Controller Parameters - */ -struct mly_param_controller { - u_int8_t rdahen:1; /* N/A */ - u_int8_t bilodly:1; /* N/A */ - u_int8_t fua_disable:1; - u_int8_t reass1s:1; /* N/A */ - u_int8_t truvrfy:1; /* N/A */ - u_int8_t dwtvrfy:1; /* N/A */ - u_int8_t background_initialisation:1; - u_int8_t clustering:1; /* N/A */ - - u_int8_t bios_disable:1; - u_int8_t boot_from_cdrom:1; - u_int8_t drive_coercion:1; - u_int8_t write_same_disable:1; - u_int8_t hba_mode:1; /* N/A */ - u_int8_t bios_geometry:2; -#define MLY_BIOSGEOM_2G 0x0 -#define MLY_BIOSGEOM_8G 0x1 - u_int8_t res1:1; /* N/A */ - - u_int8_t res2[2]; /* N/A */ - - u_int8_t v_dec:1; - u_int8_t safte:1; /* N/A */ - u_int8_t ses:1; /* N/A */ - u_int8_t res3:2; /* N/A */ - u_int8_t v_arm:1; - u_int8_t v_ofm:1; - u_int8_t res4:1; /* N/A */ - - u_int8_t rebuild_check_rate; - u_int8_t cache_line_size; /* see 8.4 */ - u_int8_t oem_code; -#define MLY_OEM_MYLEX 0x00 -#define MLY_OEM_IBM 0x08 -#define MLY_OEM_HP 0x0a -#define MLY_OEM_DEC 0x0c -#define MLY_OEM_SIEMENS 0x10 -#define MLY_OEM_INTEL 0x12 - u_int8_t spinup_mode; -#define MLY_SPIN_AUTO 0 -#define MLY_SPIN_PWRSPIN 1 -#define MLY_SPIN_WSSUSPIN 2 - u_int8_t spinup_devices; - u_int8_t spinup_interval; - u_int8_t spinup_wait_time; - - u_int8_t res5:3; /* N/A */ - u_int8_t vutursns:1; /* N/A */ - u_int8_t dccfil:1; /* N/A */ - u_int8_t nopause:1; /* N/A */ - u_int8_t disqfull:1; /* N/A */ - u_int8_t disbusy:1; /* N/A */ - - u_int8_t res6:2; /* N/A */ - u_int8_t failover_node_name; /* N/A */ - u_int8_t res7:1; /* N/A */ - u_int8_t ftopo:3; /* N/A */ - u_int8_t disable_ups:1; /* N/A */ - - u_int8_t res8:1; /* N/A */ - u_int8_t propagate_reset:1; /* N/A */ - u_int8_t nonstd_mp_reset:1; /* N/A */ - u_int8_t res9:5; /* N/A */ - - u_int8_t res10; /* N/A */ - u_int8_t serial_port_baud_rate; /* N/A */ - u_int8_t serial_port_control; /* N/A */ - u_int8_t change_stripe_ok_developer_flag_only; /* N/A */ - - u_int8_t small_large_host_transfers:2; /* N/A */ - u_int8_t frame_control:2; /* N/A */ - u_int8_t pci_latency_control:2; /* N/A */ - u_int8_t treat_lip_as_reset:1; /* N/A */ - u_int8_t res11:1; /* N/A */ - - u_int8_t ms_autorest:1; /* N/A */ - u_int8_t res12:7; /* N/A */ - - u_int8_t ms_aa_fsim:1; /* N/A */ - u_int8_t ms_aa_ccach:1; /* N/A */ - u_int8_t ms_aa_fault_signals:1; /* N/A */ - u_int8_t ms_aa_c4_faults:1; /* N/A */ - u_int8_t ms_aa_host_reset_delay_mask:4; /* N/A */ - - u_int8_t ms_flg_simplex_no_rstcom:1; /* N/A */ - u_int8_t res13:7; /* N/A */ - - u_int8_t res14; /* N/A */ - u_int8_t hardloopid[2][2]; /* N/A */ - u_int8_t ctrlname[2][16+1]; /* N/A */ - u_int8_t initiator_id; - u_int8_t startup_option; -#define MLY_STARTUP_IF_NO_CHANGE 0x0 -#define MLY_STARTUP_IF_NO_LUN_CHANGE 0x1 -#define MLY_STARTUP_IF_NO_LUN_OFFLINE 0x2 -#define MLY_STARTUP_IF_LUN0_NO_CHANGE 0x3 -#define MLY_STARTUP_IF_LUN0_NOT_OFFLINE 0x4 -#define MLY_STARTUP_ALWAYS 0x5 - - u_int8_t res15[62]; -} __attribute__ ((packed)); - -/* - * 10.2 Physical Device Parameters - */ -struct mly_param_physical_device { - u_int16_t tags; - u_int16_t speed; - u_int8_t width; - u_int8_t combing:1; - u_int8_t res1:7; - u_int8_t res2[3]; -} __attribute__ ((packed)); - -/* - * 10.3 Logical Device Parameters - */ -struct mly_param_logical_device { - u_int8_t type; /* see 8.2 */ - u_int8_t state; /* see 8.1 */ - u_int16_t raid_device; - u_int8_t res1; - u_int8_t bios_geometry; /* BIOS control word? */ - u_int8_t stripe_size; /* see 8.3 */ - u_int8_t read_write_control; /* see 8.5 */ - u_int8_t res2[8]; -} __attribute__ ((packed)); - -/* - * 12.3 Health Status Buffer - * - * Pad to 128 bytes. - */ -struct mly_health_status { - u_int32_t uptime_us; /* N/A */ - u_int32_t uptime_ms; /* N/A */ - u_int32_t realtime; /* N/A */ - u_int32_t res1; /* N/A */ - u_int32_t change_counter; - u_int32_t res2; /* N/A */ - u_int32_t debug_message_index; /* N/A */ - u_int32_t bios_message_index; /* N/A */ - u_int32_t trace_page; /* N/A */ - u_int32_t profiler_page; /* N/A */ - u_int32_t next_event; - u_int8_t res3[4 + 16 + 64]; /* N/A */ -} __attribute__ ((packed)); - -/* - * 14.2 Timeout Bit Format - */ -struct mly_timeout { - u_int8_t value:6; - u_int8_t scale:2; -#define MLY_TIMEOUT_SECONDS 0x0 -#define MLY_TIMEOUT_MINUTES 0x1 -#define MLY_TIMEOUT_HOURS 0x2 -} __attribute__ ((packed)); - -/* - * 14.3 Operation Device - */ -#define MLY_OPDEVICE_PHYSICAL_DEVICE 0x0 -#define MLY_OPDEVICE_RAID_DEVICE 0x1 -#define MLY_OPDEVICE_PHYSICAL_CHANNEL 0x2 -#define MLY_OPDEVICE_RAID_CHANNEL 0x3 -#define MLY_OPDEVICE_PHYSICAL_CONTROLLER 0x4 -#define MLY_OPDEVICE_RAID_CONTROLLER 0x5 -#define MLY_OPDEVICE_CONFIGURATION_GROUP 0x10 - -/* - * 14.4 Status Bit Format - * - * AKA Status Mailbox Format - * - * XXX format conflict between FSI and PG6 over the ordering of the - * status and sense length fields. - */ -struct mly_status { - u_int16_t command_id; - u_int8_t status; - u_int8_t sense_length; - int32_t residue; -} __attribute__ ((packed)); - -/* - * 14.5 Command Control Bit (CCB) format - * - * This byte is unfortunately named. - */ -struct mly_command_control { - u_int8_t force_unit_access:1; - u_int8_t disable_page_out:1; - u_int8_t res1:1; - u_int8_t extended_sg_table:1; - u_int8_t data_direction:1; -#define MLY_CCB_WRITE 1 -#define MLY_CCB_READ 0 - u_int8_t res2:1; - u_int8_t no_auto_sense:1; - u_int8_t disable_disconnect:1; -} __attribute__ ((packed)); - -/* - * 15.0 Commands - * - * We use the command names as given by Mylex - */ -#define MDACMD_MEMCOPY 0x1 /* memory to memory copy */ -#define MDACMD_SCSIPT 0x2 /* SCSI passthrough (small command) */ -#define MDACMD_SCSILCPT 0x3 /* SCSI passthrough (large command) */ -#define MDACMD_SCSI 0x4 /* SCSI command for logical/phyiscal device (small command) */ -#define MDACMD_SCSILC 0x5 /* SCSI command for logical/phyiscal device (large command) */ -#define MDACMD_IOCTL 0x20 /* Management command */ -#define MDACMD_IOCTLCHECK 0x23 /* Validate management command (not implemented) */ - -/* - * 16.0 IOCTL command - * - * We use the IOCTL names as given by Mylex - * Note that only ioctls supported by the PCI controller family are listed - */ -#define MDACIOCTL_GETCONTROLLERINFO 0x1 -#define MDACIOCTL_GETLOGDEVINFOVALID 0x3 -#define MDACIOCTL_GETPHYSDEVINFOVALID 0x5 -#define MDACIOCTL_GETCONTROLLERSTATISTICS 0xb -#define MDACIOCTL_GETLOGDEVSTATISTICS 0xd -#define MDACIOCTL_GETPHYSDEVSTATISTICS 0xf -#define MDACIOCTL_GETHEALTHSTATUS 0x11 -#define MDACIOCTL_GETEVENT 0x15 -/* flash update */ -#define MDACIOCTL_STOREIMAGE 0x2c -#define MDACIOCTL_READIMAGE 0x2d -#define MDACIOCTL_FLASHIMAGES 0x2e -/* battery backup unit */ -#define MDACIOCTL_GET_SUBSYSTEM_DATA 0x70 -#define MDACIOCTL_SET_SUBSYSTEM_DATA 0x71 -/* non-data commands */ -#define MDACIOCTL_STARTDISOCVERY 0x81 -#define MDACIOCTL_SETRAIDDEVSTATE 0x82 -#define MDACIOCTL_INITPHYSDEVSTART 0x84 -#define MDACIOCTL_INITPHYSDEVSTOP 0x85 -#define MDACIOCTL_INITRAIDDEVSTART 0x86 -#define MDACIOCTL_INITRAIDDEVSTOP 0x87 -#define MDACIOCTL_REBUILDRAIDDEVSTART 0x88 -#define MDACIOCTL_REBUILDRAIDDEVSTOP 0x89 -#define MDACIOCTL_MAKECONSISTENTDATASTART 0x8a -#define MDACIOCTL_MAKECONSISTENTDATASTOP 0x8b -#define MDACIOCTL_CONSISTENCYCHECKSTART 0x8c -#define MDACIOCTL_CONSISTENCYCHECKSTOP 0x8d -#define MDACIOCTL_SETMEMORYMAILBOX 0x8e -#define MDACIOCTL_RESETDEVICE 0x90 -#define MDACIOCTL_FLUSHDEVICEDATA 0x91 -#define MDACIOCTL_PAUSEDEVICE 0x92 -#define MDACIOCTL_UNPAUSEDEVICE 0x93 -#define MDACIOCTL_LOCATEDEVICE 0x94 -#define MDACIOCTL_SETMASTERSLAVEMODE 0x95 -#define MDACIOCTL_SETREALTIMECLOCK 0xac -/* RAID configuration */ -#define MDACIOCTL_CREATENEWCONF 0xc0 -#define MDACIOCTL_DELETERAIDDEV 0xc1 -#define MDACIOCTL_REPLACEINTERNALDEV 0xc2 -#define MDACIOCTL_RENAMERAIDDEV 0xc3 -#define MDACIOCTL_ADDNEWCONF 0xc4 -#define MDACIOCTL_XLATEPHYSDEVTORAIDDEV 0xc5 -#define MDACIOCTL_MORE 0xc6 -#define MDACIOCTL_SETPHYSDEVPARAMETER 0xc8 -#define MDACIOCTL_GETPHYSDEVPARAMETER 0xc9 -#define MDACIOCTL_CLEARCONF 0xca -#define MDACIOCTL_GETDEVCONFINFO 0xcb -#define MDACIOCTL_GETGROUPCONFINFO 0xcc -#define MDACIOCTL_GETFREESPACELIST 0xcd -#define MDACIOCTL_GETLOGDEVPARAMETER 0xce -#define MDACIOCTL_SETLOGDEVPARAMETER 0xcf -#define MDACIOCTL_GETCONTROLLERPARAMETER 0xd0 -#define MDACIOCTL_SETCONTRLLERPARAMETER 0xd1 -#define MDACIOCTL_CLEARCONFSUSPMODE 0xd2 -#define MDACIOCTL_GETBDT_FOR_SYSDRIVE 0xe0 - -/* - * 17.1.4 Data Transfer Memory Address Without SG List - */ -struct mly_short_transfer { - struct mly_sg_entry sg[2]; -} __attribute__ ((packed)); - -/* - * 17.1.5 Data Transfer Memory Address With SG List - * - * Note that only the first s/g table is currently used. - */ -struct mly_sg_transfer { - u_int16_t entries[3]; - u_int16_t res1; - u_int64_t table_physaddr[3]; -} __attribute__ ((packed)); - -/* - * 17.1.3 Data Transfer Memory Address Format - */ -union mly_command_transfer { - struct mly_short_transfer direct; - struct mly_sg_transfer indirect; -}; - -/* - * 21.1 MDACIOCTL_SETREALTIMECLOCK - * 21.7 MDACIOCTL_GETHEALTHSTATUS - * 21.8 MDACIOCTL_GETCONTROLLERINFO - * 21.9 MDACIOCTL_GETLOGDEVINFOVALID - * 21.10 MDACIOCTL_GETPHYSDEVINFOVALID - * 21.11 MDACIOCTL_GETPHYSDEVSTATISTICS - * 21.12 MDACIOCTL_GETLOGDEVSTATISTICS - * 21.13 MDACIOCTL_GETCONTROLLERSTATISTICS - * 21.27 MDACIOCTL_GETBDT_FOR_SYSDRIVE - * 23.4 MDACIOCTL_CREATENEWCONF - * 23.5 MDACIOCTL_ADDNEWCONF - * 23.8 MDACIOCTL_GETDEVCONFINFO - * 23.9 MDACIOCTL_GETFREESPACELIST - * 24.1 MDACIOCTL_MORE - * 25.1 MDACIOCTL_GETPHYSDEVPARAMETER - * 25.2 MDACIOCTL_SETPHYSDEVPARAMETER - * 25.3 MDACIOCTL_GETLOGDEVPARAMETER - * 25.4 MDACIOCTL_SETLOGDEVPARAMETER - * 25.5 MDACIOCTL_GETCONTROLLERPARAMETER - * 25.6 MDACIOCTL_SETCONTROLLERPARAMETER - * - * These commands just transfer data - */ -struct mly_ioctl_param_data { - u_int8_t param[10]; - union mly_command_transfer transfer; -} __attribute__ ((packed)); - -/* - * 21.2 MDACIOCTL_SETMEMORYMAILBOX - */ -struct mly_ioctl_param_setmemorymailbox { - u_int8_t health_buffer_size; - u_int8_t res1; - u_int64_t health_buffer_physaddr; - u_int64_t command_mailbox_physaddr; - u_int64_t status_mailbox_physaddr; - u_int64_t res2[2]; -} __attribute__ ((packed)); - -/* - * 21.8.2 MDACIOCTL_GETCONTROLLERINFO: Data Format - */ -struct mly_ioctl_getcontrollerinfo { - u_int8_t res1; /* N/A */ - u_int8_t interface_type; - u_int8_t controller_type; - u_int8_t res2; /* N/A */ - u_int16_t interface_speed; - u_int8_t interface_width; - u_int8_t res3[9]; /* N/A */ - char interface_name[16]; - char controller_name[16]; - u_int8_t res4[16]; /* N/A */ - /* firmware release information */ - u_int8_t fw_major; - u_int8_t fw_minor; - u_int8_t fw_turn; - u_int8_t fw_build; - u_int8_t fw_day; - u_int8_t fw_month; - u_int8_t fw_century; - u_int8_t fw_year; - /* hardware release information */ - u_int8_t hw_revision; /* N/A */ - u_int8_t res5[3]; /* N/A */ - u_int8_t hw_release_day; /* N/A */ - u_int8_t hw_release_month; /* N/A */ - u_int8_t hw_release_century; /* N/A */ - u_int8_t hw_release_year; /* N/A */ - /* hardware manufacturing information */ - u_int8_t batch_number; /* N/A */ - u_int8_t res6; /* N/A */ - u_int8_t plant_number; - u_int8_t res7; - u_int8_t hw_manuf_day; - u_int8_t hw_manuf_month; - u_int8_t hw_manuf_century; - u_int8_t hw_manuf_year; - u_int8_t max_pdd_per_xldd; - u_int8_t max_ildd_per_xldd; - u_int16_t nvram_size; - u_int8_t max_number_of_xld; /* N/A */ - u_int8_t res8[3]; /* N/A */ - /* unique information per controller */ - char serial_number[16]; - u_int8_t res9[16]; /* N/A */ - /* vendor information */ - u_int8_t res10[3]; /* N/A */ - u_int8_t oem_information; - char vendor_name[16]; /* N/A */ - /* other physical/controller/operation information */ - u_int8_t bbu_present:1; - u_int8_t active_clustering:1; - u_int8_t res11:6; /* N/A */ - u_int8_t res12[3]; /* N/A */ - /* physical device scan information */ - u_int8_t physical_scan_active:1; - u_int8_t res13:7; /* N/A */ - u_int8_t physical_scan_channel; - u_int8_t physical_scan_target; - u_int8_t physical_scan_lun; - /* maximum command data transfer size */ - u_int16_t maximum_block_count; - u_int16_t maximum_sg_entries; - /* logical/physical device counts */ - u_int16_t logical_devices_present; - u_int16_t logical_devices_critical; - u_int16_t logical_devices_offline; - u_int16_t physical_devices_present; - u_int16_t physical_disks_present; - u_int16_t physical_disks_critical; /* N/A */ - u_int16_t physical_disks_offline; - u_int16_t maximum_parallel_commands; - /* channel and target ID information */ - u_int8_t physical_channels_present; - u_int8_t virtual_channels_present; - u_int8_t physical_channels_possible; - u_int8_t virtual_channels_possible; - u_int8_t maximum_targets_possible[16]; /* N/A (6 and up) */ - u_int8_t res14[12]; /* N/A */ - /* memory/cache information */ - u_int16_t memory_size; - u_int16_t cache_size; - u_int32_t valid_cache_size; /* N/A */ - u_int32_t dirty_cache_size; /* N/A */ - u_int16_t memory_speed; - u_int8_t memory_width; - u_int8_t memory_type:5; - u_int8_t res15:1; /* N/A */ - u_int8_t memory_parity:1; - u_int8_t memory_ecc:1; - char memory_information[16]; /* N/A */ - /* execution memory information */ - u_int16_t exmemory_size; - u_int16_t l2cache_size; /* N/A */ - u_int8_t res16[8]; /* N/A */ - u_int16_t exmemory_speed; - u_int8_t exmemory_width; - u_int8_t exmemory_type:5; - u_int8_t res17:1; /* N/A */ - u_int8_t exmemory_parity:1; - u_int8_t exmemory_ecc:1; - char exmemory_name[16]; /* N/A */ - /* CPU information */ - struct { - u_int16_t speed; - u_int8_t type; - u_int8_t number; - u_int8_t res1[12]; /* N/A */ - char name[16]; /* N/A */ - } cpu[2] __attribute__ ((packed)); - /* debugging/profiling/command time tracing information */ - u_int16_t profiling_page; /* N/A */ - u_int16_t profiling_programs; /* N/A */ - u_int16_t time_trace_page; /* N/A */ - u_int16_t time_trace_programs; /* N/A */ - u_int8_t res18[8]; /* N/A */ - /* error counters on physical devices */ - u_int16_t physical_device_bus_resets; /* N/A */ - u_int16_t physical_device_parity_errors; /* N/A */ - u_int16_t physical_device_soft_errors; /* N/A */ - u_int16_t physical_device_commands_failed; /* N/A */ - u_int16_t physical_device_miscellaneous_errors; /* N/A */ - u_int16_t physical_device_command_timeouts; /* N/A */ - u_int16_t physical_device_selection_timeouts; /* N/A */ - u_int16_t physical_device_retries; /* N/A */ - u_int16_t physical_device_aborts; /* N/A */ - u_int16_t physical_device_host_command_aborts; /* N/A */ - u_int16_t physical_device_PFAs_detected; /* N/A */ - u_int16_t physical_device_host_commands_failed; /* N/A */ - u_int8_t res19[8]; /* N/A */ - /* error counters on logical devices */ - u_int16_t logical_device_soft_errors; /* N/A */ - u_int16_t logical_device_commands_failed; /* N/A */ - u_int16_t logical_device_host_command_aborts; /* N/A */ - u_int16_t res20; /* N/A */ - /* error counters on controller */ - u_int16_t controller_parity_ecc_errors; - u_int16_t controller_host_command_aborts; /* N/A */ - u_int8_t res21[4]; /* N/A */ - /* long duration activity information */ - u_int16_t background_inits_active; - u_int16_t logical_inits_active; - u_int16_t physical_inits_active; - u_int16_t consistency_checks_active; - u_int16_t rebuilds_active; - u_int16_t MORE_active; - u_int16_t patrol_active; /* N/A */ - u_int8_t long_operation_status; /* N/A */ - u_int8_t res22; /* N/A */ - /* flash ROM information */ - u_int8_t flash_type; /* N/A */ - u_int8_t res23; /* N/A */ - u_int16_t flash_size; - u_int32_t flash_maximum_age; - u_int32_t flash_age; - u_int8_t res24[4]; /* N/A */ - char flash_name[16]; /* N/A */ - /* firmware runtime information */ - u_int8_t rebuild_rate; - u_int8_t background_init_rate; - u_int8_t init_rate; - u_int8_t consistency_check_rate; - u_int8_t res25[4]; /* N/A */ - u_int32_t maximum_dp; - u_int32_t free_dp; - u_int32_t maximum_iop; - u_int32_t free_iop; - u_int16_t maximum_comb_length; - u_int16_t maximum_configuration_groups; - u_int8_t installation_abort:1; - u_int8_t maintenance:1; - u_int8_t res26:6; /* N/A */ - u_int8_t res27[3]; /* N/A */ - u_int8_t res28[32 + 512]; /* N/A */ -} __attribute__ ((packed)); - -/* - * 21.9.2 MDACIOCTL_GETLOGDEVINFOVALID - */ -struct mly_ioctl_getlogdevinfovalid { - u_int8_t res1; /* N/A */ - u_int8_t channel; - u_int8_t target; - u_int8_t lun; - u_int8_t state; /* see 8.1 */ - u_int8_t raid_level; /* see 8.2 */ - u_int8_t stripe_size; /* see 8.3 */ - u_int8_t cache_line_size; /* see 8.4 */ - u_int8_t read_write_control; /* see 8.5 */ - u_int8_t consistency_check:1; - u_int8_t rebuild:1; - u_int8_t make_consistent:1; - u_int8_t initialisation:1; - u_int8_t migration:1; - u_int8_t patrol:1; - u_int8_t res2:2; /* N/A */ - u_int8_t ar5_limit; - u_int8_t ar5_algo; - u_int16_t logical_device_number; - u_int16_t bios_control; - /* erorr counters */ - u_int16_t soft_errors; /* N/A */ - u_int16_t commands_failed; /* N/A */ - u_int16_t host_command_aborts; /* N/A */ - u_int16_t deferred_write_errors; /* N/A */ - u_int8_t res3[8]; /* N/A */ - /* device size information */ - u_int8_t res4[2]; /* N/A */ - u_int16_t device_block_size; - u_int32_t original_device_size; /* N/A */ - u_int32_t device_size; /* XXX "blocks or MB" Huh? */ - u_int8_t res5[4]; /* N/A */ - char device_name[32]; /* N/A */ - u_int8_t inquiry[36]; - u_int8_t res6[12]; /* N/A */ - u_int64_t last_read_block; /* N/A */ - u_int64_t last_written_block; /* N/A */ - u_int64_t consistency_check_block; - u_int64_t rebuild_block; - u_int64_t make_consistent_block; - u_int64_t initialisation_block; - u_int64_t migration_block; - u_int64_t patrol_block; /* N/A */ - u_int8_t res7[64]; /* N/A */ -} __attribute__ ((packed)); - -/* - * 21.10.2 MDACIOCTL_GETPHYSDEVINFOVALID: Data Format - */ -struct mly_ioctl_getphysdevinfovalid { - u_int8_t res1; - u_int8_t channel; - u_int8_t target; - u_int8_t lun; - u_int8_t raid_ft:1; /* configuration status */ - u_int8_t res2:1; /* N/A */ - u_int8_t local:1; - u_int8_t res3:5; - u_int8_t host_dead:1; /* multiple host/controller status *//* N/A */ - u_int8_t host_connection_dead:1; /* N/A */ - u_int8_t res4:6; /* N/A */ - u_int8_t state; /* see 8.1 */ - u_int8_t width; - u_int16_t speed; - /* multiported physical device information */ - u_int8_t ports_available; /* N/A */ - u_int8_t ports_inuse; /* N/A */ - u_int8_t res5[4]; - u_int8_t ether_address[16]; /* N/A */ - u_int16_t command_tags; - u_int8_t consistency_check:1; /* N/A */ - u_int8_t rebuild:1; /* N/A */ - u_int8_t make_consistent:1; /* N/A */ - u_int8_t initialisation:1; - u_int8_t migration:1; /* N/A */ - u_int8_t patrol:1; /* N/A */ - u_int8_t res6:2; - u_int8_t long_operation_status; /* N/A */ - u_int8_t parity_errors; - u_int8_t soft_errors; - u_int8_t hard_errors; - u_int8_t miscellaneous_errors; - u_int8_t command_timeouts; /* N/A */ - u_int8_t retries; /* N/A */ - u_int8_t aborts; /* N/A */ - u_int8_t PFAs_detected; /* N/A */ - u_int8_t res7[6]; - u_int16_t block_size; - u_int32_t original_device_size; /* XXX "blocks or MB" Huh? */ - u_int32_t device_size; /* XXX "blocks or MB" Huh? */ - u_int8_t res8[4]; - char name[16]; /* N/A */ - u_int8_t res9[16 + 32]; - u_int8_t inquiry[36]; - u_int8_t res10[12 + 16]; - u_int64_t last_read_block; /* N/A */ - u_int64_t last_written_block; /* N/A */ - u_int64_t consistency_check_block; /* N/A */ - u_int64_t rebuild_block; /* N/A */ - u_int64_t make_consistent_block; /* N/A */ - u_int64_t initialisation_block; /* N/A */ - u_int64_t migration_block; /* N/A */ - u_int64_t patrol_block; /* N/A */ - u_int8_t res11[256]; -} __attribute__ ((packed)); - -union mly_devinfo { - struct mly_ioctl_getlogdevinfovalid logdev; - struct mly_ioctl_getphysdevinfovalid physdev; -}; - -/* - * 21.11.2 MDACIOCTL_GETPHYSDEVSTATISTICS: Data Format - * 21.12.2 MDACIOCTL_GETLOGDEVSTATISTICS: Data Format - */ -struct mly_ioctl_getdevstatistics { - u_int32_t uptime_ms; /* getphysedevstatistics only */ - u_int8_t res1[5]; /* N/A */ - u_int8_t channel; - u_int8_t target; - u_int8_t lun; - u_int16_t raid_device; /* getlogdevstatistics only */ - u_int8_t res2[2]; /* N/A */ - /* total read/write performance including cache data */ - u_int32_t total_reads; - u_int32_t total_writes; - u_int32_t total_read_size; - u_int32_t total_write_size; - /* cache read/write performance */ - u_int32_t cache_reads; /* N/A */ - u_int32_t cache_writes; /* N/A */ - u_int32_t cache_read_size; /* N/A */ - u_int32_t cache_write_size; /* N/A */ - /* commands active/wait information */ - u_int32_t command_waits_done; /* N/A */ - u_int16_t active_commands; /* N/A */ - u_int16_t waiting_commands; /* N/A */ - u_int8_t res3[8]; /* N/A */ -} __attribute__ ((packed)); - -/* - * 21.13.2 MDACIOCTL_GETCONTROLLERSTATISTICS: Data Format - */ -struct mly_ioctl_getcontrollerstatistics { - u_int32_t uptime_ms; /* N/A */ - u_int8_t res1[12]; /* N/A */ - /* target physical device performance data information */ - u_int32_t target_physical_device_interrupts; /* N/A */ - u_int32_t target_physical_device_stray_interrupts; /* N/A */ - u_int8_t res2[8]; /* N/A */ - u_int32_t target_physical_device_reads; /* N/A */ - u_int32_t target_physical_device_writes; /* N/A */ - u_int32_t target_physical_device_read_size; /* N/A */ - u_int32_t target_physical_device_write_size; /* N/A */ - /* host system performance data information */ - u_int32_t host_system_interrupts; /* N/A */ - u_int32_t host_system_stray_interrupts; /* N/A */ - u_int32_t host_system_sent_interrupts; /* N/A */ - u_int8_t res3[4]; /* N/A */ - u_int32_t physical_device_reads; /* N/A */ - u_int32_t physical_device_writes; /* N/A */ - u_int32_t physical_device_read_size; /* N/A */ - u_int32_t physical_device_write_size; /* N/A */ - u_int32_t physical_device_cache_reads; /* N/A */ - u_int32_t physical_device_cache_writes; /* N/A */ - u_int32_t physical_device_cache_read_size; /* N/A */ - u_int32_t physical_device_cache_write_size; /* N/A */ - u_int32_t logical_device_reads; /* N/A */ - u_int32_t logical_device_writes; /* N/A */ - u_int32_t logical_device_read_size; /* N/A */ - u_int32_t logical_device_write_size; /* N/A */ - u_int32_t logical_device_cache_reads; /* N/A */ - u_int32_t logical_device_cache_writes; /* N/A */ - u_int32_t logical_device_cache_read_size; /* N/A */ - u_int32_t logical_device_cache_write_size; /* N/A */ - u_int16_t target_physical_device_commands_active; /* N/A */ - u_int16_t target_physical_device_commands_waiting; /* N/A */ - u_int16_t host_system_commands_active; /* N/A */ - u_int16_t host_system_commands_waiting; /* N/A */ - u_int8_t res4[48 + 64]; /* N/A */ -} __attribute__ ((packed)); - -/* - * 21.2 MDACIOCTL_SETRAIDDEVSTATE - */ -struct mly_ioctl_param_setraiddevstate { - u_int8_t state; -} __attribute__ ((packed)); - -/* - * 21.27.2 MDACIOCTL_GETBDT_FOR_SYSDRIVE: Data Format - */ -#define MLY_MAX_BDT_ENTRIES 1022 -struct mly_ioctl_getbdt_for_sysdrive { - u_int32_t num_of_bdt_entries; - u_int32_t bad_data_block_address[MLY_MAX_BDT_ENTRIES]; -} __attribute__ ((packed)); - -/* - * 22.1 Physical Device Definition (PDD) - */ -struct mly_pdd { - u_int8_t type; /* see 8.2 */ - u_int8_t state; /* see 8.1 */ - u_int16_t raid_device; - u_int32_t device_size; /* XXX "block or MB" Huh? */ - u_int8_t controller; - u_int8_t channel; - u_int8_t target; - u_int8_t lun; - u_int32_t start_address; -} __attribute__ ((packed)); - -/* - * 22.2 RAID Device Use Definition (UDD) - */ -struct mly_udd { - u_int8_t res1; - u_int8_t state; /* see 8.1 */ - u_int16_t raid_device; - u_int32_t start_address; -} __attribute__ ((packed)); - -/* - * RAID Device Definition (LDD) - */ -struct mly_ldd { - u_int8_t type; /* see 8.2 */ - u_int8_t state; /* see 8.1 */ - u_int16_t raid_device; - u_int32_t device_size; /* XXX "block or MB" Huh? */ - u_int8_t devices_used_count; - u_int8_t stripe_size; /* see 8.3 */ - u_int8_t cache_line_size; /* see 8.4 */ - u_int8_t read_write_control; /* see 8.5 */ - u_int32_t devices_used_size; /* XXX "block or MB" Huh? */ - u_int16_t devices_used[32]; /* XXX actual size of this field unknown! */ -} __attribute__ ((packed)); - -/* - * Define a datastructure giving the smallest allocation that will hold - * a PDD, UDD or LDD for MDACIOCTL_GETDEVCONFINFO. - */ -struct mly_devconf_hdr { - u_int8_t type; /* see 8.2 */ - u_int8_t state; /* see 8.1 */ - u_int16_t raid_device; -}; - -union mly_ioctl_devconfinfo { - struct mly_pdd pdd; - struct mly_udd udd; - struct mly_ldd ldd; - struct mly_devconf_hdr hdr; -}; - -/* - * 22.3 MDACIOCTL_RENAMERAIDDEV - * - * XXX this command is listed as transferring data, but does not define the data. - */ -struct mly_ioctl_param_renameraiddev { - u_int8_t new_raid_device; -} __attribute__ ((packed)); - -/* - * 23.6.2 MDACIOCTL_XLATEPHYSDEVTORAIDDEV - * - * XXX documentation suggests this format will change - */ -struct mly_ioctl_param_xlatephysdevtoraiddev { - u_int16_t raid_device; - u_int8_t res1[2]; - u_int8_t controller; - u_int8_t channel; - u_int8_t target; - u_int8_t lun; -} __attribute__ ((packed)); - -/* - * 23.7 MDACIOCTL_GETGROUPCONFINFO - */ -struct mly_ioctl_param_getgroupconfinfo { - u_int16_t group; - u_int8_t res1[8]; - union mly_command_transfer transfer; -} __attribute__ ((packed)); - -/* - * 23.9.2 MDACIOCTL_GETFREESPACELIST: Data Format - * - * The controller will populate as much of this structure as is provided, - * or as is required to fully list the free space available. - */ -struct mly_ioctl_getfreespacelist_entry { - u_int16_t raid_device; - u_int8_t res1[6]; - u_int32_t address; /* XXX "blocks or MB" Huh? */ - u_int32_t size; /* XXX "blocks or MB" Huh? */ -} __attribute__ ((packed)); - -struct mly_ioctl_getfrespacelist { - u_int16_t returned_entries; - u_int16_t total_entries; - u_int8_t res1[12]; - struct mly_ioctl_getfreespacelist_entry space[0]; /* expand to suit */ -} __attribute__ ((packed)); - -/* - * 27.1 MDACIOCTL_GETSUBSYSTEMDATA - * 27.2 MDACIOCTL_SETSUBSYSTEMDATA - * - * PCI controller only supports a limited subset of the possible operations. - * - * XXX where does the status end up? (the command transfers no data) - */ -struct mly_ioctl_param_subsystemdata { - u_int8_t operation:4; -#define MLY_BBU_GETSTATUS 0x00 -#define MLY_BBU_SET_THRESHOLD 0x00 /* minutes in param[0,1] */ - u_int8_t subsystem:4; -#define MLY_SUBSYSTEM_BBU 0x01 - u_int parameter[3]; /* only for SETSUBSYSTEMDATA */ -} __attribute__ ((packed)); - -struct mly_ioctl_getsubsystemdata_bbustatus { - u_int16_t current_power; - u_int16_t maximum_power; - u_int16_t power_threshold; - u_int8_t charge_level; - u_int8_t hardware_version; - u_int8_t battery_type; -#define MLY_BBU_TYPE_UNKNOWN 0x00 -#define MLY_BBU_TYPE_NICAD 0x01 -#define MLY_BBU_TYPE_MISSING 0xfe - u_int8_t res1; - u_int8_t operation_status; -#define MLY_BBU_STATUS_NO_SYNC 0x01 -#define MLY_BBU_STATUS_OUT_OF_SYNC 0x02 -#define MLY_BBU_STATUS_FIRST_WARNING 0x04 -#define MLY_BBU_STATUS_SECOND_WARNING 0x08 -#define MLY_BBU_STATUS_RECONDITIONING 0x10 -#define MLY_BBU_STATUS_DISCHARGING 0x20 -#define MLY_BBU_STATUS_FASTCHARGING 0x40 - u_int8_t res2; -} __attribute__ ((packed)); - -/* - * 28.9 MDACIOCTL_RESETDEVICE - * 28.10 MDACIOCTL_FLUSHDEVICEDATA - * 28.11 MDACIOCTL_PAUSEDEVICE - * 28.12 MDACIOCTL_UNPAUSEDEVICE - */ -struct mly_ioctl_param_deviceoperation { - u_int8_t operation_device; /* see 14.3 */ -} __attribute__ ((packed)); - -/* - * 31.1 Event Data Format - */ -struct mly_event { - u_int32_t sequence_number; - u_int32_t timestamp; - u_int32_t code; - u_int8_t controller; - u_int8_t channel; - u_int8_t target; /* also enclosure */ - u_int8_t lun; /* also enclosure unit */ - u_int8_t res1[4]; - u_int32_t param; - u_int8_t sense[40]; -} __attribute__ ((packed)); - -/* - * 31.2 MDACIOCTL_GETEVENT - */ -struct mly_ioctl_param_getevent { - u_int16_t sequence_number_low; - u_int8_t res1[8]; - union mly_command_transfer transfer; -} __attribute__ ((packed)); - -union mly_ioctl_param { - struct mly_ioctl_param_data data; - struct mly_ioctl_param_setmemorymailbox setmemorymailbox; - struct mly_ioctl_param_setraiddevstate setraiddevstate; - struct mly_ioctl_param_renameraiddev renameraiddev; - struct mly_ioctl_param_xlatephysdevtoraiddev xlatephysdevtoraiddev; - struct mly_ioctl_param_getgroupconfinfo getgroupconfinfo; - struct mly_ioctl_param_subsystemdata subsystemdata; - struct mly_ioctl_param_deviceoperation deviceoperation; - struct mly_ioctl_param_getevent getevent; -}; - -/* - * 19 SCSI Command Format - */ -struct mly_command_address_physical { - u_int8_t lun; - u_int8_t target; - u_int8_t channel:3; - u_int8_t controller:5; -} __attribute__ ((packed)); - -struct mly_command_address_logical { - u_int16_t logdev; - u_int8_t res1:3; - u_int8_t controller:5; -} __attribute__ ((packed)); - -union mly_command_address { - struct mly_command_address_physical phys; - struct mly_command_address_logical log; -}; - -struct mly_command_generic { - u_int16_t command_id; - u_int8_t opcode; - struct mly_command_control command_control; - u_int32_t data_size; - u_int64_t sense_buffer_address; - union mly_command_address addr; - struct mly_timeout timeout; - u_int8_t maximum_sense_size; - u_int8_t res1[11]; - union mly_command_transfer transfer; -} __attribute__ ((packed)); - - -/* - * 19.1 MDACMD_SCSI & MDACMD_SCSIPT - */ -#define MLY_CMD_SCSI_SMALL_CDB 10 -struct mly_command_scsi_small { - u_int16_t command_id; - u_int8_t opcode; - struct mly_command_control command_control; - u_int32_t data_size; - u_int64_t sense_buffer_address; - union mly_command_address addr; - struct mly_timeout timeout; - u_int8_t maximum_sense_size; - u_int8_t cdb_length; - u_int8_t cdb[MLY_CMD_SCSI_SMALL_CDB]; - union mly_command_transfer transfer; -} __attribute__ ((packed)); - -/* - * 19.2 MDACMD_SCSILC & MDACMD_SCSILCPT - */ -struct mly_command_scsi_large { - u_int16_t command_id; - u_int8_t opcode; - struct mly_command_control command_control; - u_int32_t data_size; - u_int64_t sense_buffer_address; - union mly_command_address addr; - struct mly_timeout timeout; - u_int8_t maximum_sense_size; - u_int8_t cdb_length; - u_int16_t res1; - u_int64_t cdb_physaddr; - union mly_command_transfer transfer; -} __attribute__ ((packed)); - -/* - * 20.1 IOCTL Command Format: Internal Bus - */ -struct mly_command_ioctl { - u_int16_t command_id; - u_int8_t opcode; - struct mly_command_control command_control; - u_int32_t data_size; - u_int64_t sense_buffer_address; - union mly_command_address addr; - struct mly_timeout timeout; - u_int8_t maximum_sense_size; - u_int8_t sub_ioctl; - union mly_ioctl_param param; -} __attribute__ ((packed)); - -/* - * PG6: 8.2.2 - */ -struct mly_command_mmbox { - u_int32_t flag; - u_int8_t data[60]; -} __attribute__ ((packed)); - -union mly_command_packet { - struct mly_command_generic generic; - struct mly_command_scsi_small scsi_small; - struct mly_command_scsi_large scsi_large; - struct mly_command_ioctl ioctl; - struct mly_command_mmbox mmbox; -}; - -/* - * PG6: 5.3 - */ -#define MLY_I960RX_COMMAND_MAILBOX 0x10 -#define MLY_I960RX_STATUS_MAILBOX 0x18 -#define MLY_I960RX_IDBR 0x20 -#define MLY_I960RX_ODBR 0x2c -#define MLY_I960RX_ERROR_STATUS 0x2e -#define MLY_I960RX_INTERRUPT_STATUS 0x30 -#define MLY_I960RX_INTERRUPT_MASK 0x34 - -#define MLY_STRONGARM_COMMAND_MAILBOX 0x50 -#define MLY_STRONGARM_STATUS_MAILBOX 0x58 -#define MLY_STRONGARM_IDBR 0x60 -#define MLY_STRONGARM_ODBR 0x61 -#define MLY_STRONGARM_ERROR_STATUS 0x63 -#define MLY_STRONGARM_INTERRUPT_STATUS 0x30 -#define MLY_STRONGARM_INTERRUPT_MASK 0x34 - -/* - * PG6: 5.4.3 Doorbell 0 - */ -#define MLY_HM_CMDSENT (1<<0) -#define MLY_HM_STSACK (1<<1) -#define MLY_SOFT_RST (1<<3) -#define MLY_AM_CMDSENT (1<<4) - -/* - * PG6: 5.4.4 Doorbell 1 - * - * Note that the documentation claims that these bits are set when the - * status queue(s) are empty, wheras the Linux driver and experience - * suggest they are set when there is status available. - */ -#define MLY_HM_STSREADY (1<<0) -#define MLY_AM_STSREADY (1<<1) - -/* - * PG6: 5.4.6 Doorbell 3 - */ -#define MLY_MSG_EMPTY (1<<3) -#define MLY_MSG_SPINUP 0x08 -#define MLY_MSG_RACE_RECOVERY_FAIL 0x60 -#define MLY_MSG_RACE_IN_PROGRESS 0x70 -#define MLY_MSG_RACE_ON_CRITICAL 0xb0 -#define MLY_MSG_PARITY_ERROR 0xf0 - -/* - * PG6: 5.4.8 Outbound Interrupt Mask - */ -#define MLY_INTERRUPT_MASK_DISABLE 0xff -#define MLY_INTERRUPT_MASK_ENABLE (0xff & ~(1<<2)) - -/* - * PG6: 8.2 Advanced Mailbox Scheme - * - * Note that this must be allocated on a 4k boundary, and all internal - * fields must also reside on a 4k boundary. - * We could dynamically size this structure, but the extra effort - * is probably unjustified. Note that these buffers do not need to be - * adjacent - we just group them to simplify allocation of the bus-visible - * buffer. - * - * XXX Note that for some reason, if MLY_MMBOX_COMMANDS is > 64, the controller - * fails to respond to the command at (MLY_MMBOX_COMMANDS - 64). It's not - * wrapping to 0 at this point (determined by experimentation). This is not - * consistent with the Linux driver's implementation. - * Whilst it's handy to have lots of room for status returns in case we end up - * being slow getting back to completed commands, it seems unlikely that we - * would get 64 commands ahead of the controller on the submissions side, so - * the current workaround is to simply limit the command ring to 64 entries. - */ -union mly_status_packet { - struct mly_status status; - struct { - u_int32_t flag; - u_int8_t data[4]; - } __attribute__ ((packed)) mmbox; -}; -union mly_health_region { - struct mly_health_status status; - u_int8_t pad[1024]; -}; - -#define MLY_MMBOX_COMMANDS 64 -#define MLY_MMBOX_STATUS 512 -struct mly_mmbox { - union mly_command_packet mmm_command[MLY_MMBOX_COMMANDS]; - union mly_status_packet mmm_status[MLY_MMBOX_STATUS]; - union mly_health_region mmm_health; -} __attribute__ ((packed)); diff --git a/sys/dev/mly/mlyvar.h b/sys/dev/mly/mlyvar.h deleted file mode 100644 index 00a9c9be1d3c1..0000000000000 --- a/sys/dev/mly/mlyvar.h +++ /dev/null @@ -1,423 +0,0 @@ -/*- - * Copyright (c) 2000 Michael Smith - * Copyright (c) 2000 BSDi - * 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. - * - * 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$ - */ - -/******************************************************************************** - ******************************************************************************** - Driver Parameter Definitions - ******************************************************************************** - ********************************************************************************/ - -/* - * The firmware interface allows for a 16-bit command identifier. A lookup - * table this size (256k) would be too expensive, so we cap ourselves at a - * reasonable limit. - */ -#define MLY_MAXCOMMANDS 256 /* max outstanding commands per controller, limit 65535 */ - -/* - * The firmware interface allows for a 16-bit s/g list length. We limit - * ourselves to a reasonable maximum and ensure alignment. - */ -#define MLY_MAXSGENTRIES 64 /* max S/G entries, limit 65535 */ - -/******************************************************************************** - ******************************************************************************** - Driver Variable Definitions - ******************************************************************************** - ********************************************************************************/ - -#if __FreeBSD_version >= 500005 -# include <sys/taskqueue.h> -#endif - -/* - * Debugging levels: - * 0 - quiet, only emit warnings - * 1 - noisy, emit major function points and things done - * 2 - extremely noisy, emit trace items in loops, etc. - */ -#ifdef MLY_DEBUG -# define debug(level, fmt, args...) do { if (level <= MLY_DEBUG) printf("%s: " fmt "\n", __FUNCTION__ , ##args); } while(0) -# define debug_called(level) do { if (level <= MLY_DEBUG) printf(__FUNCTION__ ": called\n"); } while(0) -# define debug_struct(s) printf(" SIZE %s: %d\n", #s, sizeof(struct s)) -# define debug_union(s) printf(" SIZE %s: %d\n", #s, sizeof(union s)) -# define debug_field(s, f) printf(" OFFSET %s.%s: %d\n", #s, #f, ((int)&(((struct s *)0)->f))) -extern void mly_printstate0(void); -extern struct mly_softc *mly_softc0; -#else -# define debug(level, fmt, args...) -# define debug_called(level) -# define debug_struct(s) -#endif - -#define mly_printf(sc, fmt, args...) device_printf(sc->mly_dev, fmt , ##args) - -/* - * Per-device structure, used to save persistent state on devices. - * - * Note that this isn't really Bus/Target/Lun since we don't support - * lun != 0 at this time. - */ -struct mly_btl { - int mb_flags; -#define MLY_BTL_PHYSICAL (1<<0) /* physical device */ -#define MLY_BTL_LOGICAL (1<<1) /* logical device */ -#define MLY_BTL_PROTECTED (1<<2) /* device is protected - I/O not allowed */ -#define MLY_BTL_RESCAN (1<<3) /* device needs to be rescanned */ - char mb_name[16]; /* peripheral attached to this device */ - int mb_state; /* see 8.1 */ - int mb_type; /* see 8.2 */ -}; - -/* - * Per-command control structure. - */ -struct mly_command { - TAILQ_ENTRY(mly_command) mc_link; /* list linkage */ - - struct mly_softc *mc_sc; /* controller that owns us */ - u_int16_t mc_slot; /* command slot we occupy */ - int mc_flags; -#define MLY_CMD_STATEMASK ((1<<8)-1) -#define MLY_CMD_STATE(mc) ((mc)->mc_flags & MLY_CMD_STATEMASK) -#define MLY_CMD_SETSTATE(mc, s) ((mc)->mc_flags = ((mc)->mc_flags &= ~MLY_CMD_STATEMASK) | (s)) -#define MLY_CMD_FREE 0 /* command is on the free list */ -#define MLY_CMD_SETUP 1 /* command is being built */ -#define MLY_CMD_BUSY 2 /* command is being run, or ready to run, or not completed */ -#define MLY_CMD_COMPLETE 3 /* command has been completed */ -#define MLY_CMD_SLOTTED (1<<8) /* command has a slot number */ -#define MLY_CMD_MAPPED (1<<9) /* command has had its data mapped */ -#define MLY_CMD_PRIORITY (1<<10) /* allow use of "priority" slots */ -#define MLY_CMD_DATAIN (1<<11) /* data moves controller->system */ -#define MLY_CMD_DATAOUT (1<<12) /* data moves system->controller */ - u_int16_t mc_status; /* command completion status */ - u_int8_t mc_sense; /* sense data length */ - int32_t mc_resid; /* I/O residual count */ - - union mly_command_packet *mc_packet; /* our controller command */ - u_int64_t mc_packetphys; /* physical address of the mapped packet */ - - void *mc_data; /* data buffer */ - size_t mc_length; /* data length */ - bus_dmamap_t mc_datamap; /* DMA map for data */ - - void (* mc_complete)(struct mly_command *mc); /* completion handler */ - void *mc_private; /* caller-private data */ - -}; - -/* - * Command slot regulation. - * - * We can't use slot 0 due to the memory mailbox implementation. - */ -#define MLY_SLOT_START 1 -#define MLY_SLOT_MAX (MLY_SLOT_START + MLY_MAXCOMMANDS) - -/* - * Command/command packet cluster. - * - * Due to the difficulty of using the zone allocator to create a new - * zone from within a module, we use our own clustering to reduce - * memory wastage caused by allocating lots of these small structures. - * - * Note that it is possible to require more than MLY_MAXCOMMANDS - * command structures. - * - * Since we may need to allocate extra clusters at any time, and since this - * process needs to allocate a physically contiguous slab of controller - * addressible memory in which to place the command packets, do not allow more - * command packets in a cluster than will fit in a page. - */ -#define MLY_CMD_CLUSTERCOUNT (PAGE_SIZE / sizeof(union mly_command_packet)) - -struct mly_command_cluster { - TAILQ_ENTRY(mly_command_cluster) mcc_link; - union mly_command_packet *mcc_packet; - bus_dmamap_t mcc_packetmap; - u_int64_t mcc_packetphys; - struct mly_command mcc_command[MLY_CMD_CLUSTERCOUNT]; -}; - -/* - * Per-controller structure. - */ -struct mly_softc { - /* bus connections */ - device_t mly_dev; - struct resource *mly_regs_resource; /* register interface window */ - int mly_regs_rid; /* resource ID */ - bus_space_handle_t mly_bhandle; /* bus space handle */ - bus_space_tag_t mly_btag; /* bus space tag */ - bus_dma_tag_t mly_parent_dmat; /* parent DMA tag */ - bus_dma_tag_t mly_buffer_dmat; /* data buffer/command DMA tag */ - struct resource *mly_irq; /* interrupt */ - int mly_irq_rid; - void *mly_intr; /* interrupt handle */ - - /* scatter/gather lists and their controller-visible mappings */ - struct mly_sg_entry *mly_sg_table; /* s/g lists */ - u_int32_t mly_sg_busaddr; /* s/g table base address in bus space */ - bus_dma_tag_t mly_sg_dmat; /* s/g buffer DMA tag */ - bus_dmamap_t mly_sg_dmamap; /* map for s/g buffers */ - - /* controller hardware interface */ - int mly_hwif; -#define MLY_HWIF_I960RX 0 -#define MLY_HWIF_STRONGARM 1 - u_int8_t mly_doorbell_true; /* xor map to make hardware doorbell 'true' bits into 1s */ - u_int8_t mly_command_mailbox; /* register offsets */ - u_int8_t mly_status_mailbox; - u_int8_t mly_idbr; - u_int8_t mly_odbr; - u_int8_t mly_error_status; - u_int8_t mly_interrupt_status; - u_int8_t mly_interrupt_mask; - struct mly_mmbox *mly_mmbox; /* kernel-space address of memory mailbox */ - u_int64_t mly_mmbox_busaddr; /* bus-space address of memory mailbox */ - bus_dma_tag_t mly_mmbox_dmat; /* memory mailbox DMA tag */ - bus_dmamap_t mly_mmbox_dmamap; /* memory mailbox DMA map */ - u_int32_t mly_mmbox_command_index; /* next slot to use */ - u_int32_t mly_mmbox_status_index; /* slot we next expect status in */ - - /* controller features, limits and status */ - int mly_state; -#define MLY_STATE_SUSPEND (1<<0) -#define MLY_STATE_OPEN (1<<1) -#define MLY_STATE_INTERRUPTS_ON (1<<2) -#define MLY_STATE_MMBOX_ACTIVE (1<<3) - int mly_max_commands; /* max parallel commands we allow */ - struct mly_ioctl_getcontrollerinfo *mly_controllerinfo; - struct mly_param_controller *mly_controllerparam; - struct mly_btl mly_btl[MLY_MAX_CHANNELS][MLY_MAX_TARGETS]; - - /* command management */ - struct mly_command *mly_busycmds[MLY_SLOT_MAX]; /* busy commands */ - int mly_busy_count; - int mly_last_slot; - TAILQ_HEAD(,mly_command) mly_freecmds; /* commands available for reuse */ - TAILQ_HEAD(,mly_command) mly_ready; /* commands ready to be submitted */ - TAILQ_HEAD(,mly_command) mly_completed; /* commands which have been returned by the controller */ - TAILQ_HEAD(,mly_command_cluster) mly_clusters; /* command memory blocks */ - bus_dma_tag_t mly_packet_dmat; /* command packet DMA tag */ - - /* health monitoring */ - u_int32_t mly_event_change; /* event status change indicator */ - u_int32_t mly_event_counter; /* next event for which we anticpiate status */ - u_int32_t mly_event_waiting; /* next event the controller will post status for */ - struct callout_handle mly_periodic; /* periodic event handling */ - - /* CAM connection */ - TAILQ_HEAD(,ccb_hdr) mly_cam_ccbq; /* outstanding I/O from CAM */ - struct cam_sim *mly_cam_sim[MLY_MAX_CHANNELS]; - int mly_cam_lowbus; - -#if __FreeBSD_version >= 500005 - /* command-completion task */ - struct task mly_task_complete; /* deferred-completion task */ -#endif -}; - -/* - * Register access helpers. - */ -#define MLY_SET_REG(sc, reg, val) bus_space_write_1(sc->mly_btag, sc->mly_bhandle, reg, val) -#define MLY_GET_REG(sc, reg) bus_space_read_1 (sc->mly_btag, sc->mly_bhandle, reg) -#define MLY_GET_REG2(sc, reg) bus_space_read_2 (sc->mly_btag, sc->mly_bhandle, reg) -#define MLY_GET_REG4(sc, reg) bus_space_read_4 (sc->mly_btag, sc->mly_bhandle, reg) - -#define MLY_SET_MBOX(sc, mbox, ptr) \ - do { \ - bus_space_write_4(sc->mly_btag, sc->mly_bhandle, mbox, *((u_int32_t *)ptr)); \ - bus_space_write_4(sc->mly_btag, sc->mly_bhandle, mbox + 4, *((u_int32_t *)ptr + 1)); \ - bus_space_write_4(sc->mly_btag, sc->mly_bhandle, mbox + 8, *((u_int32_t *)ptr + 2)); \ - bus_space_write_4(sc->mly_btag, sc->mly_bhandle, mbox + 12, *((u_int32_t *)ptr + 3)); \ - } while(0); -#define MLY_GET_MBOX(sc, mbox, ptr) \ - do { \ - *((u_int32_t *)ptr) = bus_space_read_4(sc->mly_btag, sc->mly_bhandle, mbox); \ - *((u_int32_t *)ptr + 1) = bus_space_read_4(sc->mly_btag, sc->mly_bhandle, mbox + 4); \ - *((u_int32_t *)ptr + 2) = bus_space_read_4(sc->mly_btag, sc->mly_bhandle, mbox + 8); \ - *((u_int32_t *)ptr + 3) = bus_space_read_4(sc->mly_btag, sc->mly_bhandle, mbox + 12); \ - } while(0); - -#define MLY_IDBR_TRUE(sc, mask) \ - ((((MLY_GET_REG((sc), (sc)->mly_idbr)) ^ (sc)->mly_doorbell_true) & (mask)) == (mask)) -#define MLY_ODBR_TRUE(sc, mask) \ - ((MLY_GET_REG((sc), (sc)->mly_odbr) & (mask)) == (mask)) -#define MLY_ERROR_VALID(sc) \ - ((((MLY_GET_REG((sc), (sc)->mly_error_status)) ^ (sc)->mly_doorbell_true) & (MLY_MSG_EMPTY)) == 0) - -#define MLY_MASK_INTERRUPTS(sc) \ - do { \ - MLY_SET_REG((sc), (sc)->mly_interrupt_mask, MLY_INTERRUPT_MASK_DISABLE); \ - sc->mly_state &= ~MLY_STATE_INTERRUPTS_ON; \ - } while(0); -#define MLY_UNMASK_INTERRUPTS(sc) \ - do { \ - MLY_SET_REG((sc), (sc)->mly_interrupt_mask, MLY_INTERRUPT_MASK_ENABLE); \ - sc->mly_state |= MLY_STATE_INTERRUPTS_ON; \ - } while(0); - -/* - * Logical device number -> bus/target translation - */ -#define MLY_LOGDEV_BUS(sc, x) (((x) / MLY_MAX_TARGETS) + (sc)->mly_controllerinfo->physical_channels_present) -#define MLY_LOGDEV_TARGET(x) ((x) % MLY_MAX_TARGETS) - -/* - * Public functions/variables - */ -/* mly.c */ -extern int mly_attach(struct mly_softc *sc); -extern void mly_detach(struct mly_softc *sc); -extern void mly_free(struct mly_softc *sc); -extern void mly_startio(struct mly_softc *sc); -extern void mly_done(struct mly_softc *sc); -extern int mly_alloc_command(struct mly_softc *sc, struct mly_command **mcp); -extern void mly_release_command(struct mly_command *mc); - -/* mly_cam.c */ -extern int mly_cam_attach(struct mly_softc *sc); -extern void mly_cam_detach(struct mly_softc *sc); -extern int mly_cam_command(struct mly_softc *sc, struct mly_command **mcp); -extern int mly_name_device(struct mly_softc *sc, int bus, int target); - -/******************************************************************************** - * Queue primitives - * - * These are broken out individually to make statistics gathering easier. - */ - -static __inline void -mly_enqueue_ready(struct mly_command *mc) -{ - int s; - - s = splcam(); - TAILQ_INSERT_TAIL(&mc->mc_sc->mly_ready, mc, mc_link); - MLY_CMD_SETSTATE(mc, MLY_CMD_BUSY); - splx(s); -} - -static __inline void -mly_requeue_ready(struct mly_command *mc) -{ - int s; - - s = splcam(); - TAILQ_INSERT_HEAD(&mc->mc_sc->mly_ready, mc, mc_link); - splx(s); -} - -static __inline struct mly_command * -mly_dequeue_ready(struct mly_softc *sc) -{ - struct mly_command *mc; - int s; - - s = splcam(); - if ((mc = TAILQ_FIRST(&sc->mly_ready)) != NULL) - TAILQ_REMOVE(&sc->mly_ready, mc, mc_link); - splx(s); - return(mc); -} - -static __inline void -mly_enqueue_completed(struct mly_command *mc) -{ - int s; - - s = splcam(); - TAILQ_INSERT_TAIL(&mc->mc_sc->mly_completed, mc, mc_link); - /* don't set MLY_CMD_COMPLETE here to avoid wakeup race */ - splx(s); -} - -static __inline struct mly_command * -mly_dequeue_completed(struct mly_softc *sc) -{ - struct mly_command *mc; - int s; - - s = splcam(); - if ((mc = TAILQ_FIRST(&sc->mly_completed)) != NULL) - TAILQ_REMOVE(&sc->mly_completed, mc, mc_link); - splx(s); - return(mc); -} - -static __inline void -mly_enqueue_free(struct mly_command *mc) -{ - int s; - - s = splcam(); - TAILQ_INSERT_HEAD(&mc->mc_sc->mly_freecmds, mc, mc_link); - MLY_CMD_SETSTATE(mc, MLY_CMD_FREE); - splx(s); -} - -static __inline struct mly_command * -mly_dequeue_free(struct mly_softc *sc) -{ - struct mly_command *mc; - int s; - - s = splcam(); - if ((mc = TAILQ_FIRST(&sc->mly_freecmds)) != NULL) - TAILQ_REMOVE(&sc->mly_freecmds, mc, mc_link); - splx(s); - return(mc); -} - -static __inline void -mly_enqueue_cluster(struct mly_softc *sc, struct mly_command_cluster *mcc) -{ - int s; - - s = splcam(); - TAILQ_INSERT_HEAD(&sc->mly_clusters, mcc, mcc_link); - splx(s); -} - -static __inline struct mly_command_cluster * -mly_dequeue_cluster(struct mly_softc *sc) -{ - struct mly_command_cluster *mcc; - int s; - - s = splcam(); - if ((mcc = TAILQ_FIRST(&sc->mly_clusters)) != NULL) - TAILQ_REMOVE(&sc->mly_clusters, mcc, mcc_link); - splx(s); - return(mcc); -} - - |