2018-11-20 16:05:24

by John Garry

[permalink] [raw]
Subject: [PATCH 0/4] hisi_sas: DIF/DIX support

This patchset introduces support to the driver for DIF/DIX (or PI -
protection information).

We will only support PI in v3 hw at the moment, even though previous hw
versions also support.

The series is broken down as follows:
- Add a generic helper for checking Scsi command normal operation
- Some tidy-up to accept PI support
- Add components for PI support for main and v3 driver

John Garry (1):
scsi: Add scsi_prot_op_normal()

Xiang Chen (3):
scsi: hisi_sas: Relocate some code to reduce complexity
scsi: hisi_sas: Make sg_tablesize consistent value
scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw

drivers/scsi/hisi_sas/hisi_sas.h | 18 +++
drivers/scsi/hisi_sas/hisi_sas_main.c | 242 ++++++++++++++++++++++++---------
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +-
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 +-
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 192 +++++++++++++++++++++++++-
include/scsi/scsi_cmnd.h | 5 +
6 files changed, 385 insertions(+), 76 deletions(-)

--
1.9.1



2018-11-20 15:27:24

by John Garry

[permalink] [raw]
Subject: [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw

From: Xiang Chen <[email protected]>

For v3 hw, we support DIF/DIX operation for SAS, but not SATA.

In addition, DIF CRC16 is supported.

This patchset adds the SW support for the described features. The main
components are as follows:
- Allocate memory for PI
- Fill PI fields
- Fill related to DIF/DIX in DQ and protection iu memories

Signed-off-by: Xiang Chen <[email protected]>
Signed-off-by: John Garry <[email protected]>
---
drivers/scsi/hisi_sas/hisi_sas.h | 18 ++++
drivers/scsi/hisi_sas/hisi_sas_main.c | 99 ++++++++++++++---
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 189 ++++++++++++++++++++++++++++++++-
3 files changed, 289 insertions(+), 17 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas.h b/drivers/scsi/hisi_sas/hisi_sas.h
index 535c613..a73aad6 100644
--- a/drivers/scsi/hisi_sas/hisi_sas.h
+++ b/drivers/scsi/hisi_sas/hisi_sas.h
@@ -55,6 +55,11 @@
#define hisi_sas_sge_addr_mem(slot) hisi_sas_sge_addr(slot->buf)
#define hisi_sas_sge_addr_dma(slot) hisi_sas_sge_addr(slot->buf_dma)

+#define hisi_sas_sge_dif_addr(buf) \
+ (buf + offsetof(struct hisi_sas_slot_dif_buf_table, sge_dif_page))
+#define hisi_sas_sge_dif_addr_mem(slot) hisi_sas_sge_dif_addr(slot->buf)
+#define hisi_sas_sge_dif_addr_dma(slot) hisi_sas_sge_dif_addr(slot->buf_dma)
+
#define HISI_SAS_MAX_SSP_RESP_SZ (sizeof(struct ssp_frame_hdr) + 1024)
#define HISI_SAS_MAX_SMP_RESP_SZ 1028
#define HISI_SAS_MAX_STP_RESP_SZ 28
@@ -197,6 +202,7 @@ struct hisi_sas_slot {
struct sas_task *task;
struct hisi_sas_port *port;
u64 n_elem;
+ u64 n_elem_dif;
int dlvry_queue;
int dlvry_queue_slot;
int cmplt_queue;
@@ -268,6 +274,8 @@ struct hisi_hba {
struct pci_dev *pci_dev;
struct device *dev;

+ bool enable_dif_dix;
+
void __iomem *regs;
void __iomem *sgpio_regs;
struct regmap *ctrl;
@@ -422,6 +430,11 @@ struct hisi_sas_sge_page {
struct hisi_sas_sge sge[HISI_SAS_SGE_PAGE_CNT];
} __aligned(16);

+#define HISI_SAS_SGE_DIF_PAGE_CNT SG_CHUNK_SIZE
+struct hisi_sas_sge_dif_page {
+ struct hisi_sas_sge sge[HISI_SAS_SGE_DIF_PAGE_CNT];
+} __aligned(16);
+
struct hisi_sas_command_table_ssp {
struct ssp_frame_hdr hdr;
union {
@@ -452,6 +465,11 @@ struct hisi_sas_slot_buf_table {
struct hisi_sas_sge_page sge_page;
};

+struct hisi_sas_slot_dif_buf_table {
+ struct hisi_sas_slot_buf_table slot_buf;
+ struct hisi_sas_sge_dif_page sge_dif_page;
+};
+
extern struct scsi_transport_template *hisi_sas_stt;
extern void hisi_sas_stop_phys(struct hisi_hba *hisi_hba);
extern int hisi_sas_alloc(struct hisi_hba *hisi_hba, struct Scsi_Host *shost);
diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index cbda48e..d0b693b 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -252,14 +252,21 @@ void hisi_sas_slot_task_free(struct hisi_hba *hisi_hba, struct sas_task *task,

task->lldd_task = NULL;

- if (!sas_protocol_ata(task->task_proto))
+ if (!sas_protocol_ata(task->task_proto)) {
+ struct sas_ssp_task *ssp_task = &task->ssp_task;
+ struct scsi_cmnd *scsi_cmnd = ssp_task->cmd;
+
if (slot->n_elem)
dma_unmap_sg(dev, task->scatter,
task->num_scatter,
task->data_dir);
+ if (slot->n_elem_dif)
+ dma_unmap_sg(dev, scsi_prot_sglist(scsi_cmnd),
+ scsi_prot_sg_count(scsi_cmnd),
+ task->data_dir);
+ }
}

-
spin_lock_irqsave(&dq->lock, flags);
list_del_init(&slot->entry);
spin_unlock_irqrestore(&dq->lock, flags);
@@ -380,6 +387,59 @@ static int hisi_sas_dma_map(struct hisi_hba *hisi_hba,
return rc;
}

+static void hisi_sas_dif_dma_unmap(struct hisi_hba *hisi_hba,
+ struct sas_task *task, int n_elem_dif)
+{
+ struct device *dev = hisi_hba->dev;
+
+ if (n_elem_dif) {
+ struct sas_ssp_task *ssp_task = &task->ssp_task;
+ struct scsi_cmnd *scsi_cmnd = ssp_task->cmd;
+
+ dma_unmap_sg(dev, scsi_prot_sglist(scsi_cmnd),
+ scsi_prot_sg_count(scsi_cmnd),
+ task->data_dir);
+ }
+}
+
+static int hisi_sas_dif_dma_map(struct hisi_hba *hisi_hba,
+ int *n_elem_dif, struct sas_task *task)
+{
+ struct device *dev = hisi_hba->dev;
+ struct sas_ssp_task *ssp_task;
+ struct scsi_cmnd *scsi_cmnd;
+ int rc;
+
+ if (task->num_scatter) {
+ ssp_task = &task->ssp_task;
+ scsi_cmnd = ssp_task->cmd;
+
+ if (scsi_prot_sg_count(scsi_cmnd)) {
+ *n_elem_dif = dma_map_sg(dev,
+ scsi_prot_sglist(scsi_cmnd),
+ scsi_prot_sg_count(scsi_cmnd),
+ task->data_dir);
+
+ if (!*n_elem_dif)
+ return -ENOMEM;
+
+ if (*n_elem_dif > HISI_SAS_SGE_DIF_PAGE_CNT) {
+ dev_err(dev, "task prep: n_elem_dif(%d) too large\n",
+ *n_elem_dif);
+ rc = -EINVAL;
+ goto err_out_dif_dma_unmap;
+ }
+ }
+ }
+
+ return 0;
+
+err_out_dif_dma_unmap:
+ dma_unmap_sg(dev, scsi_prot_sglist(scsi_cmnd),
+ scsi_prot_sg_count(scsi_cmnd), task->data_dir);
+ return rc;
+}
+
static int hisi_sas_task_prep(struct sas_task *task,
struct hisi_sas_dq **dq_pointer,
bool is_tmf, struct hisi_sas_tmf_task *tmf,
@@ -394,7 +454,7 @@ static int hisi_sas_task_prep(struct sas_task *task,
struct asd_sas_port *sas_port = device->port;
struct device *dev = hisi_hba->dev;
int dlvry_queue_slot, dlvry_queue, rc, slot_idx;
- int n_elem = 0, n_elem_req = 0, n_elem_resp = 0;
+ int n_elem = 0, n_elem_dif = 0, n_elem_req = 0, n_elem_resp = 0;
struct hisi_sas_dq *dq;
unsigned long flags;
int wr_q_index;
@@ -427,6 +487,12 @@ static int hisi_sas_task_prep(struct sas_task *task,
if (rc < 0)
goto prep_out;

+ if (!sas_protocol_ata(task->task_proto)) {
+ rc = hisi_sas_dif_dma_map(hisi_hba, &n_elem_dif, task);
+ if (rc < 0)
+ goto err_out_dma_unmap;
+ }
+
if (hisi_hba->hw->slot_index_alloc)
rc = hisi_hba->hw->slot_index_alloc(hisi_hba, device);
else {
@@ -445,7 +511,7 @@ static int hisi_sas_task_prep(struct sas_task *task,
rc = hisi_sas_slot_index_alloc(hisi_hba, scsi_cmnd);
}
if (rc < 0)
- goto err_out_dma_unmap;
+ goto err_out_dif_dma_unmap;

slot_idx = rc;
slot = &hisi_hba->slot_info[slot_idx];
@@ -466,6 +532,7 @@ static int hisi_sas_task_prep(struct sas_task *task,
dlvry_queue_slot = wr_q_index;

slot->n_elem = n_elem;
+ slot->n_elem_dif = n_elem_dif;
slot->dlvry_queue = dlvry_queue;
slot->dlvry_queue_slot = dlvry_queue_slot;
cmd_hdr_base = hisi_hba->cmd_hdr[dlvry_queue];
@@ -509,6 +576,9 @@ static int hisi_sas_task_prep(struct sas_task *task,

err_out_tag:
hisi_sas_slot_index_free(hisi_hba, slot_idx);
+err_out_dif_dma_unmap:
+ if (!sas_protocol_ata(task->task_proto))
+ hisi_sas_dif_dma_unmap(hisi_hba, task, n_elem_dif);
err_out_dma_unmap:
hisi_sas_dma_unmap(hisi_hba, task, n_elem,
n_elem_req, n_elem_resp);
@@ -2142,21 +2212,26 @@ int hisi_sas_alloc(struct hisi_hba *hisi_hba, struct Scsi_Host *shost)
if (!hisi_hba->slot_info)
goto err_out;

- /* roundup to avoid overly large block size */
+ /* roundup to avoid an overly large block size */
max_command_entries_ru = roundup(max_command_entries, 64);
- sz_slot_buf_ru = roundup(sizeof(struct hisi_sas_slot_buf_table), 64);
+ if (hisi_hba->enable_dif_dix)
+ sz_slot_buf_ru = sizeof(struct hisi_sas_slot_dif_buf_table);
+ else
+ sz_slot_buf_ru = sizeof(struct hisi_sas_slot_buf_table);
+ sz_slot_buf_ru = roundup(sz_slot_buf_ru, 64);
s = lcm(max_command_entries_ru, sz_slot_buf_ru);
blk_cnt = (max_command_entries_ru * sz_slot_buf_ru) / s;
slots_per_blk = s / sz_slot_buf_ru;
+
for (i = 0; i < blk_cnt; i++) {
- struct hisi_sas_slot_buf_table *buf;
- dma_addr_t buf_dma;
int slot_index = i * slots_per_blk;
+ dma_addr_t buf_dma;
+ void *buf;

- buf = dmam_alloc_coherent(dev, s, &buf_dma, GFP_KERNEL);
+ buf = dmam_alloc_coherent(dev, s, &buf_dma,
+ GFP_KERNEL | __GFP_ZERO);
if (!buf)
goto err_out;
- memset(buf, 0, s);

for (j = 0; j < slots_per_blk; j++, slot_index++) {
struct hisi_sas_slot *slot;
@@ -2166,8 +2241,8 @@ int hisi_sas_alloc(struct hisi_hba *hisi_hba, struct Scsi_Host *shost)
slot->buf_dma = buf_dma;
slot->idx = slot_index;

- buf++;
- buf_dma += sizeof(*buf);
+ buf += sz_slot_buf_ru;
+ buf_dma += sz_slot_buf_ru;
}
}

diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index 8a08078..314918c 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -127,6 +127,8 @@
#define PHY_CTRL (PORT_BASE + 0x14)
#define PHY_CTRL_RESET_OFF 0
#define PHY_CTRL_RESET_MSK (0x1 << PHY_CTRL_RESET_OFF)
+#define CMD_HDR_PIR_OFF 8
+#define CMD_HDR_PIR_MSK (0x1 << CMD_HDR_PIR_OFF)
#define SL_CFG (PORT_BASE + 0x84)
#define AIP_LIMIT (PORT_BASE + 0x90)
#define SL_CONTROL (PORT_BASE + 0x94)
@@ -333,6 +335,16 @@
#define ITCT_HDR_RTOLT_OFF 48
#define ITCT_HDR_RTOLT_MSK (0xffffULL << ITCT_HDR_RTOLT_OFF)

+struct hisi_sas_protect_iu_v3_hw {
+ u32 dw0;
+ u32 lbrtcv;
+ u32 lbrtgv;
+ u32 dw3;
+ u32 dw4;
+ u32 dw5;
+ u32 rsv;
+};
+
struct hisi_sas_complete_v3_hdr {
__le32 dw0;
__le32 dw1;
@@ -372,9 +384,27 @@ struct hisi_sas_err_record_v3 {
((fis.command == ATA_CMD_DEV_RESET) && \
((fis.control & ATA_SRST) != 0)))

+#define T10_INSRT_EN_OFF 0
+#define T10_INSRT_EN_MSK (1 << T10_INSRT_EN_OFF)
+#define T10_RMV_EN_OFF 1
+#define T10_RMV_EN_MSK (1 << T10_RMV_EN_OFF)
+#define T10_RPLC_EN_OFF 2
+#define T10_RPLC_EN_MSK (1 << T10_RPLC_EN_OFF)
+#define T10_CHK_EN_OFF 3
+#define T10_CHK_EN_MSK (1 << T10_CHK_EN_OFF)
+#define INCR_LBRT_OFF 5
+#define INCR_LBRT_MSK (1 << INCR_LBRT_OFF)
+#define USR_DATA_BLOCK_SZ_OFF 20
+#define USR_DATA_BLOCK_SZ_MSK (0x3 << USR_DATA_BLOCK_SZ_OFF)
+#define T10_CHK_MSK_OFF 16
+
static bool hisi_sas_intr_conv;
MODULE_PARM_DESC(intr_conv, "interrupt converge enable (0-1)");

+static bool enable_dif_dix;
+module_param(enable_dif_dix, bool, 0444);
+MODULE_PARM_DESC(enable_dif_dix, "DIF/DIX enable (0-1)");
+
static u32 hisi_sas_read32(struct hisi_hba *hisi_hba, u32 off)
{
void __iomem *regs = hisi_hba->regs + off;
@@ -937,7 +967,107 @@ static void prep_prd_sge_v3_hw(struct hisi_hba *hisi_hba,

hdr->prd_table_addr = cpu_to_le64(hisi_sas_sge_addr_dma(slot));

- hdr->sg_len = cpu_to_le32(n_elem << CMD_HDR_DATA_SGL_LEN_OFF);
+ hdr->sg_len |= cpu_to_le32(n_elem << CMD_HDR_DATA_SGL_LEN_OFF);
+}
+
+static void prep_prd_sge_dif_v3_hw(struct hisi_hba *hisi_hba,
+ struct hisi_sas_slot *slot,
+ struct hisi_sas_cmd_hdr *hdr,
+ struct scatterlist *scatter,
+ int n_elem)
+{
+ struct hisi_sas_sge_dif_page *sge_dif_page;
+ struct scatterlist *sg;
+ int i;
+
+ sge_dif_page = hisi_sas_sge_dif_addr_mem(slot);
+
+ for_each_sg(scatter, sg, n_elem, i) {
+ struct hisi_sas_sge *entry = &sge_dif_page->sge[i];
+
+ entry->addr = cpu_to_le64(sg_dma_address(sg));
+ entry->page_ctrl_0 = entry->page_ctrl_1 = 0;
+ entry->data_len = cpu_to_le32(sg_dma_len(sg));
+ entry->data_off = 0;
+ }
+
+ hdr->dif_prd_table_addr = cpu_to_le64(
+ hisi_sas_sge_dif_addr_dma(slot));
+
+ hdr->sg_len |= cpu_to_le32(n_elem << CMD_HDR_DIF_SGL_LEN_OFF);
+}
+
+static void fill_prot_v3_hw(struct scsi_cmnd *scsi_cmnd,
+ struct hisi_sas_protect_iu_v3_hw *prot)
+{
+ u8 prot_type = scsi_get_prot_type(scsi_cmnd);
+ u8 prot_op = scsi_get_prot_op(scsi_cmnd);
+ unsigned int interval = scsi_prot_interval(scsi_cmnd);
+ u32 lbrt_chk_val;
+
+ if (interval == 4096)
+ lbrt_chk_val = (u32)(scsi_get_lba(scsi_cmnd) >> 3);
+ else
+ lbrt_chk_val = (u32)scsi_get_lba(scsi_cmnd);
+
+ switch (prot_op) {
+ case SCSI_PROT_READ_INSERT:
+ prot->dw0 |= T10_INSRT_EN_MSK;
+ prot->lbrtgv = lbrt_chk_val;
+ break;
+ case SCSI_PROT_READ_STRIP:
+ prot->dw0 |= (T10_RMV_EN_MSK | T10_CHK_EN_MSK);
+ prot->lbrtcv = lbrt_chk_val;
+ if (prot_type == SCSI_PROT_DIF_TYPE1)
+ prot->dw4 |= (0xc << 16);
+ else if (prot_type == SCSI_PROT_DIF_TYPE3)
+ prot->dw4 |= (0xfc << 16);
+ break;
+ case SCSI_PROT_READ_PASS:
+ prot->dw0 |= T10_CHK_EN_MSK;
+ prot->lbrtcv = lbrt_chk_val;
+ if (prot_type == SCSI_PROT_DIF_TYPE1)
+ prot->dw4 |= (0xc << 16);
+ else if (prot_type == SCSI_PROT_DIF_TYPE3)
+ prot->dw4 |= (0xfc << 16);
+ break;
+ case SCSI_PROT_WRITE_INSERT:
+ prot->dw0 |= T10_INSRT_EN_MSK;
+ prot->lbrtgv = lbrt_chk_val;
+ break;
+ case SCSI_PROT_WRITE_STRIP:
+ prot->dw0 |= (T10_RMV_EN_MSK | T10_CHK_EN_MSK);
+ prot->lbrtcv = lbrt_chk_val;
+ break;
+ case SCSI_PROT_WRITE_PASS:
+ prot->dw0 |= T10_CHK_EN_MSK;
+ prot->lbrtcv = lbrt_chk_val;
+ if (prot_type == SCSI_PROT_DIF_TYPE1)
+ prot->dw4 |= (0xc << 16);
+ else if (prot_type == SCSI_PROT_DIF_TYPE3)
+ prot->dw4 |= (0xfc << 16);
+ break;
+ default:
+ WARN(1, "prot_op(0x%x) is not valid\n", prot_op);
+ break;
+ }
+
+ switch (interval) {
+ case 512:
+ break;
+ case 4096:
+ prot->dw0 |= (0x1 << USR_DATA_BLOCK_SZ_OFF);
+ break;
+ case 520:
+ prot->dw0 |= (0x2 << USR_DATA_BLOCK_SZ_OFF);
+ break;
+ default:
+ WARN(1, "protection interval (0x%x) invalid\n",
+ interval);
+ break;
+ }
+
+ prot->dw0 |= INCR_LBRT_MSK;
}

static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
@@ -953,7 +1083,7 @@ static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
struct hisi_sas_tmf_task *tmf = slot->tmf;
int has_data = 0, priority = !!tmf;
u8 *buf_cmd;
- u32 dw1 = 0, dw2 = 0;
+ u32 dw1 = 0, dw2 = 0, len = 0;

hdr->dw0 = cpu_to_le32((1 << CMD_HDR_RESP_REPORT_OFF) |
(2 << CMD_HDR_TLR_CTRL_OFF) |
@@ -992,11 +1122,16 @@ static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
hdr->dw2 = cpu_to_le32(dw2);
hdr->transfer_tags = cpu_to_le32(slot->idx);

- if (has_data)
+ if (has_data) {
prep_prd_sge_v3_hw(hisi_hba, slot, hdr, task->scatter,
- slot->n_elem);
+ slot->n_elem);
+
+ if (scsi_prot_sg_count(scsi_cmnd))
+ prep_prd_sge_dif_v3_hw(hisi_hba, slot, hdr,
+ scsi_prot_sglist(scsi_cmnd),
+ slot->n_elem_dif);
+ }

- hdr->data_transfer_len = cpu_to_le32(task->total_xfer_len);
hdr->cmd_table_addr = cpu_to_le64(hisi_sas_cmd_hdr_addr_dma(slot));
hdr->sts_buffer_addr = cpu_to_le64(hisi_sas_status_buf_addr_dma(slot));

@@ -1021,6 +1156,35 @@ static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
break;
}
}
+
+ if (has_data && !scsi_prot_op_normal(scsi_cmnd)) {
+ struct hisi_sas_protect_iu_v3_hw prot;
+ unsigned char prot_op = scsi_get_prot_op(scsi_cmnd);
+ u8 *buf_cmd_prot;
+
+ hdr->dw7 |= 1 << CMD_HDR_ADDR_MODE_SEL_OFF;
+ hdr->dw1 |= CMD_HDR_PIR_MSK;
+ buf_cmd_prot = hisi_sas_cmd_hdr_addr_mem(slot) +
+ sizeof(struct ssp_frame_hdr) +
+ sizeof(struct ssp_command_iu);
+
+ memset(&prot, 0, sizeof(struct hisi_sas_protect_iu_v3_hw));
+ fill_prot_v3_hw(scsi_cmnd, &prot);
+ memcpy(buf_cmd_prot, &prot,
+ sizeof(struct hisi_sas_protect_iu_v3_hw));
+
+ if ((prot_op == SCSI_PROT_READ_INSERT) ||
+ (prot_op == SCSI_PROT_WRITE_INSERT) ||
+ (prot_op == SCSI_PROT_WRITE_PASS) ||
+ (prot_op == SCSI_PROT_READ_PASS)) {
+ unsigned int interval = scsi_prot_interval(scsi_cmnd);
+ unsigned int ilog2_interval = ilog2(interval);
+
+ len = (task->total_xfer_len >> ilog2_interval) * 8;
+ }
+ }
+
+ hdr->data_transfer_len = cpu_to_le32(task->total_xfer_len + len);
}

static void prep_smp_v3_hw(struct hisi_hba *hisi_hba,
@@ -2225,6 +2389,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
.bios_param = sas_bios_param,
.this_id = -1,
.sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
+ .sg_prot_tablesize = HISI_SAS_SGE_PAGE_CNT,
.max_sectors = SCSI_DEFAULT_MAX_SECTORS,
.use_clustering = ENABLE_CLUSTERING,
.eh_device_reset_handler = sas_eh_device_reset_handler,
@@ -2284,6 +2449,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
hisi_hba->dev = dev;
hisi_hba->shost = shost;
SHOST_TO_SAS_HA(shost) = &hisi_hba->sha;
+ hisi_hba->enable_dif_dix = enable_dif_dix;

timer_setup(&hisi_hba->timer, NULL, 0);

@@ -2395,6 +2561,19 @@ struct device_attribute *host_attrs_v3_hw[] = {
if (rc)
goto err_out_register_ha;

+ if (hisi_hba->enable_dif_dix) {
+ dev_info(dev, "Registering for DIF/DIX type 1/2/3 protection.\n");
+ scsi_host_set_prot(hisi_hba->shost,
+ SHOST_DIF_TYPE1_PROTECTION |
+ SHOST_DIF_TYPE2_PROTECTION |
+ SHOST_DIF_TYPE3_PROTECTION |
+ SHOST_DIX_TYPE1_PROTECTION |
+ SHOST_DIX_TYPE2_PROTECTION |
+ SHOST_DIX_TYPE3_PROTECTION);
+ scsi_host_set_guard(hisi_hba->shost,
+ SHOST_DIX_GUARD_CRC);
+ }
+
scsi_scan_host(shost);

return 0;
--
1.9.1


2018-11-20 16:04:05

by John Garry

[permalink] [raw]
Subject: [PATCH 1/4] scsi: Add scsi_prot_op_normal()

It is a common pattern to check if a Scsi command protection option is
"normal", i.e. regular IO.

Add a common simple wrapper for this.

Signed-off-by: John Garry <[email protected]>
---
include/scsi/scsi_cmnd.h | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/include/scsi/scsi_cmnd.h b/include/scsi/scsi_cmnd.h
index c891ada..3b26ea1 100644
--- a/include/scsi/scsi_cmnd.h
+++ b/include/scsi/scsi_cmnd.h
@@ -271,6 +271,11 @@ static inline unsigned char scsi_get_prot_op(struct scsi_cmnd *scmd)
return scmd->prot_op;
}

+static inline bool scsi_prot_op_normal(struct scsi_cmnd *scmd)
+{
+ return scmd->prot_op == SCSI_PROT_NORMAL;
+}
+
enum scsi_prot_flags {
SCSI_PROT_TRANSFER_PI = 1 << 0,
SCSI_PROT_GUARD_CHECK = 1 << 1,
--
1.9.1


2018-11-20 16:04:35

by John Garry

[permalink] [raw]
Subject: [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value

From: Xiang Chen <[email protected]>

Sht->sg_tablesize is set in the driver, and it will be assigned to
shost->sg_tablesize in SCSI mid-layer. So it is not necessary to
assign shost->sg_table one more time in the driver.

In addition to the change, change each scsi_host_template.sg_tablesize
to HISI_SAS_SGE_PAGE_CNT instead of SG_ALL.

Signed-off-by: Xiang Chen <[email protected]>
Signed-off-by: John Garry <[email protected]>
---
drivers/scsi/hisi_sas/hisi_sas_main.c | 1 -
drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +-
drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 +-
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +--
4 files changed, 3 insertions(+), 5 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index d13a662..cbda48e 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -2410,7 +2410,6 @@ int hisi_sas_probe(struct platform_device *pdev,
shost->max_lun = ~0;
shost->max_channel = 1;
shost->max_cmd_len = 16;
- shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
if (hisi_hba->hw->slot_index_alloc) {
shost->can_queue = hisi_hba->hw->max_command_entries;
shost->cmd_per_lun = hisi_hba->hw->max_command_entries;
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
index d24342b..2d035cc 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
@@ -1815,7 +1815,7 @@ static int hisi_sas_v1_init(struct hisi_hba *hisi_hba)
.change_queue_depth = sas_change_queue_depth,
.bios_param = sas_bios_param,
.this_id = -1,
- .sg_tablesize = SG_ALL,
+ .sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
.max_sectors = SCSI_DEFAULT_MAX_SECTORS,
.use_clustering = ENABLE_CLUSTERING,
.eh_device_reset_handler = sas_eh_device_reset_handler,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
index e78a97e..79e58a7 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
@@ -3570,7 +3570,7 @@ struct device_attribute *host_attrs_v2_hw[] = {
.change_queue_depth = sas_change_queue_depth,
.bios_param = sas_bios_param,
.this_id = -1,
- .sg_tablesize = SG_ALL,
+ .sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
.max_sectors = SCSI_DEFAULT_MAX_SECTORS,
.use_clustering = ENABLE_CLUSTERING,
.eh_device_reset_handler = sas_eh_device_reset_handler,
diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
index 7e2b020..8a08078 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
@@ -2224,7 +2224,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
.change_queue_depth = sas_change_queue_depth,
.bios_param = sas_bios_param,
.this_id = -1,
- .sg_tablesize = SG_ALL,
+ .sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
.max_sectors = SCSI_DEFAULT_MAX_SECTORS,
.use_clustering = ENABLE_CLUSTERING,
.eh_device_reset_handler = sas_eh_device_reset_handler,
@@ -2366,7 +2366,6 @@ struct device_attribute *host_attrs_v3_hw[] = {
shost->max_lun = ~0;
shost->max_channel = 1;
shost->max_cmd_len = 16;
- shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
shost->can_queue = hisi_hba->hw->max_command_entries -
HISI_SAS_RESERVED_IPTT_CNT;
shost->cmd_per_lun = hisi_hba->hw->max_command_entries -
--
1.9.1


2018-11-20 17:53:18

by John Garry

[permalink] [raw]
Subject: [PATCH 2/4] scsi: hisi_sas: Relocate some code to reduce complexity

From: Xiang Chen <[email protected]>

Relocate the codes related to dma_map/unmap in hisi_sas_task_prep()
to reduce complexity, with a view to add DIF/DIX support.

Signed-off-by: Xiang Chen <[email protected]>
Signed-off-by: John Garry <[email protected]>
---
drivers/scsi/hisi_sas/hisi_sas_main.c | 146 +++++++++++++++++++++-------------
1 file changed, 90 insertions(+), 56 deletions(-)

diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
index 65dc749..d13a662 100644
--- a/drivers/scsi/hisi_sas/hisi_sas_main.c
+++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
@@ -296,6 +296,90 @@ static void hisi_sas_task_prep_abort(struct hisi_hba *hisi_hba,
device_id, abort_flag, tag_to_abort);
}

+static void hisi_sas_dma_unmap(struct hisi_hba *hisi_hba,
+ struct sas_task *task, int n_elem,
+ int n_elem_req, int n_elem_resp)
+{
+ struct device *dev = hisi_hba->dev;
+
+ if (!sas_protocol_ata(task->task_proto)) {
+ if (task->num_scatter) {
+ if (n_elem)
+ dma_unmap_sg(dev, task->scatter,
+ task->num_scatter,
+ task->data_dir);
+ } else if (task->task_proto & SAS_PROTOCOL_SMP) {
+ if (n_elem_req)
+ dma_unmap_sg(dev, &task->smp_task.smp_req,
+ 1, DMA_TO_DEVICE);
+ if (n_elem_resp)
+ dma_unmap_sg(dev, &task->smp_task.smp_resp,
+ 1, DMA_FROM_DEVICE);
+ }
+ }
+}
+
+static int hisi_sas_dma_map(struct hisi_hba *hisi_hba,
+ struct sas_task *task, int *n_elem,
+ int *n_elem_req, int *n_elem_resp)
+{
+ struct device *dev = hisi_hba->dev;
+ int rc;
+
+ if (sas_protocol_ata(task->task_proto)) {
+ *n_elem = task->num_scatter;
+ } else {
+ unsigned int req_len, resp_len;
+
+ if (task->num_scatter) {
+ *n_elem = dma_map_sg(dev, task->scatter,
+ task->num_scatter, task->data_dir);
+ if (!*n_elem) {
+ rc = -ENOMEM;
+ goto prep_out;
+ }
+ } else if (task->task_proto & SAS_PROTOCOL_SMP) {
+ *n_elem_req = dma_map_sg(dev, &task->smp_task.smp_req,
+ 1, DMA_TO_DEVICE);
+ if (!*n_elem_req) {
+ rc = -ENOMEM;
+ goto prep_out;
+ }
+ req_len = sg_dma_len(&task->smp_task.smp_req);
+ if (req_len & 0x3) {
+ rc = -EINVAL;
+ goto err_out_dma_unmap;
+ }
+ *n_elem_resp = dma_map_sg(dev, &task->smp_task.smp_resp,
+ 1, DMA_FROM_DEVICE);
+ if (!*n_elem_resp) {
+ rc = -ENOMEM;
+ goto err_out_dma_unmap;
+ }
+ resp_len = sg_dma_len(&task->smp_task.smp_resp);
+ if (resp_len & 0x3) {
+ rc = -EINVAL;
+ goto err_out_dma_unmap;
+ }
+ }
+ }
+
+ if (*n_elem > HISI_SAS_SGE_PAGE_CNT) {
+ dev_err(dev, "task prep: n_elem(%d) > HISI_SAS_SGE_PAGE_CNT",
+ *n_elem);
+ rc = -EINVAL;
+ goto err_out_dma_unmap;
+ }
+ return 0;
+
+err_out_dma_unmap:
+ /* It would be better to call dma_unmap_sg() here, but it's messy */
+ hisi_sas_dma_unmap(hisi_hba, task, *n_elem,
+ *n_elem_req, *n_elem_resp);
+prep_out:
+ return rc;
+}
+
static int hisi_sas_task_prep(struct sas_task *task,
struct hisi_sas_dq **dq_pointer,
bool is_tmf, struct hisi_sas_tmf_task *tmf,
@@ -338,49 +422,10 @@ static int hisi_sas_task_prep(struct sas_task *task,
return -ECOMM;
}

- if (!sas_protocol_ata(task->task_proto)) {
- unsigned int req_len, resp_len;
-
- if (task->num_scatter) {
- n_elem = dma_map_sg(dev, task->scatter,
- task->num_scatter, task->data_dir);
- if (!n_elem) {
- rc = -ENOMEM;
- goto prep_out;
- }
- } else if (task->task_proto & SAS_PROTOCOL_SMP) {
- n_elem_req = dma_map_sg(dev, &task->smp_task.smp_req,
- 1, DMA_TO_DEVICE);
- if (!n_elem_req) {
- rc = -ENOMEM;
- goto prep_out;
- }
- req_len = sg_dma_len(&task->smp_task.smp_req);
- if (req_len & 0x3) {
- rc = -EINVAL;
- goto err_out_dma_unmap;
- }
- n_elem_resp = dma_map_sg(dev, &task->smp_task.smp_resp,
- 1, DMA_FROM_DEVICE);
- if (!n_elem_resp) {
- rc = -ENOMEM;
- goto err_out_dma_unmap;
- }
- resp_len = sg_dma_len(&task->smp_task.smp_resp);
- if (resp_len & 0x3) {
- rc = -EINVAL;
- goto err_out_dma_unmap;
- }
- }
- } else
- n_elem = task->num_scatter;
-
- if (n_elem > HISI_SAS_SGE_PAGE_CNT) {
- dev_err(dev, "task prep: n_elem(%d) > HISI_SAS_SGE_PAGE_CNT",
- n_elem);
- rc = -EINVAL;
- goto err_out_dma_unmap;
- }
+ rc = hisi_sas_dma_map(hisi_hba, task, &n_elem,
+ &n_elem_req, &n_elem_resp);
+ if (rc < 0)
+ goto prep_out;

if (hisi_hba->hw->slot_index_alloc)
rc = hisi_hba->hw->slot_index_alloc(hisi_hba, device);
@@ -465,19 +510,8 @@ static int hisi_sas_task_prep(struct sas_task *task,
err_out_tag:
hisi_sas_slot_index_free(hisi_hba, slot_idx);
err_out_dma_unmap:
- if (!sas_protocol_ata(task->task_proto)) {
- if (task->num_scatter) {
- dma_unmap_sg(dev, task->scatter, task->num_scatter,
- task->data_dir);
- } else if (task->task_proto & SAS_PROTOCOL_SMP) {
- if (n_elem_req)
- dma_unmap_sg(dev, &task->smp_task.smp_req,
- 1, DMA_TO_DEVICE);
- if (n_elem_resp)
- dma_unmap_sg(dev, &task->smp_task.smp_resp,
- 1, DMA_FROM_DEVICE);
- }
- }
+ hisi_sas_dma_unmap(hisi_hba, task, n_elem,
+ n_elem_req, n_elem_resp);
prep_out:
dev_err(dev, "task prep: failed[%d]!\n", rc);
return rc;
--
1.9.1


2018-11-20 17:57:19

by John Garry

[permalink] [raw]
Subject: Re: [PATCH 1/4] scsi: Add scsi_prot_op_normal()

On 20/11/2018 16:19, Christoph Hellwig wrote:
>> +static inline bool scsi_prot_op_normal(struct scsi_cmnd *scmd)
>> +{
>> + return scmd->prot_op == SCSI_PROT_NORMAL;
>> +}
>
> This "wrapper" just obsfucates the check being performed, please drop
> it.
>
> .
>

ok, if you think so.

I just thought that was better for a more concise check, rather than
this common pattern:
if ((scsi_get_prot_op(scsi_cmnd) != SCSI_PROT_NORMAL) ...

cheers,



2018-11-20 19:29:26

by Christoph Hellwig

[permalink] [raw]
Subject: Re: [PATCH 1/4] scsi: Add scsi_prot_op_normal()

> +static inline bool scsi_prot_op_normal(struct scsi_cmnd *scmd)
> +{
> + return scmd->prot_op == SCSI_PROT_NORMAL;
> +}

This "wrapper" just obsfucates the check being performed, please drop
it.

2018-11-21 11:04:41

by Steffen Maier

[permalink] [raw]
Subject: Re: [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value

On 11/20/2018 03:59 PM, John Garry wrote:
> From: Xiang Chen <[email protected]>
>
> Sht->sg_tablesize is set in the driver, and it will be assigned to
> shost->sg_tablesize in SCSI mid-layer. So it is not necessary to
> assign shost->sg_table one more time in the driver.
>
> In addition to the change, change each scsi_host_template.sg_tablesize
> to HISI_SAS_SGE_PAGE_CNT instead of SG_ALL.

Might be completely irrelevant, so just as information: I once had
problems due to changing (reducing) SHT.sg_tablesize because block queue
limits of BSG devices of Scsi_Host and fc_host (not sure if you have an
equivalent bsg device for your transport(s)) inherit from SHT, but don't
update (automatically) on later updates of shost->sg_tablesize, which in
turn affect scsi_devices allocated after the shost update.
Cf.
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/s390/scsi?id=5fea4291deacd80188b996d2f555fc6a1940e5d4
("[SCSI] zfcp: block queue limits with data router")
if you need more details.

> Signed-off-by: Xiang Chen <[email protected]>
> Signed-off-by: John Garry <[email protected]>
> ---
> drivers/scsi/hisi_sas/hisi_sas_main.c | 1 -
> drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +-
> drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 +-
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +--
> 4 files changed, 3 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c b/drivers/scsi/hisi_sas/hisi_sas_main.c
> index d13a662..cbda48e 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_main.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
> @@ -2410,7 +2410,6 @@ int hisi_sas_probe(struct platform_device *pdev,
> shost->max_lun = ~0;
> shost->max_channel = 1;
> shost->max_cmd_len = 16;
> - shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
> if (hisi_hba->hw->slot_index_alloc) {
> shost->can_queue = hisi_hba->hw->max_command_entries;
> shost->cmd_per_lun = hisi_hba->hw->max_command_entries;
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
> index d24342b..2d035cc 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
> @@ -1815,7 +1815,7 @@ static int hisi_sas_v1_init(struct hisi_hba *hisi_hba)
> .change_queue_depth = sas_change_queue_depth,
> .bios_param = sas_bios_param,
> .this_id = -1,
> - .sg_tablesize = SG_ALL,
> + .sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
> .max_sectors = SCSI_DEFAULT_MAX_SECTORS,
> .use_clustering = ENABLE_CLUSTERING,
> .eh_device_reset_handler = sas_eh_device_reset_handler,
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> index e78a97e..79e58a7 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
> @@ -3570,7 +3570,7 @@ struct device_attribute *host_attrs_v2_hw[] = {
> .change_queue_depth = sas_change_queue_depth,
> .bios_param = sas_bios_param,
> .this_id = -1,
> - .sg_tablesize = SG_ALL,
> + .sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
> .max_sectors = SCSI_DEFAULT_MAX_SECTORS,
> .use_clustering = ENABLE_CLUSTERING,
> .eh_device_reset_handler = sas_eh_device_reset_handler,
> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> index 7e2b020..8a08078 100644
> --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> @@ -2224,7 +2224,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
> .change_queue_depth = sas_change_queue_depth,
> .bios_param = sas_bios_param,
> .this_id = -1,
> - .sg_tablesize = SG_ALL,
> + .sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
> .max_sectors = SCSI_DEFAULT_MAX_SECTORS,
> .use_clustering = ENABLE_CLUSTERING,
> .eh_device_reset_handler = sas_eh_device_reset_handler,
> @@ -2366,7 +2366,6 @@ struct device_attribute *host_attrs_v3_hw[] = {
> shost->max_lun = ~0;
> shost->max_channel = 1;
> shost->max_cmd_len = 16;
> - shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
> shost->can_queue = hisi_hba->hw->max_command_entries -
> HISI_SAS_RESERVED_IPTT_CNT;
> shost->cmd_per_lun = hisi_hba->hw->max_command_entries -
>


--
Mit freundlichen Gruessen / Kind regards
Steffen Maier

Linux on IBM Z Development

IBM Deutschland Research & Development GmbH
Vorsitzende des Aufsichtsrats: Martina Koederitz
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294


2018-11-21 11:10:10

by Steffen Maier

[permalink] [raw]
Subject: Re: [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value

On 11/21/2018 12:02 PM, Steffen Maier wrote:
> On 11/20/2018 03:59 PM, John Garry wrote:
>> From: Xiang Chen <[email protected]>
>>
>> Sht->sg_tablesize is set in the driver, and it will be assigned to
>> shost->sg_tablesize in SCSI mid-layer. So it is not necessary to
>> assign shost->sg_table one more time in the driver.
>>
>> In addition to the change, change each scsi_host_template.sg_tablesize
>> to HISI_SAS_SGE_PAGE_CNT instead of SG_ALL.
>
> Might be completely irrelevant, so just as information: I once had
> problems due to changing (reducing) SHT.sg_tablesize because block queue
> limits of BSG devices of Scsi_Host and fc_host (not sure if you have an
> equivalent bsg device for your transport(s)) inherit from SHT, but don't
> update (automatically) on later updates of shost->sg_tablesize, which in
> turn affect scsi_devices allocated after the shost update.
> Cf.
> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/s390/scsi?id=5fea4291deacd80188b996d2f555fc6a1940e5d4

Figured, your new constant seems to have the same value so no problem.

#define SG_CHUNK_SIZE 128
#define SG_ALL SG_CHUNK_SIZE
#define HISI_SAS_SGE_PAGE_CNT SG_CHUNK_SIZE

> ("[SCSI] zfcp: block queue limits with data router")
> if you need more details.
>
>> Signed-off-by: Xiang Chen <[email protected]>
>> Signed-off-by: John Garry <[email protected]>
>> ---
>>   drivers/scsi/hisi_sas/hisi_sas_main.c  | 1 -
>>   drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +-
>>   drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 +-
>>   drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +--
>>   4 files changed, 3 insertions(+), 5 deletions(-)
>>
>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c
>> b/drivers/scsi/hisi_sas/hisi_sas_main.c
>> index d13a662..cbda48e 100644
>> --- a/drivers/scsi/hisi_sas/hisi_sas_main.c
>> +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
>> @@ -2410,7 +2410,6 @@ int hisi_sas_probe(struct platform_device *pdev,
>>       shost->max_lun = ~0;
>>       shost->max_channel = 1;
>>       shost->max_cmd_len = 16;
>> -    shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
>>       if (hisi_hba->hw->slot_index_alloc) {
>>           shost->can_queue = hisi_hba->hw->max_command_entries;
>>           shost->cmd_per_lun = hisi_hba->hw->max_command_entries;
>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>> b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>> index d24342b..2d035cc 100644
>> --- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>> @@ -1815,7 +1815,7 @@ static int hisi_sas_v1_init(struct hisi_hba
>> *hisi_hba)
>>       .change_queue_depth    = sas_change_queue_depth,
>>       .bios_param        = sas_bios_param,
>>       .this_id        = -1,
>> -    .sg_tablesize        = SG_ALL,
>> +    .sg_tablesize        = HISI_SAS_SGE_PAGE_CNT,
>>       .max_sectors        = SCSI_DEFAULT_MAX_SECTORS,
>>       .use_clustering        = ENABLE_CLUSTERING,
>>       .eh_device_reset_handler = sas_eh_device_reset_handler,
>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>> b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>> index e78a97e..79e58a7 100644
>> --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>> @@ -3570,7 +3570,7 @@ struct device_attribute *host_attrs_v2_hw[] = {
>>       .change_queue_depth    = sas_change_queue_depth,
>>       .bios_param        = sas_bios_param,
>>       .this_id        = -1,
>> -    .sg_tablesize        = SG_ALL,
>> +    .sg_tablesize        = HISI_SAS_SGE_PAGE_CNT,
>>       .max_sectors        = SCSI_DEFAULT_MAX_SECTORS,
>>       .use_clustering        = ENABLE_CLUSTERING,
>>       .eh_device_reset_handler = sas_eh_device_reset_handler,
>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>> b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>> index 7e2b020..8a08078 100644
>> --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>> @@ -2224,7 +2224,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
>>       .change_queue_depth    = sas_change_queue_depth,
>>       .bios_param        = sas_bios_param,
>>       .this_id        = -1,
>> -    .sg_tablesize        = SG_ALL,
>> +    .sg_tablesize        = HISI_SAS_SGE_PAGE_CNT,
>>       .max_sectors        = SCSI_DEFAULT_MAX_SECTORS,
>>       .use_clustering        = ENABLE_CLUSTERING,
>>       .eh_device_reset_handler = sas_eh_device_reset_handler,
>> @@ -2366,7 +2366,6 @@ struct device_attribute *host_attrs_v3_hw[] = {
>>       shost->max_lun = ~0;
>>       shost->max_channel = 1;
>>       shost->max_cmd_len = 16;
>> -    shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
>>       shost->can_queue = hisi_hba->hw->max_command_entries -
>>           HISI_SAS_RESERVED_IPTT_CNT;
>>       shost->cmd_per_lun = hisi_hba->hw->max_command_entries -
>>
>
>


--
Mit freundlichen Gruessen / Kind regards
Steffen Maier

Linux on IBM Z Development

IBM Deutschland Research & Development GmbH
Vorsitzende des Aufsichtsrats: Martina Koederitz
Geschaeftsfuehrung: Dirk Wittkopp
Sitz der Gesellschaft: Boeblingen
Registergericht: Amtsgericht Stuttgart, HRB 243294


2018-11-21 11:56:28

by John Garry

[permalink] [raw]
Subject: Re: [PATCH 3/4] scsi: hisi_sas: Make sg_tablesize consistent value

On 21/11/2018 11:08, Steffen Maier wrote:
> On 11/21/2018 12:02 PM, Steffen Maier wrote:
>> On 11/20/2018 03:59 PM, John Garry wrote:
>>> From: Xiang Chen <[email protected]>
>>>
>>> Sht->sg_tablesize is set in the driver, and it will be assigned to
>>> shost->sg_tablesize in SCSI mid-layer. So it is not necessary to
>>> assign shost->sg_table one more time in the driver.
>>>
>>> In addition to the change, change each scsi_host_template.sg_tablesize
>>> to HISI_SAS_SGE_PAGE_CNT instead of SG_ALL.
>>
>> Might be completely irrelevant, so just as information: I once had
>> problems due to changing (reducing) SHT.sg_tablesize because block
>> queue limits of BSG devices of Scsi_Host and fc_host (not sure if you
>> have an equivalent bsg device for your transport(s)) inherit from SHT,
>> but don't update (automatically) on later updates of
>> shost->sg_tablesize, which in turn affect scsi_devices allocated after
>> the shost update.
>> Cf.
>> https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/drivers/s390/scsi?id=5fea4291deacd80188b996d2f555fc6a1940e5d4
>
>
> Figured, your new constant seems to have the same value so no problem.
>

Right, so previously we were doing similar to what you describe -
setting the value in the SHT and then setting shost->sg_tablesize after
the host is allocated.

However the values were the same, so in this patch we're just removing
setting shost->sg_tablesize (again).

Thanks,
John

> #define SG_CHUNK_SIZE 128
> #define SG_ALL SG_CHUNK_SIZE
> #define HISI_SAS_SGE_PAGE_CNT SG_CHUNK_SIZE
>
>> ("[SCSI] zfcp: block queue limits with data router")
>> if you need more details.
>>
>>> Signed-off-by: Xiang Chen <[email protected]>
>>> Signed-off-by: John Garry <[email protected]>
>>> ---
>>> drivers/scsi/hisi_sas/hisi_sas_main.c | 1 -
>>> drivers/scsi/hisi_sas/hisi_sas_v1_hw.c | 2 +-
>>> drivers/scsi/hisi_sas/hisi_sas_v2_hw.c | 2 +-
>>> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c | 3 +--
>>> 4 files changed, 3 insertions(+), 5 deletions(-)
>>>
>>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_main.c
>>> b/drivers/scsi/hisi_sas/hisi_sas_main.c
>>> index d13a662..cbda48e 100644
>>> --- a/drivers/scsi/hisi_sas/hisi_sas_main.c
>>> +++ b/drivers/scsi/hisi_sas/hisi_sas_main.c
>>> @@ -2410,7 +2410,6 @@ int hisi_sas_probe(struct platform_device *pdev,
>>> shost->max_lun = ~0;
>>> shost->max_channel = 1;
>>> shost->max_cmd_len = 16;
>>> - shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
>>> if (hisi_hba->hw->slot_index_alloc) {
>>> shost->can_queue = hisi_hba->hw->max_command_entries;
>>> shost->cmd_per_lun = hisi_hba->hw->max_command_entries;
>>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>>> b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>>> index d24342b..2d035cc 100644
>>> --- a/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v1_hw.c
>>> @@ -1815,7 +1815,7 @@ static int hisi_sas_v1_init(struct hisi_hba
>>> *hisi_hba)
>>> .change_queue_depth = sas_change_queue_depth,
>>> .bios_param = sas_bios_param,
>>> .this_id = -1,
>>> - .sg_tablesize = SG_ALL,
>>> + .sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
>>> .max_sectors = SCSI_DEFAULT_MAX_SECTORS,
>>> .use_clustering = ENABLE_CLUSTERING,
>>> .eh_device_reset_handler = sas_eh_device_reset_handler,
>>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>>> b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>>> index e78a97e..79e58a7 100644
>>> --- a/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v2_hw.c
>>> @@ -3570,7 +3570,7 @@ struct device_attribute *host_attrs_v2_hw[] = {
>>> .change_queue_depth = sas_change_queue_depth,
>>> .bios_param = sas_bios_param,
>>> .this_id = -1,
>>> - .sg_tablesize = SG_ALL,
>>> + .sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
>>> .max_sectors = SCSI_DEFAULT_MAX_SECTORS,
>>> .use_clustering = ENABLE_CLUSTERING,
>>> .eh_device_reset_handler = sas_eh_device_reset_handler,
>>> diff --git a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>>> b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>>> index 7e2b020..8a08078 100644
>>> --- a/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>>> +++ b/drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>>> @@ -2224,7 +2224,7 @@ struct device_attribute *host_attrs_v3_hw[] = {
>>> .change_queue_depth = sas_change_queue_depth,
>>> .bios_param = sas_bios_param,
>>> .this_id = -1,
>>> - .sg_tablesize = SG_ALL,
>>> + .sg_tablesize = HISI_SAS_SGE_PAGE_CNT,
>>> .max_sectors = SCSI_DEFAULT_MAX_SECTORS,
>>> .use_clustering = ENABLE_CLUSTERING,
>>> .eh_device_reset_handler = sas_eh_device_reset_handler,
>>> @@ -2366,7 +2366,6 @@ struct device_attribute *host_attrs_v3_hw[] = {
>>> shost->max_lun = ~0;
>>> shost->max_channel = 1;
>>> shost->max_cmd_len = 16;
>>> - shost->sg_tablesize = min_t(u16, SG_ALL, HISI_SAS_SGE_PAGE_CNT);
>>> shost->can_queue = hisi_hba->hw->max_command_entries -
>>> HISI_SAS_RESERVED_IPTT_CNT;
>>> shost->cmd_per_lun = hisi_hba->hw->max_command_entries -
>>>
>>
>>
>
>



2018-11-24 18:52:19

by kernel test robot

[permalink] [raw]
Subject: Re: [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw

Hi Xiang,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on mkp-scsi/for-next]
[also build test WARNING on next-20181123]
[cannot apply to v4.20-rc3]
[if your patch is applied to the wrong git tree, please drop us a note to help improve the system]

url: https://github.com/0day-ci/linux/commits/John-Garry/hisi_sas-DIF-DIX-support/20181123-202805
base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
config: x86_64-allmodconfig (attached as .config)
compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
reproduce:
# save the attached .config to linux build tree
make ARCH=x86_64

All warnings (new ones prefixed by >>):

drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: incorrect type in argument 1 (different base types)
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: expected unsigned long long [unsigned] [usertype] val
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: got restricted __le64 [usertype] sas_addr
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: warning: incorrect type in assignment (different base types)
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: expected restricted __le64 [usertype] sas_addr
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: got unsigned long long
>> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: warning: invalid assignment: |=
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: left side has type restricted __le32
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: right side has type int
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: warning: invalid assignment: |=
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: left side has type restricted __le32
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: right side has type int
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: warning: incorrect type in initializer (different base types)
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: expected unsigned int [unsigned] [usertype] dma_rx_err_type
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: got restricted __le32 [usertype] dma_rx_err_type
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: warning: incorrect type in initializer (different base types)
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: expected unsigned int [unsigned] [usertype] trans_tx_fail_type
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: got restricted __le32 [usertype] trans_tx_fail_type
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1767:40: warning: restricted __le32 degrades to integer
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1781:40: warning: restricted __le32 degrades to integer
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1840:30: warning: restricted __le32 degrades to integer
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1864:26: warning: restricted __le32 degrades to integer
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1976:37: warning: restricted __le32 degrades to integer
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2372:25: warning: symbol 'host_attrs_v3_hw' was not declared. Should it be static?
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: warning: incorrect type in assignment (different base types)
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: expected unsigned int [unsigned] [usertype] device_state
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: got restricted pci_power_t
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: warning: incorrect type in argument 2 (different base types)
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: expected restricted pci_power_t [usertype] state
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: got unsigned int [unsigned] [usertype] device_state
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: warning: incorrect type in initializer (different base types)
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: expected unsigned int [unsigned] [usertype] device_state
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: got restricted pci_power_t [usertype] current_state

vim +1165 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c

1072
1073 static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
1074 struct hisi_sas_slot *slot)
1075 {
1076 struct sas_task *task = slot->task;
1077 struct hisi_sas_cmd_hdr *hdr = slot->cmd_hdr;
1078 struct domain_device *device = task->dev;
1079 struct hisi_sas_device *sas_dev = device->lldd_dev;
1080 struct hisi_sas_port *port = slot->port;
1081 struct sas_ssp_task *ssp_task = &task->ssp_task;
1082 struct scsi_cmnd *scsi_cmnd = ssp_task->cmd;
1083 struct hisi_sas_tmf_task *tmf = slot->tmf;
1084 int has_data = 0, priority = !!tmf;
1085 u8 *buf_cmd;
1086 u32 dw1 = 0, dw2 = 0, len = 0;
1087
1088 hdr->dw0 = cpu_to_le32((1 << CMD_HDR_RESP_REPORT_OFF) |
1089 (2 << CMD_HDR_TLR_CTRL_OFF) |
1090 (port->id << CMD_HDR_PORT_OFF) |
1091 (priority << CMD_HDR_PRIORITY_OFF) |
1092 (1 << CMD_HDR_CMD_OFF)); /* ssp */
1093
1094 dw1 = 1 << CMD_HDR_VDTL_OFF;
1095 if (tmf) {
1096 dw1 |= 2 << CMD_HDR_FRAME_TYPE_OFF;
1097 dw1 |= DIR_NO_DATA << CMD_HDR_DIR_OFF;
1098 } else {
1099 dw1 |= 1 << CMD_HDR_FRAME_TYPE_OFF;
1100 switch (scsi_cmnd->sc_data_direction) {
1101 case DMA_TO_DEVICE:
1102 has_data = 1;
1103 dw1 |= DIR_TO_DEVICE << CMD_HDR_DIR_OFF;
1104 break;
1105 case DMA_FROM_DEVICE:
1106 has_data = 1;
1107 dw1 |= DIR_TO_INI << CMD_HDR_DIR_OFF;
1108 break;
1109 default:
1110 dw1 &= ~CMD_HDR_DIR_MSK;
1111 }
1112 }
1113
1114 /* map itct entry */
1115 dw1 |= sas_dev->device_id << CMD_HDR_DEV_ID_OFF;
1116 hdr->dw1 = cpu_to_le32(dw1);
1117
1118 dw2 = (((sizeof(struct ssp_command_iu) + sizeof(struct ssp_frame_hdr)
1119 + 3) / 4) << CMD_HDR_CFL_OFF) |
1120 ((HISI_SAS_MAX_SSP_RESP_SZ / 4) << CMD_HDR_MRFL_OFF) |
1121 (2 << CMD_HDR_SG_MOD_OFF);
1122 hdr->dw2 = cpu_to_le32(dw2);
1123 hdr->transfer_tags = cpu_to_le32(slot->idx);
1124
1125 if (has_data) {
1126 prep_prd_sge_v3_hw(hisi_hba, slot, hdr, task->scatter,
1127 slot->n_elem);
1128
1129 if (scsi_prot_sg_count(scsi_cmnd))
1130 prep_prd_sge_dif_v3_hw(hisi_hba, slot, hdr,
1131 scsi_prot_sglist(scsi_cmnd),
1132 slot->n_elem_dif);
1133 }
1134
1135 hdr->cmd_table_addr = cpu_to_le64(hisi_sas_cmd_hdr_addr_dma(slot));
1136 hdr->sts_buffer_addr = cpu_to_le64(hisi_sas_status_buf_addr_dma(slot));
1137
1138 buf_cmd = hisi_sas_cmd_hdr_addr_mem(slot) +
1139 sizeof(struct ssp_frame_hdr);
1140
1141 memcpy(buf_cmd, &task->ssp_task.LUN, 8);
1142 if (!tmf) {
1143 buf_cmd[9] = ssp_task->task_attr | (ssp_task->task_prio << 3);
1144 memcpy(buf_cmd + 12, scsi_cmnd->cmnd, scsi_cmnd->cmd_len);
1145 } else {
1146 buf_cmd[10] = tmf->tmf;
1147 switch (tmf->tmf) {
1148 case TMF_ABORT_TASK:
1149 case TMF_QUERY_TASK:
1150 buf_cmd[12] =
1151 (tmf->tag_of_task_to_be_managed >> 8) & 0xff;
1152 buf_cmd[13] =
1153 tmf->tag_of_task_to_be_managed & 0xff;
1154 break;
1155 default:
1156 break;
1157 }
1158 }
1159
1160 if (has_data && !scsi_prot_op_normal(scsi_cmnd)) {
1161 struct hisi_sas_protect_iu_v3_hw prot;
1162 unsigned char prot_op = scsi_get_prot_op(scsi_cmnd);
1163 u8 *buf_cmd_prot;
1164
> 1165 hdr->dw7 |= 1 << CMD_HDR_ADDR_MODE_SEL_OFF;
1166 hdr->dw1 |= CMD_HDR_PIR_MSK;
1167 buf_cmd_prot = hisi_sas_cmd_hdr_addr_mem(slot) +
1168 sizeof(struct ssp_frame_hdr) +
1169 sizeof(struct ssp_command_iu);
1170
1171 memset(&prot, 0, sizeof(struct hisi_sas_protect_iu_v3_hw));
1172 fill_prot_v3_hw(scsi_cmnd, &prot);
1173 memcpy(buf_cmd_prot, &prot,
1174 sizeof(struct hisi_sas_protect_iu_v3_hw));
1175
1176 if ((prot_op == SCSI_PROT_READ_INSERT) ||
1177 (prot_op == SCSI_PROT_WRITE_INSERT) ||
1178 (prot_op == SCSI_PROT_WRITE_PASS) ||
1179 (prot_op == SCSI_PROT_READ_PASS)) {
1180 unsigned int interval = scsi_prot_interval(scsi_cmnd);
1181 unsigned int ilog2_interval = ilog2(interval);
1182
1183 len = (task->total_xfer_len >> ilog2_interval) * 8;
1184 }
1185 }
1186
1187 hdr->data_transfer_len = cpu_to_le32(task->total_xfer_len + len);
1188 }
1189

---
0-DAY kernel test infrastructure Open Source Technology Center
https://lists.01.org/pipermail/kbuild-all Intel Corporation


Attachments:
(No filename) (9.32 kB)
.config.gz (65.05 kB)
Download all attachments

2018-11-26 15:46:53

by John Garry

[permalink] [raw]
Subject: Re: [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw

On 24/11/2018 17:50, kbuild test robot wrote:
> Hi Xiang,
>
> Thank you for the patch! Perhaps something to improve:
>
> [auto build test WARNING on mkp-scsi/for-next]
> [also build test WARNING on next-20181123]
> [cannot apply to v4.20-rc3]
> [if your patch is applied to the wrong git tree, please drop us a note to help improve the system]
>
> url: https://github.com/0day-ci/linux/commits/John-Garry/hisi_sas-DIF-DIX-support/20181123-202805
> base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
> config: x86_64-allmodconfig (attached as .config)
> compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
> reproduce:
> # save the attached .config to linux build tree
> make ARCH=x86_64

For sparse errors - which are detected, below - we need C=2 option, right?

It would be good to include that in the instructions.

Thanks,
John

>
> All warnings (new ones prefixed by >>):
>
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: incorrect type in argument 1 (different base types)
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: expected unsigned long long [unsigned] [usertype] val
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: got restricted __le64 [usertype] sas_addr
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted __le64
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: warning: incorrect type in assignment (different base types)
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: expected restricted __le64 [usertype] sas_addr
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: got unsigned long long
>>> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: warning: invalid assignment: |=
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: left side has type restricted __le32
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: right side has type int
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: warning: invalid assignment: |=
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: left side has type restricted __le32
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: right side has type int
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: warning: incorrect type in initializer (different base types)
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: expected unsigned int [unsigned] [usertype] dma_rx_err_type
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: got restricted __le32 [usertype] dma_rx_err_type
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: warning: incorrect type in initializer (different base types)
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: expected unsigned int [unsigned] [usertype] trans_tx_fail_type
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: got restricted __le32 [usertype] trans_tx_fail_type
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1767:40: warning: restricted __le32 degrades to integer
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1781:40: warning: restricted __le32 degrades to integer
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1840:30: warning: restricted __le32 degrades to integer
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1864:26: warning: restricted __le32 degrades to integer
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1976:37: warning: restricted __le32 degrades to integer
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2372:25: warning: symbol 'host_attrs_v3_hw' was not declared. Should it be static?
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: warning: incorrect type in assignment (different base types)
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: expected unsigned int [unsigned] [usertype] device_state
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: got restricted pci_power_t
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: warning: incorrect type in argument 2 (different base types)
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: expected restricted pci_power_t [usertype] state
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: got unsigned int [unsigned] [usertype] device_state
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: warning: incorrect type in initializer (different base types)
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: expected unsigned int [unsigned] [usertype] device_state
> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: got restricted pci_power_t [usertype] current_state
>
> vim +1165 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
>
> 1072
> 1073 static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
> 1074 struct hisi_sas_slot *slot)
> 1075 {
> 1076 struct sas_task *task = slot->task;
> 1077 struct hisi_sas_cmd_hdr *hdr = slot->cmd_hdr;
> 1078 struct domain_device *device = task->dev;
> 1079 struct hisi_sas_device *sas_dev = device->lldd_dev;
> 1080 struct hisi_sas_port *port = slot->port;
> 1081 struct sas_ssp_task *ssp_task = &task->ssp_task;
> 1082 struct scsi_cmnd *scsi_cmnd = ssp_task->cmd;
> 1083 struct hisi_sas_tmf_task *tmf = slot->tmf;
> 1084 int has_data = 0, priority = !!tmf;
> 1085 u8 *buf_cmd;
> 1086 u32 dw1 = 0, dw2 = 0, len = 0;
> 1087
> 1088 hdr->dw0 = cpu_to_le32((1 << CMD_HDR_RESP_REPORT_OFF) |
> 1089 (2 << CMD_HDR_TLR_CTRL_OFF) |
> 1090 (port->id << CMD_HDR_PORT_OFF) |
> 1091 (priority << CMD_HDR_PRIORITY_OFF) |
> 1092 (1 << CMD_HDR_CMD_OFF)); /* ssp */
> 1093
> 1094 dw1 = 1 << CMD_HDR_VDTL_OFF;
> 1095 if (tmf) {
> 1096 dw1 |= 2 << CMD_HDR_FRAME_TYPE_OFF;
> 1097 dw1 |= DIR_NO_DATA << CMD_HDR_DIR_OFF;
> 1098 } else {
> 1099 dw1 |= 1 << CMD_HDR_FRAME_TYPE_OFF;
> 1100 switch (scsi_cmnd->sc_data_direction) {
> 1101 case DMA_TO_DEVICE:
> 1102 has_data = 1;
> 1103 dw1 |= DIR_TO_DEVICE << CMD_HDR_DIR_OFF;
> 1104 break;
> 1105 case DMA_FROM_DEVICE:
> 1106 has_data = 1;
> 1107 dw1 |= DIR_TO_INI << CMD_HDR_DIR_OFF;
> 1108 break;
> 1109 default:
> 1110 dw1 &= ~CMD_HDR_DIR_MSK;
> 1111 }
> 1112 }
> 1113
> 1114 /* map itct entry */
> 1115 dw1 |= sas_dev->device_id << CMD_HDR_DEV_ID_OFF;
> 1116 hdr->dw1 = cpu_to_le32(dw1);
> 1117
> 1118 dw2 = (((sizeof(struct ssp_command_iu) + sizeof(struct ssp_frame_hdr)
> 1119 + 3) / 4) << CMD_HDR_CFL_OFF) |
> 1120 ((HISI_SAS_MAX_SSP_RESP_SZ / 4) << CMD_HDR_MRFL_OFF) |
> 1121 (2 << CMD_HDR_SG_MOD_OFF);
> 1122 hdr->dw2 = cpu_to_le32(dw2);
> 1123 hdr->transfer_tags = cpu_to_le32(slot->idx);
> 1124
> 1125 if (has_data) {
> 1126 prep_prd_sge_v3_hw(hisi_hba, slot, hdr, task->scatter,
> 1127 slot->n_elem);
> 1128
> 1129 if (scsi_prot_sg_count(scsi_cmnd))
> 1130 prep_prd_sge_dif_v3_hw(hisi_hba, slot, hdr,
> 1131 scsi_prot_sglist(scsi_cmnd),
> 1132 slot->n_elem_dif);
> 1133 }
> 1134
> 1135 hdr->cmd_table_addr = cpu_to_le64(hisi_sas_cmd_hdr_addr_dma(slot));
> 1136 hdr->sts_buffer_addr = cpu_to_le64(hisi_sas_status_buf_addr_dma(slot));
> 1137
> 1138 buf_cmd = hisi_sas_cmd_hdr_addr_mem(slot) +
> 1139 sizeof(struct ssp_frame_hdr);
> 1140
> 1141 memcpy(buf_cmd, &task->ssp_task.LUN, 8);
> 1142 if (!tmf) {
> 1143 buf_cmd[9] = ssp_task->task_attr | (ssp_task->task_prio << 3);
> 1144 memcpy(buf_cmd + 12, scsi_cmnd->cmnd, scsi_cmnd->cmd_len);
> 1145 } else {
> 1146 buf_cmd[10] = tmf->tmf;
> 1147 switch (tmf->tmf) {
> 1148 case TMF_ABORT_TASK:
> 1149 case TMF_QUERY_TASK:
> 1150 buf_cmd[12] =
> 1151 (tmf->tag_of_task_to_be_managed >> 8) & 0xff;
> 1152 buf_cmd[13] =
> 1153 tmf->tag_of_task_to_be_managed & 0xff;
> 1154 break;
> 1155 default:
> 1156 break;
> 1157 }
> 1158 }
> 1159
> 1160 if (has_data && !scsi_prot_op_normal(scsi_cmnd)) {
> 1161 struct hisi_sas_protect_iu_v3_hw prot;
> 1162 unsigned char prot_op = scsi_get_prot_op(scsi_cmnd);
> 1163 u8 *buf_cmd_prot;
> 1164
>> 1165 hdr->dw7 |= 1 << CMD_HDR_ADDR_MODE_SEL_OFF;
> 1166 hdr->dw1 |= CMD_HDR_PIR_MSK;
> 1167 buf_cmd_prot = hisi_sas_cmd_hdr_addr_mem(slot) +
> 1168 sizeof(struct ssp_frame_hdr) +
> 1169 sizeof(struct ssp_command_iu);
> 1170
> 1171 memset(&prot, 0, sizeof(struct hisi_sas_protect_iu_v3_hw));
> 1172 fill_prot_v3_hw(scsi_cmnd, &prot);
> 1173 memcpy(buf_cmd_prot, &prot,
> 1174 sizeof(struct hisi_sas_protect_iu_v3_hw));
> 1175
> 1176 if ((prot_op == SCSI_PROT_READ_INSERT) ||
> 1177 (prot_op == SCSI_PROT_WRITE_INSERT) ||
> 1178 (prot_op == SCSI_PROT_WRITE_PASS) ||
> 1179 (prot_op == SCSI_PROT_READ_PASS)) {
> 1180 unsigned int interval = scsi_prot_interval(scsi_cmnd);
> 1181 unsigned int ilog2_interval = ilog2(interval);
> 1182
> 1183 len = (task->total_xfer_len >> ilog2_interval) * 8;
> 1184 }
> 1185 }
> 1186
> 1187 hdr->data_transfer_len = cpu_to_le32(task->total_xfer_len + len);
> 1188 }
> 1189
>
> ---
> 0-DAY kernel test infrastructure Open Source Technology Center
> https://lists.01.org/pipermail/kbuild-all Intel Corporation
>



2018-12-05 00:51:14

by Philip Li

[permalink] [raw]
Subject: RE: [kbuild-all] [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX feature for v3 hw

Subject: Re: [kbuild-all] [PATCH 4/4] scsi: hisi_sas: Add support for DIF/DIX
> feature for v3 hw
>
> On 24/11/2018 17:50, kbuild test robot wrote:
> > Hi Xiang,
> >
> > Thank you for the patch! Perhaps something to improve:
> >
> > [auto build test WARNING on mkp-scsi/for-next]
> > [also build test WARNING on next-20181123]
> > [cannot apply to v4.20-rc3]
> > [if your patch is applied to the wrong git tree, please drop us a note to help
> improve the system]
> >
> > url: https://github.com/0day-ci/linux/commits/John-Garry/hisi_sas-DIF-DIX-
> support/20181123-202805
> > base: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
> > config: x86_64-allmodconfig (attached as .config)
> > compiler: gcc-7 (Debian 7.3.0-1) 7.3.0
> > reproduce:
> > # save the attached .config to linux build tree
> > make ARCH=x86_64
>
> For sparse errors - which are detected, below - we need C=2 option, right?
thanks John for the input, we will look into this to enhance the reproducing steps.

>
> It would be good to include that in the instructions.
>
> Thanks,
> John
>
> >
> > All warnings (new ones prefixed by >>):
> >
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: incorrect type in
> argument 1 (different base types)
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: expected unsigned long
> long [unsigned] [usertype] val
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: got restricted __le64
> [usertype] sas_addr
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:26: warning: cast from restricted
> __le64
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: warning: incorrect type in
> assignment (different base types)
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: expected restricted __le64
> [usertype] sas_addr
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:694:24: got unsigned long long
> >>> drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: warning: invalid assignment:
> |=
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: left side has type restricted
> __le32
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1165:26: right side has type int
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: warning: invalid assignment:
> |=
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: left side has type restricted
> __le32
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1166:26: right side has type int
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: warning: incorrect type in
> initializer (different base types)
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: expected unsigned int
> [unsigned] [usertype] dma_rx_err_type
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1759:37: got restricted __le32
> [usertype] dma_rx_err_type
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: warning: incorrect type in
> initializer (different base types)
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: expected unsigned int
> [unsigned] [usertype] trans_tx_fail_type
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1760:40: got restricted __le32
> [usertype] trans_tx_fail_type
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1767:40: warning: restricted __le32
> degrades to integer
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1781:40: warning: restricted __le32
> degrades to integer
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1840:30: warning: restricted __le32
> degrades to integer
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1864:26: warning: restricted __le32
> degrades to integer
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:1976:37: warning: restricted __le32
> degrades to integer
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2372:25: warning: symbol
> 'host_attrs_v3_hw' was not declared. Should it be static?
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: warning: incorrect type in
> assignment (different base types)
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: expected unsigned int
> [unsigned] [usertype] device_state
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2858:22: got restricted pci_power_t
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: warning: incorrect type in
> argument 2 (different base types)
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: expected restricted
> pci_power_t [usertype] state
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2863:35: got unsigned int [unsigned]
> [usertype] device_state
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: warning: incorrect type in
> initializer (different base types)
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: expected unsigned int
> [unsigned] [usertype] device_state
> > drivers/scsi/hisi_sas/hisi_sas_v3_hw.c:2878:32: got restricted pci_power_t
> [usertype] current_state
> >
> > vim +1165 drivers/scsi/hisi_sas/hisi_sas_v3_hw.c
> >
> > 1072
> > 1073 static void prep_ssp_v3_hw(struct hisi_hba *hisi_hba,
> > 1074 struct hisi_sas_slot *slot)
> > 1075 {
> > 1076 struct sas_task *task = slot->task;
> > 1077 struct hisi_sas_cmd_hdr *hdr = slot->cmd_hdr;
> > 1078 struct domain_device *device = task->dev;
> > 1079 struct hisi_sas_device *sas_dev = device->lldd_dev;
> > 1080 struct hisi_sas_port *port = slot->port;
> > 1081 struct sas_ssp_task *ssp_task = &task->ssp_task;
> > 1082 struct scsi_cmnd *scsi_cmnd = ssp_task->cmd;
> > 1083 struct hisi_sas_tmf_task *tmf = slot->tmf;
> > 1084 int has_data = 0, priority = !!tmf;
> > 1085 u8 *buf_cmd;
> > 1086 u32 dw1 = 0, dw2 = 0, len = 0;
> > 1087
> > 1088 hdr->dw0 = cpu_to_le32((1 <<
> CMD_HDR_RESP_REPORT_OFF) |
> > 1089 (2 << CMD_HDR_TLR_CTRL_OFF) |
> > 1090 (port->id << CMD_HDR_PORT_OFF)
> |
> > 1091 (priority <<
> CMD_HDR_PRIORITY_OFF) |
> > 1092 (1 << CMD_HDR_CMD_OFF)); /*
> ssp */
> > 1093
> > 1094 dw1 = 1 << CMD_HDR_VDTL_OFF;
> > 1095 if (tmf) {
> > 1096 dw1 |= 2 << CMD_HDR_FRAME_TYPE_OFF;
> > 1097 dw1 |= DIR_NO_DATA << CMD_HDR_DIR_OFF;
> > 1098 } else {
> > 1099 dw1 |= 1 << CMD_HDR_FRAME_TYPE_OFF;
> > 1100 switch (scsi_cmnd->sc_data_direction) {
> > 1101 case DMA_TO_DEVICE:
> > 1102 has_data = 1;
> > 1103 dw1 |= DIR_TO_DEVICE <<
> CMD_HDR_DIR_OFF;
> > 1104 break;
> > 1105 case DMA_FROM_DEVICE:
> > 1106 has_data = 1;
> > 1107 dw1 |= DIR_TO_INI <<
> CMD_HDR_DIR_OFF;
> > 1108 break;
> > 1109 default:
> > 1110 dw1 &= ~CMD_HDR_DIR_MSK;
> > 1111 }
> > 1112 }
> > 1113
> > 1114 /* map itct entry */
> > 1115 dw1 |= sas_dev->device_id << CMD_HDR_DEV_ID_OFF;
> > 1116 hdr->dw1 = cpu_to_le32(dw1);
> > 1117
> > 1118 dw2 = (((sizeof(struct ssp_command_iu) + sizeof(struct
> ssp_frame_hdr)
> > 1119 + 3) / 4) << CMD_HDR_CFL_OFF) |
> > 1120 ((HISI_SAS_MAX_SSP_RESP_SZ / 4) <<
> CMD_HDR_MRFL_OFF) |
> > 1121 (2 << CMD_HDR_SG_MOD_OFF);
> > 1122 hdr->dw2 = cpu_to_le32(dw2);
> > 1123 hdr->transfer_tags = cpu_to_le32(slot->idx);
> > 1124
> > 1125 if (has_data) {
> > 1126 prep_prd_sge_v3_hw(hisi_hba, slot, hdr, task-
> >scatter,
> > 1127 slot->n_elem);
> > 1128
> > 1129 if (scsi_prot_sg_count(scsi_cmnd))
> > 1130 prep_prd_sge_dif_v3_hw(hisi_hba, slot,
> hdr,
> > 1131
> scsi_prot_sglist(scsi_cmnd),
> > 1132 slot->n_elem_dif);
> > 1133 }
> > 1134
> > 1135 hdr->cmd_table_addr =
> cpu_to_le64(hisi_sas_cmd_hdr_addr_dma(slot));
> > 1136 hdr->sts_buffer_addr =
> cpu_to_le64(hisi_sas_status_buf_addr_dma(slot));
> > 1137
> > 1138 buf_cmd = hisi_sas_cmd_hdr_addr_mem(slot) +
> > 1139 sizeof(struct ssp_frame_hdr);
> > 1140
> > 1141 memcpy(buf_cmd, &task->ssp_task.LUN, 8);
> > 1142 if (!tmf) {
> > 1143 buf_cmd[9] = ssp_task->task_attr | (ssp_task-
> >task_prio << 3);
> > 1144 memcpy(buf_cmd + 12, scsi_cmnd->cmnd,
> scsi_cmnd->cmd_len);
> > 1145 } else {
> > 1146 buf_cmd[10] = tmf->tmf;
> > 1147 switch (tmf->tmf) {
> > 1148 case TMF_ABORT_TASK:
> > 1149 case TMF_QUERY_TASK:
> > 1150 buf_cmd[12] =
> > 1151 (tmf-
> >tag_of_task_to_be_managed >> 8) & 0xff;
> > 1152 buf_cmd[13] =
> > 1153 tmf->tag_of_task_to_be_managed
> & 0xff;
> > 1154 break;
> > 1155 default:
> > 1156 break;
> > 1157 }
> > 1158 }
> > 1159
> > 1160 if (has_data && !scsi_prot_op_normal(scsi_cmnd)) {
> > 1161 struct hisi_sas_protect_iu_v3_hw prot;
> > 1162 unsigned char prot_op =
> scsi_get_prot_op(scsi_cmnd);
> > 1163 u8 *buf_cmd_prot;
> > 1164
> >> 1165 hdr->dw7 |= 1 <<
> CMD_HDR_ADDR_MODE_SEL_OFF;
> > 1166 hdr->dw1 |= CMD_HDR_PIR_MSK;
> > 1167 buf_cmd_prot =
> hisi_sas_cmd_hdr_addr_mem(slot) +
> > 1168 sizeof(struct ssp_frame_hdr) +
> > 1169 sizeof(struct ssp_command_iu);
> > 1170
> > 1171 memset(&prot, 0, sizeof(struct
> hisi_sas_protect_iu_v3_hw));
> > 1172 fill_prot_v3_hw(scsi_cmnd, &prot);
> > 1173 memcpy(buf_cmd_prot, &prot,
> > 1174 sizeof(struct hisi_sas_protect_iu_v3_hw));
> > 1175
> > 1176 if ((prot_op == SCSI_PROT_READ_INSERT) ||
> > 1177 (prot_op == SCSI_PROT_WRITE_INSERT) ||
> > 1178 (prot_op == SCSI_PROT_WRITE_PASS) ||
> > 1179 (prot_op == SCSI_PROT_READ_PASS)) {
> > 1180 unsigned int interval =
> scsi_prot_interval(scsi_cmnd);
> > 1181 unsigned int ilog2_interval =
> ilog2(interval);
> > 1182
> > 1183 len = (task->total_xfer_len >>
> ilog2_interval) * 8;
> > 1184 }
> > 1185 }
> > 1186
> > 1187 hdr->data_transfer_len = cpu_to_le32(task->total_xfer_len
> + len);
> > 1188 }
> > 1189
> >
> > ---
> > 0-DAY kernel test infrastructure Open Source Technology Center
> > https://lists.01.org/pipermail/kbuild-all Intel Corporation
> >
>
>
> _______________________________________________
> kbuild-all mailing list
> [email protected]
> https://lists.01.org/mailman/listinfo/kbuild-all