Deleted Added
full compact
28c28
< __FBSDID("$FreeBSD: head/sys/dev/siis/siis.c 199333 2009-11-16 20:54:47Z mav $");
---
> __FBSDID("$FreeBSD: head/sys/dev/siis/siis.c 199747 2009-11-24 12:47:58Z mav $");
418c418
< int rid, error;
---
> int rid, error, i;
423a424,430
> for (i = 0; i < 16; i++) {
> ch->user[i].revision = 0;
> ch->user[i].mode = 0;
> ch->user[i].bytecount = 8192;
> ch->user[i].tags = SIIS_MAX_SLOTS;
> ch->curr[i] = ch->user[i];
> }
835a843,849
> (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA)) {
> /* Tagged command while we have no supported tag free. */
> if (((~ch->oslots) & (0x7fffffff >> (31 -
> ch->curr[ccb->ccb_h.target_id].tags))) == 0)
> return (1);
> }
> if ((ccb->ccb_h.func_code == XPT_ATA_IO) &&
853c867
< int tag;
---
> int tag, tags;
857,863c871,875
< tag = ch->lastslot;
< while (ch->slot[tag].state != SIIS_SLOT_EMPTY) {
< if (++tag >= SIIS_MAX_SLOTS)
< tag = 0;
< KASSERT(tag != ch->lastslot, ("siis: ALL SLOTS BUSY!"));
< }
< ch->lastslot = tag;
---
> tags = SIIS_MAX_SLOTS;
> if ((ccb->ccb_h.func_code == XPT_ATA_IO) &&
> (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA))
> tags = ch->curr[ccb->ccb_h.target_id].tags;
> tag = fls((~ch->oslots) & (0x7fffffff >> (31 - tags))) - 1;
867a880
> ch->oslots |= (1 << slot->slot);
1120a1134
> ch->oslots &= ~(1 << slot->slot);
1146c1160
< if (ch->frozen && ch->numrslots == 0) {
---
> if (ch->frozen && !siis_check_collision(dev, ch->frozen)) {
1556a1571
> struct siis_device *d;
1557a1573,1584
> if (cts->type == CTS_TYPE_CURRENT_SETTINGS)
> d = &ch->curr[ccb->ccb_h.target_id];
> else
> d = &ch->user[ccb->ccb_h.target_id];
> if (cts->xport_specific.sata.valid & CTS_SATA_VALID_REVISION)
> d->revision = cts->xport_specific.sata.revision;
> if (cts->xport_specific.sata.valid & CTS_SATA_VALID_MODE)
> d->mode = cts->xport_specific.sata.mode;
> if (cts->xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT)
> d->bytecount = min(8192, cts->xport_specific.sata.bytecount);
> if (cts->xport_specific.sata.valid & CTS_SATA_VALID_TAGS)
> d->tags = min(SIIS_MAX_SLOTS, cts->xport_specific.sata.tags);
1572a1600
> struct siis_device *d;
1574a1603,1606
> if (cts->type == CTS_TYPE_CURRENT_SETTINGS)
> d = &ch->curr[ccb->ccb_h.target_id];
> else
> d = &ch->user[ccb->ccb_h.target_id];
1581c1613,1615
< if (cts->type == CTS_TYPE_CURRENT_SETTINGS)
---
> if (cts->type == CTS_TYPE_CURRENT_SETTINGS &&
> (ccb->ccb_h.target_id == 15 ||
> (ccb->ccb_h.target_id == 0 && !ch->pm_present))) {
1583,1593c1617,1625
< else
< status = ATA_INL(ch->r_mem, SIIS_P_SCTL) & ATA_SC_SPD_MASK;
< if (status & ATA_SS_SPD_GEN3) {
< cts->xport_specific.sata.bitrate = 600000;
< cts->xport_specific.sata.valid |= CTS_SATA_VALID_SPEED;
< } else if (status & ATA_SS_SPD_GEN2) {
< cts->xport_specific.sata.bitrate = 300000;
< cts->xport_specific.sata.valid |= CTS_SATA_VALID_SPEED;
< } else if (status & ATA_SS_SPD_GEN1) {
< cts->xport_specific.sata.bitrate = 150000;
< cts->xport_specific.sata.valid |= CTS_SATA_VALID_SPEED;
---
> if (status & 0x0f0) {
> cts->xport_specific.sata.revision =
> (status & 0x0f0) >> 4;
> cts->xport_specific.sata.valid |=
> CTS_SATA_VALID_REVISION;
> }
> } else {
> cts->xport_specific.sata.revision = d->revision;
> cts->xport_specific.sata.valid |= CTS_SATA_VALID_REVISION;
1594a1627,1630
> cts->xport_specific.sata.mode = d->mode;
> cts->xport_specific.sata.valid |= CTS_SATA_VALID_MODE;
> cts->xport_specific.sata.bytecount = d->bytecount;
> cts->xport_specific.sata.valid |= CTS_SATA_VALID_BYTECOUNT;
1596a1633,1634
> cts->xport_specific.sata.tags = d->tags;
> cts->xport_specific.sata.valid |= CTS_SATA_VALID_TAGS;