]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/scsi/be2iscsi/be_mgmt.c
Merge remote-tracking branch 'ktest/for-next'
[karo-tx-linux.git] / drivers / scsi / be2iscsi / be_mgmt.c
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 }