aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--drivers/scsi/be2iscsi/be_iscsi.c8
-rw-r--r--drivers/scsi/be2iscsi/be_main.c69
-rw-r--r--drivers/scsi/be2iscsi/be_main.h50
-rw-r--r--drivers/scsi/be2iscsi/be_mgmt.c139
-rw-r--r--drivers/scsi/be2iscsi/be_mgmt.h8
5 files changed, 212 insertions, 62 deletions
diff --git a/drivers/scsi/be2iscsi/be_iscsi.c b/drivers/scsi/be2iscsi/be_iscsi.c
index 3f41fc0b5712..2c458b39669c 100644
--- a/drivers/scsi/be2iscsi/be_iscsi.c
+++ b/drivers/scsi/be2iscsi/be_iscsi.c
@@ -936,6 +936,14 @@ static void beiscsi_set_params_for_offld(struct beiscsi_conn *beiscsi_conn,
936 session->initial_r2t_en); 936 session->initial_r2t_en);
937 AMAP_SET_BITS(struct amap_beiscsi_offload_params, imd, params, 937 AMAP_SET_BITS(struct amap_beiscsi_offload_params, imd, params,
938 session->imm_data_en); 938 session->imm_data_en);
939 AMAP_SET_BITS(struct amap_beiscsi_offload_params,
940 data_seq_inorder, params,
941 session->dataseq_inorder_en);
942 AMAP_SET_BITS(struct amap_beiscsi_offload_params,
943 pdu_seq_inorder, params,
944 session->pdu_inorder_en);
945 AMAP_SET_BITS(struct amap_beiscsi_offload_params, max_r2t, params,
946 session->max_r2t);
939 AMAP_SET_BITS(struct amap_beiscsi_offload_params, exp_statsn, params, 947 AMAP_SET_BITS(struct amap_beiscsi_offload_params, exp_statsn, params,
940 (conn->exp_statsn - 1)); 948 (conn->exp_statsn - 1));
941} 949}
diff --git a/drivers/scsi/be2iscsi/be_main.c b/drivers/scsi/be2iscsi/be_main.c
index 6aef05f78449..9e669cec3424 100644
--- a/drivers/scsi/be2iscsi/be_main.c
+++ b/drivers/scsi/be2iscsi/be_main.c
@@ -4087,8 +4087,6 @@ beiscsi_offload_connection(struct beiscsi_conn *beiscsi_conn,
4087 struct beiscsi_offload_params *params) 4087 struct beiscsi_offload_params *params)
4088{ 4088{
4089 struct wrb_handle *pwrb_handle; 4089 struct wrb_handle *pwrb_handle;
4090 struct iscsi_target_context_update_wrb *pwrb = NULL;
4091 struct be_mem_descriptor *mem_descr;
4092 struct beiscsi_hba *phba = beiscsi_conn->phba; 4090 struct beiscsi_hba *phba = beiscsi_conn->phba;
4093 struct iscsi_task *task = beiscsi_conn->task; 4091 struct iscsi_task *task = beiscsi_conn->task;
4094 struct iscsi_session *session = task->conn->session; 4092 struct iscsi_session *session = task->conn->session;
@@ -4105,67 +4103,16 @@ beiscsi_offload_connection(struct beiscsi_conn *beiscsi_conn,
4105 4103
4106 pwrb_handle = alloc_wrb_handle(phba, (beiscsi_conn->beiscsi_conn_cid - 4104 pwrb_handle = alloc_wrb_handle(phba, (beiscsi_conn->beiscsi_conn_cid -
4107 phba->fw_config.iscsi_cid_start)); 4105 phba->fw_config.iscsi_cid_start));
4108 pwrb = (struct iscsi_target_context_update_wrb *)pwrb_handle->pwrb;
4109 memset(pwrb, 0, sizeof(*pwrb));
4110 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
4111 max_burst_length, pwrb, params->dw[offsetof
4112 (struct amap_beiscsi_offload_params,
4113 max_burst_length) / 32]);
4114 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
4115 max_send_data_segment_length, pwrb,
4116 params->dw[offsetof(struct amap_beiscsi_offload_params,
4117 max_send_data_segment_length) / 32]);
4118 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
4119 first_burst_length,
4120 pwrb,
4121 params->dw[offsetof(struct amap_beiscsi_offload_params,
4122 first_burst_length) / 32]);
4123
4124 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, erl, pwrb,
4125 (params->dw[offsetof(struct amap_beiscsi_offload_params,
4126 erl) / 32] & OFFLD_PARAMS_ERL));
4127 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, dde, pwrb,
4128 (params->dw[offsetof(struct amap_beiscsi_offload_params,
4129 dde) / 32] & OFFLD_PARAMS_DDE) >> 2);
4130 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, hde, pwrb,
4131 (params->dw[offsetof(struct amap_beiscsi_offload_params,
4132 hde) / 32] & OFFLD_PARAMS_HDE) >> 3);
4133 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ir2t, pwrb,
4134 (params->dw[offsetof(struct amap_beiscsi_offload_params,
4135 ir2t) / 32] & OFFLD_PARAMS_IR2T) >> 4);
4136 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, imd, pwrb,
4137 (params->dw[offsetof(struct amap_beiscsi_offload_params,
4138 imd) / 32] & OFFLD_PARAMS_IMD) >> 5);
4139 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, stat_sn,
4140 pwrb,
4141 (params->dw[offsetof(struct amap_beiscsi_offload_params,
4142 exp_statsn) / 32] + 1));
4143 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, type, pwrb,
4144 0x7);
4145 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, wrb_idx,
4146 pwrb, pwrb_handle->wrb_index);
4147 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ptr2nextwrb,
4148 pwrb, pwrb_handle->nxt_wrb_index);
4149 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
4150 session_state, pwrb, 0);
4151 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, compltonack,
4152 pwrb, 1);
4153 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, notpredblq,
4154 pwrb, 0);
4155 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, mode, pwrb,
4156 0);
4157
4158 mem_descr = phba->init_mem;
4159 mem_descr += ISCSI_MEM_GLOBAL_HEADER;
4160 4106
4161 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, 4107 /* Check for the adapter family */
4162 pad_buffer_addr_hi, pwrb, 4108 if (chip_skh_r(phba->pcidev))
4163 mem_descr->mem_array[0].bus_address.u.a32.address_hi); 4109 beiscsi_offload_cxn_v2(params, pwrb_handle);
4164 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, 4110 else
4165 pad_buffer_addr_lo, pwrb, 4111 beiscsi_offload_cxn_v0(params, pwrb_handle,
4166 mem_descr->mem_array[0].bus_address.u.a32.address_lo); 4112 phba->init_mem);
4167 4113
4168 be_dws_le_to_cpu(pwrb, sizeof(struct iscsi_target_context_update_wrb)); 4114 be_dws_le_to_cpu(pwrb_handle->pwrb,
4115 sizeof(struct iscsi_target_context_update_wrb));
4169 4116
4170 doorbell |= beiscsi_conn->beiscsi_conn_cid & DB_WRB_POST_CID_MASK; 4117 doorbell |= beiscsi_conn->beiscsi_conn_cid & DB_WRB_POST_CID_MASK;
4171 doorbell |= (pwrb_handle->wrb_index & DB_DEF_PDU_WRB_INDEX_MASK) 4118 doorbell |= (pwrb_handle->wrb_index & DB_DEF_PDU_WRB_INDEX_MASK)
diff --git a/drivers/scsi/be2iscsi/be_main.h b/drivers/scsi/be2iscsi/be_main.h
index 8632927da1ef..0e730d1cd1af 100644
--- a/drivers/scsi/be2iscsi/be_main.h
+++ b/drivers/scsi/be2iscsi/be_main.h
@@ -469,6 +469,9 @@ struct beiscsi_offload_params {
469#define OFFLD_PARAMS_HDE 0x00000008 469#define OFFLD_PARAMS_HDE 0x00000008
470#define OFFLD_PARAMS_IR2T 0x00000010 470#define OFFLD_PARAMS_IR2T 0x00000010
471#define OFFLD_PARAMS_IMD 0x00000020 471#define OFFLD_PARAMS_IMD 0x00000020
472#define OFFLD_PARAMS_DATA_SEQ_INORDER 0x00000040
473#define OFFLD_PARAMS_PDU_SEQ_INORDER 0x00000080
474#define OFFLD_PARAMS_MAX_R2T 0x00FFFF00
472 475
473/** 476/**
474 * Pseudo amap definition in which each bit of the actual structure is defined 477 * Pseudo amap definition in which each bit of the actual structure is defined
@@ -483,7 +486,10 @@ struct amap_beiscsi_offload_params {
483 u8 hde[1]; 486 u8 hde[1];
484 u8 ir2t[1]; 487 u8 ir2t[1];
485 u8 imd[1]; 488 u8 imd[1];
486 u8 pad[26]; 489 u8 data_seq_inorder[1];
490 u8 pdu_seq_inorder[1];
491 u8 max_r2t[16];
492 u8 pad[8];
487 u8 exp_statsn[32]; 493 u8 exp_statsn[32];
488}; 494};
489 495
@@ -785,6 +791,7 @@ struct iscsi_target_context_update_wrb {
785 * Pseudo amap definition in which each bit of the actual structure is defined 791 * Pseudo amap definition in which each bit of the actual structure is defined
786 * as a byte: used to calculate offset/shift/mask of each field 792 * as a byte: used to calculate offset/shift/mask of each field
787 */ 793 */
794#define BE_TGT_CTX_UPDT_CMD 0x07
788struct amap_iscsi_target_context_update_wrb { 795struct amap_iscsi_target_context_update_wrb {
789 u8 lun[14]; /* DWORD 0 */ 796 u8 lun[14]; /* DWORD 0 */
790 u8 lt; /* DWORD 0 */ 797 u8 lt; /* DWORD 0 */
@@ -830,6 +837,47 @@ struct amap_iscsi_target_context_update_wrb {
830 837
831} __packed; 838} __packed;
832 839
840#define BEISCSI_MAX_RECV_DATASEG_LEN (64 * 1024)
841#define BEISCSI_MAX_CXNS 1
842struct amap_iscsi_target_context_update_wrb_v2 {
843 u8 max_burst_length[24]; /* DWORD 0 */
844 u8 rsvd0[3]; /* DWORD 0 */
845 u8 type[5]; /* DWORD 0 */
846 u8 ptr2nextwrb[8]; /* DWORD 1 */
847 u8 wrb_idx[8]; /* DWORD 1 */
848 u8 rsvd1[16]; /* DWORD 1 */
849 u8 max_send_data_segment_length[24]; /* DWORD 2 */
850 u8 rsvd2[8]; /* DWORD 2 */
851 u8 first_burst_length[24]; /* DWORD 3 */
852 u8 rsvd3[8]; /* DOWRD 3 */
853 u8 max_r2t[16]; /* DWORD 4 */
854 u8 rsvd4[10]; /* DWORD 4 */
855 u8 hde; /* DWORD 4 */
856 u8 dde; /* DWORD 4 */
857 u8 erl[2]; /* DWORD 4 */
858 u8 imd; /* DWORD 4 */
859 u8 ir2t; /* DWORD 4 */
860 u8 stat_sn[32]; /* DWORD 5 */
861 u8 rsvd5[32]; /* DWORD 6 */
862 u8 rsvd6[32]; /* DWORD 7 */
863 u8 max_recv_dataseg_len[24]; /* DWORD 8 */
864 u8 rsvd7[8]; /* DWORD 8 */
865 u8 rsvd8[32]; /* DWORD 9 */
866 u8 rsvd9[32]; /* DWORD 10 */
867 u8 max_cxns[16]; /* DWORD 11 */
868 u8 rsvd10[11]; /* DWORD 11*/
869 u8 invld; /* DWORD 11 */
870 u8 rsvd11;/* DWORD 11*/
871 u8 dmsg; /* DWORD 11 */
872 u8 data_seq_inorder; /* DWORD 11 */
873 u8 pdu_seq_inorder; /* DWORD 11 */
874 u8 rsvd12[32]; /*DWORD 12 */
875 u8 rsvd13[32]; /* DWORD 13 */
876 u8 rsvd14[32]; /* DWORD 14 */
877 u8 rsvd15[32]; /* DWORD 15 */
878} __packed;
879
880
833struct be_ring { 881struct be_ring {
834 u32 pages; /* queue size in pages */ 882 u32 pages; /* queue size in pages */
835 u32 id; /* queue id assigned by beklib */ 883 u32 id; /* queue id assigned by beklib */
diff --git a/drivers/scsi/be2iscsi/be_mgmt.c b/drivers/scsi/be2iscsi/be_mgmt.c
index 1ec1db3a1465..b96a159b12c3 100644
--- a/drivers/scsi/be2iscsi/be_mgmt.c
+++ b/drivers/scsi/be2iscsi/be_mgmt.c
@@ -1152,3 +1152,142 @@ beiscsi_drvr_ver_disp(struct device *dev, struct device_attribute *attr,
1152{ 1152{
1153 return snprintf(buf, PAGE_SIZE, BE_NAME "\n"); 1153 return snprintf(buf, PAGE_SIZE, BE_NAME "\n");
1154} 1154}
1155
1156void beiscsi_offload_cxn_v0(struct beiscsi_offload_params *params,
1157 struct wrb_handle *pwrb_handle,
1158 struct be_mem_descriptor *mem_descr)
1159{
1160 struct iscsi_wrb *pwrb = pwrb_handle->pwrb;
1161
1162 memset(pwrb, 0, sizeof(*pwrb));
1163 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1164 max_send_data_segment_length, pwrb,
1165 params->dw[offsetof(struct amap_beiscsi_offload_params,
1166 max_send_data_segment_length) / 32]);
1167 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, type, pwrb,
1168 BE_TGT_CTX_UPDT_CMD);
1169 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1170 first_burst_length,
1171 pwrb,
1172 params->dw[offsetof(struct amap_beiscsi_offload_params,
1173 first_burst_length) / 32]);
1174 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, erl, pwrb,
1175 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1176 erl) / 32] & OFFLD_PARAMS_ERL));
1177 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, dde, pwrb,
1178 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1179 dde) / 32] & OFFLD_PARAMS_DDE) >> 2);
1180 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, hde, pwrb,
1181 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1182 hde) / 32] & OFFLD_PARAMS_HDE) >> 3);
1183 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ir2t, pwrb,
1184 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1185 ir2t) / 32] & OFFLD_PARAMS_IR2T) >> 4);
1186 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, imd, pwrb,
1187 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1188 imd) / 32] & OFFLD_PARAMS_IMD) >> 5);
1189 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, stat_sn,
1190 pwrb,
1191 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1192 exp_statsn) / 32] + 1));
1193 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, wrb_idx,
1194 pwrb, pwrb_handle->wrb_index);
1195
1196 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1197 max_burst_length, pwrb, params->dw[offsetof
1198 (struct amap_beiscsi_offload_params,
1199 max_burst_length) / 32]);
1200
1201 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ptr2nextwrb,
1202 pwrb, pwrb_handle->nxt_wrb_index);
1203 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1204 session_state, pwrb, 0);
1205 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, compltonack,
1206 pwrb, 1);
1207 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, notpredblq,
1208 pwrb, 0);
1209 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, mode, pwrb,
1210 0);
1211
1212 mem_descr += ISCSI_MEM_GLOBAL_HEADER;
1213 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1214 pad_buffer_addr_hi, pwrb,
1215 mem_descr->mem_array[0].bus_address.u.a32.address_hi);
1216 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1217 pad_buffer_addr_lo, pwrb,
1218 mem_descr->mem_array[0].bus_address.u.a32.address_lo);
1219}
1220
1221void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params,
1222 struct wrb_handle *pwrb_handle)
1223{
1224 struct iscsi_wrb *pwrb = pwrb_handle->pwrb;
1225
1226 memset(pwrb, 0, sizeof(*pwrb));
1227
1228 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1229 max_burst_length, pwrb, params->dw[offsetof
1230 (struct amap_beiscsi_offload_params,
1231 max_burst_length) / 32]);
1232 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1233 max_burst_length, pwrb, params->dw[offsetof
1234 (struct amap_beiscsi_offload_params,
1235 max_burst_length) / 32]);
1236 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1237 type, pwrb,
1238 BE_TGT_CTX_UPDT_CMD);
1239 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1240 ptr2nextwrb,
1241 pwrb, pwrb_handle->nxt_wrb_index);
1242 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, wrb_idx,
1243 pwrb, pwrb_handle->wrb_index);
1244 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1245 max_send_data_segment_length, pwrb,
1246 params->dw[offsetof(struct amap_beiscsi_offload_params,
1247 max_send_data_segment_length) / 32]);
1248 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1249 first_burst_length, pwrb,
1250 params->dw[offsetof(struct amap_beiscsi_offload_params,
1251 first_burst_length) / 32]);
1252 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1253 max_recv_dataseg_len, pwrb, BEISCSI_MAX_RECV_DATASEG_LEN);
1254 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1255 max_cxns, pwrb, BEISCSI_MAX_CXNS);
1256 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, erl, pwrb,
1257 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1258 erl) / 32] & OFFLD_PARAMS_ERL));
1259 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, dde, pwrb,
1260 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1261 dde) / 32] & OFFLD_PARAMS_DDE) >> 2);
1262 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, hde, pwrb,
1263 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1264 hde) / 32] & OFFLD_PARAMS_HDE) >> 3);
1265 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1266 ir2t, pwrb,
1267 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1268 ir2t) / 32] & OFFLD_PARAMS_IR2T) >> 4);
1269 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, imd, pwrb,
1270 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1271 imd) / 32] & OFFLD_PARAMS_IMD) >> 5);
1272 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1273 data_seq_inorder,
1274 pwrb,
1275 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1276 data_seq_inorder) / 32] &
1277 OFFLD_PARAMS_DATA_SEQ_INORDER) >> 6);
1278 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1279 pdu_seq_inorder,
1280 pwrb,
1281 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1282 pdu_seq_inorder) / 32] &
1283 OFFLD_PARAMS_PDU_SEQ_INORDER) >> 7);
1284 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, max_r2t,
1285 pwrb,
1286 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1287 max_r2t) / 32] &
1288 OFFLD_PARAMS_MAX_R2T) >> 8);
1289 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, stat_sn,
1290 pwrb,
1291 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1292 exp_statsn) / 32] + 1));
1293}
diff --git a/drivers/scsi/be2iscsi/be_mgmt.h b/drivers/scsi/be2iscsi/be_mgmt.h
index 291c68476c14..4ec61274e70c 100644
--- a/drivers/scsi/be2iscsi/be_mgmt.h
+++ b/drivers/scsi/be2iscsi/be_mgmt.h
@@ -304,4 +304,12 @@ int mgmt_set_vlan(struct beiscsi_hba *phba, uint16_t vlan_tag);
304 304
305ssize_t beiscsi_drvr_ver_disp(struct device *dev, 305ssize_t beiscsi_drvr_ver_disp(struct device *dev,
306 struct device_attribute *attr, char *buf); 306 struct device_attribute *attr, char *buf);
307
308void beiscsi_offload_cxn_v0(struct beiscsi_offload_params *params,
309 struct wrb_handle *pwrb_handle,
310 struct be_mem_descriptor *mem_descr);
311
312void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params,
313 struct wrb_handle *pwrb_handle);
314
307#endif 315#endif