Author: mav
Date: Tue Jan 19 13:36:12 2010
New Revision: 202626
URL: http://svn.freebsd.org/changeset/base/202626

Log:
  MFC r201222:
  Usually these controllers are able to automatically decode command code to
  get required command protocol. But they have no idea about new commands,
  such as DATA SET MANAGEMENT (TRIM). As soon as this info any way provided
  by CAM, give controller specific instructions.

Modified:
  stable/8/sys/dev/siis/siis.c
  stable/8/sys/dev/siis/siis.h
Directory Properties:
  stable/8/sys/   (props changed)
  stable/8/sys/amd64/include/xen/   (props changed)
  stable/8/sys/cddl/contrib/opensolaris/   (props changed)
  stable/8/sys/contrib/dev/acpica/   (props changed)
  stable/8/sys/contrib/pf/   (props changed)
  stable/8/sys/dev/xen/xenpci/   (props changed)

Modified: stable/8/sys/dev/siis/siis.c
==============================================================================
--- stable/8/sys/dev/siis/siis.c        Tue Jan 19 13:33:54 2010        
(r202625)
+++ stable/8/sys/dev/siis/siis.c        Tue Jan 19 13:36:12 2010        
(r202626)
@@ -987,13 +987,29 @@ siis_execute_transaction(struct siis_slo
        ctp->protocol_override = 0;
        ctp->transfer_count = 0;
        /* Special handling for Soft Reset command. */
-       if ((ccb->ccb_h.func_code == XPT_ATA_IO) &&
-           (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL)) {
-               ctp->control |= htole16(SIIS_PRB_SOFT_RESET);
+       if (ccb->ccb_h.func_code == XPT_ATA_IO) {
+               if (ccb->ataio.cmd.flags & CAM_ATAIO_CONTROL) {
+                       ctp->control |= htole16(SIIS_PRB_SOFT_RESET);
+               } else {
+                       ctp->control |= htole16(SIIS_PRB_PROTOCOL_OVERRIDE);
+                       if (ccb->ataio.cmd.flags & CAM_ATAIO_FPDMA) {
+                               ctp->protocol_override |=
+                                   htole16(SIIS_PRB_PROTO_NCQ);
+                       }
+                       if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN) {
+                               ctp->protocol_override |=
+                                   htole16(SIIS_PRB_PROTO_READ);
+                       } else
+                       if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT) {
+                               ctp->protocol_override |=
+                                   htole16(SIIS_PRB_PROTO_WRITE);
+                       }
+               }
        } else if (ccb->ccb_h.func_code == XPT_SCSI_IO) {
-               if (ccb->ccb_h.flags & CAM_DIR_IN)
+               if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_IN)
                        ctp->control |= htole16(SIIS_PRB_PACKET_READ);
-               if (ccb->ccb_h.flags & CAM_DIR_OUT)
+               else
+               if ((ccb->ccb_h.flags & CAM_DIR_MASK) == CAM_DIR_OUT)
                        ctp->control |= htole16(SIIS_PRB_PACKET_WRITE);
        }
        /* Setup the FIS for this request */

Modified: stable/8/sys/dev/siis/siis.h
==============================================================================
--- stable/8/sys/dev/siis/siis.h        Tue Jan 19 13:33:54 2010        
(r202625)
+++ stable/8/sys/dev/siis/siis.h        Tue Jan 19 13:36:12 2010        
(r202626)
@@ -304,6 +304,12 @@ struct siis_cmd {
 #define SIIS_PRB_INTERRUPT_MASK                0x0040
 #define SIIS_PRB_SOFT_RESET            0x0080
     u_int16_t                  protocol_override;
+#define SIIS_PRB_PROTO_PACKET          0x0001
+#define SIIS_PRB_PROTO_TCQ             0x0002
+#define SIIS_PRB_PROTO_NCQ             0x0004
+#define SIIS_PRB_PROTO_READ            0x0008
+#define SIIS_PRB_PROTO_WRITE           0x0010
+#define SIIS_PRB_PROTO_TRANSPARENT     0x0020
     u_int32_t                  transfer_count;
     u_int8_t                   fis[24];
     union {
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to