From 2458a87a718a37261418254ad47f5f9adc3366d4 Mon Sep 17 00:00:00 2001 From: zrj Date: Sun, 26 Nov 2017 17:53:16 +0200 Subject: [PATCH] kernel/nata: Deal with ATA_DEV() and atadev->unit. Hopefully I got all places correctly. While there, some misc cleanup. --- sys/dev/disk/nata/ata-all.c | 77 +++++++------------ sys/dev/disk/nata/ata-all.h | 18 +++-- sys/dev/disk/nata/ata-lowlevel.c | 24 +++--- sys/dev/disk/nata/ata-raid.c | 14 ++-- sys/dev/disk/nata/ata-sata.c | 14 ++-- sys/dev/disk/nata/atapi-cam.c | 17 ++-- sys/dev/disk/nata/atapi-cd.c | 2 +- sys/dev/disk/nata/atapi-cd.h | 3 +- sys/dev/disk/nata/atapi-fd.c | 2 +- sys/dev/disk/nata/atapi-fd.h | 2 +- sys/dev/disk/nata/atapi-tape.c | 2 +- sys/dev/disk/nata/atapi-tape.h | 2 +- sys/dev/disk/nata/chipsets/ata-acard.c | 4 +- sys/dev/disk/nata/chipsets/ata-acerlabs.c | 2 +- sys/dev/disk/nata/chipsets/ata-ahci.c | 16 ++-- sys/dev/disk/nata/chipsets/ata-amd.c | 2 +- sys/dev/disk/nata/chipsets/ata-ati.c | 2 +- sys/dev/disk/nata/chipsets/ata-cyrix.c | 2 +- sys/dev/disk/nata/chipsets/ata-highpoint.c | 2 +- sys/dev/disk/nata/chipsets/ata-intel.c | 10 +-- sys/dev/disk/nata/chipsets/ata-ite.c | 4 +- sys/dev/disk/nata/chipsets/ata-national.c | 2 +- sys/dev/disk/nata/chipsets/ata-nvidia.c | 2 +- sys/dev/disk/nata/chipsets/ata-promise.c | 33 +++++--- sys/dev/disk/nata/chipsets/ata-serverworks.c | 8 +- sys/dev/disk/nata/chipsets/ata-siliconimage.c | 26 ++++--- sys/dev/disk/nata/chipsets/ata-sis.c | 2 +- sys/dev/disk/nata/chipsets/ata-via.c | 2 +- sys/dev/disk/nata/nataisa/Makefile | 2 - 29 files changed, 150 insertions(+), 148 deletions(-) diff --git a/sys/dev/disk/nata/ata-all.c b/sys/dev/disk/nata/ata-all.c index a5eea0e5e0..5340c4fe30 100644 --- a/sys/dev/disk/nata/ata-all.c +++ b/sys/dev/disk/nata/ata-all.c @@ -594,11 +594,9 @@ ata_getparam(struct ata_device *atadev, int init) u_int8_t command = 0; int error = ENOMEM, retries = 2; - if (ch->devices & - (atadev->unit == ATA_MASTER ? ATA_ATA_MASTER : ATA_ATA_SLAVE)) + if (ch->devices & (ATA_ATA_MASTER << atadev->unit)) command = ATA_ATA_IDENTIFY; - if (ch->devices & - (atadev->unit == ATA_MASTER ? ATA_ATAPI_MASTER : ATA_ATAPI_SLAVE)) + if (ch->devices & (ATA_ATAPI_MASTER << atadev->unit)) command = ATA_ATAPI_IDENTIFY; if (!command) return ENXIO; @@ -685,54 +683,37 @@ int ata_identify(device_t dev) { struct ata_channel *ch = device_get_softc(dev); - struct ata_device *master = NULL, *slave = NULL; - device_t master_child = NULL, slave_child = NULL; - int master_unit = -1, slave_unit = -1; - - if (ch->devices & (ATA_ATA_MASTER | ATA_ATAPI_MASTER)) { - if (!(master = kmalloc(sizeof(struct ata_device), - M_ATA, M_INTWAIT | M_ZERO))) { - device_printf(dev, "out of memory\n"); - return ENOMEM; - } - master->unit = ATA_MASTER; - } - if (ch->devices & (ATA_ATA_SLAVE | ATA_ATAPI_SLAVE)) { - if (!(slave = kmalloc(sizeof(struct ata_device), - M_ATA, M_INTWAIT | M_ZERO))) { - kfree(master, M_ATA); - device_printf(dev, "out of memory\n"); - return ENOMEM; - } - slave->unit = ATA_SLAVE; - } + struct ata_device *atadev; + device_t child; + int i; + if (bootverbose) + device_printf(dev, "identify ch->devices=%08x\n", ch->devices); + + for (i = 0; i < ATA_PM; ++i) { + if (ch->devices & (((ATA_ATA_MASTER | ATA_ATAPI_MASTER) << i))) { + int unit = -1; + + if (!(atadev = kmalloc(sizeof(struct ata_device), + M_ATA, M_INTWAIT | M_ZERO))) { + device_printf(dev, "out of memory\n"); + return ENOMEM; + } + atadev->unit = i; #ifdef ATA_STATIC_ID - if (ch->devices & ATA_ATA_MASTER) - master_unit = (device_get_unit(dev) << 1); -#endif - if (master && !(master_child = ata_add_child(dev, master, master_unit))) { - kfree(master, M_ATA); - master = NULL; - } -#ifdef ATA_STATIC_ID - if (ch->devices & ATA_ATA_SLAVE) - slave_unit = (device_get_unit(dev) << 1) + 1; + if (ch->devices & ((ATA_ATA_MASTER << i))) + unit = (device_get_unit(dev) << 1) + i; #endif - if (slave && !(slave_child = ata_add_child(dev, slave, slave_unit))) { - kfree(slave, M_ATA); - slave = NULL; - } - - if (slave && ata_getparam(slave, 1)) { - device_delete_child(dev, slave_child); - kfree(slave, M_ATA); - } - if (master && ata_getparam(master, 1)) { - device_delete_child(dev, master_child); - kfree(master, M_ATA); + if ((child = ata_add_child(dev, atadev, unit))) { + if (ata_getparam(atadev, 1)) { + device_delete_child(dev, child); + kfree(atadev, M_ATA); + } + } + else + kfree(atadev, M_ATA); + } } - bus_generic_probe(dev); bus_generic_attach(dev); return 0; diff --git a/sys/dev/disk/nata/ata-all.h b/sys/dev/disk/nata/ata-all.h index 997335c28b..7ca5e3d536 100644 --- a/sys/dev/disk/nata/ata-all.h +++ b/sys/dev/disk/nata/ata-all.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1998 - 2006 Søren Schmidt + * Copyright (c) 1998 - 2008 Søren Schmidt * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -301,7 +301,7 @@ struct ata_ahci_cmd_list { #define ATA_CTLADDR_RID 1 #define ATA_BMADDR_RID 0x20 #define ATA_IRQ_RID 0 -#define ATA_DEV(device) ((device == ATA_MASTER) ? 0 : 1) +#define ATA_DEV(unit) ((unit > 0) ? 0x10 : 0) #define ATA_CFA_MAGIC1 0x844A #define ATA_CFA_MAGIC2 0x848A #define ATA_CFA_MAGIC3 0x8400 @@ -415,7 +415,8 @@ struct ata_device { device_t dev; /* device handle */ int unit; /* physical unit */ #define ATA_MASTER 0x00 -#define ATA_SLAVE 0x10 +#define ATA_SLAVE 0x01 +#define ATA_PM 0x0f struct ata_params param; /* ata param structure */ int mode; /* current transfermode */ @@ -481,6 +482,7 @@ struct ata_dma { /* structure holding lowlevel functions */ struct ata_lowlevel { + u_int32_t (*softreset)(device_t dev, int pmport); int (*status)(device_t dev); int (*begin_transaction)(struct ata_request *request); int (*end_transaction)(struct ata_request *request); @@ -512,11 +514,11 @@ struct ata_channel { #define ATA_ALWAYS_DMASTAT 0x10 int devices; /* what is present */ -#define ATA_ATA_MASTER 0x01 -#define ATA_ATA_SLAVE 0x02 -#define ATA_ATAPI_MASTER 0x04 -#define ATA_ATAPI_SLAVE 0x08 -#define ATA_PORTMULTIPLIER 0x10 +#define ATA_ATA_MASTER 0x00000001 +#define ATA_ATA_SLAVE 0x00000002 +#define ATA_PORTMULTIPLIER 0x00008000 +#define ATA_ATAPI_MASTER 0x00010000 +#define ATA_ATAPI_SLAVE 0x00020000 struct lock state_mtx; /* state lock */ int state; /* ATA channel state */ diff --git a/sys/dev/disk/nata/ata-lowlevel.c b/sys/dev/disk/nata/ata-lowlevel.c index f8c899d936..0221044a2d 100644 --- a/sys/dev/disk/nata/ata-lowlevel.c +++ b/sys/dev/disk/nata/ata-lowlevel.c @@ -153,7 +153,7 @@ ata_begin_transaction(struct ata_request *request) case ATA_R_ATAPI: /* is this just a POLL DSC command ? */ if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | atadev->unit); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit)); DELAY(10); if (!(ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_DSC)) request->result = EBUSY; @@ -172,7 +172,7 @@ ata_begin_transaction(struct ata_request *request) case ATA_R_ATAPI|ATA_R_DMA: /* is this just a POLL DSC command ? */ if (request->u.atapi.ccb[0] == ATAPI_POLL_DSC) { - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | atadev->unit); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit)); DELAY(10); if (!(ATA_IDX_INB(ch, ATA_ALTSTAT) & ATA_S_DSC)) request->result = EBUSY; @@ -457,7 +457,7 @@ ata_generic_reset(device_t dev) int mask = 0, timeout; /* do we have any signs of ATA/ATAPI HW being present ? */ - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_MASTER); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_MASTER)); DELAY(10); ostat0 = ATA_IDX_INB(ch, ATA_STATUS); if ((ostat0 & 0xf8) != 0xf8 && ostat0 != 0xa5) { @@ -467,7 +467,7 @@ ata_generic_reset(device_t dev) /* in some setups we dont want to test for a slave */ if (!(ch->flags & ATA_NO_SLAVE)) { - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_SLAVE); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_SLAVE)); DELAY(10); ostat1 = ATA_IDX_INB(ch, ATA_STATUS); if ((ostat1 & 0xf8) != 0xf8 && ostat1 != 0xa5) { @@ -487,7 +487,7 @@ ata_generic_reset(device_t dev) return; /* reset (both) devices on this channel */ - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_MASTER); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_MASTER)); DELAY(10); ATA_IDX_OUTB(ch, ATA_CONTROL, ATA_A_IDS | ATA_A_RESET); ata_udelay(10000); @@ -498,7 +498,7 @@ ata_generic_reset(device_t dev) /* wait for BUSY to go inactive */ for (timeout = 0; timeout < 310; timeout++) { if ((mask & 0x01) && (stat0 & ATA_S_BUSY)) { - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_MASTER); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(ATA_MASTER)); DELAY(10); err = ATA_IDX_INB(ch, ATA_ERROR); lsb = ATA_IDX_INB(ch, ATA_CYL_LSB); @@ -528,7 +528,7 @@ ata_generic_reset(device_t dev) if ((mask & 0x02) && (stat1 & ATA_S_BUSY) && !((mask & 0x01) && (stat0 & ATA_S_BUSY))) { - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_SLAVE); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(ATA_SLAVE)); DELAY(10); err = ATA_IDX_INB(ch, ATA_ERROR); lsb = ATA_IDX_INB(ch, ATA_CYL_LSB); @@ -608,7 +608,7 @@ ata_wait(struct ata_channel *ch, struct ata_device *atadev, u_int8_t mask) /* if drive fails status, reselect the drive and try again */ if (status == 0xff) { - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | atadev->unit); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit)); timeout += 1000; DELAY(1000); continue; @@ -652,7 +652,7 @@ ata_generic_command(struct ata_request *request) struct ata_device *atadev = device_get_softc(request->dev); /* select device */ - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | atadev->unit); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit)); /* ready to issue command ? */ if (ata_wait(ch, atadev, 0) < 0) { @@ -763,7 +763,7 @@ ata_tf_write(struct ata_request *request) ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 40); ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_LBA | atadev->unit); + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(atadev->unit)); } else { ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); @@ -785,7 +785,7 @@ ata_tf_write(struct ata_request *request) (request->u.ata.lba / (sectors * heads))); ATA_IDX_OUTB(ch, ATA_CYL_MSB, (request->u.ata.lba / (sectors * heads)) >> 8); - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | atadev->unit | + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit) | (((request->u.ata.lba% (sectors * heads)) / sectors) & 0xf)); } @@ -794,7 +794,7 @@ ata_tf_write(struct ata_request *request) ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); ATA_IDX_OUTB(ch, ATA_DRIVE, - ATA_D_IBM | ATA_D_LBA | atadev->unit | + ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit) | ((request->u.ata.lba >> 24) & 0x0f)); } } diff --git a/sys/dev/disk/nata/ata-raid.c b/sys/dev/disk/nata/ata-raid.c index 4ddb80b6b4..3ee99ad70d 100644 --- a/sys/dev/disk/nata/ata-raid.c +++ b/sys/dev/disk/nata/ata-raid.c @@ -1723,8 +1723,8 @@ ata_raid_adaptec_read_meta(device_t dev, struct ar_softc **raidp) if (be32toh(meta->generation) >= raid->generation) { struct ata_device *atadev = device_get_softc(parent); struct ata_channel *ch = device_get_softc(GRANDPARENT(dev)); - int disk_number = (ch->unit << !(ch->flags & ATA_NO_SLAVE)) + - ATA_DEV(atadev->unit); + int disk_number = + (ch->unit << !(ch->flags & ATA_NO_SLAVE)) + atadev->unit; raid->disks[disk_number].dev = parent; raid->disks[disk_number].sectors = @@ -2352,7 +2352,7 @@ ata_raid_intel_write_meta(struct ar_softc *rdp) bcopy(atadev->param.serial + len, meta->disk[disk].serial, sizeof(rdp->disks[disk].serial)); meta->disk[disk].sectors = rdp->disks[disk].sectors; - meta->disk[disk].id = (ch->unit << 16) | ATA_DEV(atadev->unit); + meta->disk[disk].id = (ch->unit << 16) | atadev->unit; } else meta->disk[disk].sectors = rdp->total_sectors / rdp->width; @@ -3341,7 +3341,7 @@ ata_raid_promise_write_meta(struct ar_softc *rdp) device_get_softc(device_get_parent(rdp->disks[disk].dev)); meta->raid.channel = ch->unit; - meta->raid.device = ATA_DEV(atadev->unit); + meta->raid.device = atadev->unit; meta->raid.disk_sectors = rdp->disks[disk].sectors; meta->raid.disk_offset = rdp->offset_sectors; } @@ -3429,7 +3429,7 @@ ata_raid_promise_write_meta(struct ar_softc *rdp) device_get_softc(rdp->disks[drive].dev); meta->raid.disk[drive].channel = ch->unit; - meta->raid.disk[drive].device = ATA_DEV(atadev->unit); + meta->raid.disk[drive].device = atadev->unit; } meta->raid.disk[drive].magic_0 = PR_MAGIC0(meta->raid.disk[drive]) | timestamp.tv_sec; @@ -3742,7 +3742,7 @@ ata_raid_sis_write_meta(struct ar_softc *rdp) struct ata_channel *ch = device_get_softc(device_get_parent(rdp->disks[disk].dev)); struct ata_device *atadev = device_get_softc(rdp->disks[disk].dev); - int disk_number = 1 + ATA_DEV(atadev->unit) + (ch->unit << 1); + int disk_number = 1 + atadev->unit + (ch->unit << 1); meta->disks |= disk_number << ((1 - disk) << 2); } @@ -3780,7 +3780,7 @@ ata_raid_sis_write_meta(struct ar_softc *rdp) bcopy(atadev->param.model, meta->model, sizeof(meta->model)); /* XXX SOS if total_disks > 2 this may not float */ - meta->disk_number = 1 + ATA_DEV(atadev->unit) + (ch->unit << 1); + meta->disk_number = 1 + atadev->unit + (ch->unit << 1); if (testing || bootverbose) ata_raid_sis_print_meta(meta); diff --git a/sys/dev/disk/nata/ata-sata.c b/sys/dev/disk/nata/ata-sata.c index a5552c7e74..a7cc660b43 100644 --- a/sys/dev/disk/nata/ata-sata.c +++ b/sys/dev/disk/nata/ata-sata.c @@ -210,8 +210,8 @@ ata_request2fis_h2d(struct ata_request *request, u_int8_t *fis) struct ata_device *atadev = device_get_softc(request->dev); if (request->flags & ATA_R_ATAPI) { - fis[0] = 0x27; /* host to device */ - fis[1] = 0x80; /* command FIS (note PM goes here) */ + fis[0] = 0x27; /* host to device */ + fis[1] = 0x80 | (atadev->unit & 0x0f); fis[2] = ATA_PACKET_CMD; if (request->flags & (ATA_R_READ | ATA_R_WRITE)) fis[3] = ATA_F_DMA; @@ -219,22 +219,22 @@ ata_request2fis_h2d(struct ata_request *request, u_int8_t *fis) fis[5] = request->transfersize; fis[6] = request->transfersize >> 8; } - fis[7] = ATA_D_LBA | atadev->unit; + fis[7] = ATA_D_LBA; fis[15] = ATA_A_4BIT; return 20; } else { ata_modify_if_48bit(request); - fis[0] = 0x27; /* host to device */ - fis[1] = 0x80; /* command FIS (note PM goes here) */ + fis[0] = 0x27; /* host to device */ + fis[1] = 0x80 | (atadev->unit & 0x0f); fis[2] = request->u.ata.command; fis[3] = request->u.ata.feature; fis[4] = request->u.ata.lba; fis[5] = request->u.ata.lba >> 8; fis[6] = request->u.ata.lba >> 16; - fis[7] = ATA_D_LBA | atadev->unit; + fis[7] = ATA_D_LBA; if (!(atadev->flags & ATA_D_48BIT_ACTIVE)) - fis[7] |= (request->u.ata.lba >> 24 & 0x0f); + fis[7] |= (ATA_D_IBM | (request->u.ata.lba >> 24 & 0x0f)); fis[8] = request->u.ata.lba >> 24; fis[9] = request->u.ata.lba >> 32; fis[10] = request->u.ata.lba >> 40; diff --git a/sys/dev/disk/nata/atapi-cam.c b/sys/dev/disk/nata/atapi-cam.c index 74445f6f6b..8b6b74f4f3 100644 --- a/sys/dev/disk/nata/atapi-cam.c +++ b/sys/dev/disk/nata/atapi-cam.c @@ -150,10 +150,14 @@ atapi_cam_identify(device_t *dev, device_t parent) kmalloc(sizeof(struct atapi_xpt_softc), M_ATACAM, M_INTWAIT|M_ZERO); device_t child; + if (scp == NULL) { + kprintf ("atapi_cam_identify: out of memory"); + return; + } + /* Assume one atapicam instance per parent channel instance. */ child = device_add_child(parent, "atapicam", -1); if (child == NULL) { - /* XXX TGEN Use device_printf()? */ kprintf("atapi_cam_identify: out of memory, can't add child"); kfree(scp, M_ATACAM); return; @@ -172,7 +176,7 @@ atapi_cam_probe(device_t dev) KASSERT(atadev != NULL, ("expect valid struct ata_device")); if (atadev->unit < 0) { device_set_desc(dev, "ATAPI CAM Attachment"); - return(0); + return (0); } else { return ENXIO; } @@ -308,7 +312,7 @@ reinit_bus(struct atapi_xpt_softc *scp, enum reinit_reason reason) { xpt_async(AC_BUS_RESET, scp->path, NULL); if (!dev_changed) - break; + break; /*FALLTHROUGH*/ case ATTACH: @@ -592,8 +596,11 @@ atapi_action(struct cam_sim *sim, union ccb *ccb) if ((ccb_h->flags & CAM_DIR_MASK) == CAM_DIR_IN && (len & 1)) { /* ATA always transfers an even number of bytes */ - buf = hcb->dxfer_alloc = - kmalloc(++len, M_ATACAM, M_INTWAIT | M_ZERO); + if ((buf = hcb->dxfer_alloc + = kmalloc(++len, M_ATACAM, M_INTWAIT | M_ZERO)) == NULL) { + kprintf("cannot allocate ATAPI/CAM buffer\n"); + goto action_oom; + } } /* diff --git a/sys/dev/disk/nata/atapi-cd.c b/sys/dev/disk/nata/atapi-cd.c index 010c818173..2d18563f94 100644 --- a/sys/dev/disk/nata/atapi-cd.c +++ b/sys/dev/disk/nata/atapi-cd.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1998 - 2006 Søren Schmidt + * Copyright (c) 1998 - 2008 Søren Schmidt * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/sys/dev/disk/nata/atapi-cd.h b/sys/dev/disk/nata/atapi-cd.h index 34156a0c08..826b7c227c 100644 --- a/sys/dev/disk/nata/atapi-cd.h +++ b/sys/dev/disk/nata/atapi-cd.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1998 - 2006 Søren Schmidt + * Copyright (c) 1998 - 2008 Søren Schmidt * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,7 +24,6 @@ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD: src/sys/dev/ata/atapi-cd.h,v 1.45 2006/01/05 21:27:19 sos Exp $ - * $DragonFly: src/sys/dev/disk/nata/atapi-cd.h,v 1.3 2007/11/20 09:25:21 hasso Exp $ */ #include diff --git a/sys/dev/disk/nata/atapi-fd.c b/sys/dev/disk/nata/atapi-fd.c index 520591068d..a7b8034a92 100644 --- a/sys/dev/disk/nata/atapi-fd.c +++ b/sys/dev/disk/nata/atapi-fd.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1998 - 2006 Søren Schmidt + * Copyright (c) 1998 - 2008 Søren Schmidt * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/sys/dev/disk/nata/atapi-fd.h b/sys/dev/disk/nata/atapi-fd.h index f0a30188db..3b524b3c6c 100644 --- a/sys/dev/disk/nata/atapi-fd.h +++ b/sys/dev/disk/nata/atapi-fd.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1998 - 2006 Søren Schmidt + * Copyright (c) 1998 - 2008 Søren Schmidt * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/sys/dev/disk/nata/atapi-tape.c b/sys/dev/disk/nata/atapi-tape.c index c9f2307375..bf3da533a0 100644 --- a/sys/dev/disk/nata/atapi-tape.c +++ b/sys/dev/disk/nata/atapi-tape.c @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1998 - 2006 Søren Schmidt + * Copyright (c) 1998 - 2008 Søren Schmidt * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/sys/dev/disk/nata/atapi-tape.h b/sys/dev/disk/nata/atapi-tape.h index 88b86eaf5c..658376ba22 100644 --- a/sys/dev/disk/nata/atapi-tape.h +++ b/sys/dev/disk/nata/atapi-tape.h @@ -1,5 +1,5 @@ /*- - * Copyright (c) 1998 - 2006 Søren Schmidt + * Copyright (c) 1998 - 2008 Søren Schmidt * All rights reserved. * * Redistribution and use in source and binary forms, with or without diff --git a/sys/dev/disk/nata/chipsets/ata-acard.c b/sys/dev/disk/nata/chipsets/ata-acard.c index dfe953fbcb..c98aad7e73 100644 --- a/sys/dev/disk/nata/chipsets/ata-acard.c +++ b/sys/dev/disk/nata/chipsets/ata-acard.c @@ -129,7 +129,7 @@ ata_acard_850_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int error; mode = ata_limit_mode(dev, mode, @@ -165,7 +165,7 @@ ata_acard_86X_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int error; diff --git a/sys/dev/disk/nata/chipsets/ata-acerlabs.c b/sys/dev/disk/nata/chipsets/ata-acerlabs.c index 032bf76991..84887c5239 100644 --- a/sys/dev/disk/nata/chipsets/ata-acerlabs.c +++ b/sys/dev/disk/nata/chipsets/ata-acerlabs.c @@ -222,7 +222,7 @@ ata_ali_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int error; static const uint32_t piotimings[] = { 0x006d0003, 0x00580002, 0x00440001, 0x00330001, diff --git a/sys/dev/disk/nata/chipsets/ata-ahci.c b/sys/dev/disk/nata/chipsets/ata-ahci.c index 45b7b08bd2..63812b8095 100644 --- a/sys/dev/disk/nata/chipsets/ata-ahci.c +++ b/sys/dev/disk/nata/chipsets/ata-ahci.c @@ -29,7 +29,7 @@ static int ata_ahci_ctlr_reset(device_t dev); static int ata_ahci_status(device_t dev); static int ata_ahci_begin_transaction(struct ata_request *request); static int ata_ahci_end_transaction(struct ata_request *request); -static u_int32_t ata_ahci_softreset(device_t dev); +static u_int32_t ata_ahci_softreset(device_t dev, int port); static void ata_ahci_dmasetprd(void *xsc, bus_dma_segment_t *segs, int nsegs, int error); static int ata_ahci_setup_fis(struct ata_ahci_cmd_tab *ctp, struct ata_request *request); @@ -171,6 +171,7 @@ ata_ahci_allocate(device_t dev) ch->hw.begin_transaction = ata_ahci_begin_transaction; ch->hw.end_transaction = ata_ahci_end_transaction; ch->hw.command = NULL; /* not used here */ + ch->hw.softreset = ata_ahci_softreset; return 0; } @@ -236,9 +237,11 @@ ata_ahci_begin_transaction(struct ata_request *request) { struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); struct ata_channel *ch = device_get_softc(request->parent); + struct ata_device *atadev = device_get_softc(request->dev); struct ata_ahci_cmd_tab *ctp; struct ata_ahci_cmd_list *clp; int offset = ch->unit << 7; + int port = atadev->unit & 0x0f; int tag = 0, entries = 0; int fis_size; @@ -272,7 +275,8 @@ ata_ahci_begin_transaction(struct ata_request *request) clp->cmd_flags = (request->flags & ATA_R_WRITE ? ATA_AHCI_CMD_WRITE : 0) | (request->flags & ATA_R_ATAPI ? (ATA_AHCI_CMD_ATAPI | ATA_AHCI_CMD_PREFETCH) : 0) | - (fis_size / sizeof(u_int32_t)); + (fis_size / sizeof(u_int32_t)) | + (port << 12); clp->bytecount = 0; clp->cmd_table_phys = htole64(ch->dma->work_bus + ATA_AHCI_CT_OFFSET + (ATA_AHCI_CT_SIZE * tag)); @@ -291,7 +295,7 @@ ata_ahci_begin_transaction(struct ata_request *request) ~ATA_AHCI_P_CMD_ATAPI); /* set PM port to address */ - /* TODO */ + //ATA_OUTL(ctlr->r_res2, ATA_AHCI_P_FBS + offset, (port << 8) | 0x00000001); /* issue command to controller */ ATA_OUTL(ctlr->r_res2, ATA_AHCI_P_CI + offset, (1 << tag)); @@ -410,7 +414,7 @@ ata_ahci_restart(device_t dev) } static u_int32_t -ata_ahci_softreset(device_t dev) +ata_ahci_softreset(device_t dev, int port __unused) { struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); struct ata_channel *ch = device_get_softc(dev); @@ -487,9 +491,9 @@ ata_ahci_reset(device_t dev) return; } - signature = ata_ahci_softreset(dev); + signature = ata_ahci_softreset(dev, 0); if (bootverbose) - device_printf(ch->dev, "SIGNATURE=%08x\n", signature); + device_printf(ch->dev, "SIGNATURE: %08x\n", signature); switch (signature >> 16) { case 0x0000: diff --git a/sys/dev/disk/nata/chipsets/ata-amd.c b/sys/dev/disk/nata/chipsets/ata-amd.c index bf476e7573..bbd46de7f1 100644 --- a/sys/dev/disk/nata/chipsets/ata-amd.c +++ b/sys/dev/disk/nata/chipsets/ata-amd.c @@ -82,7 +82,7 @@ ata_amd_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; static const uint8_t timings[] = { 0xa8, 0x65, 0x42, 0x22, 0x20, 0x42, 0x22, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20 }; diff --git a/sys/dev/disk/nata/chipsets/ata-ati.c b/sys/dev/disk/nata/chipsets/ata-ati.c index 8283026d82..b23ffb1a7f 100644 --- a/sys/dev/disk/nata/chipsets/ata-ati.c +++ b/sys/dev/disk/nata/chipsets/ata-ati.c @@ -99,7 +99,7 @@ ata_ati_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int offset = (devno ^ 0x01) << 3; int error; static const uint8_t piotimings[] = diff --git a/sys/dev/disk/nata/chipsets/ata-cyrix.c b/sys/dev/disk/nata/chipsets/ata-cyrix.c index 6b3e90929d..18a7e5b9b1 100644 --- a/sys/dev/disk/nata/chipsets/ata-cyrix.c +++ b/sys/dev/disk/nata/chipsets/ata-cyrix.c @@ -62,7 +62,7 @@ ata_cyrix_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(GRANDPARENT(dev)); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int error; static const uint32_t piotiming[] = { 0x00009172, 0x00012171, 0x00020080, 0x00032010, 0x00040010 }; diff --git a/sys/dev/disk/nata/chipsets/ata-highpoint.c b/sys/dev/disk/nata/chipsets/ata-highpoint.c index b28d6276d9..592e8eb2c7 100644 --- a/sys/dev/disk/nata/chipsets/ata-highpoint.c +++ b/sys/dev/disk/nata/chipsets/ata-highpoint.c @@ -131,7 +131,7 @@ ata_highpoint_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int error; static const uint32_t timings33[][4] = { /* HPT366 HPT370 HPT372 HPT374 mode */ diff --git a/sys/dev/disk/nata/chipsets/ata-intel.c b/sys/dev/disk/nata/chipsets/ata-intel.c index b02df34e2a..dc11393f6e 100644 --- a/sys/dev/disk/nata/chipsets/ata-intel.c +++ b/sys/dev/disk/nata/chipsets/ata-intel.c @@ -251,7 +251,7 @@ ata_intel_new_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; u_int32_t reg40 = pci_read_config(gparent, 0x40, 4); u_int8_t reg44 = pci_read_config(gparent, 0x44, 1); u_int8_t reg48 = pci_read_config(gparent, 0x48, 1); @@ -355,7 +355,7 @@ ata_intel_sata_setmode(device_t dev, int mode) atadev->param.satacapabilities != 0xffff) { struct ata_channel *ch = device_get_softc(device_get_parent(dev)); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; /* on some drives we need to set the transfer mode */ ata_controlcmd(dev, ATA_SETFEATURES, ATA_SF_SETXFER, 0, @@ -451,7 +451,7 @@ ata_intel_31244_tf_write(struct ata_request *request) ((request->u.ata.lba >> 8) & 0x00ff)); ATA_IDX_OUTW(ch, ATA_CYL_MSB, ((request->u.ata.lba >> 32) & 0xff00) | ((request->u.ata.lba >> 16) & 0x00ff)); - ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_LBA | atadev->unit); + ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(atadev->unit)); } else { ATA_IDX_OUTB(ch, ATA_FEATURE, request->u.ata.feature); @@ -472,7 +472,7 @@ ata_intel_31244_tf_write(struct ata_request *request) (request->u.ata.lba / (sectors * heads))); ATA_IDX_OUTB(ch, ATA_CYL_MSB, (request->u.ata.lba / (sectors * heads)) >> 8); - ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | atadev->unit | + ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit) | (((request->u.ata.lba% (sectors * heads)) / sectors) & 0xf)); } @@ -481,7 +481,7 @@ ata_intel_31244_tf_write(struct ata_request *request) ATA_IDX_OUTB(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); ATA_IDX_OUTB(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); ATA_IDX_OUTB(ch, ATA_DRIVE, - ATA_D_IBM | ATA_D_LBA | atadev->unit | + ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit) | ((request->u.ata.lba >> 24) & 0x0f)); } } diff --git a/sys/dev/disk/nata/chipsets/ata-ite.c b/sys/dev/disk/nata/chipsets/ata-ite.c index d7377cde40..23323ca694 100644 --- a/sys/dev/disk/nata/chipsets/ata-ite.c +++ b/sys/dev/disk/nata/chipsets/ata-ite.c @@ -76,7 +76,7 @@ ata_ite_setmode(device_t dev, int mode) device_t gparent = GRANDPARENT(dev); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int error; static const uint8_t udmatiming[] = { 0x44, 0x42, 0x31, 0x21, 0x11, 0xa2, 0x91 }; @@ -110,7 +110,7 @@ ata_ite_setmode(device_t dev, int mode) /* set UDMA timing */ pci_write_config(gparent, - 0x56 + (ch->unit << 2) + ATA_DEV(atadev->unit), + 0x56 + (ch->unit << 2) + atadev->unit, udmatiming[mode & ATA_MODE_MASK], 1); } else { diff --git a/sys/dev/disk/nata/chipsets/ata-national.c b/sys/dev/disk/nata/chipsets/ata-national.c index 3ef95b173e..cf281a6fa7 100644 --- a/sys/dev/disk/nata/chipsets/ata-national.c +++ b/sys/dev/disk/nata/chipsets/ata-national.c @@ -63,7 +63,7 @@ ata_national_setmode(device_t dev, int mode) device_t gparent = GRANDPARENT(dev); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; static const uint32_t piotiming[] = { 0x9172d132, 0x21717121, 0x00803020, 0x20102010, 0x00100010, 0x00803020, 0x20102010, 0x00100010, diff --git a/sys/dev/disk/nata/chipsets/ata-nvidia.c b/sys/dev/disk/nata/chipsets/ata-nvidia.c index 1ba63bc008..237414ca30 100644 --- a/sys/dev/disk/nata/chipsets/ata-nvidia.c +++ b/sys/dev/disk/nata/chipsets/ata-nvidia.c @@ -209,7 +209,7 @@ ata_nvidia_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int error; static const uint8_t timings[] = { 0xa8, 0x65, 0x42, 0x22, 0x20, 0x42, 0x22, 0x20, diff --git a/sys/dev/disk/nata/chipsets/ata-promise.c b/sys/dev/disk/nata/chipsets/ata-promise.c index 7dc0a2e08c..7fbdccd9ec 100644 --- a/sys/dev/disk/nata/chipsets/ata-promise.c +++ b/sys/dev/disk/nata/chipsets/ata-promise.c @@ -40,7 +40,7 @@ static void ata_promise_mio_intr(void *data); static int ata_promise_mio_status(device_t dev); static int ata_promise_mio_command(struct ata_request *request); static void ata_promise_mio_reset(device_t dev); -static u_int32_t ata_promise_mio_softreset(device_t dev); +static u_int32_t ata_promise_mio_softreset(device_t dev, int port); static void ata_promise_mio_dmainit(device_t dev); static void ata_promise_mio_setprd(void *xsc, bus_dma_segment_t *segs, int nsegs, int error); static void ata_promise_mio_setmode(device_t dev, int mode); @@ -424,7 +424,7 @@ ata_promise_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int error; static const uint32_t timings[][2] = { /* PR_OLD PR_NEW mode */ @@ -552,6 +552,7 @@ ata_promise_mio_allocate(device_t dev) else { ch->hw.command = ata_promise_mio_command; ch->hw.status = ata_promise_mio_status; + ch->hw.softreset = ata_promise_mio_softreset; } return 0; } @@ -662,11 +663,18 @@ static int ata_promise_mio_command(struct ata_request *request) { struct ata_pci_controller *ctlr=device_get_softc(GRANDPARENT(request->dev)); - struct ata_channel *ch = device_get_softc(device_get_parent(request->dev)); + struct ata_channel *ch = device_get_softc(request->parent); + struct ata_device *atadev = device_get_softc(request->dev); u_int32_t *wordp = (u_int32_t *)ch->dma->work; ATA_OUTL(ctlr->r_res2, (ch->unit + 1) << 2, 0x00000001); + if ((ctlr->chip->cfg2 == PR_SATA2) || + ((ctlr->chip->cfg2 == PR_CMBO2) && (ch->unit < 2))) { + /* set portmultiplier port */ + ATA_OUTB(ctlr->r_res2, 0x4e8 + (ch->unit << 8), atadev->unit & 0x0f); + } + /* XXX SOS add ATAPI commands support later */ switch (request->u.ata.command) { default: @@ -777,10 +785,10 @@ ata_promise_mio_reset(device_t dev) ~0x00000003) | 0x00000001); if (ata_sata_phy_reset(dev)) { - u_int32_t signature = ata_promise_mio_softreset(dev); + u_int32_t signature = ch->hw.softreset(dev, ATA_PM); - if (bootverbose) - device_printf(dev, "SIGNATURE=%08x\n", signature); + if (1 | bootverbose) + device_printf(dev, "SIGNATURE: %08x\n", signature); /* figure out whats there */ switch (signature >> 16) { @@ -819,14 +827,14 @@ ata_promise_mio_reset(device_t dev) /* must be called with ATA channel locked and state_mtx held */ static u_int32_t -ata_promise_mio_softreset(device_t dev) +ata_promise_mio_softreset(device_t dev, int port) { struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); struct ata_channel *ch = device_get_softc(dev); int timeout; /* set portmultiplier port */ - ATA_OUTB(ctlr->r_res2, 0x4e8 + (ch->unit << 8), 0x0f); + ATA_OUTB(ctlr->r_res2, 0x4e8 + (ch->unit << 8), port & 0x0f); /* softreset device on this channel */ ATA_IDX_OUTB(ch, ATA_DRIVE, ATA_D_IBM | ATA_D_LBA | ATA_DEV(ATA_MASTER)); @@ -953,7 +961,7 @@ ata_promise_sx4_command(struct ata_request *request) { device_t gparent = GRANDPARENT(request->dev); struct ata_pci_controller *ctlr = device_get_softc(gparent); - struct ata_channel *ch = device_get_softc(device_get_parent(request->dev)); + struct ata_channel *ch = device_get_softc(request->parent); struct ata_dma_prdentry *prd = ch->dma->sg; caddr_t window = rman_get_virtual(ctlr->r_res1); u_int32_t *wordp; @@ -1061,7 +1069,7 @@ ata_promise_apkt(u_int8_t *bytep, struct ata_request *request) int i = 12; bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_REG | ATA_PDC_WAIT_NBUSY|ATA_DRIVE; - bytep[i++] = ATA_D_IBM | ATA_D_LBA | atadev->unit; + bytep[i++] = ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit); bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_CTL; bytep[i++] = ATA_A_4BIT; @@ -1082,7 +1090,7 @@ ata_promise_apkt(u_int8_t *bytep, struct ata_request *request) bytep[i++] = request->u.ata.lba >> 40; bytep[i++] = request->u.ata.lba >> 16; bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_REG | ATA_DRIVE; - bytep[i++] = ATA_D_LBA | atadev->unit; + bytep[i++] = ATA_D_LBA | ATA_DEV(atadev->unit); } else { bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_REG | ATA_FEATURE; @@ -1097,7 +1105,8 @@ ata_promise_apkt(u_int8_t *bytep, struct ata_request *request) bytep[i++] = request->u.ata.lba >> 16; bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_REG | ATA_DRIVE; bytep[i++] = (atadev->flags & ATA_D_USE_CHS ? 0 : ATA_D_LBA) | - ATA_D_IBM | atadev->unit | ((request->u.ata.lba >> 24)&0xf); + ATA_D_IBM | ATA_DEV(atadev->unit) | + ((request->u.ata.lba >> 24)&0xf); } bytep[i++] = ATA_PDC_1B | ATA_PDC_WRITE_END | ATA_COMMAND; bytep[i++] = request->u.ata.command; diff --git a/sys/dev/disk/nata/chipsets/ata-serverworks.c b/sys/dev/disk/nata/chipsets/ata-serverworks.c index b76f4fcc30..ec4bfa319a 100644 --- a/sys/dev/disk/nata/chipsets/ata-serverworks.c +++ b/sys/dev/disk/nata/chipsets/ata-serverworks.c @@ -208,7 +208,7 @@ ata_serverworks_tf_write(struct ata_request *request) ((request->u.ata.lba >> 8) & 0x00ff)); ATA_IDX_OUTW(ch, ATA_CYL_MSB, ((request->u.ata.lba >> 32) & 0xff00) | ((request->u.ata.lba >> 16) & 0x00ff)); - ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_LBA | atadev->unit); + ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_LBA | ATA_DEV(atadev->unit)); } else { ATA_IDX_OUTW(ch, ATA_FEATURE, request->u.ata.feature); @@ -230,7 +230,7 @@ ata_serverworks_tf_write(struct ata_request *request) (request->u.ata.lba / (sectors * heads))); ATA_IDX_OUTW(ch, ATA_CYL_MSB, (request->u.ata.lba / (sectors * heads)) >> 8); - ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_IBM | atadev->unit | + ATA_IDX_OUTW(ch, ATA_DRIVE, ATA_D_IBM | ATA_DEV(atadev->unit) | (((request->u.ata.lba% (sectors * heads)) / sectors) & 0xf)); } @@ -239,7 +239,7 @@ ata_serverworks_tf_write(struct ata_request *request) ATA_IDX_OUTW(ch, ATA_CYL_LSB, request->u.ata.lba >> 8); ATA_IDX_OUTW(ch, ATA_CYL_MSB, request->u.ata.lba >> 16); ATA_IDX_OUTW(ch, ATA_DRIVE, - ATA_D_IBM | ATA_D_LBA | atadev->unit | + ATA_D_IBM | ATA_D_LBA | ATA_DEV(atadev->unit) | ((request->u.ata.lba >> 24) & 0x0f)); } } @@ -252,7 +252,7 @@ ata_serverworks_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int offset = (devno ^ 0x01) << 3; int error; static const uint8_t piotimings[] = diff --git a/sys/dev/disk/nata/chipsets/ata-siliconimage.c b/sys/dev/disk/nata/chipsets/ata-siliconimage.c index acf3a51103..aad05801a8 100644 --- a/sys/dev/disk/nata/chipsets/ata-siliconimage.c +++ b/sys/dev/disk/nata/chipsets/ata-siliconimage.c @@ -36,7 +36,7 @@ static int ata_siiprb_allocate(device_t dev); static int ata_siiprb_status(device_t dev); static int ata_siiprb_begin_transaction(struct ata_request *request); static int ata_siiprb_end_transaction(struct ata_request *request); -static u_int32_t ata_siiprb_softreset(device_t dev); +static u_int32_t ata_siiprb_softreset(device_t dev, int port); static void ata_siiprb_reset(device_t dev); static void ata_siiprb_dmasetprd(void *xsc, bus_dma_segment_t *segs, int nsegs, int error); static void ata_siiprb_dmainit(device_t dev); @@ -225,7 +225,7 @@ ata_cmd_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int error; int treg = 0x54 + ((devno < 3) ? (devno << 1) : 7); int ureg = ch->unit ? 0x7b : 0x73; @@ -251,7 +251,7 @@ ata_cmd_setmode(device_t dev, int mode) u_int8_t umode = pci_read_config(gparent, ureg, 1); umode &= ~(atadev->unit == ATA_MASTER ? 0x35 : 0xca); - umode |= udmatimings[mode & ATA_MODE_MASK][ATA_DEV(atadev->unit)]; + umode |= udmatimings[mode & ATA_MODE_MASK][atadev->unit]; pci_write_config(gparent, ureg, umode, 1); } else if (mode >= ATA_WDMA0) { @@ -310,7 +310,7 @@ ata_sii_allocate(device_t dev) if ((ctlr->chip->cfg2 & SII_BUG) && ch->dma) { /* work around errata in early chips */ - ch->dma->boundary = 16 * DEV_BSIZE; + ch->dma->boundary = 8192; ch->dma->segsize = 15 * DEV_BSIZE; } @@ -352,9 +352,9 @@ ata_sii_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int rego = (ch->unit << 4) + (ATA_DEV(atadev->unit) << 1); + int rego = (ch->unit << 4) + (atadev->unit << 1); int mreg = ch->unit ? 0x84 : 0x80; - int mask = 0x03 << (ATA_DEV(atadev->unit) << 2); + int mask = 0x03 << (atadev->unit << 2); int mval = pci_read_config(gparent, mreg, 1) & ~mask; int error; u_int8_t preg = 0xa4 + rego; @@ -389,7 +389,7 @@ ata_sii_setmode(device_t dev, int mode) if (mode >= ATA_UDMA0) { pci_write_config(gparent, mreg, - mval | (0x03 << (ATA_DEV(atadev->unit) << 2)), 1); + mval | (0x03 << (atadev->unit << 2)), 1); pci_write_config(gparent, ureg, (pci_read_config(gparent, ureg, 1) & ~0x3f) | udmatimings[mode & ATA_MODE_MASK], 1); @@ -397,13 +397,13 @@ ata_sii_setmode(device_t dev, int mode) } else if (mode >= ATA_WDMA0) { pci_write_config(gparent, mreg, - mval | (0x02 << (ATA_DEV(atadev->unit) << 2)), 1); + mval | (0x02 << (atadev->unit << 2)), 1); pci_write_config(gparent, dreg, dmatimings[mode & ATA_MODE_MASK], 2); } else { pci_write_config(gparent, mreg, - mval | (0x01 << (ATA_DEV(atadev->unit) << 2)), 1); + mval | (0x01 << (atadev->unit << 2)), 1); pci_write_config(gparent, preg, piotimings[mode & ATA_MODE_MASK], 2); } atadev->mode = mode; @@ -457,6 +457,7 @@ ata_siiprb_allocate(device_t dev) ch->hw.begin_transaction = ata_siiprb_begin_transaction; ch->hw.end_transaction = ata_siiprb_end_transaction; ch->hw.command = NULL; /* not used here */ + ch->hw.softreset = ata_siiprb_softreset; return 0; } @@ -646,7 +647,7 @@ ata_siiprb_issue_cmd(device_t dev) } static u_int32_t -ata_siiprb_softreset(device_t dev) +ata_siiprb_softreset(device_t dev, int port) { struct ata_pci_controller *ctlr = device_get_softc(device_get_parent(dev)); struct ata_channel *ch = device_get_softc(dev); @@ -657,6 +658,7 @@ ata_siiprb_softreset(device_t dev) /* setup the workspace for a soft reset command */ bzero(prb, sizeof(struct ata_siiprb_command)); prb->control = htole16(0x0080); + prb->fis[1] = port & 0x0f; /* issue soft reset */ if (ata_siiprb_issue_cmd(dev)) @@ -710,9 +712,9 @@ ata_siiprb_reset(device_t dev) } /* issue soft reset */ - signature = ata_siiprb_softreset(dev); + signature = ata_siiprb_softreset(dev, ATA_PM); if (bootverbose) - device_printf(ch->dev, "SIGNATURE=%08x\n", signature); + device_printf(ch->dev, "SIGNATURE: %08x\n", signature); /* figure out whats there */ switch (signature >> 16) { diff --git a/sys/dev/disk/nata/chipsets/ata-sis.c b/sys/dev/disk/nata/chipsets/ata-sis.c index c2222070fa..b7232845e3 100644 --- a/sys/dev/disk/nata/chipsets/ata-sis.c +++ b/sys/dev/disk/nata/chipsets/ata-sis.c @@ -214,7 +214,7 @@ ata_sis_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int error; mode = ata_limit_mode(dev, mode, ctlr->chip->max_dma); diff --git a/sys/dev/disk/nata/chipsets/ata-via.c b/sys/dev/disk/nata/chipsets/ata-via.c index 5ad9579212..2104283678 100644 --- a/sys/dev/disk/nata/chipsets/ata-via.c +++ b/sys/dev/disk/nata/chipsets/ata-via.c @@ -259,7 +259,7 @@ ata_via_old_setmode(device_t dev, int mode) struct ata_pci_controller *ctlr = device_get_softc(gparent); struct ata_channel *ch = device_get_softc(device_get_parent(dev)); struct ata_device *atadev = device_get_softc(dev); - int devno = (ch->unit << 1) + ATA_DEV(atadev->unit); + int devno = (ch->unit << 1) + atadev->unit; int reg = 0x53 - devno; int error; static const uint8_t timings[] = diff --git a/sys/dev/disk/nata/nataisa/Makefile b/sys/dev/disk/nata/nataisa/Makefile index 63ab9d9021..3202bf5ab9 100644 --- a/sys/dev/disk/nata/nataisa/Makefile +++ b/sys/dev/disk/nata/nataisa/Makefile @@ -1,5 +1,3 @@ -# $DragonFly: src/sys/dev/disk/nata/nataisa/Makefile,v 1.3 2006/12/10 23:39:43 tgen Exp $ - .PATH: ${.CURDIR}/../../../../dev/disk/nata KMOD= nataisa -- 2.41.0