PERFORCE change 171419 for review
Alexander Motin
mav at FreeBSD.org
Sat Dec 5 19:20:30 UTC 2009
http://p4web.freebsd.org/chv.cgi?CH=171419
Change 171419 by mav at mav_mavtest on 2009/12/05 19:20:27
Improve PIO transaction size negotiation.
Affected files ...
.. //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#63 edit
Differences ...
==== //depot/projects/scottl-camlock/src/sys/cam/ata/ata_xpt.c#63 (text+ko) ====
@@ -366,7 +366,7 @@
cts.xport_specific.sata.valid = CTS_SATA_VALID_MODE;
}
xpt_action((union ccb *)&cts);
- /* Fetch user modes from SIM. */
+ /* Fetch current 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;
@@ -395,10 +395,25 @@
}
case PROBE_SET_MULTI:
{
- u_int sectors;
+ u_int sectors, bytecount;
- sectors = max(1, min(ident_buf->sectors_intr & 0xff, 16));
-
+ bytecount = 8192; /* SATA maximum */
+ /* Fetch user bytecount 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_BYTECOUNT)
+ bytecount = cts.xport_specific.ata.bytecount;
+ } else {
+ if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT)
+ bytecount = cts.xport_specific.sata.bytecount;
+ }
+ /* Honor device capabilities. */
+ sectors = max(1, min(ident_buf->sectors_intr & 0xff,
+ bytecount / ata_logical_sector_size(ident_buf)));
/* Report bytecount to SIM. */
bzero(&cts, sizeof(cts));
xpt_setup_ccb(&cts.ccb_h, path, CAM_PRIORITY_NORMAL);
@@ -414,6 +429,20 @@
cts.xport_specific.sata.valid = CTS_SATA_VALID_BYTECOUNT;
}
xpt_action((union ccb *)&cts);
+ /* Fetch current bytecount 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_BYTECOUNT)
+ bytecount = cts.xport_specific.ata.bytecount;
+ } else {
+ if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT)
+ bytecount = cts.xport_specific.sata.bytecount;
+ }
+ sectors = bytecount / ata_logical_sector_size(ident_buf);
cam_fill_ataio(ataio,
1,
@@ -427,6 +456,45 @@
break;
}
case PROBE_INQUIRY:
+ {
+ u_int bytecount;
+
+ bytecount = 8192; /* SATA maximum */
+ /* Fetch user bytecount 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_BYTECOUNT)
+ bytecount = cts.xport_specific.ata.bytecount;
+ } else {
+ if (cts.xport_specific.sata.valid & CTS_SATA_VALID_BYTECOUNT)
+ bytecount = cts.xport_specific.sata.bytecount;
+ }
+ /* Honor device capabilities. */
+ bytecount &= ~1;
+ bytecount = max(2, min(65534, bytecount));
+ if (ident_buf->satacapabilities != 0x0000 &&
+ ident_buf->satacapabilities != 0xffff) {
+ bytecount = min(8192, bytecount);
+ }
+ /* Report bytecount 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.bytecount = bytecount;
+ cts.xport_specific.ata.valid = CTS_ATA_VALID_BYTECOUNT;
+ } else {
+ cts.xport_specific.sata.bytecount = bytecount;
+ cts.xport_specific.sata.valid = CTS_SATA_VALID_BYTECOUNT;
+ }
+ xpt_action((union ccb *)&cts);
+ /* FALLTHROUGH */
+ }
case PROBE_FULL_INQUIRY:
{
u_int inquiry_len;
More information about the p4-projects
mailing list