diff options
-rw-r--r-- | sys/conf/files | 1 | ||||
-rw-r--r-- | sys/dev/amr/amr.c | 74 | ||||
-rw-r--r-- | sys/dev/amr/amr_cam.c | 103 | ||||
-rw-r--r-- | sys/dev/amr/amr_compat.h | 24 | ||||
-rw-r--r-- | sys/dev/amr/amr_disk.c | 38 | ||||
-rw-r--r-- | sys/dev/amr/amr_pci.c | 17 | ||||
-rw-r--r-- | sys/dev/amr/amr_tables.h | 7 | ||||
-rw-r--r-- | sys/dev/amr/amrio.h | 7 | ||||
-rw-r--r-- | sys/dev/amr/amrreg.h | 7 | ||||
-rw-r--r-- | sys/dev/amr/amrvar.h | 8 | ||||
-rw-r--r-- | sys/modules/amr/Makefile | 2 |
11 files changed, 216 insertions, 72 deletions
diff --git a/sys/conf/files b/sys/conf/files index e2784d61..2bace6d 100644 --- a/sys/conf/files +++ b/sys/conf/files @@ -278,6 +278,7 @@ dev/aic7xxx/ahd_pci.c optional ahd pci dev/aic7xxx/aic79xx.c optional ahd pci dev/aic7xxx/aic79xx_osm.c optional ahd pci dev/aic7xxx/aic79xx_pci.c optional ahd pci +dev/amr/amr_cam.c optional amr dev/amr/amr.c optional amr dev/amr/amr_disk.c optional amr dev/amr/amr_pci.c optional amr diff --git a/sys/dev/amr/amr.c b/sys/dev/amr/amr.c index 44c0a2d..379c67f 100644 --- a/sys/dev/amr/amr.c +++ b/sys/dev/amr/amr.c @@ -24,6 +24,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * 3. The party using or redistributing the source code and binary forms + * agrees to the above disclaimer and the terms and conditions set forth + * herein. + * + * Additional Copyright (c) 2002 by Eric Moore under same license. + * Additional Copyright (c) 2002 LSI Logic Corporation + * * $FreeBSD$ */ @@ -203,14 +210,12 @@ amr_attach(struct amr_softc *sc) debug(2, "controller query complete"); -#ifdef AMR_SCSI_PASSTHROUGH /* * Attach our 'real' SCSI channels to CAM. */ if (amr_cam_attach(sc)) return(ENXIO); debug(2, "CAM attach done"); -#endif /* * Create the control device. @@ -307,10 +312,8 @@ amr_free(struct amr_softc *sc) { struct amr_command_cluster *acc; -#ifdef AMR_SCSI_PASSTHROUGH /* detach from CAM */ amr_cam_detach(sc); -#endif /* cancel status timeout */ untimeout(amr_periodic, sc, sc->amr_timeout); @@ -340,7 +343,7 @@ amr_submit_bio(struct amr_softc *sc, struct bio *bio) * Accept an open operation on the control device. */ static int -amr_open(dev_t dev, int flags, int fmt, struct thread *td) +amr_open(dev_t dev, int flags, int fmt, d_thread_t *td) { int unit = minor(dev); struct amr_softc *sc = devclass_get_softc(devclass_find("amr"), unit); @@ -355,7 +358,7 @@ amr_open(dev_t dev, int flags, int fmt, struct thread *td) * Accept the last close on the control device. */ static int -amr_close(dev_t dev, int flags, int fmt, struct thread *td) +amr_close(dev_t dev, int flags, int fmt, d_thread_t *td) { int unit = minor(dev); struct amr_softc *sc = devclass_get_softc(devclass_find("amr"), unit); @@ -370,7 +373,7 @@ amr_close(dev_t dev, int flags, int fmt, struct thread *td) * Handle controller-specific control operations. */ static int -amr_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, struct thread *td) +amr_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) { struct amr_softc *sc = (struct amr_softc *)dev->si_drv1; int *arg = (int *)addr; @@ -431,6 +434,7 @@ amr_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, struct thread *td) ap->ap_channel = au->au_cmd[ap->ap_cdb_length + 5]; ap->ap_scsi_id = au->au_cmd[ap->ap_cdb_length + 6]; ap->ap_request_sense_length = 14; + ap->ap_data_transfer_length = au->au_length; /* XXX what about the request-sense area? does the caller want it? */ /* build command */ @@ -478,7 +482,7 @@ amr_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, struct thread *td) debug(2, "%16D", dp, " "); au->au_status = ac->ac_status; break; - + default: debug(1, "unknown ioctl 0x%lx", cmd); error = ENOIOCTL; @@ -719,12 +723,10 @@ amr_startio(struct amr_softc *sc) if (ac == NULL) (void)amr_bio_command(sc, &ac); -#ifdef AMR_SCSI_PASSTHROUGH /* if that failed, build a command from a ccb */ if (ac == NULL) (void)amr_cam_command(sc, &ac); -#endif - + /* if we don't have anything to do, give up */ if (ac == NULL) break; @@ -960,8 +962,10 @@ amr_setup_dmamap(void *arg, bus_dma_segment_t *segs, int nsegments, int error) /* decide whether we need to populate the s/g table */ if (nsegments < 2) { *sgc = 0; + ac->ac_mailbox.mb_nsgelem = 0; ac->ac_mailbox.mb_physaddr = ac->ac_dataphys; } else { + ac->ac_mailbox.mb_nsgelem = nsegments; *sgc = nsegments; ac->ac_mailbox.mb_physaddr = sc->amr_sgbusaddr + (ac->ac_slot * AMR_NSEG * sizeof(struct amr_sgentry)); for (i = 0; i < nsegments; i++, sg++) { @@ -974,31 +978,33 @@ amr_setup_dmamap(void *arg, bus_dma_segment_t *segs, int nsegments, int error) static void amr_setup_ccbmap(void *arg, bus_dma_segment_t *segs, int nsegments, int error) { - struct amr_command *ac = (struct amr_command *)arg; - struct amr_softc *sc = ac->ac_sc; - struct amr_sgentry *sg; - struct amr_passthrough *ap = (struct amr_passthrough *)ac->ac_data; - int i; + struct amr_command *ac = (struct amr_command *)arg; + struct amr_softc *sc = ac->ac_sc; + struct amr_sgentry *sg; + struct amr_passthrough *ap = (struct amr_passthrough *)ac->ac_data; + int i; /* get base address of s/g table */ sg = sc->amr_sgtable + (ac->ac_slot * AMR_NSEG); - /* save s/g table information in passthrough */ - ap->ap_no_sg_elements = nsegments; - ap->ap_data_transfer_address = sc->amr_sgbusaddr + (ac->ac_slot * AMR_NSEG * sizeof(struct amr_sgentry)); - - /* save pointer to passthrough in command XXX is this already done above? */ - ac->ac_mailbox.mb_physaddr = ac->ac_dataphys; + /* decide whether we need to populate the s/g table */ + if (nsegments < 2) { + ap->ap_no_sg_elements = 0; + ap->ap_data_transfer_address = segs[0].ds_addr; + } else { + /* save s/g table information in passthrough */ + ap->ap_no_sg_elements = nsegments; + ap->ap_data_transfer_address = sc->amr_sgbusaddr + (ac->ac_slot * AMR_NSEG * sizeof(struct amr_sgentry)); + /* populate s/g table (overwrites previous call which mapped the passthrough) */ + for (i = 0; i < nsegments; i++, sg++) { + sg->sg_addr = segs[i].ds_addr; + sg->sg_count = segs[i].ds_len; + debug(3, " %d: 0x%x/%d", i, sg->sg_addr, sg->sg_count); + } + } debug(3, "slot %d %d segments at 0x%x, passthrough at 0x%x", ac->ac_slot, - ap->ap_no_sg_elements, ap->ap_data_transfer_address, ac->ac_dataphys); - - /* populate s/g table (overwrites previous call which mapped the passthrough) */ - for (i = 0; i < nsegments; i++, sg++) { - sg->sg_addr = segs[i].ds_addr; - sg->sg_count = segs[i].ds_len; - debug(3, " %d: 0x%x/%d", i, sg->sg_addr, sg->sg_count); - } + ap->ap_no_sg_elements, ap->ap_data_transfer_address, ac->ac_dataphys); } static void @@ -1013,7 +1019,7 @@ amr_mapcmd(struct amr_command *ac) if (ac->ac_data != NULL) { /* map the data buffers into bus space and build the s/g list */ - bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_dmamap, ac->ac_data, ac->ac_length, + bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_dmamap, ac->ac_data, ac->ac_length, amr_setup_dmamap, ac, 0); if (ac->ac_flags & AMR_CMD_DATAIN) bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_dmamap, BUS_DMASYNC_PREREAD); @@ -1022,7 +1028,7 @@ amr_mapcmd(struct amr_command *ac) } if (ac->ac_ccb_data != NULL) { - bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_ccb_dmamap, ac->ac_ccb_data, ac->ac_ccb_length, + bus_dmamap_load(sc->amr_buffer_dmat, ac->ac_ccb_dmamap, ac->ac_ccb_data, ac->ac_ccb_length, amr_setup_ccbmap, ac, 0); if (ac->ac_flags & AMR_CMD_CCB_DATAIN) bus_dmamap_sync(sc->amr_buffer_dmat, ac->ac_ccb_dmamap, BUS_DMASYNC_PREREAD); @@ -1071,7 +1077,7 @@ amr_start(struct amr_command *ac) { struct amr_softc *sc = ac->ac_sc; int done, s, i; - + debug_called(3); /* mark command as busy so that polling consumer can tell */ @@ -1541,7 +1547,7 @@ amr_describe_controller(struct amr_softc *sc) * Try to get 40LD product info, which tells us what the card is labelled as. */ if ((ap = amr_enquiry(sc, 2048, AMR_CMD_CONFIG, AMR_CONFIG_PRODUCT_INFO, 0)) != NULL) { - device_printf(sc->amr_dev, "<%.80s> Firmware %.16s, BIOS %.16s, %dMB RAM\n", + device_printf(sc->amr_dev, "<LSILogic %.80s> Firmware %.16s, BIOS %.16s, %dMB RAM\n", ap->ap_product, ap->ap_firmware, ap->ap_bios, ap->ap_memsize); diff --git a/sys/dev/amr/amr_cam.c b/sys/dev/amr/amr_cam.c index b8d7be4..0a6eda8 100644 --- a/sys/dev/amr/amr_cam.c +++ b/sys/dev/amr/amr_cam.c @@ -24,6 +24,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * 3. The party using or redistributing the source code and binary forms + * agrees to the above disclaimer and the terms and conditions set forth + * herein. + * + * Additional Copyright (c) 2002 by Eric Moore under same license. + * Additional Copyright (c) 2002 LSI Logic Corporation + * * $FreeBSD$ */ @@ -119,21 +126,21 @@ amr_cam_attach(struct amr_softc *sc) * Iterate over our channels, registering them with CAM */ for (chn = 0; chn < sc->amr_maxchan; chn++) { - + /* allocate a sim */ if ((sc->amr_cam_sim[chn] = cam_sim_alloc(amr_cam_action, amr_cam_poll, "amr", - sc, + sc, device_get_unit(sc->amr_dev), - 1, + 1, AMR_MAX_SCSI_CMDS, devq)) == NULL) { cam_simq_free(devq); device_printf(sc->amr_dev, "CAM SIM attach failed\n"); return(ENOMEM); } - + /* register the bus ID so we can get it later */ if (xpt_bus_register(sc->amr_cam_sim[chn], chn)) { device_printf(sc->amr_dev, "CAM XPT bus registration failed\n"); @@ -156,7 +163,7 @@ amr_cam_detach(struct amr_softc *sc) int chn, first; for (chn = 0, first = 1; chn < sc->amr_maxchan; chn++) { - + /* * If a sim was allocated for this channel, free it */ @@ -259,27 +266,77 @@ amr_cam_action(struct cam_sim *sim, union ccb *ccb) */ case XPT_PATH_INQ: { - struct ccb_pathinq *cpi = & ccb->cpi; + struct ccb_pathinq *cpi = & ccb->cpi; - cpi->version_num = 1; /* XXX??? */ - cpi->hba_inquiry = PI_SDTR_ABLE; + debug(3, "XPT_PATH_INQ"); + cpi->version_num = 1; /* XXX??? */ + cpi->hba_inquiry = PI_SDTR_ABLE|PI_TAG_ABLE|PI_WIDE_16; cpi->target_sprt = 0; - cpi->hba_misc = 0; + cpi->hba_misc = PIM_NOBUSRESET; cpi->hba_eng_cnt = 0; cpi->max_target = AMR_MAX_TARGETS; - cpi->max_lun = AMR_MAX_LUNS; - cpi->initiator_id = 7; /* XXX variable? */ + cpi->max_lun = 0 /* AMR_MAX_LUNS*/; + cpi->initiator_id = 7; /* XXX variable? */ strncpy(cpi->sim_vid, "FreeBSD", SIM_IDLEN); - strncpy(cpi->hba_vid, "BSDi", HBA_IDLEN); + strncpy(cpi->hba_vid, "LSI", 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 get from controller? */ + cpi->base_transfer_speed = 132 * 1024; /* XXX get from controller? */ cpi->ccb_h.status = CAM_REQ_CMP; break; } + case XPT_RESET_BUS: + { + struct ccb_pathinq *cpi = & ccb->cpi; + + debug(1, "XPT_RESET_BUS"); + cpi->ccb_h.status = CAM_REQ_CMP; + break; + } + + case XPT_RESET_DEV: + { + debug(1, "XPT_RESET_DEV"); + ccb->ccb_h.status = CAM_REQ_CMP; + break; + } + + case XPT_GET_TRAN_SETTINGS: + { + struct ccb_trans_settings *cts; + + debug(3, "XPT_GET_TRAN_SETTINGS"); + + cts = &(ccb->cts); + + if ((cts->flags & CCB_TRANS_USER_SETTINGS) == 0) { + ccb->ccb_h.status = CAM_FUNC_NOTAVAIL; + break; + } + + cts->flags = CCB_TRANS_DISC_ENB|CCB_TRANS_TAG_ENB; + cts->bus_width = MSG_EXT_WDTR_BUS_32_BIT; + cts->sync_period = 6; /* 40MHz how wide is this bus? */ + cts->sync_offset = 31; /* How to extract this from board? */ + + cts->valid = CCB_TRANS_SYNC_RATE_VALID + | CCB_TRANS_SYNC_OFFSET_VALID + | CCB_TRANS_BUS_WIDTH_VALID + | CCB_TRANS_DISC_VALID + | CCB_TRANS_TQ_VALID; + ccb->ccb_h.status = CAM_REQ_CMP; + break; + } + + case XPT_SET_TRAN_SETTINGS: + debug(3, "XPT_SET_TRAN_SETTINGS"); + ccb->ccb_h.status = CAM_FUNC_NOTAVAIL; + break; + + /* * Reject anything else as unsupported. */ @@ -314,7 +371,7 @@ amr_cam_command(struct amr_softc *sc, struct amr_command **acp) bus = csio->ccb_h.sim_priv.entries[0].field; target = csio->ccb_h.target_id; - /* + /* * Build a passthrough command. */ @@ -331,6 +388,7 @@ amr_cam_command(struct amr_softc *sc, struct amr_command **acp) ap->ap_scsi_id = target; ap->ap_logical_drive_no = csio->ccb_h.target_lun; ap->ap_cdb_length = csio->cdb_len; + ap->ap_data_transfer_length = csio->dxfer_len; if (csio->ccb_h.flags & CAM_CDB_POINTER) { bcopy(csio->cdb_io.cdb_ptr, ap->ap_cdb, csio->cdb_len); } else { @@ -390,21 +448,21 @@ amr_cam_poll(struct cam_sim *sim) static void amr_cam_complete(struct amr_command *ac) { - struct amr_passthrough *ap = (struct amr_passthrough *)ac->ac_data; - struct ccb_scsiio *csio = (struct ccb_scsiio *)ac->ac_private; - struct scsi_inquiry_data *inq = (struct scsi_inquiry_data *)csio->data_ptr; + struct amr_passthrough *ap = (struct amr_passthrough *)ac->ac_data; + struct ccb_scsiio *csio = (struct ccb_scsiio *)ac->ac_private; + struct scsi_inquiry_data *inq = (struct scsi_inquiry_data *)csio->data_ptr; /* XXX note that we're ignoring ac->ac_status - good idea? */ debug(1, "status 0x%x scsi_status 0x%x", ac->ac_status, ap->ap_scsi_status); - /* + /* * Hide disks from CAM so that they're not picked up and treated as 'normal' disks. * * If the configuration provides a mechanism to mark a disk a "not managed", we * could add handling for that to allow disks to be selectively visible. */ -#if 0 + if ((ap->ap_cdb[0] == INQUIRY) && (SID_TYPE(inq) == T_DIRECT)) { bzero(csio->data_ptr, csio->dxfer_len); if (ap->ap_scsi_status == 0xf0) { @@ -413,9 +471,6 @@ amr_cam_complete(struct amr_command *ac) csio->ccb_h.status = CAM_DEV_NOT_THERE; } } else { -#else - { -#endif /* handle passthrough SCSI status */ switch(ap->ap_scsi_status) { @@ -434,13 +489,13 @@ amr_cam_complete(struct amr_command *ac) case 0x08: csio->ccb_h.status = CAM_SCSI_BUSY; break; - + case 0xf0: case 0xf4: default: csio->ccb_h.status = CAM_REQ_CMP_ERR; break; - } + } } free(ap, M_DEVBUF); if ((csio->ccb_h.flags & CAM_DIR_MASK) != CAM_DIR_NONE) diff --git a/sys/dev/amr/amr_compat.h b/sys/dev/amr/amr_compat.h index ff517b3..be53867 100644 --- a/sys/dev/amr/amr_compat.h +++ b/sys/dev/amr/amr_compat.h @@ -24,6 +24,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * 3. The party using or redistributing the source code and binary forms + * agrees to the above disclaimer and the terms and conditions set forth + * herein. + * + * Additional Copyright (c) 2002 by Eric Moore under same license. + * Additional Copyright (c) 2002 LSI Logic Corporation + * * $FreeBSD$ */ /* @@ -33,6 +40,7 @@ #if __FreeBSD_version < 500003 /* old buf style */ # include <sys/buf.h> # include <machine/clock.h> +# define INTR_ENTROPY 0 # define FREEBSD_4 # define bio buf @@ -55,8 +63,24 @@ # define BIO_ERROR B_ERROR # define devstat_end_transaction_bio(x, y) devstat_end_transaction_buf(x, y) # define BIO_IS_READ(x) ((x)->b_flags & B_READ) +# define AMR_BIO_FINISH(x) devstat_end_transaction_bio(&sc->amrd_stats, x);\ + biodone(x) #else # include <sys/bio.h> # define BIO_IS_READ(x) ((x)->bio_cmd == BIO_READ) +# define AMR_BIO_FINISH(x) biofinish(x, &sc->amrd_stats, 0) +#endif + +/************************************************************************ + * Compatibility with older versions of FreeBSD + */ +#if __FreeBSD_version < 440001 +typedef struct proc d_thread_t; +#define M_ZERO 0x0008 /* bzero the allocation */ +#endif + + +#ifndef __packed +#define __packed __attribute__ ((packed)) #endif diff --git a/sys/dev/amr/amr_disk.c b/sys/dev/amr/amr_disk.c index e486e87..9f4e343 100644 --- a/sys/dev/amr/amr_disk.c +++ b/sys/dev/amr/amr_disk.c @@ -25,6 +25,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * 3. The party using or redistributing the source code and binary forms + * agrees to the above disclaimer and the terms and conditions set forth + * herein. + * + * Additional Copyright (c) 2002 by Eric Moore under same license. + * Additional Copyright (c) 2002 LSI Logic Corporation + * * $FreeBSD$ */ @@ -100,12 +107,15 @@ static driver_t amrd_driver = { DRIVER_MODULE(amrd, amr, amrd_driver, amrd_devclass, 0, 0); static int -amrd_open(dev_t dev, int flags, int fmt, struct thread *td) +amrd_open(dev_t dev, int flags, int fmt, d_thread_t *td) { struct amrd_softc *sc = (struct amrd_softc *)dev->si_drv1; +#if __FreeBSD_version < 500000 /* old buf style */ + struct disklabel *label; +#endif debug_called(1); - + if (sc == NULL) return (ENXIO); @@ -113,22 +123,34 @@ amrd_open(dev_t dev, int flags, int fmt, struct thread *td) if (sc->amrd_controller->amr_state & AMR_STATE_SHUTDOWN) return(ENXIO); +#if __FreeBSD_version < 500000 /* old buf style */ + label = &sc->amrd_disk.d_label; + bzero(label, sizeof(*label)); + label->d_type = DTYPE_SCSI; + label->d_secsize = AMR_BLKSIZE; + label->d_nsectors = sc->amrd_drive->al_sectors; + label->d_ntracks = sc->amrd_drive->al_heads; + label->d_ncylinders = sc->amrd_drive->al_cylinders; + label->d_secpercyl = sc->amrd_drive->al_sectors * sc->amrd_drive->al_heads; + label->d_secperunit = sc->amrd_drive->al_size; +#else sc->amrd_disk.d_sectorsize = AMR_BLKSIZE; sc->amrd_disk.d_mediasize = (off_t)sc->amrd_drive->al_size * AMR_BLKSIZE; sc->amrd_disk.d_fwsectors = sc->amrd_drive->al_sectors; sc->amrd_disk.d_fwheads = sc->amrd_drive->al_heads; +#endif sc->amrd_flags |= AMRD_OPEN; return (0); } static int -amrd_close(dev_t dev, int flags, int fmt, struct thread *td) +amrd_close(dev_t dev, int flags, int fmt, d_thread_t *td) { struct amrd_softc *sc = (struct amrd_softc *)dev->si_drv1; debug_called(1); - + if (sc == NULL) return (ENXIO); sc->amrd_flags &= ~AMRD_OPEN; @@ -136,7 +158,7 @@ amrd_close(dev_t dev, int flags, int fmt, struct thread *td) } static int -amrd_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, struct thread *td) +amrd_ioctl(dev_t dev, u_long cmd, caddr_t addr, int32_t flag, d_thread_t *td) { return (ENOTTY); @@ -189,7 +211,7 @@ amrd_intr(void *data) bio->bio_resid = 0; } - biofinish(bio, &sc->amrd_stats, 0); + AMR_BIO_FINISH(bio); } static int @@ -197,8 +219,8 @@ amrd_probe(device_t dev) { debug_called(1); - - device_set_desc(dev, "MegaRAID logical drive"); + + device_set_desc(dev, "LSILogic MegaRAID logical drive"); return (0); } diff --git a/sys/dev/amr/amr_pci.c b/sys/dev/amr/amr_pci.c index e01c10b..8c7995e 100644 --- a/sys/dev/amr/amr_pci.c +++ b/sys/dev/amr/amr_pci.c @@ -24,6 +24,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * 3. The party using or redistributing the source code and binary forms + * agrees to the above disclaimer and the terms and conditions set forth + * herein. + * + * Additional Copyright (c) 2002 by Eric Moore under same license. + * Additional Copyright (c) 2002 LSI Logic Corporation + * * $FreeBSD$ */ @@ -86,7 +93,7 @@ static driver_t amr_pci_driver = { static devclass_t amr_devclass; DRIVER_MODULE(amr, pci, amr_pci_driver, amr_devclass, 0, 0); -static struct +static struct { int vendor; int device; @@ -97,11 +104,11 @@ static struct {0x101e, 0x9060, 0}, {0x8086, 0x1960, PROBE_SIGNATURE},/* generic i960RD, check for signature */ {0x101e, 0x1960, 0}, - {0x1000, 0x1960, 0}, + {0x1000, 0x1960, PROBE_SIGNATURE}, {0x1000, 0x0407, 0}, {0, 0, 0} }; - + static int amr_pci_probe(device_t dev) { @@ -119,7 +126,7 @@ amr_pci_probe(device_t dev) if ((sig != AMR_SIGNATURE_1) && (sig != AMR_SIGNATURE_2)) continue; } - device_set_desc(dev, "AMI MegaRAID"); + device_set_desc(dev, "LSILogic MegaRAID"); return(-10); /* allow room to be overridden */ } } @@ -149,7 +156,7 @@ amr_pci_attach(device_t dev) * Determine board type. */ command = pci_read_config(dev, PCIR_COMMAND, 1); - if (pci_get_device(dev) == 0x1960) { + if ((pci_get_device(dev) == 0x1960) || (pci_get_device(dev) == 0x0407)){ /* * Make sure we are going to be able to talk to this board. */ diff --git a/sys/dev/amr/amr_tables.h b/sys/dev/amr/amr_tables.h index d6e9993..f2ce1d3 100644 --- a/sys/dev/amr/amr_tables.h +++ b/sys/dev/amr/amr_tables.h @@ -24,6 +24,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * 3. The party using or redistributing the source code and binary forms + * agrees to the above disclaimer and the terms and conditions set forth + * herein. + * + * Additional Copyright (c) 2002 by Eric Moore under same license. + * Additional Copyright (c) 2002 LSI Logic Corporation + * * $FreeBSD$ */ diff --git a/sys/dev/amr/amrio.h b/sys/dev/amr/amrio.h index 757e81c..e319573 100644 --- a/sys/dev/amr/amrio.h +++ b/sys/dev/amr/amrio.h @@ -23,6 +23,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * 3. The party using or redistributing the source code and binary forms + * agrees to the above disclaimer and the terms and conditions set forth + * herein. + * + * Additional Copyright (c) 2002 by Eric Moore under same license. + * Additional Copyright (c) 2002 LSI Logic Corporation + * * $FreeBSD$ */ diff --git a/sys/dev/amr/amrreg.h b/sys/dev/amr/amrreg.h index 61fb501..7abfe0f 100644 --- a/sys/dev/amr/amrreg.h +++ b/sys/dev/amr/amrreg.h @@ -24,6 +24,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * 3. The party using or redistributing the source code and binary forms + * agrees to the above disclaimer and the terms and conditions set forth + * herein. + * + * Additional Copyright (c) 2002 by Eric Moore under same license. + * Additional Copyright (c) 2002 LSI Logic Corporation + * * $FreeBSD$ */ diff --git a/sys/dev/amr/amrvar.h b/sys/dev/amr/amrvar.h index ad08b67..2c54824 100644 --- a/sys/dev/amr/amrvar.h +++ b/sys/dev/amr/amrvar.h @@ -24,6 +24,13 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * + * 3. The party using or redistributing the source code and binary forms + * agrees to the above disclaimer and the terms and conditions set forth + * herein. + * + * Additional Copyright (c) 2002 by Eric Moore under same license. + * Additional Copyright (c) 2002 LSI Logic Corporation + * * $FreeBSD$ */ @@ -103,6 +110,7 @@ struct amr_command u_int32_t ac_ccb_dataphys; void (* ac_complete)(struct amr_command *ac); + void *ac_private; }; struct amr_command_cluster diff --git a/sys/modules/amr/Makefile b/sys/modules/amr/Makefile index b014d27..53045c8 100644 --- a/sys/modules/amr/Makefile +++ b/sys/modules/amr/Makefile @@ -7,7 +7,7 @@ SRCS= amr.c amr_pci.c amr_disk.c device_if.h bus_if.h pci_if.h # SCSI passthrough support for non-disk devices #CFLAGS+= -DAMR_SCSI_PASSTHROUGH -#SRCS+= amr_cam.c opt_cam.h opt_scsi.h +SRCS+= amr_cam.c opt_cam.h opt_scsi.h # Enable a questionable optimisation for newer adapters #CFLAGS+= -DAMR_QUARTZ_GOFASTER |