#define SPI_PRINTK(x, l, f, a...)      dev_printk(l, &(x)->dev, f , ##a)
 
-#define SPI_NUM_ATTRS 13       /* increase this if you add attributes */
+#define SPI_NUM_ATTRS 14       /* increase this if you add attributes */
 #define SPI_OTHER_ATTRS 1      /* Increase this if you add "always
                                 * on" attributes */
 #define SPI_HOST_ATTRS 1
        spi_rd_strm(starget) = 0;
        spi_rti(starget) = 0;
        spi_pcomp_en(starget) = 0;
+       spi_hold_mcs(starget) = 0;
        spi_dv_pending(starget) = 0;
        spi_initial_dv(starget) = 0;
        init_MUTEX(&spi_dv_sem(starget));
 spi_transport_rd_attr(rd_strm, "%d\n");
 spi_transport_rd_attr(rti, "%d\n");
 spi_transport_rd_attr(pcomp_en, "%d\n");
+spi_transport_rd_attr(hold_mcs, "%d\n");
 
 /* we only care about the first child device so we return 1 */
 static int child_iter(struct device *dev, void *data)
                sprint_frac(tmp, picosec, 1000);
 
                dev_info(&starget->dev,
-                       "%s %sSCSI %d.%d MB/s %s%s%s (%s ns, offset %d)\n",
-                       scsi, tp->width ? "WIDE " : "", kb100/10, kb100 % 10,
-                       tp->dt ? "DT" : "ST", tp->iu ? " IU" : "",
-                       tp->qas  ? " QAS" : "", tmp, tp->offset);
+                        "%s %sSCSI %d.%d MB/s %s%s%s%s%s%s%s%s (%s ns, offset %d)\n",
+                        scsi, tp->width ? "WIDE " : "", kb100/10, kb100 % 10,
+                        tp->dt ? "DT" : "ST",
+                        tp->iu ? " IU" : "",
+                        tp->qas  ? " QAS" : "",
+                        tp->rd_strm ? " RDSTRM" : "",
+                        tp->rti ? " RTI" : "",
+                        tp->wr_flow ? " WRFLOW" : "",
+                        tp->pcomp_en ? " PCOMP" : "",
+                        tp->hold_mcs ? " HMCS" : "",
+                        tmp, tp->offset);
        } else {
                dev_info(&starget->dev, "%sasynchronous.\n",
                                tp->width ? "wide " : "");
        SETUP_ATTRIBUTE(rd_strm);
        SETUP_ATTRIBUTE(rti);
        SETUP_ATTRIBUTE(pcomp_en);
+       SETUP_ATTRIBUTE(hold_mcs);
 
        /* if you add an attribute but forget to increase SPI_NUM_ATTRS
         * this bug will trigger */
 
        unsigned int rd_strm:1; /* Read streaming enabled */
        unsigned int rti:1;     /* Retain Training Information */
        unsigned int pcomp_en:1;/* Precompensation enabled */
+       unsigned int hold_mcs:1;/* Hold Margin Control Settings */
        unsigned int initial_dv:1; /* DV done to this target yet  */
        unsigned long flags;    /* flags field for drivers to use */
        /* Device Properties fields */
 #define spi_rd_strm(x) (((struct spi_transport_attrs *)&(x)->starget_data)->rd_strm)
 #define spi_rti(x)     (((struct spi_transport_attrs *)&(x)->starget_data)->rti)
 #define spi_pcomp_en(x)        (((struct spi_transport_attrs *)&(x)->starget_data)->pcomp_en)
+#define spi_hold_mcs(x)        (((struct spi_transport_attrs *)&(x)->starget_data)->hold_mcs)
 #define spi_initial_dv(x)      (((struct spi_transport_attrs *)&(x)->starget_data)->initial_dv)
 
 #define spi_support_sync(x)    (((struct spi_transport_attrs *)&(x)->starget_data)->support_sync)
        void    (*set_rti)(struct scsi_target *, int);
        void    (*get_pcomp_en)(struct scsi_target *);
        void    (*set_pcomp_en)(struct scsi_target *, int);
+       void    (*get_hold_mcs)(struct scsi_target *);
+       void    (*set_hold_mcs)(struct scsi_target *, int);
        void    (*get_signalling)(struct Scsi_Host *);
        void    (*set_signalling)(struct Scsi_Host *, enum spi_signal_type);
        /* The driver sets these to tell the transport class it
        unsigned long   show_rd_strm:1;
        unsigned long   show_rti:1;
        unsigned long   show_pcomp_en:1;
+       unsigned long   show_hold_mcs:1;
 };
 
 struct scsi_transport_template *spi_attach_transport(struct spi_function_template *);