@@ -76,6 +76,7 @@ static bool register_always = true;
static bool never_register;
static int topspin_workarounds = 1;
static uint32_t srp_opt_max_it_iu_size;
+static unsigned int srp_max_imm_data;
module_param(srp_sg_tablesize, uint, 0444);
MODULE_PARM_DESC(srp_sg_tablesize, "Deprecated name for cmd_sg_entries");
@@ -138,9 +139,9 @@ module_param_named(use_imm_data, srp_use_imm_data, bool, 0644);
MODULE_PARM_DESC(use_imm_data,
"Whether or not to request permission to use immediate data during SRP login.");
-static unsigned int srp_max_imm_data = 8 * 1024;
-module_param_named(max_imm_data, srp_max_imm_data, uint, 0644);
-MODULE_PARM_DESC(max_imm_data, "Maximum immediate data size.");
+static unsigned int srp_default_max_imm_data = 8 * 1024;
+module_param_named(max_imm_data, srp_default_max_imm_data, uint, 0644);
+MODULE_PARM_DESC(max_imm_data, "Default maximum immediate data size.");
static unsigned ch_count;
module_param(ch_count, uint, 0444);
@@ -1369,9 +1370,20 @@ static uint32_t srp_max_it_iu_len(int cmd_sg_cnt, bool use_imm_data)
sizeof(struct srp_indirect_buf) +
cmd_sg_cnt * sizeof(struct srp_direct_buf);
- if (use_imm_data)
- max_iu_len = max(max_iu_len, SRP_IMM_DATA_OFFSET +
- srp_max_imm_data);
+ if (use_imm_data) {
+ if (srp_opt_max_it_iu_size == 0) {
+ srp_max_imm_data = srp_default_max_imm_data;
+ max_iu_len = max(max_iu_len,
+ SRP_IMM_DATA_OFFSET + srp_max_imm_data);
+ }
+ else {
+ srp_max_imm_data =
+ srp_opt_max_it_iu_size - SRP_IMM_DATA_OFFSET;
+ max_iu_len = srp_opt_max_it_iu_size;
+ }
+ pr_debug("srp_max_imm_data = %d, max_iu_len = %d\n",
+ srp_max_imm_data, max_iu_len);
+ }
return max_iu_len;
}
@@ -3829,6 +3841,8 @@ static ssize_t srp_create_target(struct device *dev,
if (ret < 0)
goto put;
+ srp_opt_max_it_iu_size = 0;
+
ret = srp_parse_options(target->net, buf, target);
if (ret)
goto out;