diff --git a/sys/dev/aac/aac.c b/sys/dev/aac/aac.c index dd50a5c52f83..d7355899de2c 100644 --- a/sys/dev/aac/aac.c +++ b/sys/dev/aac/aac.c @@ -105,7 +105,7 @@ static void aac_fa_clear_istatus(struct aac_softc *sc, int mask); static void aac_fa_set_mailbox(struct aac_softc *sc, u_int32_t command, u_int32_t arg0, u_int32_t arg1, u_int32_t arg2, u_int32_t arg3); -static int aac_fa_get_mailboxstatus(struct aac_softc *sc); +static int aac_fa_get_mailbox(struct aac_softc *sc, int mb); static void aac_fa_set_interrupts(struct aac_softc *sc, int enable); struct aac_interface aac_fa_interface = { @@ -114,7 +114,7 @@ struct aac_interface aac_fa_interface = { aac_fa_get_istatus, aac_fa_clear_istatus, aac_fa_set_mailbox, - aac_fa_get_mailboxstatus, + aac_fa_get_mailbox, aac_fa_set_interrupts }; @@ -126,7 +126,7 @@ static void aac_sa_clear_istatus(struct aac_softc *sc, int mask); static void aac_sa_set_mailbox(struct aac_softc *sc, u_int32_t command, u_int32_t arg0, u_int32_t arg1, u_int32_t arg2, u_int32_t arg3); -static int aac_sa_get_mailboxstatus(struct aac_softc *sc); +static int aac_sa_get_mailbox(struct aac_softc *sc, int mb); static void aac_sa_set_interrupts(struct aac_softc *sc, int enable); struct aac_interface aac_sa_interface = { @@ -135,7 +135,7 @@ struct aac_interface aac_sa_interface = { aac_sa_get_istatus, aac_sa_clear_istatus, aac_sa_set_mailbox, - aac_sa_get_mailboxstatus, + aac_sa_get_mailbox, aac_sa_set_interrupts }; @@ -147,7 +147,7 @@ static void aac_rx_clear_istatus(struct aac_softc *sc, int mask); static void aac_rx_set_mailbox(struct aac_softc *sc, u_int32_t command, u_int32_t arg0, u_int32_t arg1, u_int32_t arg2, u_int32_t arg3); -static int aac_rx_get_mailboxstatus(struct aac_softc *sc); +static int aac_rx_get_mailbox(struct aac_softc *sc, int mb); static void aac_rx_set_interrupts(struct aac_softc *sc, int enable); struct aac_interface aac_rx_interface = { @@ -156,7 +156,7 @@ struct aac_interface aac_rx_interface = { aac_rx_get_istatus, aac_rx_clear_istatus, aac_rx_set_mailbox, - aac_rx_get_mailboxstatus, + aac_rx_get_mailbox, aac_rx_set_interrupts }; @@ -288,7 +288,7 @@ aac_attach(struct aac_softc *sc) "shutdown event registration failed\n"); /* Register with CAM for the non-DASD devices */ - if (!(sc->quirks & AAC_QUIRK_NOCAM)) { + if ((sc->flags & AAC_FLAGS_ENABLE_CAM) != 0) { TAILQ_INIT(&sc->aac_sim_tqh); aac_get_bus_info(sc); } @@ -1104,12 +1104,14 @@ aac_alloc_commands(struct aac_softc *sc) uint32_t fibphys; int i, error; - debug_called(1); + debug_called(2); - if (sc->total_fibs + AAC_FIB_COUNT > AAC_MAX_FIBS) + if (sc->total_fibs + AAC_FIB_COUNT > sc->aac_max_fibs) return (ENOMEM); fm = malloc(sizeof(struct aac_fibmap), M_AACBUF, M_NOWAIT|M_ZERO); + if (fm == NULL) + return (ENOMEM); /* allocate the FIBs in DMAable memory and load them */ if (bus_dmamem_alloc(sc->aac_fib_dmat, (void **)&fm->aac_fibs, @@ -1144,6 +1146,7 @@ aac_alloc_commands(struct aac_softc *sc) if (i > 0) { TAILQ_INSERT_TAIL(&sc->aac_fibmap_tqh, fm, fm_link); + debug(1, "total_fibs= %d\n", sc->total_fibs); return (0); } @@ -1292,18 +1295,18 @@ aac_common_map(void *arg, bus_dma_segment_t *segs, int nseg, int error) sc->aac_common_busaddr = segs[0].ds_addr; } -/* - * Retrieve the firmware version numbers. Dell PERC2/QC cards with - * firmware version 1.x are not compatible with this driver. - */ static int aac_check_firmware(struct aac_softc *sc) { - u_int32_t major, minor; + u_int32_t major, minor, options; debug_called(1); - if (sc->quirks & AAC_QUIRK_PERC2QC) { + /* + * Retrieve the firmware version numbers. Dell PERC2/QC cards with + * firmware version 1.x are not compatible with this driver. + */ + if (sc->flags & AAC_FLAGS_PERC2QC) { if (aac_sync_command(sc, AAC_MONKER_GETKERNVER, 0, 0, 0, 0, NULL)) { device_printf(sc->aac_dev, @@ -1312,8 +1315,8 @@ aac_check_firmware(struct aac_softc *sc) } /* These numbers are stored as ASCII! */ - major = (AAC_GETREG4(sc, AAC_SA_MAILBOX + 4) & 0xff) - 0x30; - minor = (AAC_GETREG4(sc, AAC_SA_MAILBOX + 8) & 0xff) - 0x30; + major = (AAC_GET_MAILBOX(sc, 1) & 0xff) - 0x30; + minor = (AAC_GET_MAILBOX(sc, 2) & 0xff) - 0x30; if (major == 1) { device_printf(sc->aac_dev, "Firmware version %d.%d is not supported.\n", @@ -1322,6 +1325,35 @@ aac_check_firmware(struct aac_softc *sc) } } + /* + * Retrieve the capabilities/supported options word so we know what + * work-arounds to enable. + */ + if (aac_sync_command(sc, AAC_MONKER_GETINFO, 0, 0, 0, 0, NULL)) { + device_printf(sc->aac_dev, "RequestAdapterInfo failed\n"); + return (EIO); + } + options = AAC_GET_MAILBOX(sc, 1); + sc->supported_options = options; + + if ((options & AAC_SUPPORTED_4GB_WINDOW) != 0 && + (sc->flags & AAC_FLAGS_NO4GB) == 0) + sc->flags |= AAC_FLAGS_4GB_WINDOW; + if (options & AAC_SUPPORTED_NONDASD) + sc->flags |= AAC_FLAGS_ENABLE_CAM; +#if 0 + if (options & AAC_SUPPORTED_SGMAP_HOST64 && sizeof(bus_addr_t) > 4) { + device_printf(sc->aac_dev, "Enabling 64-bit address support\n"); + sc->flags |= AAC_FLAGS_SG_64BIT; + } +#endif + + /* Check for broken hardware that does a lower number of commands */ + if ((sc->flags & AAC_FLAGS_256FIBS) == 0) + sc->aac_max_fibs = AAC_MAX_FIBS; + else + sc->aac_max_fibs = 256; + return (0); } @@ -1332,6 +1364,7 @@ aac_init(struct aac_softc *sc) time_t then; u_int32_t code; u_int8_t *qaddr; + int error; debug_called(1); @@ -1358,27 +1391,70 @@ aac_init(struct aac_softc *sc) } } while (!(code & AAC_UP_AND_RUNNING)); + error = ENOMEM; + /* + * Create DMA tag for mapping buffers into controller-addressable space. + */ + if (bus_dma_tag_create(sc->aac_parent_dmat, /* parent */ + 1, 0, /* algnmnt, boundary */ + (sc->flags & AAC_FLAGS_SG_64BIT) ? + BUS_SPACE_MAXADDR : + BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + MAXBSIZE, /* maxsize */ + AAC_MAXSGENTRIES, /* nsegments */ + MAXBSIZE, /* maxsegsize */ + BUS_DMA_ALLOCNOW, /* flags */ + &sc->aac_buffer_dmat)) { + device_printf(sc->aac_dev, "can't allocate buffer DMA tag\n"); + goto out; + } + + /* + * Create DMA tag for mapping FIBs into controller-addressable space.. + */ + if (bus_dma_tag_create(sc->aac_parent_dmat, /* parent */ + 1, 0, /* algnmnt, boundary */ + (sc->flags & AAC_FLAGS_4GB_WINDOW) ? + BUS_SPACE_MAXADDR_32BIT : + 0x7fffffff, /* lowaddr */ + BUS_SPACE_MAXADDR, /* highaddr */ + NULL, NULL, /* filter, filterarg */ + AAC_FIB_COUNT * + sizeof(struct aac_fib), /* maxsize */ + 1, /* nsegments */ + AAC_FIB_COUNT * + sizeof(struct aac_fib), /* maxsegsize */ + BUS_DMA_ALLOCNOW, /* flags */ + &sc->aac_fib_dmat)) { + device_printf(sc->aac_dev, "can't allocate FIB DMA tag\n");; + goto out; + } + /* * Create DMA tag for the common structure and allocate it. */ if (bus_dma_tag_create(sc->aac_parent_dmat, /* parent */ 1, 0, /* algnmnt, boundary */ - BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ + (sc->flags & AAC_FLAGS_4GB_WINDOW) ? + BUS_SPACE_MAXADDR_32BIT : + 0x7fffffff, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ 8192 + sizeof(struct aac_common), /* maxsize */ 1, /* nsegments */ BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ + BUS_DMA_ALLOCNOW, /* flags */ &sc->aac_common_dmat)) { device_printf(sc->aac_dev, "can't allocate common structure DMA tag\n"); - return(ENOMEM); + goto out; } if (bus_dmamem_alloc(sc->aac_common_dmat, (void **)&sc->aac_common, BUS_DMA_NOWAIT, &sc->aac_common_dmamap)) { device_printf(sc->aac_dev, "can't allocate common structure\n"); - return(ENOMEM); + goto out; } /* @@ -1406,7 +1482,7 @@ aac_init(struct aac_softc *sc) break; } if (sc->total_fibs == 0) - return (ENOMEM); + goto out; /* * Fill in the init structure. This tells the adapter about the @@ -1520,10 +1596,13 @@ aac_init(struct aac_softc *sc) NULL)) { device_printf(sc->aac_dev, "error establishing init structure\n"); - return(EIO); + error = EIO; + goto out; } - return(0); + error = 0; +out: + return(error); } /* @@ -1552,7 +1631,7 @@ aac_sync_command(struct aac_softc *sc, u_int32_t command, then = time_second; do { if (time_second > (then + AAC_IMMEDIATE_TIMEOUT)) { - debug(2, "timed out"); + debug(1, "timed out"); return(EIO); } } while (!(AAC_GET_ISTATUS(sc) & AAC_DB_SYNC_COMMAND)); @@ -1561,7 +1640,7 @@ aac_sync_command(struct aac_softc *sc, u_int32_t command, AAC_CLEAR_ISTATUS(sc, AAC_DB_SYNC_COMMAND); /* get the command status */ - status = AAC_GET_MAILBOXSTATUS(sc); + status = AAC_GET_MAILBOX(sc, 0); if (sp != NULL) *sp = status; return(0); @@ -2023,29 +2102,29 @@ aac_fa_set_mailbox(struct aac_softc *sc, u_int32_t command, * Fetch the immediate command status word */ static int -aac_sa_get_mailboxstatus(struct aac_softc *sc) +aac_sa_get_mailbox(struct aac_softc *sc, int mb) { debug_called(4); - return(AAC_GETREG4(sc, AAC_SA_MAILBOX)); + return(AAC_GETREG4(sc, AAC_SA_MAILBOX + (mb * 4))); } static int -aac_rx_get_mailboxstatus(struct aac_softc *sc) +aac_rx_get_mailbox(struct aac_softc *sc, int mb) { debug_called(4); - return(AAC_GETREG4(sc, AAC_RX_MAILBOX)); + return(AAC_GETREG4(sc, AAC_RX_MAILBOX + (mb * 4))); } static int -aac_fa_get_mailboxstatus(struct aac_softc *sc) +aac_fa_get_mailbox(struct aac_softc *sc, int mb) { int val; debug_called(4); - val = AAC_GETREG4(sc, AAC_FA_MAILBOX); + val = AAC_GETREG4(sc, AAC_FA_MAILBOX + (mb * 4)); return (val); } @@ -2113,7 +2192,7 @@ aac_describe_controller(struct aac_softc *sc) aac_release_sync_fib(sc); return; } - info = (struct aac_adapter_info *)&fib->data[0]; + info = (struct aac_adapter_info *)&fib->data[0]; device_printf(sc->aac_dev, "%s %dMHz, %dMB cache memory, %s\n", aac_describe_code(aac_cpu_variant, info->CpuVariant), @@ -2131,6 +2210,25 @@ aac_describe_controller(struct aac_softc *sc) (u_int32_t)(info->SerialNumber & 0xffffff)); aac_release_sync_fib(sc); + + if (1 || bootverbose) { + device_printf(sc->aac_dev, "Supported Options=%b\n", + sc->supported_options, + "\20" + "\1SNAPSHOT" + "\2CLUSTERS" + "\3WCACHE" + "\4DATA64" + "\5HOSTTIME" + "\6RAID50" + "\7WINDOW4GB" + "\10SCSIUPGD" + "\11SOFTERR" + "\12NORECOND" + "\13SGMAP64" + "\14ALARM" + "\15NONDASD"); + } } /* diff --git a/sys/dev/aac/aac_cam.c b/sys/dev/aac/aac_cam.c index d822dca96525..8386aed305f9 100644 --- a/sys/dev/aac/aac_cam.c +++ b/sys/dev/aac/aac_cam.c @@ -259,7 +259,7 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb) xpt_done(ccb); return; case XPT_RESET_BUS: - if (!(sc->quirks & AAC_QUIRK_CAM_NORESET)) { + if (!(sc->flags & AAC_FLAGS_CAM_NORESET)) { ccb->ccb_h.status = aac_cam_reset_bus(sim, ccb); } else { ccb->ccb_h.status = CAM_REQ_CMP; @@ -366,7 +366,7 @@ aac_cam_action(struct cam_sim *sim, union ccb *ccb) break; } case XPT_RESET_DEV: - if (!(sc->quirks & AAC_QUIRK_CAM_NORESET)) { + if (!(sc->flags & AAC_FLAGS_CAM_NORESET)) { srb->function = AAC_SRB_FUNC_RESET_DEVICE; break; } else { @@ -476,7 +476,7 @@ aac_cam_complete(struct aac_command *cm) */ if ((device == T_DIRECT) || (device == T_PROCESSOR) || - (sc->quirks & AAC_QUIRK_CAM_PASSONLY)) + (sc->flags & AAC_FLAGS_CAM_PASSONLY)) ccb->csio.data_ptr[0] = ((device & 0xe0) | T_NODEVICE); } diff --git a/sys/dev/aac/aac_pci.c b/sys/dev/aac/aac_pci.c index 85fed9d7d89a..8875502715a0 100644 --- a/sys/dev/aac/aac_pci.c +++ b/sys/dev/aac/aac_pci.c @@ -92,40 +92,40 @@ struct aac_ident int quirks; char *desc; } aac_identifiers[] = { - {0x1028, 0x0001, 0x1028, 0x0001, AAC_HWIF_I960RX, AAC_QUIRK_NOCAM, + {0x1028, 0x0001, 0x1028, 0x0001, AAC_HWIF_I960RX, 0, "Dell PERC 2/Si"}, - {0x1028, 0x0002, 0x1028, 0x0002, AAC_HWIF_I960RX, AAC_QUIRK_NOCAM, + {0x1028, 0x0002, 0x1028, 0x0002, AAC_HWIF_I960RX, 0, "Dell PERC 3/Di"}, - {0x1028, 0x0003, 0x1028, 0x0003, AAC_HWIF_I960RX, AAC_QUIRK_NOCAM, + {0x1028, 0x0003, 0x1028, 0x0003, AAC_HWIF_I960RX, 0, "Dell PERC 3/Si"}, - {0x1028, 0x0004, 0x1028, 0x00d0, AAC_HWIF_I960RX, AAC_QUIRK_NOCAM, + {0x1028, 0x0004, 0x1028, 0x00d0, AAC_HWIF_I960RX, 0, "Dell PERC 3/Si"}, - {0x1028, 0x0002, 0x1028, 0x00d1, AAC_HWIF_I960RX, AAC_QUIRK_NOCAM, + {0x1028, 0x0002, 0x1028, 0x00d1, AAC_HWIF_I960RX, 0, "Dell PERC 3/Di"}, - {0x1028, 0x0002, 0x1028, 0x00d9, AAC_HWIF_I960RX, AAC_QUIRK_NOCAM, + {0x1028, 0x0002, 0x1028, 0x00d9, AAC_HWIF_I960RX, 0, "Dell PERC 3/Di"}, - {0x1028, 0x0008, 0x1028, 0x00cf, AAC_HWIF_I960RX, AAC_QUIRK_NOCAM, + {0x1028, 0x0008, 0x1028, 0x00cf, AAC_HWIF_I960RX, 0, "Dell PERC 3/Di"}, - {0x1028, 0x000a, 0x1028, 0x0106, AAC_HWIF_I960RX, AAC_QUIRK_NOCAM, + {0x1028, 0x000a, 0x1028, 0x0106, AAC_HWIF_I960RX, 0, "Dell PERC 3/Di"}, - {0x1028, 0x000a, 0x1028, 0x011b, AAC_HWIF_I960RX, AAC_QUIRK_NOCAM, + {0x1028, 0x000a, 0x1028, 0x011b, AAC_HWIF_I960RX, 0, "Dell PERC 3/Di"}, - {0x1028, 0x000a, 0x1028, 0x0121, AAC_HWIF_I960RX, AAC_QUIRK_NOCAM, + {0x1028, 0x000a, 0x1028, 0x0121, AAC_HWIF_I960RX, 0, "Dell PERC 3/Di"}, - {0x1011, 0x0046, 0x9005, 0x0364, AAC_HWIF_STRONGARM, AAC_QUIRK_NOCAM, + {0x1011, 0x0046, 0x9005, 0x0364, AAC_HWIF_STRONGARM, 0, "Adaptec AAC-364"}, - {0x1011, 0x0046, 0x9005, 0x0365, AAC_HWIF_STRONGARM, AAC_QUIRK_NOCAM, + {0x1011, 0x0046, 0x9005, 0x0365, AAC_HWIF_STRONGARM, 0, "Adaptec SCSI RAID 5400S"}, - {0x1011, 0x0046, 0x9005, 0x1364, AAC_HWIF_STRONGARM, AAC_QUIRK_NOCAM | - AAC_QUIRK_PERC2QC, "Dell PERC 2/QC"}, - {0x1011, 0x0046, 0x103c, 0x10c2, AAC_HWIF_STRONGARM, AAC_QUIRK_NOCAM, + {0x1011, 0x0046, 0x9005, 0x1364, AAC_HWIF_STRONGARM, AAC_FLAGS_PERC2QC, + "Dell PERC 2/QC"}, + {0x1011, 0x0046, 0x103c, 0x10c2, AAC_HWIF_STRONGARM, 0, "HP NetRaid-4M"}, - {0x9005, 0x0285, 0x9005, 0x0285, AAC_HWIF_I960RX, 0, - "Adaptec SCSI RAID 2200S"}, - {0x9005, 0x0285, 0x1028, 0x0287, AAC_HWIF_I960RX, 0, - "Dell PERC 320/DC"}, - {0x9005, 0x0285, 0x9005, 0x0286, AAC_HWIF_I960RX, 0, - "Adaptec SCSI RAID 2120S"}, + {0x9005, 0x0285, 0x9005, 0x0285, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB | + AAC_FLAGS_256FIBS, "Adaptec SCSI RAID 2200S"}, + {0x9005, 0x0285, 0x1028, 0x0287, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB | + AAC_FLAGS_256FIBS, "Dell PERC 320/DC"}, + {0x9005, 0x0285, 0x9005, 0x0286, AAC_HWIF_I960RX, AAC_FLAGS_NO4GB | + AAC_FLAGS_256FIBS, "Adaptec SCSI RAID 2120S"}, {0, 0, 0, 0, 0, 0, 0} }; @@ -239,51 +239,18 @@ aac_pci_attach(device_t dev) */ if (bus_dma_tag_create(NULL, /* parent */ PAGE_SIZE, 0, /* algnmnt, boundary */ - BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ + BUS_SPACE_MAXADDR, /* lowaddr */ BUS_SPACE_MAXADDR, /* highaddr */ NULL, NULL, /* filter, filterarg */ - MAXBSIZE, /* maxsize */ + BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ AAC_MAXSGENTRIES, /* nsegments */ BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - BUS_DMA_ALLOCNOW, /* flags */ + 0, /* flags */ &sc->aac_parent_dmat)) { device_printf(sc->aac_dev, "can't allocate parent DMA tag\n"); goto out; } - /* - * Create DMA tag for mapping buffers into controller-addressable space. - */ - if (bus_dma_tag_create(sc->aac_parent_dmat, /* parent */ - 1, 0, /* algnmnt, boundary */ - BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - MAXBSIZE, AAC_MAXSGENTRIES, /* maxsize, nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - &sc->aac_buffer_dmat)) { - device_printf(sc->aac_dev, "can't allocate buffer DMA tag\n"); - goto out; - } - - /* - * Create DMA tag for mapping FIBs into controller-addressable space.. - */ - if (bus_dma_tag_create(sc->aac_parent_dmat, /* parent */ - 1, 0, /* algnmnt, boundary */ - BUS_SPACE_MAXADDR_32BIT, /* lowaddr */ - BUS_SPACE_MAXADDR, /* highaddr */ - NULL, NULL, /* filter, filterarg */ - AAC_FIB_COUNT * - sizeof(struct aac_fib), 1, /* maxsize, nsegments */ - BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ - 0, /* flags */ - &sc->aac_fib_dmat)) { - device_printf(sc->aac_dev, "can't allocate FIB DMA tag\n");; - goto out; - } - /* * Detect the hardware interface version, set up the bus interface * indirection. @@ -312,7 +279,7 @@ aac_pci_attach(device_t dev) } /* Set up quirks */ - sc->quirks = aac_identifiers[i].quirks; + sc->flags = aac_identifiers[i].quirks; break; } diff --git a/sys/dev/aac/aacreg.h b/sys/dev/aac/aacreg.h index 75bb21cd0cc9..dd084379322f 100644 --- a/sys/dev/aac/aacreg.h +++ b/sys/dev/aac/aacreg.h @@ -341,6 +341,11 @@ struct aac_sg_entry { u_int32_t SgByteCount; } __packed; +struct aac_sg_entry64 { + u_int64_t SgAddress; + u_int32_t SgByteCount; +} __packed; + struct aac_sg_table { u_int32_t SgCount; struct aac_sg_entry SgEntry[0]; @@ -350,10 +355,8 @@ struct aac_sg_table { * Host-side scatter/gather list for 64-bit commands. */ struct aac_sg_table64 { - u_int8_t SgCount; - u_int8_t SgSectorsPerPage; - u_int16_t SgByteOffset; - u_int64_t SgEntry[0]; + u_int32_t SgCount; + struct aac_sg_entry64 SgEntry64[0]; } __packed; /* @@ -488,6 +491,13 @@ typedef enum #define AAC_SUPPORTED_64BIT_DATA 0x08 #define AAC_SUPPORTED_HOST_TIME_FIB 0x10 #define AAC_SUPPORTED_RAID50 0x20 +#define AAC_SUPPORTED_4GB_WINDOW 0x40 +#define AAC_SUPPORTED_SCSI_UPGRADEABLE 0x80 +#define AAC_SUPPORTED_SOFT_ERR_REPORT 0x100 +#define AAC_SUPPORTED_NOT_RECONDITION 0x200 +#define AAC_SUPPORTED_SGMAP_HOST64 0x400 +#define AAC_SUPPORTED_ALARM 0x800 +#define AAC_SUPPORTED_NONDASD 0x1000 /* * Structure used to respond to a RequestAdapterInfo fib. @@ -526,6 +536,7 @@ struct aac_adapter_info { #define AAC_MONKER_INITSTRUCT 0x05 #define AAC_MONKER_SYNCFIB 0x0c #define AAC_MONKER_GETKERNVER 0x11 +#define AAC_MONKER_GETINFO 0x19 /* * Adapter Status Register @@ -961,6 +972,8 @@ typedef enum _VM_COMMANDS { VM_CtBlockRead64, VM_CtBlockWrite64, VM_CtBlockVerify64, + VM_CtHostRead64, + VM_CtHostWrite64, } AAC_VMCommand; /* @@ -1134,6 +1147,16 @@ struct aac_blockread { struct aac_sg_table SgMap; /* variable size */ } __packed; +struct aac_blockread64 { + u_int32_t Command; + u_int16_t ContainerId; + u_int16_t SectorCount; + u_int32_t BlockNumber; + u_int16_t Pad; + u_int16_t Flags; + struct aac_sg_table64 SgMap64; +} __packed; + struct aac_blockread_response { u_int32_t Status; u_int32_t ByteCount; @@ -1148,6 +1171,16 @@ struct aac_blockwrite { struct aac_sg_table SgMap; /* variable size */ } __packed; +struct aac_blockwrite64 { + u_int32_t Command; /* not FSACommand! */ + u_int16_t ContainerId; + u_int16_t SectorCount; + u_int32_t BlockNumber; + u_int16_t Pad; + u_int16_t Flags; + struct aac_sg_table64 SgMap64; /* variable size */ +} __packed; + struct aac_blockwrite_response { u_int32_t Status; u_int32_t ByteCount; diff --git a/sys/dev/aac/aacvar.h b/sys/dev/aac/aacvar.h index 7ee8dc6d7ba2..1d6ab1594b95 100644 --- a/sys/dev/aac/aacvar.h +++ b/sys/dev/aac/aacvar.h @@ -223,7 +223,7 @@ struct aac_interface void (*aif_set_mailbox)(struct aac_softc *sc, u_int32_t command, u_int32_t arg0, u_int32_t arg1, u_int32_t arg2, u_int32_t arg3); - int (*aif_get_mailboxstatus)(struct aac_softc *sc); + int (*aif_get_mailbox)(struct aac_softc *sc, int mb); void (*aif_set_interrupts)(struct aac_softc *sc, int enable); }; extern struct aac_interface aac_rx_interface; @@ -238,8 +238,8 @@ extern struct aac_interface aac_fa_interface; #define AAC_SET_MAILBOX(sc, command, arg0, arg1, arg2, arg3) \ ((sc)->aac_if.aif_set_mailbox((sc), (command), (arg0), (arg1), (arg2), \ (arg3))) -#define AAC_GET_MAILBOXSTATUS(sc) ((sc)->aac_if.aif_get_mailboxstatus( \ - (sc))) +#define AAC_GET_MAILBOX(sc, mb) ((sc)->aac_if.aif_get_mailbox((sc), \ + (mb))) #define AAC_MASK_INTERRUPTS(sc) ((sc)->aac_if.aif_set_interrupts((sc), \ 0)) #define AAC_UNMASK_INTERRUPTS(sc) ((sc)->aac_if.aif_set_interrupts((sc), \ @@ -357,12 +357,19 @@ struct aac_softc #define AAC_AIFFLAGS_ALLOCFIBS (1 << 5) #define AAC_AIFFLAGS_PENDING (AAC_AIFFLAGS_AIF | AAC_AIFFLAGS_PRINTF | \ AAC_AIFFLAGS_ALLOCFIBS) - u_int32_t quirks; -#define AAC_QUIRK_PERC2QC (1 << 0) -#define AAC_QUIRK_NOCAM (1 << 1) /* No SCSI passthrough */ -#define AAC_QUIRK_CAM_NORESET (1 << 2) /* Fake SCSI resets */ -#define AAC_QUIRK_CAM_PASSONLY (1 << 3) /* Only create pass devices */ + u_int32_t flags; +#define AAC_FLAGS_PERC2QC (1 << 0) +#define AAC_FLAGS_ENABLE_CAM (1 << 1) /* No SCSI passthrough */ +#define AAC_FLAGS_CAM_NORESET (1 << 2) /* Fake SCSI resets */ +#define AAC_FLAGS_CAM_PASSONLY (1 << 3) /* Only create pass devices */ +#define AAC_FLAGS_SG_64BIT (1 << 4) /* Use 64-bit S/G addresses */ +#define AAC_FLAGS_4GB_WINDOW (1 << 5) /* Device can access host mem + * 2GB-4GB range */ +#define AAC_FLAGS_NO4GB (1 << 6) /* Can't access host mem >2GB */ +#define AAC_FLAGS_256FIBS (1 << 7) /* Can only do 256 commands */ + u_int32_t supported_options; + int aac_max_fibs; u_int32_t scsi_method_id; TAILQ_HEAD(,aac_sim) aac_sim_tqh; };