Date: Wed, 21 Oct 2009 20:38:33 GMT From: Andrew Thompson <thompsa@FreeBSD.org> To: Perforce Change Reviews <perforce@freebsd.org> Subject: PERFORCE change 169663 for review Message-ID: <200910212038.n9LKcX1W080714@repoman.freebsd.org>
next in thread | raw e-mail | index | archive | help
http://p4web.freebsd.org/chv.cgi?CH=169663 Change 169663 by thompsa@thompsa_burger on 2009/10/21 20:38:11 IFC @169658 Affected files ... .. //depot/projects/usb/src/sys/amd64/amd64/pmap.c#32 integrate .. //depot/projects/usb/src/sys/arm/arm/pmap.c#22 integrate .. //depot/projects/usb/src/sys/arm/mv/mv_machdep.c#8 integrate .. //depot/projects/usb/src/sys/cam/ata/ata_da.c#5 integrate .. //depot/projects/usb/src/sys/cam/ata/ata_xpt.c#4 integrate .. //depot/projects/usb/src/sys/cam/cam_xpt.c#23 integrate .. //depot/projects/usb/src/sys/cam/cam_xpt_internal.h#3 integrate .. //depot/projects/usb/src/sys/compat/x86bios/x86bios.c#2 integrate .. //depot/projects/usb/src/sys/compat/x86bios/x86bios.h#2 integrate .. //depot/projects/usb/src/sys/compat/x86bios/x86bios_alloc.c#2 delete .. //depot/projects/usb/src/sys/conf/NOTES#47 integrate .. //depot/projects/usb/src/sys/conf/files#83 integrate .. //depot/projects/usb/src/sys/conf/files.amd64#26 integrate .. //depot/projects/usb/src/sys/conf/files.i386#31 integrate .. //depot/projects/usb/src/sys/conf/options#41 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/changes.txt#3 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/common/adfile.c#3 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/common/adisasm.c#4 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/common/adwalk.c#3 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/common/dmextern.c#1 branch .. //depot/projects/usb/src/sys/contrib/dev/acpica/common/dmtable.c#4 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/common/getopt.c#4 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/compiler/aslload.c#5 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/debugger/dbcmds.c#3 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/debugger/dbinput.c#2 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/disassembler/dmutils.c#2 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/disassembler/dmwalk.c#2 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/dispatcher/dswload.c#3 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/events/evregion.c#2 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/include/acapps.h#2 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/include/acdebug.h#3 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/include/acdisasm.h#3 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/include/acglobal.h#3 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/include/aclocal.h#3 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/include/acpixf.h#3 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/namespace/nsrepair.c#2 integrate .. //depot/projects/usb/src/sys/contrib/dev/acpica/utilities/utglobal.c#3 integrate .. //depot/projects/usb/src/sys/contrib/x86emu/x86emu_util.c#2 delete .. //depot/projects/usb/src/sys/dev/ahci/ahci.c#4 integrate .. //depot/projects/usb/src/sys/dev/ahci/ahci.h#3 integrate .. //depot/projects/usb/src/sys/dev/aic7xxx/aicasm/aicasm.c#3 integrate .. //depot/projects/usb/src/sys/dev/atkbdc/atkbd.c#7 integrate .. //depot/projects/usb/src/sys/dev/bce/if_bce.c#23 integrate .. //depot/projects/usb/src/sys/dev/bce/if_bcereg.h#14 integrate .. //depot/projects/usb/src/sys/dev/bge/if_bge.c#22 integrate .. //depot/projects/usb/src/sys/dev/dpms/dpms.c#3 integrate .. //depot/projects/usb/src/sys/dev/drm/mach64_state.c#3 integrate .. //depot/projects/usb/src/sys/dev/fb/vesa.c#3 integrate .. //depot/projects/usb/src/sys/dev/hwpmc/hwpmc_mod.c#14 integrate .. //depot/projects/usb/src/sys/dev/ips/ips_disk.c#2 integrate .. //depot/projects/usb/src/sys/dev/mpt/mpt.c#9 integrate .. //depot/projects/usb/src/sys/dev/mpt/mpt.h#11 integrate .. //depot/projects/usb/src/sys/dev/mpt/mpt_cam.c#12 integrate .. //depot/projects/usb/src/sys/dev/mpt/mpt_raid.c#11 integrate .. //depot/projects/usb/src/sys/dev/mxge/if_mxge.c#18 integrate .. //depot/projects/usb/src/sys/dev/mxge/if_mxge_var.h#16 integrate .. //depot/projects/usb/src/sys/dev/pci/vga_pci.c#4 integrate .. //depot/projects/usb/src/sys/dev/siis/siis.c#4 integrate .. //depot/projects/usb/src/sys/dev/usb/serial/uchcom.c#16 integrate .. //depot/projects/usb/src/sys/dev/usb/storage/umass.c#36 integrate .. //depot/projects/usb/src/sys/dev/usb/usbdevs#82 integrate .. //depot/projects/usb/src/sys/fs/nfsclient/nfs_clport.c#5 integrate .. //depot/projects/usb/src/sys/fs/nfsclient/nfs_clstate.c#8 integrate .. //depot/projects/usb/src/sys/fs/nfsclient/nfs_clsubs.c#3 integrate .. //depot/projects/usb/src/sys/i386/conf/NOTES#27 integrate .. //depot/projects/usb/src/sys/i386/i386/pmap.c#28 integrate .. //depot/projects/usb/src/sys/i386/xen/pmap.c#15 integrate .. //depot/projects/usb/src/sys/ia64/ia64/pmap.c#16 integrate .. //depot/projects/usb/src/sys/ia64/include/asm.h#2 integrate .. //depot/projects/usb/src/sys/kern/init_main.c#17 integrate .. //depot/projects/usb/src/sys/kern/stack_protector.c#2 integrate .. //depot/projects/usb/src/sys/kern/sys_process.c#14 integrate .. //depot/projects/usb/src/sys/kern/tty.c#32 integrate .. //depot/projects/usb/src/sys/mips/mips/pmap.c#13 integrate .. //depot/projects/usb/src/sys/modules/Makefile#45 integrate .. //depot/projects/usb/src/sys/modules/dpms/Makefile#3 integrate .. //depot/projects/usb/src/sys/modules/usb/Makefile#23 integrate .. //depot/projects/usb/src/sys/modules/usb/ucom/Makefile#3 integrate .. //depot/projects/usb/src/sys/modules/vesa/Makefile#3 integrate .. //depot/projects/usb/src/sys/modules/x86bios/Makefile#3 integrate .. //depot/projects/usb/src/sys/net/flowtable.c#13 integrate .. //depot/projects/usb/src/sys/net/pfil.c#6 integrate .. //depot/projects/usb/src/sys/net80211/ieee80211_hwmp.c#5 integrate .. //depot/projects/usb/src/sys/net80211/ieee80211_mesh.c#5 integrate .. //depot/projects/usb/src/sys/net80211/ieee80211_mesh.h#5 integrate .. //depot/projects/usb/src/sys/net80211/ieee80211_output.c#28 integrate .. //depot/projects/usb/src/sys/net80211/ieee80211_proto.h#20 integrate .. //depot/projects/usb/src/sys/netinet/if_ether.c#31 integrate .. //depot/projects/usb/src/sys/powerpc/aim/mmu_oea.c#9 integrate .. //depot/projects/usb/src/sys/powerpc/aim/mmu_oea64.c#5 integrate .. //depot/projects/usb/src/sys/powerpc/booke/pmap.c#17 integrate .. //depot/projects/usb/src/sys/powerpc/include/pmap.h#9 integrate .. //depot/projects/usb/src/sys/powerpc/powerpc/mmu_if.m#7 integrate .. //depot/projects/usb/src/sys/powerpc/powerpc/pmap_dispatch.c#11 integrate .. //depot/projects/usb/src/sys/powerpc/powerpc/uio_machdep.c#6 integrate .. //depot/projects/usb/src/sys/sparc64/sparc64/pmap.c#14 integrate .. //depot/projects/usb/src/sys/sun4v/sun4v/pmap.c#10 integrate .. //depot/projects/usb/src/sys/sys/kernel.h#17 integrate .. //depot/projects/usb/src/sys/sys/ttyqueue.h#4 integrate .. //depot/projects/usb/src/sys/tools/fw_stub.awk#4 integrate .. //depot/projects/usb/src/sys/vm/pmap.h#7 integrate .. //depot/projects/usb/src/sys/vm/vm_extern.h#11 integrate .. //depot/projects/usb/src/sys/vm/vm_glue.c#11 integrate Differences ... ==== //depot/projects/usb/src/sys/amd64/amd64/pmap.c#32 (text+ko) ==== @@ -77,7 +77,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.674 2009/09/28 17:10:27 alc Exp $"); +__FBSDID("$FreeBSD: src/sys/amd64/amd64/pmap.c,v 1.675 2009/10/21 18:38:02 marcel Exp $"); /* * Manages physical address maps. @@ -4810,6 +4810,11 @@ critical_exit(); } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ +} + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. ==== //depot/projects/usb/src/sys/arm/arm/pmap.c#22 (text+ko) ==== @@ -147,7 +147,7 @@ #include "opt_vm.h" #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.115 2009/10/05 10:08:58 stas Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/arm/pmap.c,v 1.116 2009/10/21 18:38:02 marcel Exp $"); #include <sys/param.h> #include <sys/systm.h> #include <sys/kernel.h> @@ -2863,14 +2863,14 @@ if (pvzone != NULL && (m = vm_phys_paddr_to_vm_page(pa))) { vm_page_lock_queues(); if (!TAILQ_EMPTY(&m->md.pv_list) || m->md.pv_kva) { - /* release vm_page lock for pv_entry UMA */ + /* release vm_page lock for pv_entry UMA */ vm_page_unlock_queues(); if ((pve = pmap_get_pv_entry()) == NULL) panic("pmap_kenter_internal: no pv entries"); vm_page_lock_queues(); PMAP_LOCK(pmap_kernel()); pmap_enter_pv(m, pve, pmap_kernel(), va, - PVF_WRITE | PVF_UNMAN); + PVF_WRITE | PVF_UNMAN); pmap_fix_cache(m, pmap_kernel(), va); PMAP_UNLOCK(pmap_kernel()); } else { @@ -4567,6 +4567,12 @@ } +void +pmap_sync_icache(pmap_t pm, vm_offset_t va, vm_size_t sz) +{ +} + + /* * Increase the starting virtual address of the given mapping if a * different alignment might result in more superpage mappings. ==== //depot/projects/usb/src/sys/arm/mv/mv_machdep.c#8 (text+ko) ==== @@ -39,7 +39,7 @@ #include "opt_ddb.h" #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/arm/mv/mv_machdep.c,v 1.7 2009/08/25 09:30:03 raj Exp $"); +__FBSDID("$FreeBSD: src/sys/arm/mv/mv_machdep.c,v 1.9 2009/10/21 18:44:00 marcel Exp $"); #define _ARM32_BUS_DMA_PRIVATE #include <sys/param.h> ==== //depot/projects/usb/src/sys/cam/ata/ata_da.c#5 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/cam/ata/ata_da.c,v 1.5 2009/10/09 09:29:59 pjd Exp $"); +__FBSDID("$FreeBSD: src/sys/cam/ata/ata_da.c,v 1.6 2009/10/21 14:20:55 mav Exp $"); #include <sys/param.h> @@ -63,37 +63,32 @@ #define ATA_MAX_28BIT_LBA 268435455UL typedef enum { - ADA_STATE_NORMAL + ADA_STATE_NORMAL, + ADA_STATE_SET_MULTI } ada_state; typedef enum { ADA_FLAG_PACK_INVALID = 0x001, ADA_FLAG_CAN_48BIT = 0x002, ADA_FLAG_CAN_FLUSHCACHE = 0x004, - ADA_FLAG_CAN_NCQ = 0x008, - ADA_FLAG_TAGGED_QUEUING = 0x010, + ADA_FLAG_CAN_NCQ = 0x008, + ADA_FLAG_CAN_DMA = 0x010, ADA_FLAG_NEED_OTAG = 0x020, ADA_FLAG_WENT_IDLE = 0x040, - ADA_FLAG_RETRY_UA = 0x080, ADA_FLAG_OPEN = 0x100, ADA_FLAG_SCTX_INIT = 0x200 } ada_flags; typedef enum { - ADA_Q_NONE = 0x00, - ADA_Q_NO_SYNC_CACHE = 0x01, - ADA_Q_NO_6_BYTE = 0x02, - ADA_Q_NO_PREVENT = 0x04 + ADA_Q_NONE = 0x00 } ada_quirks; typedef enum { - ADA_CCB_PROBE = 0x01, - ADA_CCB_PROBE2 = 0x02, + ADA_CCB_SET_MULTI = 0x01, ADA_CCB_BUFFER_IO = 0x03, ADA_CCB_WAITING = 0x04, ADA_CCB_DUMP = 0x05, ADA_CCB_TYPE_MASK = 0x0F, - ADA_CCB_RETRY_UA = 0x10 } ada_ccb_state; /* Offsets into our private area for storing information */ @@ -117,6 +112,7 @@ ada_quirks quirks; int ordered_tag_count; int outstanding_cmds; + int secsperint; struct disk_params params; struct disk *disk; union ccb saved_ccb; @@ -289,8 +285,7 @@ else ata_28bit_cmd(&ccb->ataio, ATA_FLUSHCACHE, 0, 0, 0); cam_periph_runccb(ccb, /*error_routine*/NULL, /*cam_flags*/0, - /*sense_flags*/SF_RETRY_UA, - softc->disk->d_devstat); + /*sense_flags*/0, softc->disk->d_devstat); if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) xpt_print(periph->path, "Synchronize cache failed\n"); @@ -331,20 +326,7 @@ cam_periph_lock(periph); -#if 0 - /* - * check it's not too big a transfer for our adapter - */ - scsi_minphys(bp,&sd_switch); -#endif - /* - * Mask interrupts so that the pack cannot be invalidated until - * after we are in the queue. Otherwise, we might not properly - * clean up one of the buffers. - */ - - /* * If the device has been made invalid, error out */ if ((softc->flags & ADA_FLAG_PACK_INVALID)) { @@ -551,11 +533,6 @@ if (cgd->protocol != PROTO_ATA) break; -// if (SID_TYPE(&cgd->inq_data) != T_DIRECT -// && SID_TYPE(&cgd->inq_data) != T_RBC -// && SID_TYPE(&cgd->inq_data) != T_OPTICAL) -// break; - /* * Allocate a peripheral instance for * this device and start the probe @@ -576,18 +553,18 @@ case AC_SENT_BDR: case AC_BUS_RESET: { - struct ada_softc *softc; - struct ccb_hdr *ccbh; + struct ada_softc *softc = (struct ada_softc *)periph->softc; - softc = (struct ada_softc *)periph->softc; + cam_periph_async(periph, code, path, arg); + if (softc->state != ADA_STATE_NORMAL) + break; /* - * Don't fail on the expected unit attention - * that will occur. + * Restore device configuration. */ - softc->flags |= ADA_FLAG_RETRY_UA; - LIST_FOREACH(ccbh, &softc->pending_ccbs, periph_links.le) - ccbh->ccb_state |= ADA_CCB_RETRY_UA; - /* FALLTHROUGH*/ + softc->state = ADA_STATE_SET_MULTI; + cam_periph_acquire(periph); + xpt_schedule(periph, 0); + break; } default: cam_periph_async(periph, code, path, arg); @@ -651,14 +628,15 @@ if (softc == NULL) { printf("adaregister: Unable to probe new device. " - "Unable to allocate softc\n"); + "Unable to allocate softc\n"); return(CAM_REQ_CMP_ERR); } LIST_INIT(&softc->pending_ccbs); - softc->state = ADA_STATE_NORMAL; bioq_init(&softc->bio_queue); + if (cgd->ident_data.capabilities1 & ATA_SUPPORT_DMA) + softc->flags |= ADA_FLAG_CAN_DMA; if (cgd->ident_data.support.command2 & ATA_SUPPORT_ADDRESS48) softc->flags |= ADA_FLAG_CAN_48BIT; if (cgd->ident_data.support.command2 & ATA_SUPPORT_FLUSHCACHE) @@ -666,8 +644,8 @@ if (cgd->ident_data.satacapabilities & ATA_SUPPORT_NCQ && cgd->ident_data.queue >= 31) softc->flags |= ADA_FLAG_CAN_NCQ; -// if ((cgd->inq_data.flags & SID_CmdQue) != 0) -// softc->flags |= ADA_FLAG_TAGGED_QUEUING; + softc->secsperint = max(1, min(cgd->ident_data.sectors_intr, 16)); + softc->state = ADA_STATE_SET_MULTI; periph->softc = softc; @@ -713,9 +691,9 @@ else if (maxio > MAXPHYS) maxio = MAXPHYS; /* for safety */ if (cgd->ident_data.support.command2 & ATA_SUPPORT_ADDRESS48) - maxio = min(maxio, 65535 * 512); + maxio = min(maxio, 65536 * 512); else /* 28bit ATA command limit */ - maxio = min(maxio, 255 * 512); + maxio = min(maxio, 256 * 512); softc->disk->d_maxsize = maxio; softc->disk->d_unit = periph->unit_number; softc->disk->d_flags = 0; @@ -730,8 +708,6 @@ /* XXX: these are not actually "firmware" values, so they may be wrong */ softc->disk->d_fwsectors = softc->params.secs_per_track; softc->disk->d_fwheads = softc->params.heads; -// softc->disk->d_devstat->block_size = softc->params.secsize; -// softc->disk->d_devstat->flags &= ~DEVSTAT_BS_UNAVAILABLE; disk_create(softc->disk, DISK_VERSION); mtx_lock(periph->sim->mtx); @@ -766,8 +742,8 @@ * to finish the probe. The reference will be dropped in adadone at * the end of probe. */ -// (void)cam_periph_hold(periph, PRIBIO); -// xpt_schedule(periph, /*priority*/5); + cam_periph_acquire(periph); + xpt_schedule(periph, /*priority*/5); /* * Schedule a periodic event to occasionally send an @@ -784,10 +760,9 @@ static void adastart(struct cam_periph *periph, union ccb *start_ccb) { - struct ada_softc *softc; + struct ada_softc *softc = (struct ada_softc *)periph->softc; + struct ccb_ataio *ataio = &start_ccb->ataio; - softc = (struct ada_softc *)periph->softc; - switch (softc->state) { case ADA_STATE_NORMAL: { @@ -809,7 +784,6 @@ } else if (bp == NULL) { xpt_release_ccb(start_ccb); } else { - struct ccb_ataio *ataio = &start_ccb->ataio; u_int8_t tag_code; bioq_remove(&softc->bio_queue, bp); @@ -817,9 +791,9 @@ if ((softc->flags & ADA_FLAG_NEED_OTAG) != 0) { softc->flags &= ~ADA_FLAG_NEED_OTAG; softc->ordered_tag_count++; - tag_code = 0;//MSG_ORDERED_Q_TAG; + tag_code = 0; } else { - tag_code = 0;//MSG_SIMPLE_Q_TAG; + tag_code = 1; } switch (bp->bio_cmd) { case BIO_READ: @@ -838,7 +812,7 @@ bp->bio_bcount, ada_default_timeout*1000); - if (softc->flags & ADA_FLAG_CAN_NCQ) { + if ((softc->flags & ADA_FLAG_CAN_NCQ) && tag_code) { if (bp->bio_cmd == BIO_READ) { ata_ncq_cmd(ataio, ATA_READ_FPDMA_QUEUED, lba, count); @@ -848,21 +822,43 @@ } } else if ((softc->flags & ADA_FLAG_CAN_48BIT) && (lba + count >= ATA_MAX_28BIT_LBA || - count >= 256)) { - if (bp->bio_cmd == BIO_READ) { - ata_48bit_cmd(ataio, ATA_READ_DMA48, - 0, lba, count); + count > 256)) { + if (softc->flags & ADA_FLAG_CAN_DMA) { + if (bp->bio_cmd == BIO_READ) { + ata_48bit_cmd(ataio, ATA_READ_DMA48, + 0, lba, count); + } else { + ata_48bit_cmd(ataio, ATA_WRITE_DMA48, + 0, lba, count); + } } else { - ata_48bit_cmd(ataio, ATA_WRITE_DMA48, - 0, lba, count); + if (bp->bio_cmd == BIO_READ) { + ata_48bit_cmd(ataio, ATA_READ_MUL48, + 0, lba, count); + } else { + ata_48bit_cmd(ataio, ATA_WRITE_MUL48, + 0, lba, count); + } } } else { - if (bp->bio_cmd == BIO_READ) { - ata_28bit_cmd(ataio, ATA_READ_DMA, - 0, lba, count); + if (count == 256) + count = 0; + if (softc->flags & ADA_FLAG_CAN_DMA) { + if (bp->bio_cmd == BIO_READ) { + ata_28bit_cmd(ataio, ATA_READ_DMA, + 0, lba, count); + } else { + ata_28bit_cmd(ataio, ATA_WRITE_DMA, + 0, lba, count); + } } else { - ata_28bit_cmd(ataio, ATA_WRITE_DMA, - 0, lba, count); + if (bp->bio_cmd == BIO_READ) { + ata_28bit_cmd(ataio, ATA_READ_MUL, + 0, lba, count); + } else { + ata_28bit_cmd(ataio, ATA_WRITE_MUL, + 0, lba, count); + } } } } @@ -872,7 +868,7 @@ 1, adadone, CAM_DIR_NONE, - tag_code, + 0, NULL, 0, ada_default_timeout*1000); @@ -893,12 +889,6 @@ &start_ccb->ccb_h, periph_links.le); softc->outstanding_cmds++; - /* We expect a unit attention from this device */ - if ((softc->flags & ADA_FLAG_RETRY_UA) != 0) { - start_ccb->ccb_h.ccb_state |= ADA_CCB_RETRY_UA; - softc->flags &= ~ADA_FLAG_RETRY_UA; - } - start_ccb->ccb_h.ccb_bp = bp; bp = bioq_first(&softc->bio_queue); @@ -911,7 +901,22 @@ } break; } + case ADA_STATE_SET_MULTI: + { + cam_fill_ataio(ataio, + ada_retry_count, + adadone, + CAM_DIR_NONE, + 0, + NULL, + 0, + ada_default_timeout*1000); + + ata_28bit_cmd(ataio, ATA_SET_MULTI, 0, 0, softc->secsperint); + start_ccb->ccb_h.ccb_state = ADA_CCB_SET_MULTI; + xpt_action(start_ccb); } + } } static void @@ -931,16 +936,12 @@ if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) { int error; - error = adaerror(done_ccb, CAM_RETRY_SELTO, 0); + error = adaerror(done_ccb, 0, 0); if (error == ERESTART) { - /* - * A retry was scheuled, so - * just return. - */ + /* A retry was scheduled, so just return. */ return; } if (error != 0) { - if (error == ENXIO) { /* * Catastrophic error. Mark our pack as @@ -1002,6 +1003,35 @@ wakeup(&done_ccb->ccb_h.cbfcnp); return; } + case ADA_CCB_SET_MULTI: + { + if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { + } else { + int error; + + error = adaerror(done_ccb, 0, 0); + if (error == ERESTART) { + /* A retry was scheduled, so just return. */ + return; + } + } + softc->state = ADA_STATE_NORMAL; + /* + * Since our peripheral may be invalidated by an error + * above or an external event, we must release our CCB + * before releasing the probe lock on the peripheral. + * The peripheral will only go away once the last lock + * is removed, and we need it around for the CCB release + * operation. + */ + xpt_release_ccb(done_ccb); + if (bioq_first(&softc->bio_queue) != NULL) { + /* Have more work to do, so ensure we stay scheduled */ + xpt_schedule(periph, 1); + } + cam_periph_release_locked(periph); + return; + } case ADA_CCB_DUMP: /* No-op. We're polling */ return; @@ -1049,10 +1079,6 @@ lbasize = (u_int32_t)cgd->ident_data.lba_size_1 | ((u_int32_t)cgd->ident_data.lba_size_2 << 16); - /* does this device need oldstyle CHS addressing */ -// if (!ad_version(cgd->ident_data.version_major) || !lbasize) -// atadev->flags |= ATA_D_USE_CHS; - /* use the 28bit LBA size if valid or bigger than the CHS mapping */ if (cgd->ident_data.cylinders == 16383 || dp->sectors < lbasize) dp->sectors = lbasize; ==== //depot/projects/usb/src/sys/cam/ata/ata_xpt.c#4 (text+ko) ==== @@ -25,7 +25,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/cam/ata/ata_xpt.c,v 1.5 2009/08/30 16:31:25 mav Exp $"); +__FBSDID("$FreeBSD: src/sys/cam/ata/ata_xpt.c,v 1.7 2009/10/21 15:27:48 mav Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -62,7 +62,6 @@ #include <cam/scsi/scsi_all.h> #include <cam/scsi/scsi_message.h> -#include <cam/scsi/scsi_pass.h> #include <cam/ata/ata_all.h> #include <machine/stdarg.h> /* for xpt_print below */ #include "opt_cam.h" @@ -755,11 +754,8 @@ strlen(path->device->serial_num); } - path->device->flags |= CAM_DEV_INQUIRY_DATA_VALID; - - scsi_find_quirk(path->device); + path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID; ata_device_transport(path); - PROBE_SET_ACTION(softc, PROBE_SETMODE); xpt_release_ccb(done_ccb); xpt_schedule(periph, priority); @@ -793,7 +789,7 @@ case PROBE_SETMODE: { if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - if (path->device->protocol == PROTO_ATA) { +modedone: if (path->device->protocol == PROTO_ATA) { path->device->flags &= ~CAM_DEV_UNCONFIGURED; done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; xpt_action(done_ccb); @@ -815,6 +811,10 @@ xpt_release_devq(done_ccb->ccb_h.path, /*count*/1, /*run_queue*/TRUE); } + /* Old PIO2 devices may not support mode setting. */ + if (ata_max_pmode(ident_buf) <= ATA_PIO2 && + (ident_buf->capabilities1 & ATA_SUPPORT_IORDY) == 0) + goto modedone; goto device_fail; } case PROBE_INQUIRY: @@ -854,8 +854,7 @@ } scsi_find_quirk(path->device); - -// scsi_devise_transport(path); + ata_device_transport(path); path->device->flags &= ~CAM_DEV_UNCONFIGURED; done_ccb->ccb_h.func_code = XPT_GDEV_TYPE; xpt_action(done_ccb); @@ -876,7 +875,7 @@ } case PROBE_PM_PID: if ((done_ccb->ccb_h.status & CAM_STATUS_MASK) == CAM_REQ_CMP) { - if ((path->device->flags & CAM_DEV_INQUIRY_DATA_VALID) == 0) + if ((path->device->flags & CAM_DEV_IDENTIFY_DATA_VALID) == 0) bzero(ident_buf, sizeof(*ident_buf)); softc->pm_pid = (done_ccb->ataio.res.lba_high << 24) + (done_ccb->ataio.res.lba_mid << 16) + @@ -940,7 +939,7 @@ softc->pm_ports = 5; printf("PM ports: %d\n", softc->pm_ports); ident_buf->config = softc->pm_ports; - path->device->flags |= CAM_DEV_INQUIRY_DATA_VALID; + path->device->flags |= CAM_DEV_IDENTIFY_DATA_VALID; softc->pm_step = 0; PROBE_SET_ACTION(softc, PROBE_PM_RESET); xpt_release_ccb(done_ccb); @@ -1170,7 +1169,10 @@ } scan_info->request_ccb = request_ccb; scan_info->cpi = &work_ccb->cpi; - scan_info->found = 0x8001; + if (scan_info->cpi->transport == XPORT_ATA) + scan_info->found = 0x0003; + else + scan_info->found = 0x8001; scan_info->counter = 0; /* If PM supported, probe it first. */ if (scan_info->cpi->hba_inquiry & PI_SATAPM) @@ -1212,7 +1214,8 @@ take_next: /* Take next device. Wrap from 15 (PM) to 0. */ scan_info->counter = (scan_info->counter + 1 ) & 0x0f; - if (scan_info->counter >= scan_info->cpi->max_target+1) { + if (scan_info->counter > scan_info->cpi->max_target - + ((scan_info->cpi->hba_inquiry & PI_SATAPM) ? 1 : 0)) { xpt_free_ccb(work_ccb); xpt_free_ccb((union ccb *)scan_info->cpi); request_ccb = scan_info->request_ccb; @@ -1399,68 +1402,29 @@ ata_device_transport(struct cam_path *path) { struct ccb_pathinq cpi; -// struct ccb_trans_settings cts; - struct scsi_inquiry_data *inq_buf; + struct ccb_trans_settings cts; + struct scsi_inquiry_data *inq_buf = NULL; + struct ata_params *ident_buf = NULL; /* Get transport information from the SIM */ xpt_setup_ccb(&cpi.ccb_h, path, /*priority*/1); cpi.ccb_h.func_code = XPT_PATH_INQ; xpt_action((union ccb *)&cpi); - inq_buf = NULL; -// if ((path->device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0) -// inq_buf = &path->device->inq_data; -// path->device->protocol = cpi.protocol; -// path->device->protocol_version = -// inq_buf != NULL ? SID_ANSI_REV(inq_buf) : cpi.protocol_version; path->device->transport = cpi.transport; - path->device->transport_version = cpi.transport_version; -#if 0 - /* - * Any device not using SPI3 features should - * be considered SPI2 or lower. - */ - if (inq_buf != NULL) { - if (path->device->transport == XPORT_SPI - && (inq_buf->spi3data & SID_SPI_MASK) == 0 - && path->device->transport_version > 2) - path->device->transport_version = 2; - } else { - struct cam_ed* otherdev; - - for (otherdev = TAILQ_FIRST(&path->target->ed_entries); - otherdev != NULL; - otherdev = TAILQ_NEXT(otherdev, links)) { - if (otherdev != path->device) - break; - } - - if (otherdev != NULL) { - /* - * Initially assume the same versioning as - * prior luns for this target. - */ - path->device->protocol_version = - otherdev->protocol_version; - path->device->transport_version = - otherdev->transport_version; - } else { - /* Until we know better, opt for safty */ - path->device->protocol_version = 2; - if (path->device->transport == XPORT_SPI) - path->device->transport_version = 2; - else - path->device->transport_version = 0; - } + if ((path->device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0) + inq_buf = &path->device->inq_data; + if ((path->device->flags & CAM_DEV_IDENTIFY_DATA_VALID) != 0) + ident_buf = &path->device->ident_data; + if (path->device->protocol == PROTO_ATA) { + path->device->protocol_version = ident_buf ? + ata_version(ident_buf->version_major) : cpi.protocol_version; + } else if (path->device->protocol == PROTO_SCSI) { + path->device->protocol_version = inq_buf ? + SID_ANSI_REV(inq_buf) : cpi.protocol_version; } - - /* - * XXX - * For a device compliant with SPC-2 we should be able - * to determine the transport version supported by - * scrutinizing the version descriptors in the - * inquiry buffer. - */ + path->device->transport_version = ident_buf ? + ata_version(ident_buf->version_major) : cpi.transport_version; /* Tell the controller what we think */ xpt_setup_ccb(&cts.ccb_h, path, /*priority*/1); @@ -1473,7 +1437,6 @@ cts.proto_specific.valid = 0; cts.xport_specific.valid = 0; xpt_action((union ccb *)&cts); -#endif } static void @@ -1629,114 +1592,6 @@ scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB; } - /* SPI specific sanity checking */ - if (cts->transport == XPORT_SPI && async_update == FALSE) { - u_int spi3caps; - struct ccb_trans_settings_spi *spi; - struct ccb_trans_settings_spi *cur_spi; - - spi = &cts->xport_specific.spi; - - cur_spi = &cur_cts.xport_specific.spi; - - /* Fill in any gaps in what the user gave us */ - if ((spi->valid & CTS_SPI_VALID_SYNC_RATE) == 0) - spi->sync_period = cur_spi->sync_period; - if ((cur_spi->valid & CTS_SPI_VALID_SYNC_RATE) == 0) - spi->sync_period = 0; - if ((spi->valid & CTS_SPI_VALID_SYNC_OFFSET) == 0) - spi->sync_offset = cur_spi->sync_offset; - if ((cur_spi->valid & CTS_SPI_VALID_SYNC_OFFSET) == 0) - spi->sync_offset = 0; - if ((spi->valid & CTS_SPI_VALID_PPR_OPTIONS) == 0) - spi->ppr_options = cur_spi->ppr_options; - if ((cur_spi->valid & CTS_SPI_VALID_PPR_OPTIONS) == 0) - spi->ppr_options = 0; - if ((spi->valid & CTS_SPI_VALID_BUS_WIDTH) == 0) - spi->bus_width = cur_spi->bus_width; - if ((cur_spi->valid & CTS_SPI_VALID_BUS_WIDTH) == 0) - spi->bus_width = 0; - if ((spi->valid & CTS_SPI_VALID_DISC) == 0) { - spi->flags &= ~CTS_SPI_FLAGS_DISC_ENB; - spi->flags |= cur_spi->flags & CTS_SPI_FLAGS_DISC_ENB; - } - if ((cur_spi->valid & CTS_SPI_VALID_DISC) == 0) - spi->flags &= ~CTS_SPI_FLAGS_DISC_ENB; - if (((device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0 - && (inq_data->flags & SID_Sync) == 0 - && cts->type == CTS_TYPE_CURRENT_SETTINGS) - || ((cpi.hba_inquiry & PI_SDTR_ABLE) == 0)) { - /* Force async */ - spi->sync_period = 0; - spi->sync_offset = 0; - } - - switch (spi->bus_width) { - case MSG_EXT_WDTR_BUS_32_BIT: - if (((device->flags & CAM_DEV_INQUIRY_DATA_VALID) == 0 - || (inq_data->flags & SID_WBus32) != 0 - || cts->type == CTS_TYPE_USER_SETTINGS) - && (cpi.hba_inquiry & PI_WIDE_32) != 0) - break; - /* Fall Through to 16-bit */ - case MSG_EXT_WDTR_BUS_16_BIT: - if (((device->flags & CAM_DEV_INQUIRY_DATA_VALID) == 0 - || (inq_data->flags & SID_WBus16) != 0 - || cts->type == CTS_TYPE_USER_SETTINGS) - && (cpi.hba_inquiry & PI_WIDE_16) != 0) { - spi->bus_width = MSG_EXT_WDTR_BUS_16_BIT; - break; - } - /* Fall Through to 8-bit */ - default: /* New bus width?? */ - case MSG_EXT_WDTR_BUS_8_BIT: - /* All targets can do this */ - spi->bus_width = MSG_EXT_WDTR_BUS_8_BIT; - break; - } - - spi3caps = cpi.xport_specific.spi.ppr_options; - if ((device->flags & CAM_DEV_INQUIRY_DATA_VALID) != 0 - && cts->type == CTS_TYPE_CURRENT_SETTINGS) - spi3caps &= inq_data->spi3data; - - if ((spi3caps & SID_SPI_CLOCK_DT) == 0) - spi->ppr_options &= ~MSG_EXT_PPR_DT_REQ; - - if ((spi3caps & SID_SPI_IUS) == 0) - spi->ppr_options &= ~MSG_EXT_PPR_IU_REQ; - - if ((spi3caps & SID_SPI_QAS) == 0) - spi->ppr_options &= ~MSG_EXT_PPR_QAS_REQ; - - /* No SPI Transfer settings are allowed unless we are wide */ - if (spi->bus_width == 0) - spi->ppr_options = 0; - - if ((spi->valid & CTS_SPI_VALID_DISC) - && ((spi->flags & CTS_SPI_FLAGS_DISC_ENB) == 0)) { - /* - * Can't tag queue without disconnection. - */ - scsi->flags &= ~CTS_SCSI_FLAGS_TAG_ENB; - scsi->valid |= CTS_SCSI_VALID_TQ; - } - - /* - * If we are currently performing tagged transactions to - * this device and want to change its negotiation parameters, - * go non-tagged for a bit to give the controller a chance to - * negotiate unhampered by tag messages. - */ - if (cts->type == CTS_TYPE_CURRENT_SETTINGS - && (device->inq_flags & SID_CmdQue) != 0 - && (scsi->flags & CTS_SCSI_FLAGS_TAG_ENB) != 0 - && (spi->flags & (CTS_SPI_VALID_SYNC_RATE| - CTS_SPI_VALID_SYNC_OFFSET| - CTS_SPI_VALID_BUS_WIDTH)) != 0) - scsi_toggle_tags(cts->ccb_h.path); - } - if (cts->type == CTS_TYPE_CURRENT_SETTINGS && (scsi->valid & CTS_SCSI_VALID_TQ) != 0) { int device_tagenb; ==== //depot/projects/usb/src/sys/cam/cam_xpt.c#23 (text+ko) ==== @@ -28,7 +28,7 @@ */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.224 2009/09/15 00:15:24 ken Exp $"); +__FBSDID("$FreeBSD: src/sys/cam/cam_xpt.c,v 1.225 2009/10/21 15:57:16 mav Exp $"); #include <sys/param.h> #include <sys/bus.h> @@ -4148,8 +4148,6 @@ sendq->qfrozen_cnt--; if (sendq->qfrozen_cnt == 0) { - struct cam_eb *bus; - /* * If there is a timeout scheduled to release this * sim queue, remove it. The queue frozen count is @@ -4159,15 +4157,17 @@ callout_stop(&sim->callout); sim->flags &= ~CAM_SIM_REL_TIMEOUT_PENDING; } - bus = xpt_find_bus(sim->path_id); if (run_queue) { + struct cam_eb *bus; + /* * Now that we are unfrozen run the send queue. */ + bus = xpt_find_bus(sim->path_id); xpt_run_dev_sendq(bus); + xpt_release_bus(bus); } - xpt_release_bus(bus); } } } ==== //depot/projects/usb/src/sys/cam/cam_xpt_internal.h#3 (text+ko) ==== @@ -23,7 +23,7 @@ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * - * $FreeBSD: src/sys/cam/cam_xpt_internal.h,v 1.2 2009/09/06 19:06:50 mav Exp $ + * $FreeBSD: src/sys/cam/cam_xpt_internal.h,v 1.3 2009/10/21 15:27:48 mav Exp $ */ #ifndef _CAM_CAM_XPT_INTERNAL_H @@ -116,6 +116,7 @@ #define CAM_DEV_INQUIRY_DATA_VALID 0x40 #define CAM_DEV_IN_DV 0x80 #define CAM_DEV_DV_HIT_BOTTOM 0x100 +#define CAM_DEV_IDENTIFY_DATA_VALID 0x200 u_int32_t tag_delay_count; #define CAM_TAG_DELAY_COUNT 5 u_int32_t tag_saved_openings; ==== //depot/projects/usb/src/sys/compat/x86bios/x86bios.c#2 (text+ko) ==== @@ -1,5 +1,6 @@ /*- * Copyright (c) 2009 Alex Keda <admin@lissyara.su> + * Copyright (c) 2009 Jung-uk Kim <jkim@FreeBSD.org> * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -22,39 +23,162 @@ * 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. - * */ #include <sys/cdefs.h> -__FBSDID("$FreeBSD: src/sys/compat/x86bios/x86bios.c,v 1.5 2009/09/28 08:14:15 delphij Exp $"); +__FBSDID("$FreeBSD: src/sys/compat/x86bios/x86bios.c,v 1.7 2009/10/19 21:01:42 jkim Exp $"); #include "opt_x86bios.h" #include <sys/param.h> +#include <sys/bus.h> #include <sys/kernel.h> #include <sys/lock.h> +#include <sys/malloc.h> #include <sys/module.h> #include <sys/mutex.h> +#include <sys/proc.h> + +#include <contrib/x86emu/x86emu.h> +#include <contrib/x86emu/x86emu_regs.h> +#include <compat/x86bios/x86bios.h> + >>> TRUNCATED FOR MAIL (1000 lines) <<<
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200910212038.n9LKcX1W080714>