Deleted Added
full compact
28c28
< __FBSDID("$FreeBSD: head/sys/cam/ata/ata_xpt.c 199263 2009-11-14 08:08:49Z mav $");
---
> __FBSDID("$FreeBSD: head/sys/cam/ata/ata_xpt.c 199747 2009-11-24 12:47:58Z mav $");
278c278
< /* Probe the device that our peripheral driver points to */
---
> struct ccb_trans_settings cts;
335a336,384
> {
> int mode, wantmode;
>
> mode = 0;
> /* Fetch user modes from SIM. */
> bzero(&cts, sizeof(cts));
> xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NORMAL);
> cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
> cts.type = CTS_TYPE_USER_SETTINGS;
> xpt_action((union ccb *)&cts);
> if (path->device->transport == XPORT_ATA) {
> if (cts.xport_specific.ata.valid & CTS_ATA_VALID_MODE)
> mode = cts.xport_specific.ata.mode;
> } else {
> if (cts.xport_specific.ata.valid & CTS_SATA_VALID_MODE)
> mode = cts.xport_specific.sata.mode;
> }
> negotiate:
> /* Honor device capabilities. */
> wantmode = mode = ata_max_mode(ident_buf, mode);
> /* Report modes to SIM. */
> bzero(&cts, sizeof(cts));
> xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NORMAL);
> cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
> cts.type = CTS_TYPE_CURRENT_SETTINGS;
> if (path->device->transport == XPORT_ATA) {
> cts.xport_specific.ata.mode = mode;
> cts.xport_specific.ata.valid = CTS_ATA_VALID_MODE;
> } else {
> cts.xport_specific.sata.mode = mode;
> cts.xport_specific.sata.valid = CTS_SATA_VALID_MODE;
> }
> xpt_action((union ccb *)&cts);
> /* Fetch user modes from SIM. */
> bzero(&cts, sizeof(cts));
> xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NORMAL);
> cts.ccb_h.func_code = XPT_GET_TRAN_SETTINGS;
> cts.type = CTS_TYPE_CURRENT_SETTINGS;
> xpt_action((union ccb *)&cts);
> if (path->device->transport == XPORT_ATA) {
> if (cts.xport_specific.ata.valid & CTS_ATA_VALID_MODE)
> mode = cts.xport_specific.ata.mode;
> } else {
> if (cts.xport_specific.ata.valid & CTS_SATA_VALID_MODE)
> mode = cts.xport_specific.sata.mode;
> }
> /* If SIM disagree - renegotiate. */
> if (mode != wantmode)
> goto negotiate;
344,345c393
< ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_SETXFER, 0,
< ata_max_mode(ident_buf, ATA_UDMA6, ATA_UDMA6));
---
> ata_28bit_cmd(ataio, ATA_SETFEATURES, ATA_SF_SETXFER, 0, mode);
346a395
> }
349d397
< struct ccb_trans_settings cts;
566a615
> struct ccb_trans_settings cts;
622,624c671
< struct ccb_trans_settings cts;
<
< /* Report SIM that PM is present. */
---
> /* Report SIM that PM is present. */
719,721d765
< /* XXX: If not all tags allowed, we must to tell SIM which are. */
< if (path->device->mintags < path->bus->sim->max_tagged_dev_openings)
< path->device->mintags = path->device->maxtags = 0;
723a768,776
> /* Report SIM which tags are allowed. */
> bzero(&cts, sizeof(cts));
> xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NORMAL);
> cts.ccb_h.func_code = XPT_SET_TRAN_SETTINGS;
> cts.type = CTS_TYPE_CURRENT_SETTINGS;
> cts.xport_specific.sata.tags = path->device->maxtags;
> cts.xport_specific.sata.valid = CTS_SATA_VALID_TAGS;
> xpt_action((union ccb *)&cts);
> /* Reconfigure queues for tagged queueing. */