p4-projects@freebsd.org
[Top] [All Lists]

PERFORCE change 171419 for review

Subject: PERFORCE change 171419 for review
From: Alexander Motin
Date: Sat, 5 Dec 2009 19:20:29 GMT
http://p4web.freebsd.org/chv.cgi?CH=171419

Change 171419 by mav@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;
_______________________________________________
p4-projects@xxxxxxxxxxx mailing list
http://lists.freebsd.org/mailman/listinfo/p4-projects
To unsubscribe, send any mail to "p4-projects-unsubscribe@xxxxxxxxxxx"

<Prev in Thread] Current Thread [Next in Thread>
  • PERFORCE change 171419 for review, Alexander Motin <=