Commit 3c97b569 authored by Saurav Kashyap's avatar Saurav Kashyap Committed by Martin K. Petersen

scsi: bnx2fc: Limit the IO size according to the FW capability

 - 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: default avatarSaurav Kashyap <skashyap@marvell.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 25ad7394
...@@ -75,8 +75,9 @@ ...@@ -75,8 +75,9 @@
#define BNX2X_DOORBELL_PCI_BAR 2 #define BNX2X_DOORBELL_PCI_BAR 2
#define BNX2FC_MAX_BD_LEN 0xffff #define BNX2FC_MAX_BD_LEN 0xffff
#define BNX2FC_BD_SPLIT_SZ 0x8000 #define BNX2FC_BD_SPLIT_SZ 0xffff
#define BNX2FC_MAX_BDS_PER_CMD 256 #define BNX2FC_MAX_BDS_PER_CMD 255
#define BNX2FC_FW_MAX_BDS_PER_CMD 255
#define BNX2FC_SQ_WQES_MAX 256 #define BNX2FC_SQ_WQES_MAX 256
......
...@@ -2971,7 +2971,8 @@ static struct scsi_host_template bnx2fc_shost_template = { ...@@ -2971,7 +2971,8 @@ static struct scsi_host_template bnx2fc_shost_template = {
.this_id = -1, .this_id = -1,
.cmd_per_lun = 3, .cmd_per_lun = 3,
.sg_tablesize = BNX2FC_MAX_BDS_PER_CMD, .sg_tablesize = BNX2FC_MAX_BDS_PER_CMD,
.max_sectors = 1024, .dma_boundary = 0x7fff,
.max_sectors = 0x3fbf,
.track_queue_depth = 1, .track_queue_depth = 1,
.slave_configure = bnx2fc_slave_configure, .slave_configure = bnx2fc_slave_configure,
.shost_attrs = bnx2fc_host_attrs, .shost_attrs = bnx2fc_host_attrs,
......
...@@ -1660,6 +1660,7 @@ static int bnx2fc_map_sg(struct bnx2fc_cmd *io_req) ...@@ -1660,6 +1660,7 @@ static int bnx2fc_map_sg(struct bnx2fc_cmd *io_req)
u64 addr; u64 addr;
int i; 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 * Use dma_map_sg directly to ensure we're using the correct
* dev struct off of pcidev. * dev struct off of pcidev.
...@@ -1707,6 +1708,16 @@ static int bnx2fc_build_bd_list_from_sg(struct bnx2fc_cmd *io_req) ...@@ -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; 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; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment