xref: /openbmc/linux/drivers/scsi/be2iscsi/be_mgmt.c (revision d2168146)
1 /**
2  * Copyright (C) 2005 - 2013 Emulex
3  * All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License version 2
7  * as published by the Free Software Foundation.  The full GNU General
8  * Public License is included in this distribution in the file called COPYING.
9  *
10  * Written by: Jayamohan Kallickal (jayamohan.kallickal@emulex.com)
11  *
12  * Contact Information:
13  * linux-drivers@emulex.com
14  *
15  * Emulex
16  * 3333 Susan Street
17  * Costa Mesa, CA 92626
18  */
19 
20 #include <linux/bsg-lib.h>
21 #include <scsi/scsi_transport_iscsi.h>
22 #include <scsi/scsi_bsg_iscsi.h>
23 #include "be_mgmt.h"
24 #include "be_iscsi.h"
25 #include "be_main.h"
26 
27 /* UE Status Low CSR */
28 static const char * const desc_ue_status_low[] = {
29 	"CEV",
30 	"CTX",
31 	"DBUF",
32 	"ERX",
33 	"Host",
34 	"MPU",
35 	"NDMA",
36 	"PTC ",
37 	"RDMA ",
38 	"RXF ",
39 	"RXIPS ",
40 	"RXULP0 ",
41 	"RXULP1 ",
42 	"RXULP2 ",
43 	"TIM ",
44 	"TPOST ",
45 	"TPRE ",
46 	"TXIPS ",
47 	"TXULP0 ",
48 	"TXULP1 ",
49 	"UC ",
50 	"WDMA ",
51 	"TXULP2 ",
52 	"HOST1 ",
53 	"P0_OB_LINK ",
54 	"P1_OB_LINK ",
55 	"HOST_GPIO ",
56 	"MBOX ",
57 	"AXGMAC0",
58 	"AXGMAC1",
59 	"JTAG",
60 	"MPU_INTPEND"
61 };
62 
63 /* UE Status High CSR */
64 static const char * const desc_ue_status_hi[] = {
65 	"LPCMEMHOST",
66 	"MGMT_MAC",
67 	"PCS0ONLINE",
68 	"MPU_IRAM",
69 	"PCS1ONLINE",
70 	"PCTL0",
71 	"PCTL1",
72 	"PMEM",
73 	"RR",
74 	"TXPB",
75 	"RXPP",
76 	"XAUI",
77 	"TXP",
78 	"ARM",
79 	"IPC",
80 	"HOST2",
81 	"HOST3",
82 	"HOST4",
83 	"HOST5",
84 	"HOST6",
85 	"HOST7",
86 	"HOST8",
87 	"HOST9",
88 	"NETC",
89 	"Unknown",
90 	"Unknown",
91 	"Unknown",
92 	"Unknown",
93 	"Unknown",
94 	"Unknown",
95 	"Unknown",
96 	"Unknown"
97 };
98 
99 /*
100  * beiscsi_ue_detec()- Detect Unrecoverable Error on adapter
101  * @phba: Driver priv structure
102  *
103  * Read registers linked to UE and check for the UE status
104  **/
105 void beiscsi_ue_detect(struct beiscsi_hba *phba)
106 {
107 	uint32_t ue_hi = 0, ue_lo = 0;
108 	uint32_t ue_mask_hi = 0, ue_mask_lo = 0;
109 	uint8_t i = 0;
110 
111 	if (phba->ue_detected)
112 		return;
113 
114 	pci_read_config_dword(phba->pcidev,
115 			      PCICFG_UE_STATUS_LOW, &ue_lo);
116 	pci_read_config_dword(phba->pcidev,
117 			      PCICFG_UE_STATUS_MASK_LOW,
118 			      &ue_mask_lo);
119 	pci_read_config_dword(phba->pcidev,
120 			      PCICFG_UE_STATUS_HIGH,
121 			      &ue_hi);
122 	pci_read_config_dword(phba->pcidev,
123 			      PCICFG_UE_STATUS_MASK_HI,
124 			      &ue_mask_hi);
125 
126 	ue_lo = (ue_lo & ~ue_mask_lo);
127 	ue_hi = (ue_hi & ~ue_mask_hi);
128 
129 
130 	if (ue_lo || ue_hi) {
131 		phba->ue_detected = true;
132 		beiscsi_log(phba, KERN_ERR,
133 			    BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
134 			    "BG_%d : Error detected on the adapter\n");
135 	}
136 
137 	if (ue_lo) {
138 		for (i = 0; ue_lo; ue_lo >>= 1, i++) {
139 			if (ue_lo & 1)
140 				beiscsi_log(phba, KERN_ERR,
141 					    BEISCSI_LOG_CONFIG,
142 					    "BG_%d : UE_LOW %s bit set\n",
143 					    desc_ue_status_low[i]);
144 		}
145 	}
146 
147 	if (ue_hi) {
148 		for (i = 0; ue_hi; ue_hi >>= 1, i++) {
149 			if (ue_hi & 1)
150 				beiscsi_log(phba, KERN_ERR,
151 					    BEISCSI_LOG_CONFIG,
152 					    "BG_%d : UE_HIGH %s bit set\n",
153 					    desc_ue_status_hi[i]);
154 		}
155 	}
156 }
157 
158 int be_cmd_modify_eq_delay(struct beiscsi_hba *phba,
159 		 struct be_set_eqd *set_eqd, int num)
160 {
161 	struct be_ctrl_info *ctrl = &phba->ctrl;
162 	struct be_mcc_wrb *wrb;
163 	struct be_cmd_req_modify_eq_delay *req;
164 	unsigned int tag = 0;
165 	int i;
166 
167 	spin_lock(&ctrl->mbox_lock);
168 	tag = alloc_mcc_tag(phba);
169 	if (!tag) {
170 		spin_unlock(&ctrl->mbox_lock);
171 		return tag;
172 	}
173 
174 	wrb = wrb_from_mccq(phba);
175 	req = embedded_payload(wrb);
176 
177 	wrb->tag0 |= tag;
178 	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
179 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
180 		OPCODE_COMMON_MODIFY_EQ_DELAY, sizeof(*req));
181 
182 	req->num_eq = cpu_to_le32(num);
183 	for (i = 0; i < num; i++) {
184 		req->delay[i].eq_id = cpu_to_le32(set_eqd[i].eq_id);
185 		req->delay[i].phase = 0;
186 		req->delay[i].delay_multiplier =
187 				cpu_to_le32(set_eqd[i].delay_multiplier);
188 	}
189 
190 	be_mcc_notify(phba);
191 	spin_unlock(&ctrl->mbox_lock);
192 	return tag;
193 }
194 
195 /**
196  * mgmt_reopen_session()- Reopen a session based on reopen_type
197  * @phba: Device priv structure instance
198  * @reopen_type: Type of reopen_session FW should do.
199  * @sess_handle: Session Handle of the session to be re-opened
200  *
201  * return
202  *	the TAG used for MBOX Command
203  *
204  **/
205 unsigned int mgmt_reopen_session(struct beiscsi_hba *phba,
206 				  unsigned int reopen_type,
207 				  unsigned int sess_handle)
208 {
209 	struct be_ctrl_info *ctrl = &phba->ctrl;
210 	struct be_mcc_wrb *wrb;
211 	struct be_cmd_reopen_session_req *req;
212 	unsigned int tag = 0;
213 
214 	beiscsi_log(phba, KERN_INFO,
215 		    BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
216 		    "BG_%d : In bescsi_get_boot_target\n");
217 
218 	spin_lock(&ctrl->mbox_lock);
219 	tag = alloc_mcc_tag(phba);
220 	if (!tag) {
221 		spin_unlock(&ctrl->mbox_lock);
222 		return tag;
223 	}
224 
225 	wrb = wrb_from_mccq(phba);
226 	req = embedded_payload(wrb);
227 	wrb->tag0 |= tag;
228 	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
229 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
230 			   OPCODE_ISCSI_INI_DRIVER_REOPEN_ALL_SESSIONS,
231 			   sizeof(struct be_cmd_reopen_session_resp));
232 
233 	/* set the reopen_type,sess_handle */
234 	req->reopen_type = reopen_type;
235 	req->session_handle = sess_handle;
236 
237 	be_mcc_notify(phba);
238 	spin_unlock(&ctrl->mbox_lock);
239 	return tag;
240 }
241 
242 unsigned int mgmt_get_boot_target(struct beiscsi_hba *phba)
243 {
244 	struct be_ctrl_info *ctrl = &phba->ctrl;
245 	struct be_mcc_wrb *wrb;
246 	struct be_cmd_get_boot_target_req *req;
247 	unsigned int tag = 0;
248 
249 	beiscsi_log(phba, KERN_INFO,
250 		    BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
251 		    "BG_%d : In bescsi_get_boot_target\n");
252 
253 	spin_lock(&ctrl->mbox_lock);
254 	tag = alloc_mcc_tag(phba);
255 	if (!tag) {
256 		spin_unlock(&ctrl->mbox_lock);
257 		return tag;
258 	}
259 
260 	wrb = wrb_from_mccq(phba);
261 	req = embedded_payload(wrb);
262 	wrb->tag0 |= tag;
263 	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
264 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
265 			   OPCODE_ISCSI_INI_BOOT_GET_BOOT_TARGET,
266 			   sizeof(struct be_cmd_get_boot_target_resp));
267 
268 	be_mcc_notify(phba);
269 	spin_unlock(&ctrl->mbox_lock);
270 	return tag;
271 }
272 
273 unsigned int mgmt_get_session_info(struct beiscsi_hba *phba,
274 				   u32 boot_session_handle,
275 				   struct be_dma_mem *nonemb_cmd)
276 {
277 	struct be_ctrl_info *ctrl = &phba->ctrl;
278 	struct be_mcc_wrb *wrb;
279 	unsigned int tag = 0;
280 	struct  be_cmd_get_session_req *req;
281 	struct be_cmd_get_session_resp *resp;
282 	struct be_sge *sge;
283 
284 	beiscsi_log(phba, KERN_INFO,
285 		    BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
286 		    "BG_%d : In beiscsi_get_session_info\n");
287 
288 	spin_lock(&ctrl->mbox_lock);
289 	tag = alloc_mcc_tag(phba);
290 	if (!tag) {
291 		spin_unlock(&ctrl->mbox_lock);
292 		return tag;
293 	}
294 
295 	nonemb_cmd->size = sizeof(*resp);
296 	req = nonemb_cmd->va;
297 	memset(req, 0, sizeof(*req));
298 	wrb = wrb_from_mccq(phba);
299 	sge = nonembedded_sgl(wrb);
300 	wrb->tag0 |= tag;
301 
302 
303 	wrb->tag0 |= tag;
304 	be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
305 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
306 			   OPCODE_ISCSI_INI_SESSION_GET_A_SESSION,
307 			   sizeof(*resp));
308 	req->session_handle = boot_session_handle;
309 	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
310 	sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
311 	sge->len = cpu_to_le32(nonemb_cmd->size);
312 
313 	be_mcc_notify(phba);
314 	spin_unlock(&ctrl->mbox_lock);
315 	return tag;
316 }
317 
318 /**
319  * mgmt_get_fw_config()- Get the FW config for the function
320  * @ctrl: ptr to Ctrl Info
321  * @phba: ptr to the dev priv structure
322  *
323  * Get the FW config and resources available for the function.
324  * The resources are created based on the count received here.
325  *
326  * return
327  *	Success: 0
328  *	Failure: Non-Zero Value
329  **/
330 int mgmt_get_fw_config(struct be_ctrl_info *ctrl,
331 				struct beiscsi_hba *phba)
332 {
333 	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
334 	struct be_fw_cfg *req = embedded_payload(wrb);
335 	int status = 0;
336 
337 	spin_lock(&ctrl->mbox_lock);
338 	memset(wrb, 0, sizeof(*wrb));
339 
340 	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
341 
342 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
343 			   OPCODE_COMMON_QUERY_FIRMWARE_CONFIG,
344 			   EMBED_MBX_MAX_PAYLOAD_SIZE);
345 	status = be_mbox_notify(ctrl);
346 	if (!status) {
347 		uint8_t ulp_num = 0;
348 		struct be_fw_cfg *pfw_cfg;
349 		pfw_cfg = req;
350 
351 		if (!is_chip_be2_be3r(phba)) {
352 			phba->fw_config.eqid_count = pfw_cfg->eqid_count;
353 			phba->fw_config.cqid_count = pfw_cfg->cqid_count;
354 
355 			beiscsi_log(phba, KERN_INFO,
356 				    BEISCSI_LOG_INIT,
357 				    "BG_%d : EQ_Count : %d CQ_Count : %d\n",
358 				    phba->fw_config.eqid_count,
359 				    phba->fw_config.cqid_count);
360 		}
361 
362 		for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++)
363 			if (pfw_cfg->ulp[ulp_num].ulp_mode &
364 			    BEISCSI_ULP_ISCSI_INI_MODE)
365 				set_bit(ulp_num,
366 				&phba->fw_config.ulp_supported);
367 
368 		phba->fw_config.phys_port = pfw_cfg->phys_port;
369 		for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) {
370 			if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) {
371 
372 				phba->fw_config.iscsi_cid_start[ulp_num] =
373 					pfw_cfg->ulp[ulp_num].sq_base;
374 				phba->fw_config.iscsi_cid_count[ulp_num] =
375 					pfw_cfg->ulp[ulp_num].sq_count;
376 
377 				phba->fw_config.iscsi_icd_start[ulp_num] =
378 					pfw_cfg->ulp[ulp_num].icd_base;
379 				phba->fw_config.iscsi_icd_count[ulp_num] =
380 					pfw_cfg->ulp[ulp_num].icd_count;
381 
382 				phba->fw_config.iscsi_chain_start[ulp_num] =
383 					pfw_cfg->chain_icd[ulp_num].chain_base;
384 				phba->fw_config.iscsi_chain_count[ulp_num] =
385 					pfw_cfg->chain_icd[ulp_num].chain_count;
386 
387 				beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
388 					    "BG_%d : Function loaded on ULP : %d\n"
389 					    "\tiscsi_cid_count : %d\n"
390 					    "\tiscsi_cid_start : %d\n"
391 					    "\t iscsi_icd_count : %d\n"
392 					    "\t iscsi_icd_start : %d\n",
393 					    ulp_num,
394 					    phba->fw_config.
395 					    iscsi_cid_count[ulp_num],
396 					    phba->fw_config.
397 					    iscsi_cid_start[ulp_num],
398 					    phba->fw_config.
399 					    iscsi_icd_count[ulp_num],
400 					    phba->fw_config.
401 					    iscsi_icd_start[ulp_num]);
402 			}
403 		}
404 
405 		phba->fw_config.dual_ulp_aware = (pfw_cfg->function_mode &
406 						  BEISCSI_FUNC_DUA_MODE);
407 
408 		beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
409 			    "BG_%d : DUA Mode : 0x%x\n",
410 			    phba->fw_config.dual_ulp_aware);
411 
412 	} else {
413 		beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
414 			    "BG_%d : Failed in mgmt_get_fw_config\n");
415 		status = -EINVAL;
416 	}
417 
418 	spin_unlock(&ctrl->mbox_lock);
419 	return status;
420 }
421 
422 int mgmt_check_supported_fw(struct be_ctrl_info *ctrl,
423 				      struct beiscsi_hba *phba)
424 {
425 	struct be_dma_mem nonemb_cmd;
426 	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
427 	struct be_mgmt_controller_attributes *req;
428 	struct be_sge *sge = nonembedded_sgl(wrb);
429 	int status = 0;
430 
431 	nonemb_cmd.va = pci_alloc_consistent(ctrl->pdev,
432 				sizeof(struct be_mgmt_controller_attributes),
433 				&nonemb_cmd.dma);
434 	if (nonemb_cmd.va == NULL) {
435 		beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
436 			    "BG_%d : Failed to allocate memory for "
437 			    "mgmt_check_supported_fw\n");
438 		return -ENOMEM;
439 	}
440 	nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes);
441 	req = nonemb_cmd.va;
442 	memset(req, 0, sizeof(*req));
443 	spin_lock(&ctrl->mbox_lock);
444 	memset(wrb, 0, sizeof(*wrb));
445 	be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
446 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
447 			   OPCODE_COMMON_GET_CNTL_ATTRIBUTES, sizeof(*req));
448 	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd.dma));
449 	sge->pa_lo = cpu_to_le32(nonemb_cmd.dma & 0xFFFFFFFF);
450 	sge->len = cpu_to_le32(nonemb_cmd.size);
451 	status = be_mbox_notify(ctrl);
452 	if (!status) {
453 		struct be_mgmt_controller_attributes_resp *resp = nonemb_cmd.va;
454 		beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
455 			    "BG_%d : Firmware Version of CMD : %s\n"
456 			    "Firmware Version is : %s\n"
457 			    "Developer Build, not performing version check...\n",
458 			    resp->params.hba_attribs
459 			    .flashrom_version_string,
460 			    resp->params.hba_attribs.
461 			    firmware_version_string);
462 
463 		phba->fw_config.iscsi_features =
464 				resp->params.hba_attribs.iscsi_features;
465 		beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
466 			    "BM_%d : phba->fw_config.iscsi_features = %d\n",
467 			    phba->fw_config.iscsi_features);
468 		memcpy(phba->fw_ver_str, resp->params.hba_attribs.
469 		       firmware_version_string, BEISCSI_VER_STRLEN);
470 	} else
471 		beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
472 			    "BG_%d :  Failed in mgmt_check_supported_fw\n");
473 	spin_unlock(&ctrl->mbox_lock);
474 	if (nonemb_cmd.va)
475 		pci_free_consistent(ctrl->pdev, nonemb_cmd.size,
476 				    nonemb_cmd.va, nonemb_cmd.dma);
477 
478 	return status;
479 }
480 
481 unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
482 					 struct beiscsi_hba *phba,
483 					 struct bsg_job *job,
484 					 struct be_dma_mem *nonemb_cmd)
485 {
486 	struct be_cmd_resp_hdr *resp;
487 	struct be_mcc_wrb *wrb;
488 	struct be_sge *mcc_sge;
489 	unsigned int tag = 0;
490 	struct iscsi_bsg_request *bsg_req = job->request;
491 	struct be_bsg_vendor_cmd *req = nonemb_cmd->va;
492 	unsigned short region, sector_size, sector, offset;
493 
494 	nonemb_cmd->size = job->request_payload.payload_len;
495 	memset(nonemb_cmd->va, 0, nonemb_cmd->size);
496 	resp = nonemb_cmd->va;
497 	region =  bsg_req->rqst_data.h_vendor.vendor_cmd[1];
498 	sector_size =  bsg_req->rqst_data.h_vendor.vendor_cmd[2];
499 	sector =  bsg_req->rqst_data.h_vendor.vendor_cmd[3];
500 	offset =  bsg_req->rqst_data.h_vendor.vendor_cmd[4];
501 	req->region = region;
502 	req->sector = sector;
503 	req->offset = offset;
504 	spin_lock(&ctrl->mbox_lock);
505 
506 	switch (bsg_req->rqst_data.h_vendor.vendor_cmd[0]) {
507 	case BEISCSI_WRITE_FLASH:
508 		offset = sector * sector_size + offset;
509 		be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
510 				   OPCODE_COMMON_WRITE_FLASH, sizeof(*req));
511 		sg_copy_to_buffer(job->request_payload.sg_list,
512 				  job->request_payload.sg_cnt,
513 				  nonemb_cmd->va + offset, job->request_len);
514 		break;
515 	case BEISCSI_READ_FLASH:
516 		be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
517 			   OPCODE_COMMON_READ_FLASH, sizeof(*req));
518 		break;
519 	default:
520 		beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
521 			    "BG_%d : Unsupported cmd = 0x%x\n\n",
522 			    bsg_req->rqst_data.h_vendor.vendor_cmd[0]);
523 
524 		spin_unlock(&ctrl->mbox_lock);
525 		return -ENOSYS;
526 	}
527 
528 	tag = alloc_mcc_tag(phba);
529 	if (!tag) {
530 		spin_unlock(&ctrl->mbox_lock);
531 		return tag;
532 	}
533 
534 	wrb = wrb_from_mccq(phba);
535 	mcc_sge = nonembedded_sgl(wrb);
536 	be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false,
537 			   job->request_payload.sg_cnt);
538 	mcc_sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
539 	mcc_sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
540 	mcc_sge->len = cpu_to_le32(nonemb_cmd->size);
541 	wrb->tag0 |= tag;
542 
543 	be_mcc_notify(phba);
544 
545 	spin_unlock(&ctrl->mbox_lock);
546 	return tag;
547 }
548 
549 /**
550  * mgmt_epfw_cleanup()- Inform FW to cleanup data structures.
551  * @phba: pointer to dev priv structure
552  * @ulp_num: ULP number.
553  *
554  * return
555  *	Success: 0
556  *	Failure: Non-Zero Value
557  **/
558 int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num)
559 {
560 	struct be_ctrl_info *ctrl = &phba->ctrl;
561 	struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
562 	struct iscsi_cleanup_req *req = embedded_payload(wrb);
563 	int status = 0;
564 
565 	spin_lock(&ctrl->mbox_lock);
566 
567 	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
568 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
569 			   OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req));
570 
571 	req->chute = (1 << ulp_num);
572 	req->hdr_ring_id = cpu_to_le16(HWI_GET_DEF_HDRQ_ID(phba, ulp_num));
573 	req->data_ring_id = cpu_to_le16(HWI_GET_DEF_BUFQ_ID(phba, ulp_num));
574 
575 	status =  be_mcc_notify_wait(phba);
576 	if (status)
577 		beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT,
578 			    "BG_%d : mgmt_epfw_cleanup , FAILED\n");
579 	spin_unlock(&ctrl->mbox_lock);
580 	return status;
581 }
582 
583 unsigned int  mgmt_invalidate_icds(struct beiscsi_hba *phba,
584 				struct invalidate_command_table *inv_tbl,
585 				unsigned int num_invalidate, unsigned int cid,
586 				struct be_dma_mem *nonemb_cmd)
587 
588 {
589 	struct be_ctrl_info *ctrl = &phba->ctrl;
590 	struct be_mcc_wrb *wrb;
591 	struct be_sge *sge;
592 	struct invalidate_commands_params_in *req;
593 	unsigned int i, tag = 0;
594 
595 	spin_lock(&ctrl->mbox_lock);
596 	tag = alloc_mcc_tag(phba);
597 	if (!tag) {
598 		spin_unlock(&ctrl->mbox_lock);
599 		return tag;
600 	}
601 
602 	req = nonemb_cmd->va;
603 	memset(req, 0, sizeof(*req));
604 	wrb = wrb_from_mccq(phba);
605 	sge = nonembedded_sgl(wrb);
606 	wrb->tag0 |= tag;
607 
608 	be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
609 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
610 			OPCODE_COMMON_ISCSI_ERROR_RECOVERY_INVALIDATE_COMMANDS,
611 			sizeof(*req));
612 	req->ref_handle = 0;
613 	req->cleanup_type = CMD_ISCSI_COMMAND_INVALIDATE;
614 	for (i = 0; i < num_invalidate; i++) {
615 		req->table[i].icd = inv_tbl->icd;
616 		req->table[i].cid = inv_tbl->cid;
617 		req->icd_count++;
618 		inv_tbl++;
619 	}
620 	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
621 	sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
622 	sge->len = cpu_to_le32(nonemb_cmd->size);
623 
624 	be_mcc_notify(phba);
625 	spin_unlock(&ctrl->mbox_lock);
626 	return tag;
627 }
628 
629 unsigned int mgmt_invalidate_connection(struct beiscsi_hba *phba,
630 					 struct beiscsi_endpoint *beiscsi_ep,
631 					 unsigned short cid,
632 					 unsigned short issue_reset,
633 					 unsigned short savecfg_flag)
634 {
635 	struct be_ctrl_info *ctrl = &phba->ctrl;
636 	struct be_mcc_wrb *wrb;
637 	struct iscsi_invalidate_connection_params_in *req;
638 	unsigned int tag = 0;
639 
640 	spin_lock(&ctrl->mbox_lock);
641 	tag = alloc_mcc_tag(phba);
642 	if (!tag) {
643 		spin_unlock(&ctrl->mbox_lock);
644 		return tag;
645 	}
646 	wrb = wrb_from_mccq(phba);
647 	wrb->tag0 |= tag;
648 	req = embedded_payload(wrb);
649 
650 	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
651 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
652 			   OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION,
653 			   sizeof(*req));
654 	req->session_handle = beiscsi_ep->fw_handle;
655 	req->cid = cid;
656 	if (issue_reset)
657 		req->cleanup_type = CMD_ISCSI_CONNECTION_ISSUE_TCP_RST;
658 	else
659 		req->cleanup_type = CMD_ISCSI_CONNECTION_INVALIDATE;
660 	req->save_cfg = savecfg_flag;
661 	be_mcc_notify(phba);
662 	spin_unlock(&ctrl->mbox_lock);
663 	return tag;
664 }
665 
666 unsigned int mgmt_upload_connection(struct beiscsi_hba *phba,
667 				unsigned short cid, unsigned int upload_flag)
668 {
669 	struct be_ctrl_info *ctrl = &phba->ctrl;
670 	struct be_mcc_wrb *wrb;
671 	struct tcp_upload_params_in *req;
672 	unsigned int tag = 0;
673 
674 	spin_lock(&ctrl->mbox_lock);
675 	tag = alloc_mcc_tag(phba);
676 	if (!tag) {
677 		spin_unlock(&ctrl->mbox_lock);
678 		return tag;
679 	}
680 	wrb = wrb_from_mccq(phba);
681 	req = embedded_payload(wrb);
682 	wrb->tag0 |= tag;
683 
684 	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
685 	be_cmd_hdr_prepare(&req->hdr, CMD_COMMON_TCP_UPLOAD,
686 			   OPCODE_COMMON_TCP_UPLOAD, sizeof(*req));
687 	req->id = (unsigned short)cid;
688 	req->upload_type = (unsigned char)upload_flag;
689 	be_mcc_notify(phba);
690 	spin_unlock(&ctrl->mbox_lock);
691 	return tag;
692 }
693 
694 /**
695  * mgmt_open_connection()- Establish a TCP CXN
696  * @dst_addr: Destination Address
697  * @beiscsi_ep: ptr to device endpoint struct
698  * @nonemb_cmd: ptr to memory allocated for command
699  *
700  * return
701  *	Success: Tag number of the MBX Command issued
702  *	Failure: Error code
703  **/
704 int mgmt_open_connection(struct beiscsi_hba *phba,
705 			 struct sockaddr *dst_addr,
706 			 struct beiscsi_endpoint *beiscsi_ep,
707 			 struct be_dma_mem *nonemb_cmd)
708 {
709 	struct hwi_controller *phwi_ctrlr;
710 	struct hwi_context_memory *phwi_context;
711 	struct sockaddr_in *daddr_in = (struct sockaddr_in *)dst_addr;
712 	struct sockaddr_in6 *daddr_in6 = (struct sockaddr_in6 *)dst_addr;
713 	struct be_ctrl_info *ctrl = &phba->ctrl;
714 	struct be_mcc_wrb *wrb;
715 	struct tcp_connect_and_offload_in_v1 *req;
716 	unsigned short def_hdr_id;
717 	unsigned short def_data_id;
718 	struct phys_addr template_address = { 0, 0 };
719 	struct phys_addr *ptemplate_address;
720 	unsigned int tag = 0;
721 	unsigned int i, ulp_num;
722 	unsigned short cid = beiscsi_ep->ep_cid;
723 	struct be_sge *sge;
724 
725 	phwi_ctrlr = phba->phwi_ctrlr;
726 	phwi_context = phwi_ctrlr->phwi_ctxt;
727 
728 	ulp_num = phwi_ctrlr->wrb_context[BE_GET_CRI_FROM_CID(cid)].ulp_num;
729 
730 	def_hdr_id = (unsigned short)HWI_GET_DEF_HDRQ_ID(phba, ulp_num);
731 	def_data_id = (unsigned short)HWI_GET_DEF_BUFQ_ID(phba, ulp_num);
732 
733 	ptemplate_address = &template_address;
734 	ISCSI_GET_PDU_TEMPLATE_ADDRESS(phba, ptemplate_address);
735 	spin_lock(&ctrl->mbox_lock);
736 	tag = alloc_mcc_tag(phba);
737 	if (!tag) {
738 		spin_unlock(&ctrl->mbox_lock);
739 		return tag;
740 	}
741 	wrb = wrb_from_mccq(phba);
742 	sge = nonembedded_sgl(wrb);
743 
744 	req = nonemb_cmd->va;
745 	memset(req, 0, sizeof(*req));
746 	wrb->tag0 |= tag;
747 
748 	be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false, 1);
749 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
750 			   OPCODE_COMMON_ISCSI_TCP_CONNECT_AND_OFFLOAD,
751 			   nonemb_cmd->size);
752 	if (dst_addr->sa_family == PF_INET) {
753 		__be32 s_addr = daddr_in->sin_addr.s_addr;
754 		req->ip_address.ip_type = BE2_IPV4;
755 		req->ip_address.addr[0] = s_addr & 0x000000ff;
756 		req->ip_address.addr[1] = (s_addr & 0x0000ff00) >> 8;
757 		req->ip_address.addr[2] = (s_addr & 0x00ff0000) >> 16;
758 		req->ip_address.addr[3] = (s_addr & 0xff000000) >> 24;
759 		req->tcp_port = ntohs(daddr_in->sin_port);
760 		beiscsi_ep->dst_addr = daddr_in->sin_addr.s_addr;
761 		beiscsi_ep->dst_tcpport = ntohs(daddr_in->sin_port);
762 		beiscsi_ep->ip_type = BE2_IPV4;
763 	} else if (dst_addr->sa_family == PF_INET6) {
764 		req->ip_address.ip_type = BE2_IPV6;
765 		memcpy(&req->ip_address.addr,
766 		       &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
767 		req->tcp_port = ntohs(daddr_in6->sin6_port);
768 		beiscsi_ep->dst_tcpport = ntohs(daddr_in6->sin6_port);
769 		memcpy(&beiscsi_ep->dst6_addr,
770 		       &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
771 		beiscsi_ep->ip_type = BE2_IPV6;
772 	} else{
773 		beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
774 			    "BG_%d : unknown addr family %d\n",
775 			    dst_addr->sa_family);
776 		spin_unlock(&ctrl->mbox_lock);
777 		free_mcc_tag(&phba->ctrl, tag);
778 		return -EINVAL;
779 
780 	}
781 	req->cid = cid;
782 	i = phba->nxt_cqid++;
783 	if (phba->nxt_cqid == phba->num_cpus)
784 		phba->nxt_cqid = 0;
785 	req->cq_id = phwi_context->be_cq[i].id;
786 	beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG,
787 		    "BG_%d : i=%d cq_id=%d\n", i, req->cq_id);
788 	req->defq_id = def_hdr_id;
789 	req->hdr_ring_id = def_hdr_id;
790 	req->data_ring_id = def_data_id;
791 	req->do_offload = 1;
792 	req->dataout_template_pa.lo = ptemplate_address->lo;
793 	req->dataout_template_pa.hi = ptemplate_address->hi;
794 	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
795 	sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
796 	sge->len = cpu_to_le32(nonemb_cmd->size);
797 
798 	if (!is_chip_be2_be3r(phba)) {
799 		req->hdr.version = MBX_CMD_VER1;
800 		req->tcp_window_size = 0;
801 		req->tcp_window_scale_count = 2;
802 	}
803 
804 	be_mcc_notify(phba);
805 	spin_unlock(&ctrl->mbox_lock);
806 	return tag;
807 }
808 
809 unsigned int mgmt_get_all_if_id(struct beiscsi_hba *phba)
810 {
811 	struct be_ctrl_info *ctrl = &phba->ctrl;
812 	struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
813 	struct be_cmd_get_all_if_id_req *req = embedded_payload(wrb);
814 	struct be_cmd_get_all_if_id_req *pbe_allid = req;
815 	int status = 0;
816 
817 	memset(wrb, 0, sizeof(*wrb));
818 
819 	spin_lock(&ctrl->mbox_lock);
820 
821 	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
822 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
823 			   OPCODE_COMMON_ISCSI_NTWK_GET_ALL_IF_ID,
824 			   sizeof(*req));
825 	status = be_mbox_notify(ctrl);
826 	if (!status)
827 		phba->interface_handle = pbe_allid->if_hndl_list[0];
828 	else {
829 		beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
830 			    "BG_%d : Failed in mgmt_get_all_if_id\n");
831 	}
832 	spin_unlock(&ctrl->mbox_lock);
833 
834 	return status;
835 }
836 
837 /*
838  * mgmt_exec_nonemb_cmd()- Execute Non Embedded MBX Cmd
839  * @phba: Driver priv structure
840  * @nonemb_cmd: Address of the MBX command issued
841  * @resp_buf: Buffer to copy the MBX cmd response
842  * @resp_buf_len: respone lenght to be copied
843  *
844  **/
845 static int mgmt_exec_nonemb_cmd(struct beiscsi_hba *phba,
846 				struct be_dma_mem *nonemb_cmd, void *resp_buf,
847 				int resp_buf_len)
848 {
849 	struct be_ctrl_info *ctrl = &phba->ctrl;
850 	struct be_mcc_wrb *wrb;
851 	struct be_sge *sge;
852 	unsigned int tag;
853 	int rc = 0;
854 
855 	spin_lock(&ctrl->mbox_lock);
856 	tag = alloc_mcc_tag(phba);
857 	if (!tag) {
858 		spin_unlock(&ctrl->mbox_lock);
859 		rc = -ENOMEM;
860 		goto free_cmd;
861 	}
862 
863 	wrb = wrb_from_mccq(phba);
864 	wrb->tag0 |= tag;
865 	sge = nonembedded_sgl(wrb);
866 
867 	be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false, 1);
868 	sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
869 	sge->pa_lo = cpu_to_le32(lower_32_bits(nonemb_cmd->dma));
870 	sge->len = cpu_to_le32(nonemb_cmd->size);
871 
872 	be_mcc_notify(phba);
873 	spin_unlock(&ctrl->mbox_lock);
874 
875 	rc = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd);
876 
877 	if (resp_buf)
878 		memcpy(resp_buf, nonemb_cmd->va, resp_buf_len);
879 
880 	if (rc) {
881 		/* Check if the MBX Cmd needs to be re-issued */
882 		if (rc == -EAGAIN)
883 			return rc;
884 
885 		beiscsi_log(phba, KERN_WARNING,
886 			    BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
887 			    "BG_%d : mgmt_exec_nonemb_cmd Failed status\n");
888 
889 		if (rc != -EBUSY)
890 			goto free_cmd;
891 		else
892 			return rc;
893 	}
894 free_cmd:
895 	pci_free_consistent(ctrl->pdev, nonemb_cmd->size,
896 			    nonemb_cmd->va, nonemb_cmd->dma);
897 	return rc;
898 }
899 
900 static int mgmt_alloc_cmd_data(struct beiscsi_hba *phba, struct be_dma_mem *cmd,
901 			       int iscsi_cmd, int size)
902 {
903 	cmd->va = pci_alloc_consistent(phba->ctrl.pdev, size, &cmd->dma);
904 	if (!cmd->va) {
905 		beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
906 			    "BG_%d : Failed to allocate memory for if info\n");
907 		return -ENOMEM;
908 	}
909 	memset(cmd->va, 0, size);
910 	cmd->size = size;
911 	be_cmd_hdr_prepare(cmd->va, CMD_SUBSYSTEM_ISCSI, iscsi_cmd, size);
912 	return 0;
913 }
914 
915 static int
916 mgmt_static_ip_modify(struct beiscsi_hba *phba,
917 		      struct be_cmd_get_if_info_resp *if_info,
918 		      struct iscsi_iface_param_info *ip_param,
919 		      struct iscsi_iface_param_info *subnet_param,
920 		      uint32_t ip_action)
921 {
922 	struct be_cmd_set_ip_addr_req *req;
923 	struct be_dma_mem nonemb_cmd;
924 	uint32_t ip_type;
925 	int rc;
926 
927 	rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
928 				 OPCODE_COMMON_ISCSI_NTWK_MODIFY_IP_ADDR,
929 				 sizeof(*req));
930 	if (rc)
931 		return rc;
932 
933 	ip_type = (ip_param->param == ISCSI_NET_PARAM_IPV6_ADDR) ?
934 		BE2_IPV6 : BE2_IPV4 ;
935 
936 	req = nonemb_cmd.va;
937 	req->ip_params.record_entry_count = 1;
938 	req->ip_params.ip_record.action = ip_action;
939 	req->ip_params.ip_record.interface_hndl =
940 		phba->interface_handle;
941 	req->ip_params.ip_record.ip_addr.size_of_structure =
942 		sizeof(struct be_ip_addr_subnet_format);
943 	req->ip_params.ip_record.ip_addr.ip_type = ip_type;
944 
945 	if (ip_action == IP_ACTION_ADD) {
946 		memcpy(req->ip_params.ip_record.ip_addr.addr, ip_param->value,
947 		       ip_param->len);
948 
949 		if (subnet_param)
950 			memcpy(req->ip_params.ip_record.ip_addr.subnet_mask,
951 			       subnet_param->value, subnet_param->len);
952 	} else {
953 		memcpy(req->ip_params.ip_record.ip_addr.addr,
954 		       if_info->ip_addr.addr, ip_param->len);
955 
956 		memcpy(req->ip_params.ip_record.ip_addr.subnet_mask,
957 		       if_info->ip_addr.subnet_mask, ip_param->len);
958 	}
959 
960 	rc = mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
961 	if (rc < 0)
962 		beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
963 			    "BG_%d : Failed to Modify existing IP Address\n");
964 	return rc;
965 }
966 
967 static int mgmt_modify_gateway(struct beiscsi_hba *phba, uint8_t *gt_addr,
968 			       uint32_t gtway_action, uint32_t param_len)
969 {
970 	struct be_cmd_set_def_gateway_req *req;
971 	struct be_dma_mem nonemb_cmd;
972 	int rt_val;
973 
974 
975 	rt_val = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
976 				OPCODE_COMMON_ISCSI_NTWK_MODIFY_DEFAULT_GATEWAY,
977 				sizeof(*req));
978 	if (rt_val)
979 		return rt_val;
980 
981 	req = nonemb_cmd.va;
982 	req->action = gtway_action;
983 	req->ip_addr.ip_type = BE2_IPV4;
984 
985 	memcpy(req->ip_addr.addr, gt_addr, param_len);
986 
987 	return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
988 }
989 
990 int mgmt_set_ip(struct beiscsi_hba *phba,
991 		struct iscsi_iface_param_info *ip_param,
992 		struct iscsi_iface_param_info *subnet_param,
993 		uint32_t boot_proto)
994 {
995 	struct be_cmd_get_def_gateway_resp gtway_addr_set;
996 	struct be_cmd_get_if_info_resp *if_info;
997 	struct be_cmd_set_dhcp_req *dhcpreq;
998 	struct be_cmd_rel_dhcp_req *reldhcp;
999 	struct be_dma_mem nonemb_cmd;
1000 	uint8_t *gtway_addr;
1001 	uint32_t ip_type;
1002 	int rc;
1003 
1004 	if (mgmt_get_all_if_id(phba))
1005 		return -EIO;
1006 
1007 	ip_type = (ip_param->param == ISCSI_NET_PARAM_IPV6_ADDR) ?
1008 		BE2_IPV6 : BE2_IPV4 ;
1009 
1010 	rc = mgmt_get_if_info(phba, ip_type, &if_info);
1011 	if (rc)
1012 		return rc;
1013 
1014 	if (boot_proto == ISCSI_BOOTPROTO_DHCP) {
1015 		if (if_info->dhcp_state) {
1016 			beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1017 				    "BG_%d : DHCP Already Enabled\n");
1018 			return 0;
1019 		}
1020 		/* The ip_param->len is 1 in DHCP case. Setting
1021 		   proper IP len as this it is used while
1022 		   freeing the Static IP.
1023 		 */
1024 		ip_param->len = (ip_param->param == ISCSI_NET_PARAM_IPV6_ADDR) ?
1025 				IP_V6_LEN : IP_V4_LEN;
1026 
1027 	} else {
1028 		if (if_info->dhcp_state) {
1029 
1030 			memset(if_info, 0, sizeof(*if_info));
1031 			rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1032 				OPCODE_COMMON_ISCSI_NTWK_REL_STATELESS_IP_ADDR,
1033 				sizeof(*reldhcp));
1034 
1035 			if (rc)
1036 				return rc;
1037 
1038 			reldhcp = nonemb_cmd.va;
1039 			reldhcp->interface_hndl = phba->interface_handle;
1040 			reldhcp->ip_type = ip_type;
1041 
1042 			rc = mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
1043 			if (rc < 0) {
1044 				beiscsi_log(phba, KERN_WARNING,
1045 					    BEISCSI_LOG_CONFIG,
1046 					    "BG_%d : Failed to Delete existing dhcp\n");
1047 				return rc;
1048 			}
1049 		}
1050 	}
1051 
1052 	/* Delete the Static IP Set */
1053 	if (if_info->ip_addr.addr[0]) {
1054 		rc = mgmt_static_ip_modify(phba, if_info, ip_param, NULL,
1055 					   IP_ACTION_DEL);
1056 		if (rc)
1057 			return rc;
1058 	}
1059 
1060 	/* Delete the Gateway settings if mode change is to DHCP */
1061 	if (boot_proto == ISCSI_BOOTPROTO_DHCP) {
1062 		memset(&gtway_addr_set, 0, sizeof(gtway_addr_set));
1063 		rc = mgmt_get_gateway(phba, BE2_IPV4, &gtway_addr_set);
1064 		if (rc) {
1065 			beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1066 				    "BG_%d : Failed to Get Gateway Addr\n");
1067 			return rc;
1068 		}
1069 
1070 		if (gtway_addr_set.ip_addr.addr[0]) {
1071 			gtway_addr = (uint8_t *)&gtway_addr_set.ip_addr.addr;
1072 			rc = mgmt_modify_gateway(phba, gtway_addr,
1073 						 IP_ACTION_DEL, IP_V4_LEN);
1074 
1075 			if (rc) {
1076 				beiscsi_log(phba, KERN_WARNING,
1077 					    BEISCSI_LOG_CONFIG,
1078 					    "BG_%d : Failed to clear Gateway Addr Set\n");
1079 				return rc;
1080 			}
1081 		}
1082 	}
1083 
1084 	/* Set Adapter to DHCP/Static Mode */
1085 	if (boot_proto == ISCSI_BOOTPROTO_DHCP) {
1086 		rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1087 			OPCODE_COMMON_ISCSI_NTWK_CONFIG_STATELESS_IP_ADDR,
1088 			sizeof(*dhcpreq));
1089 		if (rc)
1090 			return rc;
1091 
1092 		dhcpreq = nonemb_cmd.va;
1093 		dhcpreq->flags = BLOCKING;
1094 		dhcpreq->retry_count = 1;
1095 		dhcpreq->interface_hndl = phba->interface_handle;
1096 		dhcpreq->ip_type = BE2_DHCP_V4;
1097 
1098 		return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
1099 	} else {
1100 		return mgmt_static_ip_modify(phba, if_info, ip_param,
1101 					     subnet_param, IP_ACTION_ADD);
1102 	}
1103 
1104 	return rc;
1105 }
1106 
1107 int mgmt_set_gateway(struct beiscsi_hba *phba,
1108 		     struct iscsi_iface_param_info *gateway_param)
1109 {
1110 	struct be_cmd_get_def_gateway_resp gtway_addr_set;
1111 	uint8_t *gtway_addr;
1112 	int rt_val;
1113 
1114 	memset(&gtway_addr_set, 0, sizeof(gtway_addr_set));
1115 	rt_val = mgmt_get_gateway(phba, BE2_IPV4, &gtway_addr_set);
1116 	if (rt_val) {
1117 		beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1118 			    "BG_%d : Failed to Get Gateway Addr\n");
1119 		return rt_val;
1120 	}
1121 
1122 	if (gtway_addr_set.ip_addr.addr[0]) {
1123 		gtway_addr = (uint8_t *)&gtway_addr_set.ip_addr.addr;
1124 		rt_val = mgmt_modify_gateway(phba, gtway_addr, IP_ACTION_DEL,
1125 					     gateway_param->len);
1126 		if (rt_val) {
1127 			beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1128 				    "BG_%d : Failed to clear Gateway Addr Set\n");
1129 			return rt_val;
1130 		}
1131 	}
1132 
1133 	gtway_addr = (uint8_t *)&gateway_param->value;
1134 	rt_val = mgmt_modify_gateway(phba, gtway_addr, IP_ACTION_ADD,
1135 				     gateway_param->len);
1136 
1137 	if (rt_val)
1138 		beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1139 			    "BG_%d : Failed to Set Gateway Addr\n");
1140 
1141 	return rt_val;
1142 }
1143 
1144 int mgmt_get_gateway(struct beiscsi_hba *phba, int ip_type,
1145 		     struct be_cmd_get_def_gateway_resp *gateway)
1146 {
1147 	struct be_cmd_get_def_gateway_req *req;
1148 	struct be_dma_mem nonemb_cmd;
1149 	int rc;
1150 
1151 	rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1152 				 OPCODE_COMMON_ISCSI_NTWK_GET_DEFAULT_GATEWAY,
1153 				 sizeof(*gateway));
1154 	if (rc)
1155 		return rc;
1156 
1157 	req = nonemb_cmd.va;
1158 	req->ip_type = ip_type;
1159 
1160 	return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, gateway,
1161 				    sizeof(*gateway));
1162 }
1163 
1164 int mgmt_get_if_info(struct beiscsi_hba *phba, int ip_type,
1165 		     struct be_cmd_get_if_info_resp **if_info)
1166 {
1167 	struct be_cmd_get_if_info_req *req;
1168 	struct be_dma_mem nonemb_cmd;
1169 	uint32_t ioctl_size = sizeof(struct be_cmd_get_if_info_resp);
1170 	int rc;
1171 
1172 	if (mgmt_get_all_if_id(phba))
1173 		return -EIO;
1174 
1175 	do {
1176 		rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1177 					 OPCODE_COMMON_ISCSI_NTWK_GET_IF_INFO,
1178 					 ioctl_size);
1179 		if (rc)
1180 			return rc;
1181 
1182 		req = nonemb_cmd.va;
1183 		req->interface_hndl = phba->interface_handle;
1184 		req->ip_type = ip_type;
1185 
1186 		/* Allocate memory for if_info */
1187 		*if_info = kzalloc(ioctl_size, GFP_KERNEL);
1188 		if (!*if_info) {
1189 			beiscsi_log(phba, KERN_ERR,
1190 				    BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1191 				    "BG_%d : Memory Allocation Failure\n");
1192 
1193 				/* Free the DMA memory for the IOCTL issuing */
1194 				pci_free_consistent(phba->ctrl.pdev,
1195 						    nonemb_cmd.size,
1196 						    nonemb_cmd.va,
1197 						    nonemb_cmd.dma);
1198 				return -ENOMEM;
1199 		}
1200 
1201 		rc =  mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, *if_info,
1202 					   ioctl_size);
1203 
1204 		/* Check if the error is because of Insufficent_Buffer */
1205 		if (rc == -EAGAIN) {
1206 
1207 			/* Get the new memory size */
1208 			ioctl_size = ((struct be_cmd_resp_hdr *)
1209 				      nonemb_cmd.va)->actual_resp_len;
1210 			ioctl_size += sizeof(struct be_cmd_req_hdr);
1211 
1212 			/* Free the previous allocated DMA memory */
1213 			pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
1214 					    nonemb_cmd.va,
1215 					    nonemb_cmd.dma);
1216 
1217 			/* Free the virtual memory */
1218 			kfree(*if_info);
1219 		} else
1220 			break;
1221 	} while (true);
1222 	return rc;
1223 }
1224 
1225 int mgmt_get_nic_conf(struct beiscsi_hba *phba,
1226 		      struct be_cmd_get_nic_conf_resp *nic)
1227 {
1228 	struct be_dma_mem nonemb_cmd;
1229 	int rc;
1230 
1231 	rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1232 				 OPCODE_COMMON_ISCSI_NTWK_GET_NIC_CONFIG,
1233 				 sizeof(*nic));
1234 	if (rc)
1235 		return rc;
1236 
1237 	return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, nic, sizeof(*nic));
1238 }
1239 
1240 
1241 
1242 unsigned int be_cmd_get_initname(struct beiscsi_hba *phba)
1243 {
1244 	unsigned int tag = 0;
1245 	struct be_mcc_wrb *wrb;
1246 	struct be_cmd_hba_name *req;
1247 	struct be_ctrl_info *ctrl = &phba->ctrl;
1248 
1249 	spin_lock(&ctrl->mbox_lock);
1250 	tag = alloc_mcc_tag(phba);
1251 	if (!tag) {
1252 		spin_unlock(&ctrl->mbox_lock);
1253 		return tag;
1254 	}
1255 
1256 	wrb = wrb_from_mccq(phba);
1257 	req = embedded_payload(wrb);
1258 	wrb->tag0 |= tag;
1259 	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1260 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
1261 			OPCODE_ISCSI_INI_CFG_GET_HBA_NAME,
1262 			sizeof(*req));
1263 
1264 	be_mcc_notify(phba);
1265 	spin_unlock(&ctrl->mbox_lock);
1266 	return tag;
1267 }
1268 
1269 unsigned int be_cmd_get_port_speed(struct beiscsi_hba *phba)
1270 {
1271 	unsigned int tag = 0;
1272 	struct be_mcc_wrb *wrb;
1273 	struct be_cmd_ntwk_link_status_req *req;
1274 	struct be_ctrl_info *ctrl = &phba->ctrl;
1275 
1276 	spin_lock(&ctrl->mbox_lock);
1277 	tag = alloc_mcc_tag(phba);
1278 	if (!tag) {
1279 		spin_unlock(&ctrl->mbox_lock);
1280 		return tag;
1281 	}
1282 
1283 	wrb = wrb_from_mccq(phba);
1284 	req = embedded_payload(wrb);
1285 	wrb->tag0 |= tag;
1286 	be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1287 	be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1288 			OPCODE_COMMON_NTWK_LINK_STATUS_QUERY,
1289 			sizeof(*req));
1290 
1291 	be_mcc_notify(phba);
1292 	spin_unlock(&ctrl->mbox_lock);
1293 	return tag;
1294 }
1295 
1296 /**
1297  * be_mgmt_get_boot_shandle()- Get the session handle
1298  * @phba: device priv structure instance
1299  * @s_handle: session handle returned for boot session.
1300  *
1301  * Get the boot target session handle. In case of
1302  * crashdump mode driver has to issue and MBX Cmd
1303  * for FW to login to boot target
1304  *
1305  * return
1306  *	Success: 0
1307  *	Failure: Non-Zero value
1308  *
1309  **/
1310 int be_mgmt_get_boot_shandle(struct beiscsi_hba *phba,
1311 			      unsigned int *s_handle)
1312 {
1313 	struct be_cmd_get_boot_target_resp *boot_resp;
1314 	struct be_mcc_wrb *wrb;
1315 	unsigned int tag;
1316 	uint8_t boot_retry = 3;
1317 	int rc;
1318 
1319 	do {
1320 		/* Get the Boot Target Session Handle and Count*/
1321 		tag = mgmt_get_boot_target(phba);
1322 		if (!tag) {
1323 			beiscsi_log(phba, KERN_ERR,
1324 				    BEISCSI_LOG_CONFIG | BEISCSI_LOG_INIT,
1325 				    "BG_%d : Getting Boot Target Info Failed\n");
1326 			return -EAGAIN;
1327 		}
1328 
1329 		rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
1330 		if (rc) {
1331 			beiscsi_log(phba, KERN_ERR,
1332 				    BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1333 				    "BG_%d : MBX CMD get_boot_target Failed\n");
1334 			return -EBUSY;
1335 		}
1336 
1337 		boot_resp = embedded_payload(wrb);
1338 
1339 		/* Check if the there are any Boot targets configured */
1340 		if (!boot_resp->boot_session_count) {
1341 			beiscsi_log(phba, KERN_INFO,
1342 				    BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1343 				    "BG_%d  ;No boot targets configured\n");
1344 			return -ENXIO;
1345 		}
1346 
1347 		/* FW returns the session handle of the boot session */
1348 		if (boot_resp->boot_session_handle != INVALID_SESS_HANDLE) {
1349 			*s_handle = boot_resp->boot_session_handle;
1350 			return 0;
1351 		}
1352 
1353 		/* Issue MBX Cmd to FW to login to the boot target */
1354 		tag = mgmt_reopen_session(phba, BE_REOPEN_BOOT_SESSIONS,
1355 					  INVALID_SESS_HANDLE);
1356 		if (!tag) {
1357 			beiscsi_log(phba, KERN_ERR,
1358 				    BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1359 				    "BG_%d : mgmt_reopen_session Failed\n");
1360 			return -EAGAIN;
1361 		}
1362 
1363 		rc = beiscsi_mccq_compl(phba, tag, NULL, NULL);
1364 		if (rc) {
1365 			beiscsi_log(phba, KERN_ERR,
1366 				    BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1367 				    "BG_%d : mgmt_reopen_session Failed");
1368 			return rc;
1369 		}
1370 	} while (--boot_retry);
1371 
1372 	/* Couldn't log into the boot target */
1373 	beiscsi_log(phba, KERN_ERR,
1374 		    BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1375 		    "BG_%d : Login to Boot Target Failed\n");
1376 	return -ENXIO;
1377 }
1378 
1379 /**
1380  * mgmt_set_vlan()- Issue and wait for CMD completion
1381  * @phba: device private structure instance
1382  * @vlan_tag: VLAN tag
1383  *
1384  * Issue the MBX Cmd and wait for the completion of the
1385  * command.
1386  *
1387  * returns
1388  *	Success: 0
1389  *	Failure: Non-Xero Value
1390  **/
1391 int mgmt_set_vlan(struct beiscsi_hba *phba,
1392 		   uint16_t vlan_tag)
1393 {
1394 	int rc;
1395 	unsigned int tag;
1396 
1397 	tag = be_cmd_set_vlan(phba, vlan_tag);
1398 	if (!tag) {
1399 		beiscsi_log(phba, KERN_ERR,
1400 			    (BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX),
1401 			    "BG_%d : VLAN Setting Failed\n");
1402 		return -EBUSY;
1403 	}
1404 
1405 	rc = beiscsi_mccq_compl(phba, tag, NULL, NULL);
1406 	if (rc) {
1407 		beiscsi_log(phba, KERN_ERR,
1408 			    (BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX),
1409 			    "BS_%d : VLAN MBX Cmd Failed\n");
1410 		return rc;
1411 	}
1412 	return rc;
1413 }
1414 
1415 /**
1416  * beiscsi_drvr_ver_disp()- Display the driver Name and Version
1417  * @dev: ptr to device not used.
1418  * @attr: device attribute, not used.
1419  * @buf: contains formatted text driver name and version
1420  *
1421  * return
1422  * size of the formatted string
1423  **/
1424 ssize_t
1425 beiscsi_drvr_ver_disp(struct device *dev, struct device_attribute *attr,
1426 		       char *buf)
1427 {
1428 	return snprintf(buf, PAGE_SIZE, BE_NAME "\n");
1429 }
1430 
1431 /**
1432  * beiscsi_fw_ver_disp()- Display Firmware Version
1433  * @dev: ptr to device not used.
1434  * @attr: device attribute, not used.
1435  * @buf: contains formatted text Firmware version
1436  *
1437  * return
1438  * size of the formatted string
1439  **/
1440 ssize_t
1441 beiscsi_fw_ver_disp(struct device *dev, struct device_attribute *attr,
1442 		     char *buf)
1443 {
1444 	struct Scsi_Host *shost = class_to_shost(dev);
1445 	struct beiscsi_hba *phba = iscsi_host_priv(shost);
1446 
1447 	return snprintf(buf, PAGE_SIZE, "%s\n", phba->fw_ver_str);
1448 }
1449 
1450 /**
1451  * beiscsi_active_session_disp()- Display Sessions Active
1452  * @dev: ptr to device not used.
1453  * @attr: device attribute, not used.
1454  * @buf: contains formatted text Session Count
1455  *
1456  * return
1457  * size of the formatted string
1458  **/
1459 ssize_t
1460 beiscsi_active_session_disp(struct device *dev, struct device_attribute *attr,
1461 			 char *buf)
1462 {
1463 	struct Scsi_Host *shost = class_to_shost(dev);
1464 	struct beiscsi_hba *phba = iscsi_host_priv(shost);
1465 	uint16_t avlbl_cids = 0, ulp_num, len = 0, total_cids = 0;
1466 
1467 	for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) {
1468 		if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) {
1469 			avlbl_cids = BEISCSI_ULP_AVLBL_CID(phba, ulp_num);
1470 			total_cids = BEISCSI_GET_CID_COUNT(phba, ulp_num);
1471 			len += snprintf(buf+len, PAGE_SIZE - len,
1472 					"ULP%d : %d\n", ulp_num,
1473 					(total_cids - avlbl_cids));
1474 		} else
1475 			len += snprintf(buf+len, PAGE_SIZE - len,
1476 					"ULP%d : %d\n", ulp_num, 0);
1477 	}
1478 
1479 	return len;
1480 }
1481 
1482 /**
1483  * beiscsi_free_session_disp()- Display Avaliable Session
1484  * @dev: ptr to device not used.
1485  * @attr: device attribute, not used.
1486  * @buf: contains formatted text Session Count
1487  *
1488  * return
1489  * size of the formatted string
1490  **/
1491 ssize_t
1492 beiscsi_free_session_disp(struct device *dev, struct device_attribute *attr,
1493 		       char *buf)
1494 {
1495 	struct Scsi_Host *shost = class_to_shost(dev);
1496 	struct beiscsi_hba *phba = iscsi_host_priv(shost);
1497 	uint16_t ulp_num, len = 0;
1498 
1499 	for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) {
1500 		if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported))
1501 			len += snprintf(buf+len, PAGE_SIZE - len,
1502 					"ULP%d : %d\n", ulp_num,
1503 					BEISCSI_ULP_AVLBL_CID(phba, ulp_num));
1504 		else
1505 			len += snprintf(buf+len, PAGE_SIZE - len,
1506 					"ULP%d : %d\n", ulp_num, 0);
1507 	}
1508 
1509 	return len;
1510 }
1511 
1512 /**
1513  * beiscsi_adap_family_disp()- Display adapter family.
1514  * @dev: ptr to device to get priv structure
1515  * @attr: device attribute, not used.
1516  * @buf: contains formatted text driver name and version
1517  *
1518  * return
1519  * size of the formatted string
1520  **/
1521 ssize_t
1522 beiscsi_adap_family_disp(struct device *dev, struct device_attribute *attr,
1523 			  char *buf)
1524 {
1525 	uint16_t dev_id = 0;
1526 	struct Scsi_Host *shost = class_to_shost(dev);
1527 	struct beiscsi_hba *phba = iscsi_host_priv(shost);
1528 
1529 	dev_id = phba->pcidev->device;
1530 	switch (dev_id) {
1531 	case BE_DEVICE_ID1:
1532 	case OC_DEVICE_ID1:
1533 	case OC_DEVICE_ID2:
1534 		return snprintf(buf, PAGE_SIZE, "BE2 Adapter Family\n");
1535 		break;
1536 	case BE_DEVICE_ID2:
1537 	case OC_DEVICE_ID3:
1538 		return snprintf(buf, PAGE_SIZE, "BE3-R Adapter Family\n");
1539 		break;
1540 	case OC_SKH_ID1:
1541 		return snprintf(buf, PAGE_SIZE, "Skyhawk-R Adapter Family\n");
1542 		break;
1543 	default:
1544 		return snprintf(buf, PAGE_SIZE,
1545 				"Unknown Adapter Family: 0x%x\n", dev_id);
1546 		break;
1547 	}
1548 }
1549 
1550 /**
1551  * beiscsi_phys_port()- Display Physical Port Identifier
1552  * @dev: ptr to device not used.
1553  * @attr: device attribute, not used.
1554  * @buf: contains formatted text port identifier
1555  *
1556  * return
1557  * size of the formatted string
1558  **/
1559 ssize_t
1560 beiscsi_phys_port_disp(struct device *dev, struct device_attribute *attr,
1561 			 char *buf)
1562 {
1563 	struct Scsi_Host *shost = class_to_shost(dev);
1564 	struct beiscsi_hba *phba = iscsi_host_priv(shost);
1565 
1566 	return snprintf(buf, PAGE_SIZE, "Port Identifier : %d\n",
1567 			phba->fw_config.phys_port);
1568 }
1569 
1570 void beiscsi_offload_cxn_v0(struct beiscsi_offload_params *params,
1571 			     struct wrb_handle *pwrb_handle,
1572 			     struct be_mem_descriptor *mem_descr)
1573 {
1574 	struct iscsi_wrb *pwrb = pwrb_handle->pwrb;
1575 
1576 	memset(pwrb, 0, sizeof(*pwrb));
1577 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1578 		      max_send_data_segment_length, pwrb,
1579 		      params->dw[offsetof(struct amap_beiscsi_offload_params,
1580 		      max_send_data_segment_length) / 32]);
1581 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, type, pwrb,
1582 		      BE_TGT_CTX_UPDT_CMD);
1583 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1584 		      first_burst_length,
1585 		      pwrb,
1586 		      params->dw[offsetof(struct amap_beiscsi_offload_params,
1587 		      first_burst_length) / 32]);
1588 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, erl, pwrb,
1589 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1590 		      erl) / 32] & OFFLD_PARAMS_ERL));
1591 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, dde, pwrb,
1592 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1593 		       dde) / 32] & OFFLD_PARAMS_DDE) >> 2);
1594 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, hde, pwrb,
1595 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1596 		      hde) / 32] & OFFLD_PARAMS_HDE) >> 3);
1597 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ir2t, pwrb,
1598 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1599 		      ir2t) / 32] & OFFLD_PARAMS_IR2T) >> 4);
1600 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, imd, pwrb,
1601 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1602 		      imd) / 32] & OFFLD_PARAMS_IMD) >> 5);
1603 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, stat_sn,
1604 		      pwrb,
1605 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1606 		      exp_statsn) / 32] + 1));
1607 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, wrb_idx,
1608 		      pwrb, pwrb_handle->wrb_index);
1609 
1610 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1611 		      max_burst_length, pwrb, params->dw[offsetof
1612 		      (struct amap_beiscsi_offload_params,
1613 		      max_burst_length) / 32]);
1614 
1615 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ptr2nextwrb,
1616 		      pwrb, pwrb_handle->nxt_wrb_index);
1617 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1618 		      session_state, pwrb, 0);
1619 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, compltonack,
1620 		      pwrb, 1);
1621 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, notpredblq,
1622 		      pwrb, 0);
1623 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, mode, pwrb,
1624 		      0);
1625 
1626 	mem_descr += ISCSI_MEM_GLOBAL_HEADER;
1627 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1628 		      pad_buffer_addr_hi, pwrb,
1629 		      mem_descr->mem_array[0].bus_address.u.a32.address_hi);
1630 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1631 		      pad_buffer_addr_lo, pwrb,
1632 		      mem_descr->mem_array[0].bus_address.u.a32.address_lo);
1633 }
1634 
1635 void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params,
1636 			     struct wrb_handle *pwrb_handle)
1637 {
1638 	struct iscsi_wrb *pwrb = pwrb_handle->pwrb;
1639 
1640 	memset(pwrb, 0, sizeof(*pwrb));
1641 
1642 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1643 		      max_burst_length, pwrb, params->dw[offsetof
1644 		      (struct amap_beiscsi_offload_params,
1645 		      max_burst_length) / 32]);
1646 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1647 		      type, pwrb,
1648 		      BE_TGT_CTX_UPDT_CMD);
1649 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1650 		      ptr2nextwrb,
1651 		      pwrb, pwrb_handle->nxt_wrb_index);
1652 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, wrb_idx,
1653 		      pwrb, pwrb_handle->wrb_index);
1654 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1655 		      max_send_data_segment_length, pwrb,
1656 		      params->dw[offsetof(struct amap_beiscsi_offload_params,
1657 		      max_send_data_segment_length) / 32]);
1658 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1659 		      first_burst_length, pwrb,
1660 		      params->dw[offsetof(struct amap_beiscsi_offload_params,
1661 		      first_burst_length) / 32]);
1662 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1663 		      max_recv_dataseg_len, pwrb,
1664 		      params->dw[offsetof(struct amap_beiscsi_offload_params,
1665 		      max_recv_data_segment_length) / 32]);
1666 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1667 		      max_cxns, pwrb, BEISCSI_MAX_CXNS);
1668 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, erl, pwrb,
1669 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1670 		      erl) / 32] & OFFLD_PARAMS_ERL));
1671 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, dde, pwrb,
1672 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1673 		      dde) / 32] & OFFLD_PARAMS_DDE) >> 2);
1674 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, hde, pwrb,
1675 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1676 		      hde) / 32] & OFFLD_PARAMS_HDE) >> 3);
1677 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1678 		      ir2t, pwrb,
1679 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1680 		      ir2t) / 32] & OFFLD_PARAMS_IR2T) >> 4);
1681 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, imd, pwrb,
1682 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1683 		      imd) / 32] & OFFLD_PARAMS_IMD) >> 5);
1684 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1685 		      data_seq_inorder,
1686 		      pwrb,
1687 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1688 		      data_seq_inorder) / 32] &
1689 		      OFFLD_PARAMS_DATA_SEQ_INORDER) >> 6);
1690 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1691 		      pdu_seq_inorder,
1692 		      pwrb,
1693 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1694 		      pdu_seq_inorder) / 32] &
1695 		      OFFLD_PARAMS_PDU_SEQ_INORDER) >> 7);
1696 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, max_r2t,
1697 		      pwrb,
1698 		      (params->dw[offsetof(struct amap_beiscsi_offload_params,
1699 		      max_r2t) / 32] &
1700 		      OFFLD_PARAMS_MAX_R2T) >> 8);
1701 	AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, stat_sn,
1702 		      pwrb,
1703 		     (params->dw[offsetof(struct amap_beiscsi_offload_params,
1704 		      exp_statsn) / 32] + 1));
1705 }
1706