OSDN Git Service

scsi: bnx2fc: Limit the IO size according to the FW capability
authorSaurav Kashyap <skashyap@marvell.com>
Mon, 24 Jun 2019 08:29:59 +0000 (01:29 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 27 Jun 2019 02:42:45 +0000 (22:42 -0400)
 - Reduce the sg_tablesize to 255.

 - Reduce the MAX BDs firmware can handle to 255.

 - Return IO to ML if BD goes more then 255 after split.

 - Correct the size of each BD split to 0xffff.

Signed-off-by: Saurav Kashyap <skashyap@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/bnx2fc/bnx2fc.h
drivers/scsi/bnx2fc/bnx2fc_fcoe.c
drivers/scsi/bnx2fc/bnx2fc_io.c

index 14cc692..170abe9 100644 (file)
@@ -75,8 +75,9 @@
 #define BNX2X_DOORBELL_PCI_BAR         2
 
 #define BNX2FC_MAX_BD_LEN              0xffff
-#define BNX2FC_BD_SPLIT_SZ             0x8000
-#define BNX2FC_MAX_BDS_PER_CMD         256
+#define BNX2FC_BD_SPLIT_SZ             0xffff
+#define BNX2FC_MAX_BDS_PER_CMD         255
+#define BNX2FC_FW_MAX_BDS_PER_CMD      255
 
 #define BNX2FC_SQ_WQES_MAX     256
 
index a75e74a..7796799 100644 (file)
@@ -2971,7 +2971,8 @@ static struct scsi_host_template bnx2fc_shost_template = {
        .this_id                = -1,
        .cmd_per_lun            = 3,
        .sg_tablesize           = BNX2FC_MAX_BDS_PER_CMD,
-       .max_sectors            = 1024,
+       .dma_boundary           = 0x7fff,
+       .max_sectors            = 0x3fbf,
        .track_queue_depth      = 1,
        .slave_configure        = bnx2fc_slave_configure,
        .shost_attrs            = bnx2fc_host_attrs,
index d7eb5e1..9e50e5b 100644 (file)
@@ -1660,6 +1660,7 @@ static int bnx2fc_map_sg(struct bnx2fc_cmd *io_req)
        u64 addr;
        int i;
 
+       WARN_ON(scsi_sg_count(sc) > BNX2FC_MAX_BDS_PER_CMD);
        /*
         * Use dma_map_sg directly to ensure we're using the correct
         * dev struct off of pcidev.
@@ -1707,6 +1708,16 @@ static int bnx2fc_build_bd_list_from_sg(struct bnx2fc_cmd *io_req)
        }
        io_req->bd_tbl->bd_valid = bd_count;
 
+       /*
+        * Return the command to ML if BD count exceeds the max number
+        * that can be handled by FW.
+        */
+       if (bd_count > BNX2FC_FW_MAX_BDS_PER_CMD) {
+               pr_err("bd_count = %d exceeded FW supported max BD(255), task_id = 0x%x\n",
+                      bd_count, io_req->xid);
+               return -ENOMEM;
+       }
+
        return 0;
 }