From owner-svn-src-all@FreeBSD.ORG Wed Sep 16 23:31:37 2009 Return-Path: Delivered-To: svn-src-all@FreeBSD.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1F32B1065670; Wed, 16 Sep 2009 23:31:37 +0000 (UTC) (envelope-from scottl@samsco.org) Received: from pooker.samsco.org (pooker.samsco.org [168.103.85.57]) by mx1.freebsd.org (Postfix) with ESMTP id 96BB18FC0A; Wed, 16 Sep 2009 23:31:35 +0000 (UTC) Received: from [IPv6:::1] (pooker.samsco.org [168.103.85.57]) (authenticated bits=0) by pooker.samsco.org (8.14.2/8.14.2) with ESMTP id n8GNVO13099773; Wed, 16 Sep 2009 17:31:24 -0600 (MDT) (envelope-from scottl@samsco.org) Mime-Version: 1.0 (Apple Message framework v1075.2) Content-Type: text/plain; charset=us-ascii; format=flowed; delsp=yes From: Scott Long In-Reply-To: <200909162327.n8GNREaC038896@svn.freebsd.org> Date: Wed, 16 Sep 2009 17:31:23 -0600 Content-Transfer-Encoding: 7bit Message-Id: <83DE06A4-33D2-4271-AF88-C1929DA9E254@samsco.org> References: <200909162327.n8GNREaC038896@svn.freebsd.org> To: Scott Long X-Mailer: Apple Mail (2.1075.2) X-Spam-Status: No, score=-3.9 required=3.8 tests=ALL_TRUSTED,AWL,BAYES_00 autolearn=ham version=3.1.8 X-Spam-Checker-Version: SpamAssassin 3.1.8 (2007-02-13) on pooker.samsco.org Cc: svn-src-head@FreeBSD.org, svn-src-all@FreeBSD.org, src-committers@FreeBSD.org Subject: Re: svn commit: r197263 - head/sys/dev/ciss X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 16 Sep 2009 23:31:37 -0000 Forgot to mention that this also re-works how command memory is allocated, and as a result allows up to 256k i/o's now. Scott On Sep 16, 2009, at 5:27 PM, Scott Long wrote: > Author: scottl > Date: Wed Sep 16 23:27:14 2009 > New Revision: 197263 > URL: http://svn.freebsd.org/changeset/base/197263 > > Log: > Sync driver with Yahoo: > > - Implement MSI support (MSIX support was already there) > - Use a table to drive MSI/MSIX exceptions > - Pre-calculate the command address instead of wasting cycles doing > the > calculation on every i/o. > > Modified: > head/sys/dev/ciss/ciss.c > head/sys/dev/ciss/cissreg.h > head/sys/dev/ciss/cissvar.h > > Modified: head/sys/dev/ciss/ciss.c > = > = > = > = > = > = > = > = > ====================================================================== > --- head/sys/dev/ciss/ciss.c Wed Sep 16 23:17:22 2009 (r197262) > +++ head/sys/dev/ciss/ciss.c Wed Sep 16 23:27:14 2009 (r197263) > @@ -279,8 +279,10 @@ TUNABLE_INT("hw.ciss.force_interrupt", & > * stick with matching against subvendor/subdevice, and thus have to > * be updated for every new CISS adapter that appears. > */ > -#define CISS_BOARD_SA5 (1<<0) > -#define CISS_BOARD_SA5B (1<<1) > +#define CISS_BOARD_UNKNWON 0 > +#define CISS_BOARD_SA5 1 > +#define CISS_BOARD_SA5B 2 > +#define CISS_BOARD_NOMSI (1<<4) > > static struct > { > @@ -289,10 +291,10 @@ static struct > int flags; > char *desc; > } ciss_vendor_data[] = { > - { 0x0e11, 0x4070, CISS_BOARD_SA5, "Compaq Smart Array 5300" }, > - { 0x0e11, 0x4080, CISS_BOARD_SA5B, "Compaq Smart Array 5i" }, > - { 0x0e11, 0x4082, CISS_BOARD_SA5B, "Compaq Smart Array 532" }, > - { 0x0e11, 0x4083, CISS_BOARD_SA5B, "HP Smart Array 5312" }, > + { 0x0e11, 0x4070, CISS_BOARD_SA5|CISS_BOARD_NOMSI, "Compaq > Smart Array 5300" }, > + { 0x0e11, 0x4080, CISS_BOARD_SA5B|CISS_BOARD_NOMSI, "Compaq > Smart Array 5i" }, > + { 0x0e11, 0x4082, CISS_BOARD_SA5B|CISS_BOARD_NOMSI, "Compaq > Smart Array 532" }, > + { 0x0e11, 0x4083, CISS_BOARD_SA5B|CISS_BOARD_NOMSI, "HP Smart > Array 5312" }, > { 0x0e11, 0x4091, CISS_BOARD_SA5, "HP Smart Array 6i" }, > { 0x0e11, 0x409A, CISS_BOARD_SA5, "HP Smart Array 641" }, > { 0x0e11, 0x409B, CISS_BOARD_SA5, "HP Smart Array 642" }, > @@ -661,7 +663,6 @@ ciss_init_pci(struct ciss_softc *sc) > (CISS_TRANSPORT_METHOD_SIMPLE | CISS_TRANSPORT_METHOD_PERF))) { > ciss_printf(sc, "No supported transport layers: 0x%x\n", > sc->ciss_cfg->supported_methods); > - return(ENXIO); > } > > switch (ciss_force_transport) { > @@ -677,7 +678,7 @@ ciss_init_pci(struct ciss_softc *sc) > } > > setup: > - if (supported_methods & CISS_TRANSPORT_METHOD_PERF) { > + if ((supported_methods & CISS_TRANSPORT_METHOD_PERF) != 0) { > method = CISS_TRANSPORT_METHOD_PERF; > sc->ciss_perf = (struct ciss_perf_config *)(cbase + cofs + > sc->ciss_cfg->transport_offset); > @@ -744,7 +745,7 @@ setup: > * controller. Hopefully enabling this bit universally will work OK. > * It seems to work fine for SA6i controllers. > */ > - sc->ciss_interrupt_mask = CISS_TL_PERF_INTR_OPQ | > CISS_TL_PERF_INTR_MSI; > + sc->ciss_interrupt_mask = CISS_TL_PERF_INTR_OPQ | > CISS_TL_PERF_INTR_MSI; > > } else { > ciss_printf(sc, "SIMPLE Transport\n"); > @@ -792,7 +793,7 @@ setup: > BUS_SPACE_MAXADDR, /* highaddr */ > NULL, NULL, /* filter, filterarg */ > BUS_SPACE_MAXSIZE_32BIT, /* maxsize */ > - CISS_COMMAND_SG_LENGTH, /* nsegments */ > + CISS_MAX_SG_ELEMENTS, /* nsegments */ > BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ > 0, /* flags */ > NULL, NULL, /* lockfunc, lockarg */ > @@ -810,7 +811,7 @@ setup: > BUS_SPACE_MAXADDR, /* lowaddr */ > BUS_SPACE_MAXADDR, /* highaddr */ > NULL, NULL, /* filter, filterarg */ > - MAXBSIZE, CISS_COMMAND_SG_LENGTH, /* maxsize, nsegments */ > + MAXBSIZE, CISS_MAX_SG_ELEMENTS, /* maxsize, nsegments */ > BUS_SPACE_MAXSIZE_32BIT, /* maxsegsize */ > BUS_DMA_ALLOCNOW, /* flags */ > busdma_lock_mutex, &sc->ciss_mtx, /* lockfunc, lockarg */ > @@ -823,32 +824,42 @@ setup: > > / > ************************************************************************ > * Setup MSI/MSIX operation (Performant only) > - * Four interrupts are available, but we only use 1 right now. > + * Four interrupts are available, but we only use 1 right now. If > MSI-X > + * isn't avaialble, try using MSI instead. > */ > static int > ciss_setup_msix(struct ciss_softc *sc) > { > - uint32_t id; > int val, i; > > /* Weed out devices that don't actually support MSI */ > - id = (pci_get_subvendor(sc->ciss_dev) << 16) | > - pci_get_subdevice(sc->ciss_dev); > - if ((id == 0x0e114070) || (id == 0x0e114080) || (id == > 0x0e114082) || > - (id == 0x0e114083)) > + i = ciss_lookup(sc->ciss_dev); > + if (ciss_vendor_data[i].flags & CISS_BOARD_NOMSI) > return (EINVAL); > > + /* > + * Only need to use the minimum number of MSI vectors, as the > driver > + * doesn't support directed MSIX interrupts. > + */ > val = pci_msix_count(sc->ciss_dev); > - if (val < CISS_MSI_COUNT) > - return (EINVAL); > + if (val < CISS_MSI_COUNT) { > + val = pci_msi_count(sc->ciss_dev); > + device_printf(sc->ciss_dev, "got %d MSI messages]\n", val); > + if (val < CISS_MSI_COUNT) > + return (EINVAL); > + } > val = MIN(val, CISS_MSI_COUNT); > - if (pci_alloc_msix(sc->ciss_dev, &val) != 0) > - return (EINVAL); > + if (pci_alloc_msix(sc->ciss_dev, &val) != 0) { > + if (pci_alloc_msi(sc->ciss_dev, &val) != 0) > + return (EINVAL); > + } > > sc->ciss_msi = val; > - ciss_printf(sc, "Using MSIX interrupt\n"); > + if (bootverbose) > + ciss_printf(sc, "Using %d MSIX interrupt%s\n", val, > + (val != 1) ? "s" : ""); > > - for (i = 0; i < CISS_MSI_COUNT; i++) > + for (i = 0; i < val; i++) > sc->ciss_irq_rid[i] = i + 1; > > return (0); > @@ -1031,7 +1042,7 @@ ciss_soft_reset(struct ciss_softc *sc) > NULL, 0)) != 0) > break; > > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.address = sc->ciss_controllers[i]; > > if ((error = ciss_synch_request(cr, 60 * 1000)) != 0) > @@ -1104,6 +1115,9 @@ ciss_init_requests(struct ciss_softc *sc > cr = &sc->ciss_request[i]; > cr->cr_sc = sc; > cr->cr_tag = i; > + cr->cr_cc = (struct ciss_command *)((uintptr_t)sc->ciss_command + > + CISS_COMMAND_ALLOC_SIZE * i); > + cr->cr_ccphys = sc->ciss_command_phys + CISS_COMMAND_ALLOC_SIZE * i; > bus_dmamap_create(sc->ciss_buffer_dmat, 0, &cr->cr_datamap); > ciss_enqueue_free(cr); > } > @@ -1257,7 +1271,7 @@ ciss_report_luns(struct ciss_softc *sc, > /* > * Build the Report Logical/Physical LUNs command. > */ > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cr->cr_data = cll; > cr->cr_length = report_size; > cr->cr_flags = CISS_REQ_DATAIN; > @@ -1582,7 +1596,7 @@ ciss_inquiry_logical(struct ciss_softc * > if ((error = ciss_get_request(sc, &cr)) != 0) > goto out; > > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cr->cr_data = &ld->cl_geometry; > cr->cr_length = sizeof(ld->cl_geometry); > cr->cr_flags = CISS_REQ_DATAIN; > @@ -1646,7 +1660,7 @@ ciss_identify_logical(struct ciss_softc > (void **)&ld->cl_ldrive, > sizeof(*ld->cl_ldrive))) != 0) > goto out; > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.address = *ld->cl_controller; /* target controller */ > cbc = (struct ciss_bmic_cdb *)&(cc->cdb.cdb[0]); > cbc->log_drive = CISS_LUN_TO_TARGET(ld->cl_address.logical.lun); > @@ -1742,7 +1756,7 @@ ciss_get_ldrive_status(struct ciss_softc > (void **)&ld->cl_lstatus, > sizeof(*ld->cl_lstatus))) != 0) > goto out; > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.address = *ld->cl_controller; /* target controller */ > cbc = (struct ciss_bmic_cdb *)&(cc->cdb.cdb[0]); > cbc->log_drive = CISS_LUN_TO_TARGET(ld->cl_address.logical.lun); > @@ -1832,7 +1846,7 @@ ciss_accept_media(struct ciss_softc *sc, > if ((error = ciss_get_bmic_request(sc, &cr, > CISS_BMIC_ACCEPT_MEDIA, > NULL, 0)) != 0) > goto out; > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.address = *ld->cl_controller; /* target controller */ > cbc = (struct ciss_bmic_cdb *)&(cc->cdb.cdb[0]); > cbc->log_drive = ldrive; > @@ -2000,7 +2014,7 @@ ciss_start(struct ciss_request *cr) > struct ciss_command *cc; /* XXX debugging only */ > int error; > > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > debug(2, "post command %d tag %d ", cr->cr_tag, cc- > >header.host_tag); > > /* > @@ -2056,7 +2070,7 @@ ciss_done(struct ciss_softc *sc, cr_qhea > continue; > } > cr = &(sc->ciss_request[index]); > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.host_tag = tag; /* not updated by adapter */ > ciss_enqueue_complete(cr, qh); > } > @@ -2085,7 +2099,7 @@ ciss_perf_done(struct ciss_softc *sc, cr > (tag & CISS_HDR_HOST_TAG_ERROR) ? " with error" : ""); > if (index < sc->ciss_max_requests) { > cr = &(sc->ciss_request[index]); > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.host_tag = tag; /* not updated by adapter */ > ciss_enqueue_complete(cr, qh); > } else { > @@ -2222,7 +2236,7 @@ _ciss_report_request(struct ciss_request > > debug_called(2); > > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > ce = (struct ciss_error_info *)&(cc->sg[0]); > > /* > @@ -2369,7 +2383,7 @@ ciss_abort_request(struct ciss_request * > return(error); > > /* build the abort command */ > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.address.mode.mode = > CISS_HDR_ADDRESS_MODE_PERIPHERAL; /* addressing? */ > cc->header.address.physical.target = 0; > cc->header.address.physical.bus = 0; > @@ -2438,12 +2452,12 @@ ciss_preen_command(struct ciss_request * > * Note that we set up the error_info structure here, since the > * length can be overwritten by any command. > */ > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.sg_in_list = 0; /* kinda inefficient this way */ > cc->header.sg_total = 0; > cc->header.host_tag = cr->cr_tag << 2; > cc->header.host_tag_zeroes = 0; > - cmdphys = CISS_FIND_COMMANDPHYS(cr); > + cmdphys = cr->cr_ccphys; > cc->error_info.error_info_address = cmdphys + sizeof(struct > ciss_command); > cc->error_info.error_info_length = CISS_COMMAND_ALLOC_SIZE - > sizeof(struct ciss_command); > } > @@ -2514,7 +2528,7 @@ ciss_get_bmic_request(struct ciss_softc > if (!dataout) > cr->cr_flags = CISS_REQ_DATAIN; > > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.address.physical.mode = > CISS_HDR_ADDRESS_MODE_PERIPHERAL; > cc->header.address.physical.bus = 0; > cc->header.address.physical.target = 0; > @@ -2562,7 +2576,7 @@ ciss_user_command(struct ciss_softc *sc, > */ > while (ciss_get_request(sc, &cr) != 0) > msleep(sc, &sc->ciss_mtx, PPAUSE, "cissREQ", hz); > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > > /* > * Allocate an in-kernel databuffer if required, copy in user > data. > @@ -2667,7 +2681,7 @@ ciss_map_request(struct ciss_request *cr > if (sc->ciss_perf) > CISS_TL_PERF_POST_CMD(sc, cr); > else > - CISS_TL_SIMPLE_POST_CMD(sc, CISS_FIND_COMMANDPHYS(cr)); > + CISS_TL_SIMPLE_POST_CMD(sc, cr->cr_ccphys); > } > > return(0); > @@ -2685,7 +2699,7 @@ ciss_request_map_helper(void *arg, bus_d > > cr = (struct ciss_request *)arg; > sc = cr->cr_sc; > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > > for (i = 0; i < nseg; i++) { > cc->sg[i].address = segs[i].ds_addr; > @@ -2725,7 +2739,7 @@ ciss_request_map_helper(void *arg, bus_d > if (sc->ciss_perf) > CISS_TL_PERF_POST_CMD(sc, cr); > else > - CISS_TL_SIMPLE_POST_CMD(sc, CISS_FIND_COMMANDPHYS(cr)); > + CISS_TL_SIMPLE_POST_CMD(sc, cr->cr_ccphys); > } > > / > ************************************************************************ > @@ -3091,7 +3105,7 @@ ciss_cam_action_io(struct cam_sim *sim, > /* > * Build the command. > */ > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cr->cr_data = csio->data_ptr; > cr->cr_length = csio->dxfer_len; > cr->cr_complete = ciss_cam_complete; > @@ -3235,7 +3249,7 @@ ciss_cam_complete(struct ciss_request *c > debug_called(2); > > sc = cr->cr_sc; > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > ce = (struct ciss_error_info *)&(cc->sg[0]); > csio = (struct ccb_scsiio *)cr->cr_private; > > @@ -3414,7 +3428,7 @@ ciss_periodic(void *arg) > * Send the NOP message and wait for a response. > */ > if (ciss_nop_message_heartbeat != 0 && (error = ciss_get_request > (sc, &cr)) == 0) { > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cr->cr_complete = ciss_nop_complete; > cc->cdb.cdb_length = 1; > cc->cdb.type = CISS_CDB_TYPE_MESSAGE; > @@ -3484,7 +3498,7 @@ ciss_disable_adapter(struct ciss_softc * > if ((cr->cr_flags & CISS_REQ_BUSY) == 0) > continue; > > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > ce = (struct ciss_error_info *)&(cc->sg[0]); > ce->command_status = CISS_CMD_STATUS_HARDWARE_ERROR; > ciss_enqueue_complete(cr, &qh); > @@ -3561,7 +3575,7 @@ ciss_notify_event(struct ciss_softc *sc) > ciss_preen_command(cr); > > /* (re)build the notify event command */ > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.address.physical.mode = > CISS_HDR_ADDRESS_MODE_PERIPHERAL; > cc->header.address.physical.bus = 0; > cc->header.address.physical.target = 0; > @@ -3615,7 +3629,7 @@ ciss_notify_complete(struct ciss_request > int command_status; > debug_called(1); > > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cn = (struct ciss_notify *)cr->cr_data; > sc = cr->cr_sc; > > @@ -3715,7 +3729,7 @@ ciss_notify_abort(struct ciss_softc *sc) > cr->cr_length = CISS_NOTIFY_DATA_SIZE; > > /* build the CDB */ > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > cc->header.address.physical.mode = > CISS_HDR_ADDRESS_MODE_PERIPHERAL; > cc->header.address.physical.bus = 0; > cc->header.address.physical.target = 0; > @@ -4174,7 +4188,7 @@ ciss_print_request(struct ciss_request * > int i; > > sc = cr->cr_sc; > - cc = CISS_FIND_COMMAND(cr); > + cc = cr->cr_cc; > > ciss_printf(sc, "REQUEST @ %p\n", cr); > ciss_printf(sc, " data %p/%d tag %d flags %b\n", > > Modified: head/sys/dev/ciss/cissreg.h > = > = > = > = > = > = > = > = > ====================================================================== > --- head/sys/dev/ciss/cissreg.h Wed Sep 16 23:17:22 2009 (r197262) > +++ head/sys/dev/ciss/cissreg.h Wed Sep 16 23:27:14 2009 (r197263) > @@ -731,7 +731,7 @@ struct ciss_bmic_flush_cache { > #define CISS_TL_PERF_INTR_OPQ (CISS_TL_SIMPLE_INTR_OPQ_SA5 | > CISS_TL_SIMPLE_INTR_OPQ_SA5B) > #define CISS_TL_PERF_INTR_MSI 0x01 > > -#define CISS_TL_PERF_POST_CMD(sc, cr) CISS_TL_SIMPLE_WRITE(sc, > CISS_TL_SIMPLE_IPQ, CISS_FIND_COMMANDPHYS(cr) | (cr)->cr_sg_tag) > +#define CISS_TL_PERF_POST_CMD(sc, cr) CISS_TL_SIMPLE_WRITE(sc, > CISS_TL_SIMPLE_IPQ, cr->cr_ccphys | (cr)->cr_sg_tag) > #define CISS_TL_PERF_FLUSH_INT(sc) CISS_TL_SIMPLE_READ(sc, > CISS_TL_SIMPLE_OSR) > #define CISS_TL_PERF_CLEAR_INT(sc) CISS_TL_SIMPLE_WRITE(sc, > CISS_TL_SIMPLE_ODC, CISS_TL_SIMPLE_ODC_CLEAR) > #define CISS_CYCLE_MASK 0x00000001 > @@ -747,4 +747,5 @@ struct ciss_bmic_flush_cache { > CISS_TL_SIMPLE_READ(sc, CISS_TL_SIMPLE_IMR) & ~(sc)- > >ciss_interrupt_mask) > > > + > #endif /* _KERNEL */ > > Modified: head/sys/dev/ciss/cissvar.h > = > = > = > = > = > = > = > = > ====================================================================== > --- head/sys/dev/ciss/cissvar.h Wed Sep 16 23:17:22 2009 (r197262) > +++ head/sys/dev/ciss/cissvar.h Wed Sep 16 23:27:14 2009 (r197263) > @@ -103,6 +103,8 @@ struct ciss_request > void *cr_data; /* data buffer */ > u_int32_t cr_length; /* data length */ > bus_dmamap_t cr_datamap; /* DMA map for data */ > + struct ciss_command *cr_cc; > + uint32_t cr_ccphys; > int cr_tag; > int cr_flags; > #define CISS_REQ_MAPPED (1<<0) /* data mapped */ > @@ -131,18 +133,16 @@ struct ciss_request > * scatter-gather list, and we also want to avoid having commands > * cross page boundaries. > * > - * Note that 512 bytes yields 28 scatter/gather entries, or the > - * ability to map (26 * PAGE_SIZE) + 2 bytes of data. On x86, this > is > - * 104kB. 256 bytes would only yield 12 entries, giving a mere 40kB, > - * too small. > + * The size of the ciss_command is 52 bytes. 65 s/g elements are > reserved > + * to allow a max i/o size of 256k. This gives a total command > size of > + * 1120 bytes, including the 32 byte alignment padding. Modern > controllers > + * seem to saturate nicely at this value. > */ > > -#define CISS_COMMAND_ALLOC_SIZE 512 /* XXX tune to get sensible s/ > g list length */ > -#define CISS_COMMAND_SG_LENGTH ((CISS_COMMAND_ALLOC_SIZE - sizeof > (struct ciss_command)) \ > - / sizeof(struct ciss_sg_entry)) > - > -/* XXX Prep for increasing max i/o */ > -#define CISS_MAX_SG_ELEMENTS 17 > +#define CISS_MAX_SG_ELEMENTS 65 > +#define CISS_COMMAND_ALIGN 32 > +#define CISS_COMMAND_SG_LENGTH (sizeof(struct ciss_sg_entry) * > CISS_MAX_SG_ELEMENTS) > +#define CISS_COMMAND_ALLOC_SIZE (roundup2(sizeof(struct > ciss_command) + CISS_COMMAND_SG_LENGTH, CISS_COMMAND_ALIGN)) > > /* > * Per-logical-drive data. > @@ -259,20 +259,6 @@ struct ciss_softc > struct ciss_qstat ciss_qstat[CISSQ_COUNT]; /* queue statistics */ > }; > > -/* > - * Given a request tag, find the corresponding command in virtual or > - * physical space. > - * > - * The arithmetic here is due to the allocation of ciss_command > structures > - * inside CISS_COMMAND_ALLOC_SIZE blocks. See the comment at the > definition > - * of CISS_COMMAND_ALLOC_SIZE above. > - */ > -#define CISS_FIND_COMMAND(cr) \ > - (struct ciss_command *)((u_int8_t *)(cr)->cr_sc->ciss_command + \ > - ((cr)->cr_tag * CISS_COMMAND_ALLOC_SIZE)) > -#define CISS_FIND_COMMANDPHYS(cr) ((cr)->cr_sc->ciss_command_phys + \ > - ((cr)->cr_tag * CISS_COMMAND_ALLOC_SIZE)) > - > / > ************************************************************************ > * Debugging/diagnostic output. > */