aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMichael Chan <mchan@broadcom.com>2010-06-24 10:58:37 -0400
committerDavid S. Miller <davem@davemloft.net>2010-06-25 23:37:18 -0400
commit520efdf44f0140eef9018518fdae5edfc86f3b6c (patch)
tree88e5e9bce57401ebfcc3d1ac9dec9c1af10d1d82 /drivers
parent39c9cf07077146b14ab077a0e27c869c6f0e6199 (diff)
cnic: Fine-tune CID memory space calculation.
The current code makes assumptions about the CID (context ID) memory space and starting CID that may not be always correct when firmware changes. In particular, BNX2_ISCSI_START_CID may not always be fixed. We now calculate cp->max_cid_space and cp->iscsi_start_cid dynamically instead of using fixed constants. The unused cp->max_iscsi_conn is also eliminated. Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/cnic.c32
-rw-r--r--drivers/net/cnic.h4
2 files changed, 21 insertions, 15 deletions
diff --git a/drivers/net/cnic.c b/drivers/net/cnic.c
index 04e299f46455..70a53cc7df32 100644
--- a/drivers/net/cnic.c
+++ b/drivers/net/cnic.c
@@ -257,7 +257,7 @@ static int cnic_get_l5_cid(struct cnic_local *cp, u32 cid, u32 *l5_cid)
257{ 257{
258 u32 i; 258 u32 i;
259 259
260 for (i = 0; i < MAX_ISCSI_TBL_SZ; i++) { 260 for (i = 0; i < cp->max_cid_space; i++) {
261 if (cp->ctx_tbl[i].cid == cid) { 261 if (cp->ctx_tbl[i].cid == cid) {
262 *l5_cid = i; 262 *l5_cid = i;
263 return 0; 263 return 0;
@@ -981,17 +981,10 @@ error:
981static int cnic_alloc_bnx2x_context(struct cnic_dev *dev) 981static int cnic_alloc_bnx2x_context(struct cnic_dev *dev)
982{ 982{
983 struct cnic_local *cp = dev->cnic_priv; 983 struct cnic_local *cp = dev->cnic_priv;
984 struct cnic_eth_dev *ethdev = cp->ethdev;
985 int ctx_blk_size = cp->ethdev->ctx_blk_size; 984 int ctx_blk_size = cp->ethdev->ctx_blk_size;
986 int total_mem, blks, i, cid_space; 985 int total_mem, blks, i;
987
988 if (BNX2X_ISCSI_START_CID < ethdev->starting_cid)
989 return -EINVAL;
990
991 cid_space = MAX_ISCSI_TBL_SZ +
992 (BNX2X_ISCSI_START_CID - ethdev->starting_cid);
993 986
994 total_mem = BNX2X_CONTEXT_MEM_SIZE * cid_space; 987 total_mem = BNX2X_CONTEXT_MEM_SIZE * cp->max_cid_space;
995 blks = total_mem / ctx_blk_size; 988 blks = total_mem / ctx_blk_size;
996 if (total_mem % ctx_blk_size) 989 if (total_mem % ctx_blk_size)
997 blks++; 990 blks++;
@@ -1035,16 +1028,27 @@ static int cnic_alloc_bnx2x_context(struct cnic_dev *dev)
1035static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev) 1028static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)
1036{ 1029{
1037 struct cnic_local *cp = dev->cnic_priv; 1030 struct cnic_local *cp = dev->cnic_priv;
1031 struct cnic_eth_dev *ethdev = cp->ethdev;
1032 u32 start_cid = ethdev->starting_cid;
1038 int i, j, n, ret, pages; 1033 int i, j, n, ret, pages;
1039 struct cnic_dma *kwq_16_dma = &cp->kwq_16_data_info; 1034 struct cnic_dma *kwq_16_dma = &cp->kwq_16_data_info;
1040 1035
1036 cp->max_cid_space = MAX_ISCSI_TBL_SZ;
1037 cp->iscsi_start_cid = start_cid;
1038 if (start_cid < BNX2X_ISCSI_START_CID) {
1039 u32 delta = BNX2X_ISCSI_START_CID - start_cid;
1040
1041 cp->iscsi_start_cid = BNX2X_ISCSI_START_CID;
1042 cp->max_cid_space += delta;
1043 }
1044
1041 cp->iscsi_tbl = kzalloc(sizeof(struct cnic_iscsi) * MAX_ISCSI_TBL_SZ, 1045 cp->iscsi_tbl = kzalloc(sizeof(struct cnic_iscsi) * MAX_ISCSI_TBL_SZ,
1042 GFP_KERNEL); 1046 GFP_KERNEL);
1043 if (!cp->iscsi_tbl) 1047 if (!cp->iscsi_tbl)
1044 goto error; 1048 goto error;
1045 1049
1046 cp->ctx_tbl = kzalloc(sizeof(struct cnic_context) * 1050 cp->ctx_tbl = kzalloc(sizeof(struct cnic_context) *
1047 MAX_CNIC_L5_CONTEXT, GFP_KERNEL); 1051 cp->max_cid_space, GFP_KERNEL);
1048 if (!cp->ctx_tbl) 1052 if (!cp->ctx_tbl)
1049 goto error; 1053 goto error;
1050 1054
@@ -1053,7 +1057,7 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)
1053 cp->ctx_tbl[i].ulp_proto_id = CNIC_ULP_ISCSI; 1057 cp->ctx_tbl[i].ulp_proto_id = CNIC_ULP_ISCSI;
1054 } 1058 }
1055 1059
1056 pages = PAGE_ALIGN(MAX_CNIC_L5_CONTEXT * CNIC_KWQ16_DATA_SIZE) / 1060 pages = PAGE_ALIGN(cp->max_cid_space * CNIC_KWQ16_DATA_SIZE) /
1057 PAGE_SIZE; 1061 PAGE_SIZE;
1058 1062
1059 ret = cnic_alloc_dma(dev, kwq_16_dma, pages, 0); 1063 ret = cnic_alloc_dma(dev, kwq_16_dma, pages, 0);
@@ -1061,7 +1065,7 @@ static int cnic_alloc_bnx2x_resc(struct cnic_dev *dev)
1061 return -ENOMEM; 1065 return -ENOMEM;
1062 1066
1063 n = PAGE_SIZE / CNIC_KWQ16_DATA_SIZE; 1067 n = PAGE_SIZE / CNIC_KWQ16_DATA_SIZE;
1064 for (i = 0, j = 0; i < MAX_ISCSI_TBL_SZ; i++) { 1068 for (i = 0, j = 0; i < cp->max_cid_space; i++) {
1065 long off = CNIC_KWQ16_DATA_SIZE * (i % n); 1069 long off = CNIC_KWQ16_DATA_SIZE * (i % n);
1066 1070
1067 cp->ctx_tbl[i].kwqe_data = kwq_16_dma->pg_arr[j] + off; 1071 cp->ctx_tbl[i].kwqe_data = kwq_16_dma->pg_arr[j] + off;
@@ -4129,7 +4133,7 @@ static int cnic_start_bnx2x_hw(struct cnic_dev *dev)
4129 u8 sb_id = cp->status_blk_num; 4133 u8 sb_id = cp->status_blk_num;
4130 4134
4131 ret = cnic_init_id_tbl(&cp->cid_tbl, MAX_ISCSI_TBL_SZ, 4135 ret = cnic_init_id_tbl(&cp->cid_tbl, MAX_ISCSI_TBL_SZ,
4132 BNX2X_ISCSI_START_CID); 4136 cp->iscsi_start_cid);
4133 4137
4134 if (ret) 4138 if (ret)
4135 return -ENOMEM; 4139 return -ENOMEM;
diff --git a/drivers/net/cnic.h b/drivers/net/cnic.h
index 08b1235d987d..b7e2f7fcfb1c 100644
--- a/drivers/net/cnic.h
+++ b/drivers/net/cnic.h
@@ -248,8 +248,10 @@ struct cnic_local {
248 struct cnic_iscsi *iscsi_tbl; 248 struct cnic_iscsi *iscsi_tbl;
249 struct cnic_context *ctx_tbl; 249 struct cnic_context *ctx_tbl;
250 struct cnic_id_tbl cid_tbl; 250 struct cnic_id_tbl cid_tbl;
251 int max_iscsi_conn;
252 atomic_t iscsi_conn; 251 atomic_t iscsi_conn;
252 u32 iscsi_start_cid;
253
254 u32 max_cid_space;
253 255
254 /* per connection parameters */ 256 /* per connection parameters */
255 int num_iscsi_tasks; 257 int num_iscsi_tasks;