thermal: rockchip: rk3368: ajust tsadc's data path according request of qos
[firefly-linux-kernel-4.4.55.git] / drivers / scsi / sd.h
index 7a049de220512777dd8d1cb43e665a9c351023d5..765a6f1ac1b7320edc860b1eb6baa30e7e1beac4 100644 (file)
  */
 #define SD_TIMEOUT             (30 * HZ)
 #define SD_MOD_TIMEOUT         (75 * HZ)
-#define SD_FLUSH_TIMEOUT       (60 * HZ)
+/*
+ * Flush timeout is a multiplier over the standard device timeout which is
+ * user modifiable via sysfs but initially set to SD_TIMEOUT
+ */
+#define SD_FLUSH_TIMEOUT_MULTIPLIER    2
 #define SD_WRITE_SAME_TIMEOUT  (120 * HZ)
 
 /*
@@ -40,6 +44,8 @@ enum {
 };
 
 enum {
+       SD_DEF_XFER_BLOCKS = 0xffff,
+       SD_MAX_XFER_BLOCKS = 0xffffffff,
        SD_MAX_WS10_BLOCKS = 0xffff,
        SD_MAX_WS16_BLOCKS = 0x7fffff,
 };
@@ -59,7 +65,9 @@ struct scsi_disk {
        struct device   dev;
        struct gendisk  *disk;
        atomic_t        openers;
-       sector_t        capacity;       /* size in 512-byte sectors */
+       sector_t        capacity;       /* size in logical blocks */
+       u32             max_xfer_blocks;
+       u32             opt_xfer_blocks;
        u32             max_ws_blocks;
        u32             max_unmap_blocks;
        u32             unmap_granularity;
@@ -96,9 +104,15 @@ static inline struct scsi_disk *scsi_disk(struct gendisk *disk)
 
 #define sd_printk(prefix, sdsk, fmt, a...)                             \
         (sdsk)->disk ?                                                 \
-       sdev_printk(prefix, (sdsk)->device, "[%s] " fmt,                \
-                   (sdsk)->disk->disk_name, ##a) :                     \
-       sdev_printk(prefix, (sdsk)->device, fmt, ##a)
+             sdev_prefix_printk(prefix, (sdsk)->device,                \
+                                (sdsk)->disk->disk_name, fmt, ##a) :   \
+             sdev_printk(prefix, (sdsk)->device, fmt, ##a)
+
+#define sd_first_printk(prefix, sdsk, fmt, a...)                       \
+       do {                                                            \
+               if ((sdkp)->first_scan)                                 \
+                       sd_printk(prefix, sdsk, fmt, ##a);              \
+       } while (0)
 
 static inline int scsi_medium_access_command(struct scsi_cmnd *scmd)
 {
@@ -132,6 +146,16 @@ static inline int scsi_medium_access_command(struct scsi_cmnd *scmd)
        return 0;
 }
 
+static inline sector_t logical_to_sectors(struct scsi_device *sdev, sector_t blocks)
+{
+       return blocks << (ilog2(sdev->sector_size) - 9);
+}
+
+static inline unsigned int logical_to_bytes(struct scsi_device *sdev, sector_t blocks)
+{
+       return blocks * sdev->sector_size;
+}
+
 /*
  * A DIF-capable target device can be formatted with different
  * protection schemes.  Currently 0 through 3 are defined:
@@ -153,6 +177,68 @@ enum sd_dif_target_protection_types {
        SD_DIF_TYPE3_PROTECTION = 0x3,
 };
 
+/*
+ * Look up the DIX operation based on whether the command is read or
+ * write and whether dix and dif are enabled.
+ */
+static inline unsigned int sd_prot_op(bool write, bool dix, bool dif)
+{
+       /* Lookup table: bit 2 (write), bit 1 (dix), bit 0 (dif) */
+       const unsigned int ops[] = {    /* wrt dix dif */
+               SCSI_PROT_NORMAL,       /*  0   0   0  */
+               SCSI_PROT_READ_STRIP,   /*  0   0   1  */
+               SCSI_PROT_READ_INSERT,  /*  0   1   0  */
+               SCSI_PROT_READ_PASS,    /*  0   1   1  */
+               SCSI_PROT_NORMAL,       /*  1   0   0  */
+               SCSI_PROT_WRITE_INSERT, /*  1   0   1  */
+               SCSI_PROT_WRITE_STRIP,  /*  1   1   0  */
+               SCSI_PROT_WRITE_PASS,   /*  1   1   1  */
+       };
+
+       return ops[write << 2 | dix << 1 | dif];
+}
+
+/*
+ * Returns a mask of the protection flags that are valid for a given DIX
+ * operation.
+ */
+static inline unsigned int sd_prot_flag_mask(unsigned int prot_op)
+{
+       const unsigned int flag_mask[] = {
+               [SCSI_PROT_NORMAL]              = 0,
+
+               [SCSI_PROT_READ_STRIP]          = SCSI_PROT_TRANSFER_PI |
+                                                 SCSI_PROT_GUARD_CHECK |
+                                                 SCSI_PROT_REF_CHECK |
+                                                 SCSI_PROT_REF_INCREMENT,
+
+               [SCSI_PROT_READ_INSERT]         = SCSI_PROT_REF_INCREMENT |
+                                                 SCSI_PROT_IP_CHECKSUM,
+
+               [SCSI_PROT_READ_PASS]           = SCSI_PROT_TRANSFER_PI |
+                                                 SCSI_PROT_GUARD_CHECK |
+                                                 SCSI_PROT_REF_CHECK |
+                                                 SCSI_PROT_REF_INCREMENT |
+                                                 SCSI_PROT_IP_CHECKSUM,
+
+               [SCSI_PROT_WRITE_INSERT]        = SCSI_PROT_TRANSFER_PI |
+                                                 SCSI_PROT_REF_INCREMENT,
+
+               [SCSI_PROT_WRITE_STRIP]         = SCSI_PROT_GUARD_CHECK |
+                                                 SCSI_PROT_REF_CHECK |
+                                                 SCSI_PROT_REF_INCREMENT |
+                                                 SCSI_PROT_IP_CHECKSUM,
+
+               [SCSI_PROT_WRITE_PASS]          = SCSI_PROT_TRANSFER_PI |
+                                                 SCSI_PROT_GUARD_CHECK |
+                                                 SCSI_PROT_REF_CHECK |
+                                                 SCSI_PROT_REF_INCREMENT |
+                                                 SCSI_PROT_IP_CHECKSUM,
+       };
+
+       return flag_mask[prot_op];
+}
+
 /*
  * Data Integrity Field tuple.
  */
@@ -165,7 +251,7 @@ struct sd_dif_tuple {
 #ifdef CONFIG_BLK_DEV_INTEGRITY
 
 extern void sd_dif_config_host(struct scsi_disk *);
-extern void sd_dif_prepare(struct request *rq, sector_t, unsigned int);
+extern void sd_dif_prepare(struct scsi_cmnd *scmd);
 extern void sd_dif_complete(struct scsi_cmnd *, unsigned int);
 
 #else /* CONFIG_BLK_DEV_INTEGRITY */
@@ -173,7 +259,7 @@ extern void sd_dif_complete(struct scsi_cmnd *, unsigned int);
 static inline void sd_dif_config_host(struct scsi_disk *disk)
 {
 }
-static inline int sd_dif_prepare(struct request *rq, sector_t s, unsigned int a)
+static inline int sd_dif_prepare(struct scsi_cmnd *scmd)
 {
        return 0;
 }