PERFORCE change 169663 for review
Andrew Thompson
thompsa at FreeBSD.org
Wed Oct 21 20:38:34 UTC 2009
http://p4web.freebsd.org/chv.cgi?CH=169663
Change 169663 by thompsa at 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 at lissyara.su>
+ * Copyright (c) 2009 Jung-uk Kim <jkim at 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) <<<
More information about the p4-projects
mailing list