blob: 1f2b546a3fc4467213b91065b6529b28c4ada86e [file] [log] [blame]
Jayamohan Kallickal6733b392009-09-05 07:36:35 +05301/**
Jayamohan Kallickal533c1652013-04-05 20:38:34 -07002 * Copyright (C) 2005 - 2013 Emulex
Jayamohan Kallickal6733b392009-09-05 07:36:35 +05303 * 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 *
Jayamohan Kallickal255fa9a2011-03-25 14:23:57 -070010 * Written by: Jayamohan Kallickal (jayamohan.kallickal@emulex.com)
Jayamohan Kallickal6733b392009-09-05 07:36:35 +053011 *
12 * Contact Information:
Jayamohan Kallickal255fa9a2011-03-25 14:23:57 -070013 * linux-drivers@emulex.com
Jayamohan Kallickal6733b392009-09-05 07:36:35 +053014 *
Jayamohan Kallickal255fa9a2011-03-25 14:23:57 -070015 * Emulex
16 * 3333 Susan Street
17 * Costa Mesa, CA 92626
Jayamohan Kallickal6733b392009-09-05 07:36:35 +053018 */
19
Jayamohan Kallickalffce3e22012-04-03 23:41:50 -050020#include <linux/bsg-lib.h>
21#include <scsi/scsi_transport_iscsi.h>
22#include <scsi/scsi_bsg_iscsi.h>
Jayamohan Kallickal6733b392009-09-05 07:36:35 +053023#include "be_mgmt.h"
24#include "be_iscsi.h"
John Soni Jose7a158002012-10-20 04:45:51 +053025#include "be_main.h"
26
27/* UE Status Low CSR */
28static 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 */
64static 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 **/
105void 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}
Jayamohan Kallickalc7acc5b2010-07-22 04:29:18 +0530157
John Soni Jose9aef4202012-08-20 23:00:08 +0530158/**
159 * mgmt_reopen_session()- Reopen a session based on reopen_type
160 * @phba: Device priv structure instance
161 * @reopen_type: Type of reopen_session FW should do.
162 * @sess_handle: Session Handle of the session to be re-opened
163 *
164 * return
165 * the TAG used for MBOX Command
166 *
167 **/
168unsigned int mgmt_reopen_session(struct beiscsi_hba *phba,
169 unsigned int reopen_type,
170 unsigned int sess_handle)
171{
172 struct be_ctrl_info *ctrl = &phba->ctrl;
173 struct be_mcc_wrb *wrb;
174 struct be_cmd_reopen_session_req *req;
175 unsigned int tag = 0;
176
John Soni Jose99bc5d52012-08-20 23:00:18 +0530177 beiscsi_log(phba, KERN_INFO,
178 BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
179 "BG_%d : In bescsi_get_boot_target\n");
180
John Soni Jose9aef4202012-08-20 23:00:08 +0530181 spin_lock(&ctrl->mbox_lock);
182 tag = alloc_mcc_tag(phba);
183 if (!tag) {
184 spin_unlock(&ctrl->mbox_lock);
185 return tag;
186 }
187
188 wrb = wrb_from_mccq(phba);
189 req = embedded_payload(wrb);
190 wrb->tag0 |= tag;
191 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
192 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
193 OPCODE_ISCSI_INI_DRIVER_REOPEN_ALL_SESSIONS,
194 sizeof(struct be_cmd_reopen_session_resp));
195
196 /* set the reopen_type,sess_handle */
197 req->reopen_type = reopen_type;
198 req->session_handle = sess_handle;
199
200 be_mcc_notify(phba);
201 spin_unlock(&ctrl->mbox_lock);
202 return tag;
203}
204
Mike Christie0e438952012-04-03 23:41:51 -0500205unsigned int mgmt_get_boot_target(struct beiscsi_hba *phba)
Jayamohan Kallickalc7acc5b2010-07-22 04:29:18 +0530206{
207 struct be_ctrl_info *ctrl = &phba->ctrl;
208 struct be_mcc_wrb *wrb;
Mike Christie0e438952012-04-03 23:41:51 -0500209 struct be_cmd_get_boot_target_req *req;
Jayamohan Kallickalc7acc5b2010-07-22 04:29:18 +0530210 unsigned int tag = 0;
211
John Soni Jose99bc5d52012-08-20 23:00:18 +0530212 beiscsi_log(phba, KERN_INFO,
213 BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
214 "BG_%d : In bescsi_get_boot_target\n");
215
Jayamohan Kallickalc7acc5b2010-07-22 04:29:18 +0530216 spin_lock(&ctrl->mbox_lock);
217 tag = alloc_mcc_tag(phba);
218 if (!tag) {
219 spin_unlock(&ctrl->mbox_lock);
220 return tag;
221 }
222
223 wrb = wrb_from_mccq(phba);
224 req = embedded_payload(wrb);
225 wrb->tag0 |= tag;
226 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
227 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
228 OPCODE_ISCSI_INI_BOOT_GET_BOOT_TARGET,
Mike Christie0e438952012-04-03 23:41:51 -0500229 sizeof(struct be_cmd_get_boot_target_resp));
Jayamohan Kallickalc7acc5b2010-07-22 04:29:18 +0530230
231 be_mcc_notify(phba);
232 spin_unlock(&ctrl->mbox_lock);
233 return tag;
234}
235
Mike Christie0e438952012-04-03 23:41:51 -0500236unsigned int mgmt_get_session_info(struct beiscsi_hba *phba,
237 u32 boot_session_handle,
238 struct be_dma_mem *nonemb_cmd)
Jayamohan Kallickalc7acc5b2010-07-22 04:29:18 +0530239{
240 struct be_ctrl_info *ctrl = &phba->ctrl;
241 struct be_mcc_wrb *wrb;
242 unsigned int tag = 0;
Mike Christie0e438952012-04-03 23:41:51 -0500243 struct be_cmd_get_session_req *req;
244 struct be_cmd_get_session_resp *resp;
Jayamohan Kallickalc7acc5b2010-07-22 04:29:18 +0530245 struct be_sge *sge;
246
John Soni Jose99bc5d52012-08-20 23:00:18 +0530247 beiscsi_log(phba, KERN_INFO,
248 BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
249 "BG_%d : In beiscsi_get_session_info\n");
250
Jayamohan Kallickalc7acc5b2010-07-22 04:29:18 +0530251 spin_lock(&ctrl->mbox_lock);
252 tag = alloc_mcc_tag(phba);
253 if (!tag) {
254 spin_unlock(&ctrl->mbox_lock);
255 return tag;
256 }
257
258 nonemb_cmd->size = sizeof(*resp);
259 req = nonemb_cmd->va;
260 memset(req, 0, sizeof(*req));
261 wrb = wrb_from_mccq(phba);
262 sge = nonembedded_sgl(wrb);
263 wrb->tag0 |= tag;
264
265
266 wrb->tag0 |= tag;
267 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
268 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
269 OPCODE_ISCSI_INI_SESSION_GET_A_SESSION,
270 sizeof(*resp));
271 req->session_handle = boot_session_handle;
272 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
273 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
274 sge->len = cpu_to_le32(nonemb_cmd->size);
275
276 be_mcc_notify(phba);
277 spin_unlock(&ctrl->mbox_lock);
278 return tag;
279}
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530280
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700281/**
282 * mgmt_get_fw_config()- Get the FW config for the function
283 * @ctrl: ptr to Ctrl Info
284 * @phba: ptr to the dev priv structure
285 *
286 * Get the FW config and resources available for the function.
287 * The resources are created based on the count received here.
288 *
289 * return
290 * Success: 0
291 * Failure: Non-Zero Value
292 **/
Jayamohan Kallickal03a12312010-07-22 04:17:16 +0530293int mgmt_get_fw_config(struct be_ctrl_info *ctrl,
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530294 struct beiscsi_hba *phba)
295{
296 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
297 struct be_fw_cfg *req = embedded_payload(wrb);
298 int status = 0;
299
300 spin_lock(&ctrl->mbox_lock);
301 memset(wrb, 0, sizeof(*wrb));
302
303 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
304
305 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700306 OPCODE_COMMON_QUERY_FIRMWARE_CONFIG,
307 EMBED_MBX_MAX_PAYLOAD_SIZE);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530308 status = be_mbox_notify(ctrl);
309 if (!status) {
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700310 uint8_t ulp_num = 0;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530311 struct be_fw_cfg *pfw_cfg;
312 pfw_cfg = req;
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700313
Jayamohan Kallickal68c26a32013-09-28 15:35:54 -0700314 if (!is_chip_be2_be3r(phba)) {
315 phba->fw_config.eqid_count = pfw_cfg->eqid_count;
316 phba->fw_config.cqid_count = pfw_cfg->cqid_count;
317
318 beiscsi_log(phba, KERN_INFO,
319 BEISCSI_LOG_INIT,
320 "BG_%d : EQ_Count : %d CQ_Count : %d\n",
321 phba->fw_config.eqid_count,
322 phba->fw_config.cqid_count);
323 }
324
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700325 for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++)
326 if (pfw_cfg->ulp[ulp_num].ulp_mode &
327 BEISCSI_ULP_ISCSI_INI_MODE)
328 set_bit(ulp_num,
Jayamohan Kallickal8a86e832013-09-28 15:35:45 -0700329 &phba->fw_config.ulp_supported);
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700330
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530331 phba->fw_config.phys_port = pfw_cfg->phys_port;
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700332 for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) {
333 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) {
334
335 phba->fw_config.iscsi_cid_start[ulp_num] =
336 pfw_cfg->ulp[ulp_num].sq_base;
337 phba->fw_config.iscsi_cid_count[ulp_num] =
338 pfw_cfg->ulp[ulp_num].sq_count;
339
340 phba->fw_config.iscsi_icd_start[ulp_num] =
341 pfw_cfg->ulp[ulp_num].icd_base;
342 phba->fw_config.iscsi_icd_count[ulp_num] =
343 pfw_cfg->ulp[ulp_num].icd_count;
344
345 phba->fw_config.iscsi_chain_start[ulp_num] =
346 pfw_cfg->chain_icd[ulp_num].chain_base;
347 phba->fw_config.iscsi_chain_count[ulp_num] =
348 pfw_cfg->chain_icd[ulp_num].chain_count;
349
350 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
351 "BG_%d : Function loaded on ULP : %d\n"
352 "\tiscsi_cid_count : %d\n"
353 "\t iscsi_icd_count : %d\n",
354 ulp_num,
355 phba->fw_config.
356 iscsi_cid_count[ulp_num],
357 phba->fw_config.
358 iscsi_icd_count[ulp_num]);
359 }
Jayamohan Kallickal7da50872010-01-05 05:04:12 +0530360 }
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700361
362 phba->fw_config.dual_ulp_aware = (pfw_cfg->function_mode &
363 BEISCSI_FUNC_DUA_MODE);
364
365 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
366 "BG_%d : DUA Mode : 0x%x\n",
367 phba->fw_config.dual_ulp_aware);
368
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530369 } else {
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700370 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
John Soni Jose99bc5d52012-08-20 23:00:18 +0530371 "BG_%d : Failed in mgmt_get_fw_config\n");
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700372 status = -EINVAL;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530373 }
374
375 spin_unlock(&ctrl->mbox_lock);
376 return status;
377}
378
Jayamohan Kallickal03a12312010-07-22 04:17:16 +0530379int mgmt_check_supported_fw(struct be_ctrl_info *ctrl,
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530380 struct beiscsi_hba *phba)
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530381{
382 struct be_dma_mem nonemb_cmd;
383 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
384 struct be_mgmt_controller_attributes *req;
385 struct be_sge *sge = nonembedded_sgl(wrb);
386 int status = 0;
387
388 nonemb_cmd.va = pci_alloc_consistent(ctrl->pdev,
389 sizeof(struct be_mgmt_controller_attributes),
390 &nonemb_cmd.dma);
391 if (nonemb_cmd.va == NULL) {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530392 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
393 "BG_%d : Failed to allocate memory for "
394 "mgmt_check_supported_fw\n");
Jayamohan Kallickald3ad2bb2010-07-22 04:16:38 +0530395 return -ENOMEM;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530396 }
397 nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes);
398 req = nonemb_cmd.va;
Jayamohan Kallickalf98c96b2010-02-11 05:11:15 +0530399 memset(req, 0, sizeof(*req));
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530400 spin_lock(&ctrl->mbox_lock);
401 memset(wrb, 0, sizeof(*wrb));
402 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
403 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
404 OPCODE_COMMON_GET_CNTL_ATTRIBUTES, sizeof(*req));
405 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd.dma));
406 sge->pa_lo = cpu_to_le32(nonemb_cmd.dma & 0xFFFFFFFF);
407 sge->len = cpu_to_le32(nonemb_cmd.size);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530408 status = be_mbox_notify(ctrl);
409 if (!status) {
410 struct be_mgmt_controller_attributes_resp *resp = nonemb_cmd.va;
John Soni Jose99bc5d52012-08-20 23:00:18 +0530411 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
412 "BG_%d : Firmware Version of CMD : %s\n"
413 "Firmware Version is : %s\n"
414 "Developer Build, not performing version check...\n",
415 resp->params.hba_attribs
416 .flashrom_version_string,
417 resp->params.hba_attribs.
418 firmware_version_string);
419
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530420 phba->fw_config.iscsi_features =
421 resp->params.hba_attribs.iscsi_features;
John Soni Jose99bc5d52012-08-20 23:00:18 +0530422 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
423 "BM_%d : phba->fw_config.iscsi_features = %d\n",
424 phba->fw_config.iscsi_features);
Jayamohan Kallickal22661e22013-04-05 20:38:28 -0700425 memcpy(phba->fw_ver_str, resp->params.hba_attribs.
426 firmware_version_string, BEISCSI_VER_STRLEN);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530427 } else
John Soni Jose99bc5d52012-08-20 23:00:18 +0530428 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
429 "BG_%d : Failed in mgmt_check_supported_fw\n");
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530430 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530431 if (nonemb_cmd.va)
432 pci_free_consistent(ctrl->pdev, nonemb_cmd.size,
433 nonemb_cmd.va, nonemb_cmd.dma);
434
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530435 return status;
436}
437
Jayamohan Kallickalffce3e22012-04-03 23:41:50 -0500438unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
439 struct beiscsi_hba *phba,
440 struct bsg_job *job,
441 struct be_dma_mem *nonemb_cmd)
442{
443 struct be_cmd_resp_hdr *resp;
444 struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
445 struct be_sge *mcc_sge = nonembedded_sgl(wrb);
446 unsigned int tag = 0;
447 struct iscsi_bsg_request *bsg_req = job->request;
448 struct be_bsg_vendor_cmd *req = nonemb_cmd->va;
449 unsigned short region, sector_size, sector, offset;
450
451 nonemb_cmd->size = job->request_payload.payload_len;
452 memset(nonemb_cmd->va, 0, nonemb_cmd->size);
453 resp = nonemb_cmd->va;
454 region = bsg_req->rqst_data.h_vendor.vendor_cmd[1];
455 sector_size = bsg_req->rqst_data.h_vendor.vendor_cmd[2];
456 sector = bsg_req->rqst_data.h_vendor.vendor_cmd[3];
457 offset = bsg_req->rqst_data.h_vendor.vendor_cmd[4];
458 req->region = region;
459 req->sector = sector;
460 req->offset = offset;
461 spin_lock(&ctrl->mbox_lock);
462 memset(wrb, 0, sizeof(*wrb));
463
464 switch (bsg_req->rqst_data.h_vendor.vendor_cmd[0]) {
465 case BEISCSI_WRITE_FLASH:
466 offset = sector * sector_size + offset;
467 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
468 OPCODE_COMMON_WRITE_FLASH, sizeof(*req));
469 sg_copy_to_buffer(job->request_payload.sg_list,
470 job->request_payload.sg_cnt,
471 nonemb_cmd->va + offset, job->request_len);
472 break;
473 case BEISCSI_READ_FLASH:
474 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
475 OPCODE_COMMON_READ_FLASH, sizeof(*req));
476 break;
477 default:
John Soni Jose99bc5d52012-08-20 23:00:18 +0530478 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
479 "BG_%d : Unsupported cmd = 0x%x\n\n",
480 bsg_req->rqst_data.h_vendor.vendor_cmd[0]);
481
Jayamohan Kallickalffce3e22012-04-03 23:41:50 -0500482 spin_unlock(&ctrl->mbox_lock);
483 return -ENOSYS;
484 }
485
486 tag = alloc_mcc_tag(phba);
487 if (!tag) {
488 spin_unlock(&ctrl->mbox_lock);
489 return tag;
490 }
491
492 be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false,
493 job->request_payload.sg_cnt);
494 mcc_sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
495 mcc_sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
496 mcc_sge->len = cpu_to_le32(nonemb_cmd->size);
497 wrb->tag0 |= tag;
498
499 be_mcc_notify(phba);
500
501 spin_unlock(&ctrl->mbox_lock);
502 return tag;
503}
504
Jayamohan Kallickalbd41c2b2013-09-28 15:35:51 -0700505/**
506 * mgmt_epfw_cleanup()- Inform FW to cleanup data structures.
507 * @phba: pointer to dev priv structure
508 * @ulp_num: ULP number.
509 *
510 * return
511 * Success: 0
512 * Failure: Non-Zero Value
513 **/
514int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short ulp_num)
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530515{
516 struct be_ctrl_info *ctrl = &phba->ctrl;
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530517 struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530518 struct iscsi_cleanup_req *req = embedded_payload(wrb);
519 int status = 0;
520
521 spin_lock(&ctrl->mbox_lock);
522 memset(wrb, 0, sizeof(*wrb));
523
524 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
525 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
526 OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req));
527
Jayamohan Kallickalbd41c2b2013-09-28 15:35:51 -0700528 req->chute = (1 << ulp_num);
529 req->hdr_ring_id = cpu_to_le16(HWI_GET_DEF_HDRQ_ID(phba, ulp_num));
530 req->data_ring_id = cpu_to_le16(HWI_GET_DEF_BUFQ_ID(phba, ulp_num));
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530531
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530532 status = be_mcc_notify_wait(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530533 if (status)
John Soni Jose99bc5d52012-08-20 23:00:18 +0530534 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT,
535 "BG_%d : mgmt_epfw_cleanup , FAILED\n");
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530536 spin_unlock(&ctrl->mbox_lock);
537 return status;
538}
539
Jayamohan Kallickal03a12312010-07-22 04:17:16 +0530540unsigned int mgmt_invalidate_icds(struct beiscsi_hba *phba,
Jayamohan Kallickal41831222010-02-20 08:02:39 +0530541 struct invalidate_command_table *inv_tbl,
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530542 unsigned int num_invalidate, unsigned int cid,
543 struct be_dma_mem *nonemb_cmd)
544
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530545{
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530546 struct be_ctrl_info *ctrl = &phba->ctrl;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530547 struct be_mcc_wrb *wrb;
548 struct be_sge *sge;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530549 struct invalidate_commands_params_in *req;
Jayamohan Kallickal41831222010-02-20 08:02:39 +0530550 unsigned int i, tag = 0;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530551
552 spin_lock(&ctrl->mbox_lock);
553 tag = alloc_mcc_tag(phba);
554 if (!tag) {
555 spin_unlock(&ctrl->mbox_lock);
556 return tag;
557 }
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530558
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530559 req = nonemb_cmd->va;
Jayamohan Kallickalf98c96b2010-02-11 05:11:15 +0530560 memset(req, 0, sizeof(*req));
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530561 wrb = wrb_from_mccq(phba);
562 sge = nonembedded_sgl(wrb);
563 wrb->tag0 |= tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530564
565 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
566 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
567 OPCODE_COMMON_ISCSI_ERROR_RECOVERY_INVALIDATE_COMMANDS,
568 sizeof(*req));
569 req->ref_handle = 0;
570 req->cleanup_type = CMD_ISCSI_COMMAND_INVALIDATE;
Jayamohan Kallickal41831222010-02-20 08:02:39 +0530571 for (i = 0; i < num_invalidate; i++) {
572 req->table[i].icd = inv_tbl->icd;
573 req->table[i].cid = inv_tbl->cid;
574 req->icd_count++;
575 inv_tbl++;
576 }
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530577 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
578 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
579 sge->len = cpu_to_le32(nonemb_cmd->size);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530580
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530581 be_mcc_notify(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530582 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530583 return tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530584}
585
Jayamohan Kallickal03a12312010-07-22 04:17:16 +0530586unsigned int mgmt_invalidate_connection(struct beiscsi_hba *phba,
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530587 struct beiscsi_endpoint *beiscsi_ep,
588 unsigned short cid,
589 unsigned short issue_reset,
590 unsigned short savecfg_flag)
591{
592 struct be_ctrl_info *ctrl = &phba->ctrl;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530593 struct be_mcc_wrb *wrb;
594 struct iscsi_invalidate_connection_params_in *req;
595 unsigned int tag = 0;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530596
597 spin_lock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530598 tag = alloc_mcc_tag(phba);
599 if (!tag) {
600 spin_unlock(&ctrl->mbox_lock);
601 return tag;
602 }
603 wrb = wrb_from_mccq(phba);
604 wrb->tag0 |= tag;
605 req = embedded_payload(wrb);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530606
607 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
608 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
609 OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION,
610 sizeof(*req));
611 req->session_handle = beiscsi_ep->fw_handle;
612 req->cid = cid;
613 if (issue_reset)
614 req->cleanup_type = CMD_ISCSI_CONNECTION_ISSUE_TCP_RST;
615 else
616 req->cleanup_type = CMD_ISCSI_CONNECTION_INVALIDATE;
617 req->save_cfg = savecfg_flag;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530618 be_mcc_notify(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530619 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530620 return tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530621}
622
Jayamohan Kallickal03a12312010-07-22 04:17:16 +0530623unsigned int mgmt_upload_connection(struct beiscsi_hba *phba,
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530624 unsigned short cid, unsigned int upload_flag)
625{
626 struct be_ctrl_info *ctrl = &phba->ctrl;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530627 struct be_mcc_wrb *wrb;
628 struct tcp_upload_params_in *req;
629 unsigned int tag = 0;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530630
631 spin_lock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530632 tag = alloc_mcc_tag(phba);
633 if (!tag) {
634 spin_unlock(&ctrl->mbox_lock);
635 return tag;
636 }
637 wrb = wrb_from_mccq(phba);
638 req = embedded_payload(wrb);
639 wrb->tag0 |= tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530640
641 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
642 be_cmd_hdr_prepare(&req->hdr, CMD_COMMON_TCP_UPLOAD,
643 OPCODE_COMMON_TCP_UPLOAD, sizeof(*req));
644 req->id = (unsigned short)cid;
645 req->upload_type = (unsigned char)upload_flag;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530646 be_mcc_notify(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530647 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530648 return tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530649}
650
Jayamohan Kallickal1e4be6f2013-09-28 15:35:50 -0700651/**
652 * mgmt_open_connection()- Establish a TCP CXN
653 * @dst_addr: Destination Address
654 * @beiscsi_ep: ptr to device endpoint struct
655 * @nonemb_cmd: ptr to memory allocated for command
656 *
657 * return
658 * Success: Tag number of the MBX Command issued
659 * Failure: Error code
660 **/
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530661int mgmt_open_connection(struct beiscsi_hba *phba,
662 struct sockaddr *dst_addr,
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530663 struct beiscsi_endpoint *beiscsi_ep,
664 struct be_dma_mem *nonemb_cmd)
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530665{
666 struct hwi_controller *phwi_ctrlr;
667 struct hwi_context_memory *phwi_context;
668 struct sockaddr_in *daddr_in = (struct sockaddr_in *)dst_addr;
669 struct sockaddr_in6 *daddr_in6 = (struct sockaddr_in6 *)dst_addr;
670 struct be_ctrl_info *ctrl = &phba->ctrl;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530671 struct be_mcc_wrb *wrb;
672 struct tcp_connect_and_offload_in *req;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530673 unsigned short def_hdr_id;
674 unsigned short def_data_id;
675 struct phys_addr template_address = { 0, 0 };
676 struct phys_addr *ptemplate_address;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530677 unsigned int tag = 0;
Jayamohan Kallickal1e4be6f2013-09-28 15:35:50 -0700678 unsigned int i, ulp_num;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530679 unsigned short cid = beiscsi_ep->ep_cid;
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530680 struct be_sge *sge;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530681
682 phwi_ctrlr = phba->phwi_ctrlr;
683 phwi_context = phwi_ctrlr->phwi_ctxt;
Jayamohan Kallickal1e4be6f2013-09-28 15:35:50 -0700684
685 ulp_num = phwi_ctrlr->wrb_context[BE_GET_CRI_FROM_CID(cid)].ulp_num;
686
687 def_hdr_id = (unsigned short)HWI_GET_DEF_HDRQ_ID(phba, ulp_num);
688 def_data_id = (unsigned short)HWI_GET_DEF_BUFQ_ID(phba, ulp_num);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530689
690 ptemplate_address = &template_address;
691 ISCSI_GET_PDU_TEMPLATE_ADDRESS(phba, ptemplate_address);
692 spin_lock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530693 tag = alloc_mcc_tag(phba);
694 if (!tag) {
695 spin_unlock(&ctrl->mbox_lock);
696 return tag;
697 }
698 wrb = wrb_from_mccq(phba);
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530699 memset(wrb, 0, sizeof(*wrb));
700 sge = nonembedded_sgl(wrb);
701
702 req = nonemb_cmd->va;
703 memset(req, 0, sizeof(*req));
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530704 wrb->tag0 |= tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530705
Jayamohan Kallickalb15d05b2010-08-12 23:36:06 +0530706 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530707 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
708 OPCODE_COMMON_ISCSI_TCP_CONNECT_AND_OFFLOAD,
709 sizeof(*req));
710 if (dst_addr->sa_family == PF_INET) {
711 __be32 s_addr = daddr_in->sin_addr.s_addr;
712 req->ip_address.ip_type = BE2_IPV4;
Mike Christie0e438952012-04-03 23:41:51 -0500713 req->ip_address.addr[0] = s_addr & 0x000000ff;
714 req->ip_address.addr[1] = (s_addr & 0x0000ff00) >> 8;
715 req->ip_address.addr[2] = (s_addr & 0x00ff0000) >> 16;
716 req->ip_address.addr[3] = (s_addr & 0xff000000) >> 24;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530717 req->tcp_port = ntohs(daddr_in->sin_port);
718 beiscsi_ep->dst_addr = daddr_in->sin_addr.s_addr;
719 beiscsi_ep->dst_tcpport = ntohs(daddr_in->sin_port);
720 beiscsi_ep->ip_type = BE2_IPV4;
721 } else if (dst_addr->sa_family == PF_INET6) {
722 req->ip_address.ip_type = BE2_IPV6;
Mike Christie0e438952012-04-03 23:41:51 -0500723 memcpy(&req->ip_address.addr,
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530724 &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
725 req->tcp_port = ntohs(daddr_in6->sin6_port);
726 beiscsi_ep->dst_tcpport = ntohs(daddr_in6->sin6_port);
727 memcpy(&beiscsi_ep->dst6_addr,
728 &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
729 beiscsi_ep->ip_type = BE2_IPV6;
730 } else{
John Soni Jose99bc5d52012-08-20 23:00:18 +0530731 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
732 "BG_%d : unknown addr family %d\n",
733 dst_addr->sa_family);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530734 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal5db3f332010-07-22 04:24:22 +0530735 free_mcc_tag(&phba->ctrl, tag);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530736 return -EINVAL;
737
738 }
739 req->cid = cid;
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530740 i = phba->nxt_cqid++;
741 if (phba->nxt_cqid == phba->num_cpus)
742 phba->nxt_cqid = 0;
743 req->cq_id = phwi_context->be_cq[i].id;
John Soni Jose99bc5d52012-08-20 23:00:18 +0530744 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG,
745 "BG_%d : i=%d cq_id=%d\n", i, req->cq_id);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530746 req->defq_id = def_hdr_id;
747 req->hdr_ring_id = def_hdr_id;
748 req->data_ring_id = def_data_id;
749 req->do_offload = 1;
750 req->dataout_template_pa.lo = ptemplate_address->lo;
751 req->dataout_template_pa.hi = ptemplate_address->hi;
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530752 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
753 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
754 sge->len = cpu_to_le32(nonemb_cmd->size);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530755 be_mcc_notify(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530756 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530757 return tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530758}
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530759
Mike Christie0e438952012-04-03 23:41:51 -0500760unsigned int mgmt_get_all_if_id(struct beiscsi_hba *phba)
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530761{
762 struct be_ctrl_info *ctrl = &phba->ctrl;
Mike Christie0e438952012-04-03 23:41:51 -0500763 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
764 struct be_cmd_get_all_if_id_req *req = embedded_payload(wrb);
765 struct be_cmd_get_all_if_id_req *pbe_allid = req;
766 int status = 0;
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530767
Mike Christie0e438952012-04-03 23:41:51 -0500768 memset(wrb, 0, sizeof(*wrb));
769
770 spin_lock(&ctrl->mbox_lock);
771
772 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
773 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
774 OPCODE_COMMON_ISCSI_NTWK_GET_ALL_IF_ID,
775 sizeof(*req));
776 status = be_mbox_notify(ctrl);
777 if (!status)
778 phba->interface_handle = pbe_allid->if_hndl_list[0];
779 else {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530780 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
781 "BG_%d : Failed in mgmt_get_all_if_id\n");
Mike Christie0e438952012-04-03 23:41:51 -0500782 }
783 spin_unlock(&ctrl->mbox_lock);
784
785 return status;
786}
787
John Soni Josee175def2012-10-20 04:45:40 +0530788/*
789 * mgmt_exec_nonemb_cmd()- Execute Non Embedded MBX Cmd
790 * @phba: Driver priv structure
791 * @nonemb_cmd: Address of the MBX command issued
792 * @resp_buf: Buffer to copy the MBX cmd response
793 * @resp_buf_len: respone lenght to be copied
794 *
795 **/
Mike Christie0e438952012-04-03 23:41:51 -0500796static int mgmt_exec_nonemb_cmd(struct beiscsi_hba *phba,
797 struct be_dma_mem *nonemb_cmd, void *resp_buf,
798 int resp_buf_len)
799{
800 struct be_ctrl_info *ctrl = &phba->ctrl;
801 struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
Mike Christie0e438952012-04-03 23:41:51 -0500802 struct be_sge *sge;
803 unsigned int tag;
804 int rc = 0;
805
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530806 spin_lock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530807 tag = alloc_mcc_tag(phba);
808 if (!tag) {
809 spin_unlock(&ctrl->mbox_lock);
Mike Christie0e438952012-04-03 23:41:51 -0500810 rc = -ENOMEM;
811 goto free_cmd;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530812 }
Mike Christie0e438952012-04-03 23:41:51 -0500813 memset(wrb, 0, sizeof(*wrb));
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530814 wrb->tag0 |= tag;
Mike Christie0e438952012-04-03 23:41:51 -0500815 sge = nonembedded_sgl(wrb);
816
817 be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false, 1);
818 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
John Soni Josee175def2012-10-20 04:45:40 +0530819 sge->pa_lo = cpu_to_le32(lower_32_bits(nonemb_cmd->dma));
Mike Christie0e438952012-04-03 23:41:51 -0500820 sge->len = cpu_to_le32(nonemb_cmd->size);
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530821
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530822 be_mcc_notify(phba);
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530823 spin_unlock(&ctrl->mbox_lock);
Mike Christie0e438952012-04-03 23:41:51 -0500824
John Soni Josee175def2012-10-20 04:45:40 +0530825 rc = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd->va);
826 if (rc) {
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -0700827 /* Check if the IOCTL needs to be re-issued */
828 if (rc == -EAGAIN)
829 return rc;
830
John Soni Jose99bc5d52012-08-20 23:00:18 +0530831 beiscsi_log(phba, KERN_ERR,
832 BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
John Soni Josee175def2012-10-20 04:45:40 +0530833 "BG_%d : mgmt_exec_nonemb_cmd Failed status\n");
834
John Soni Josee175def2012-10-20 04:45:40 +0530835 goto free_cmd;
Mike Christie0e438952012-04-03 23:41:51 -0500836 }
837
838 if (resp_buf)
839 memcpy(resp_buf, nonemb_cmd->va, resp_buf_len);
840
Mike Christie0e438952012-04-03 23:41:51 -0500841free_cmd:
842 pci_free_consistent(ctrl->pdev, nonemb_cmd->size,
843 nonemb_cmd->va, nonemb_cmd->dma);
844 return rc;
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530845}
846
Mike Christie0e438952012-04-03 23:41:51 -0500847static int mgmt_alloc_cmd_data(struct beiscsi_hba *phba, struct be_dma_mem *cmd,
848 int iscsi_cmd, int size)
849{
Mike Christieb83d5432012-05-23 20:40:54 -0500850 cmd->va = pci_alloc_consistent(phba->ctrl.pdev, size, &cmd->dma);
Mike Christie0e438952012-04-03 23:41:51 -0500851 if (!cmd->va) {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530852 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
853 "BG_%d : Failed to allocate memory for if info\n");
Mike Christie0e438952012-04-03 23:41:51 -0500854 return -ENOMEM;
855 }
Mike Christieb83d5432012-05-23 20:40:54 -0500856 memset(cmd->va, 0, size);
Mike Christie0e438952012-04-03 23:41:51 -0500857 cmd->size = size;
858 be_cmd_hdr_prepare(cmd->va, CMD_SUBSYSTEM_ISCSI, iscsi_cmd, size);
859 return 0;
860}
861
862static int
863mgmt_static_ip_modify(struct beiscsi_hba *phba,
864 struct be_cmd_get_if_info_resp *if_info,
865 struct iscsi_iface_param_info *ip_param,
866 struct iscsi_iface_param_info *subnet_param,
867 uint32_t ip_action)
868{
869 struct be_cmd_set_ip_addr_req *req;
870 struct be_dma_mem nonemb_cmd;
871 uint32_t ip_type;
872 int rc;
873
874 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
875 OPCODE_COMMON_ISCSI_NTWK_MODIFY_IP_ADDR,
876 sizeof(*req));
877 if (rc)
878 return rc;
879
880 ip_type = (ip_param->param == ISCSI_NET_PARAM_IPV6_ADDR) ?
881 BE2_IPV6 : BE2_IPV4 ;
882
883 req = nonemb_cmd.va;
884 req->ip_params.record_entry_count = 1;
885 req->ip_params.ip_record.action = ip_action;
886 req->ip_params.ip_record.interface_hndl =
887 phba->interface_handle;
888 req->ip_params.ip_record.ip_addr.size_of_structure =
889 sizeof(struct be_ip_addr_subnet_format);
890 req->ip_params.ip_record.ip_addr.ip_type = ip_type;
891
892 if (ip_action == IP_ACTION_ADD) {
893 memcpy(req->ip_params.ip_record.ip_addr.addr, ip_param->value,
894 ip_param->len);
895
896 if (subnet_param)
897 memcpy(req->ip_params.ip_record.ip_addr.subnet_mask,
898 subnet_param->value, subnet_param->len);
899 } else {
900 memcpy(req->ip_params.ip_record.ip_addr.addr,
901 if_info->ip_addr.addr, ip_param->len);
902
903 memcpy(req->ip_params.ip_record.ip_addr.subnet_mask,
904 if_info->ip_addr.subnet_mask, ip_param->len);
905 }
906
907 rc = mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
908 if (rc < 0)
John Soni Jose99bc5d52012-08-20 23:00:18 +0530909 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
910 "BG_%d : Failed to Modify existing IP Address\n");
Mike Christie0e438952012-04-03 23:41:51 -0500911 return rc;
912}
913
914static int mgmt_modify_gateway(struct beiscsi_hba *phba, uint8_t *gt_addr,
915 uint32_t gtway_action, uint32_t param_len)
916{
917 struct be_cmd_set_def_gateway_req *req;
918 struct be_dma_mem nonemb_cmd;
919 int rt_val;
920
921
922 rt_val = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
923 OPCODE_COMMON_ISCSI_NTWK_MODIFY_DEFAULT_GATEWAY,
924 sizeof(*req));
925 if (rt_val)
926 return rt_val;
927
928 req = nonemb_cmd.va;
929 req->action = gtway_action;
930 req->ip_addr.ip_type = BE2_IPV4;
931
932 memcpy(req->ip_addr.addr, gt_addr, param_len);
933
934 return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
935}
936
937int mgmt_set_ip(struct beiscsi_hba *phba,
938 struct iscsi_iface_param_info *ip_param,
939 struct iscsi_iface_param_info *subnet_param,
940 uint32_t boot_proto)
941{
942 struct be_cmd_get_def_gateway_resp gtway_addr_set;
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -0700943 struct be_cmd_get_if_info_resp *if_info;
Mike Christie0e438952012-04-03 23:41:51 -0500944 struct be_cmd_set_dhcp_req *dhcpreq;
945 struct be_cmd_rel_dhcp_req *reldhcp;
946 struct be_dma_mem nonemb_cmd;
947 uint8_t *gtway_addr;
948 uint32_t ip_type;
949 int rc;
950
951 if (mgmt_get_all_if_id(phba))
952 return -EIO;
953
Mike Christie0e438952012-04-03 23:41:51 -0500954 ip_type = (ip_param->param == ISCSI_NET_PARAM_IPV6_ADDR) ?
955 BE2_IPV6 : BE2_IPV4 ;
956
957 rc = mgmt_get_if_info(phba, ip_type, &if_info);
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -0700958 if (rc) {
959 kfree(if_info);
Mike Christie0e438952012-04-03 23:41:51 -0500960 return rc;
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -0700961 }
Mike Christie0e438952012-04-03 23:41:51 -0500962
963 if (boot_proto == ISCSI_BOOTPROTO_DHCP) {
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -0700964 if (if_info->dhcp_state) {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530965 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
966 "BG_%d : DHCP Already Enabled\n");
Mike Christie0e438952012-04-03 23:41:51 -0500967 return 0;
968 }
969 /* The ip_param->len is 1 in DHCP case. Setting
970 proper IP len as this it is used while
971 freeing the Static IP.
972 */
973 ip_param->len = (ip_param->param == ISCSI_NET_PARAM_IPV6_ADDR) ?
974 IP_V6_LEN : IP_V4_LEN;
975
976 } else {
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -0700977 if (if_info->dhcp_state) {
Mike Christie0e438952012-04-03 23:41:51 -0500978
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -0700979 memset(if_info, 0, sizeof(*if_info));
Mike Christie0e438952012-04-03 23:41:51 -0500980 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
981 OPCODE_COMMON_ISCSI_NTWK_REL_STATELESS_IP_ADDR,
982 sizeof(*reldhcp));
983
984 if (rc)
985 return rc;
986
987 reldhcp = nonemb_cmd.va;
988 reldhcp->interface_hndl = phba->interface_handle;
989 reldhcp->ip_type = ip_type;
990
991 rc = mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
992 if (rc < 0) {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530993 beiscsi_log(phba, KERN_WARNING,
994 BEISCSI_LOG_CONFIG,
995 "BG_%d : Failed to Delete existing dhcp\n");
Mike Christie0e438952012-04-03 23:41:51 -0500996 return rc;
997 }
998 }
999 }
1000
1001 /* Delete the Static IP Set */
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -07001002 if (if_info->ip_addr.addr[0]) {
1003 rc = mgmt_static_ip_modify(phba, if_info, ip_param, NULL,
Mike Christie0e438952012-04-03 23:41:51 -05001004 IP_ACTION_DEL);
1005 if (rc)
1006 return rc;
1007 }
1008
1009 /* Delete the Gateway settings if mode change is to DHCP */
1010 if (boot_proto == ISCSI_BOOTPROTO_DHCP) {
1011 memset(&gtway_addr_set, 0, sizeof(gtway_addr_set));
1012 rc = mgmt_get_gateway(phba, BE2_IPV4, &gtway_addr_set);
1013 if (rc) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301014 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1015 "BG_%d : Failed to Get Gateway Addr\n");
Mike Christie0e438952012-04-03 23:41:51 -05001016 return rc;
1017 }
1018
1019 if (gtway_addr_set.ip_addr.addr[0]) {
1020 gtway_addr = (uint8_t *)&gtway_addr_set.ip_addr.addr;
1021 rc = mgmt_modify_gateway(phba, gtway_addr,
1022 IP_ACTION_DEL, IP_V4_LEN);
1023
1024 if (rc) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301025 beiscsi_log(phba, KERN_WARNING,
1026 BEISCSI_LOG_CONFIG,
1027 "BG_%d : Failed to clear Gateway Addr Set\n");
Mike Christie0e438952012-04-03 23:41:51 -05001028 return rc;
1029 }
1030 }
1031 }
1032
1033 /* Set Adapter to DHCP/Static Mode */
1034 if (boot_proto == ISCSI_BOOTPROTO_DHCP) {
1035 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1036 OPCODE_COMMON_ISCSI_NTWK_CONFIG_STATELESS_IP_ADDR,
1037 sizeof(*dhcpreq));
1038 if (rc)
1039 return rc;
1040
1041 dhcpreq = nonemb_cmd.va;
1042 dhcpreq->flags = BLOCKING;
1043 dhcpreq->retry_count = 1;
1044 dhcpreq->interface_hndl = phba->interface_handle;
1045 dhcpreq->ip_type = BE2_DHCP_V4;
1046
1047 return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
1048 } else {
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -07001049 return mgmt_static_ip_modify(phba, if_info, ip_param,
Mike Christie0e438952012-04-03 23:41:51 -05001050 subnet_param, IP_ACTION_ADD);
1051 }
1052
1053 return rc;
1054}
1055
1056int mgmt_set_gateway(struct beiscsi_hba *phba,
1057 struct iscsi_iface_param_info *gateway_param)
1058{
1059 struct be_cmd_get_def_gateway_resp gtway_addr_set;
1060 uint8_t *gtway_addr;
1061 int rt_val;
1062
1063 memset(&gtway_addr_set, 0, sizeof(gtway_addr_set));
1064 rt_val = mgmt_get_gateway(phba, BE2_IPV4, &gtway_addr_set);
1065 if (rt_val) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301066 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1067 "BG_%d : Failed to Get Gateway Addr\n");
Mike Christie0e438952012-04-03 23:41:51 -05001068 return rt_val;
1069 }
1070
1071 if (gtway_addr_set.ip_addr.addr[0]) {
1072 gtway_addr = (uint8_t *)&gtway_addr_set.ip_addr.addr;
1073 rt_val = mgmt_modify_gateway(phba, gtway_addr, IP_ACTION_DEL,
1074 gateway_param->len);
1075 if (rt_val) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301076 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1077 "BG_%d : Failed to clear Gateway Addr Set\n");
Mike Christie0e438952012-04-03 23:41:51 -05001078 return rt_val;
1079 }
1080 }
1081
1082 gtway_addr = (uint8_t *)&gateway_param->value;
1083 rt_val = mgmt_modify_gateway(phba, gtway_addr, IP_ACTION_ADD,
1084 gateway_param->len);
1085
1086 if (rt_val)
John Soni Jose99bc5d52012-08-20 23:00:18 +05301087 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1088 "BG_%d : Failed to Set Gateway Addr\n");
Mike Christie0e438952012-04-03 23:41:51 -05001089
1090 return rt_val;
1091}
1092
1093int mgmt_get_gateway(struct beiscsi_hba *phba, int ip_type,
1094 struct be_cmd_get_def_gateway_resp *gateway)
1095{
1096 struct be_cmd_get_def_gateway_req *req;
1097 struct be_dma_mem nonemb_cmd;
1098 int rc;
1099
1100 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1101 OPCODE_COMMON_ISCSI_NTWK_GET_DEFAULT_GATEWAY,
1102 sizeof(*gateway));
1103 if (rc)
1104 return rc;
1105
1106 req = nonemb_cmd.va;
1107 req->ip_type = ip_type;
1108
1109 return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, gateway,
1110 sizeof(*gateway));
1111}
1112
1113int mgmt_get_if_info(struct beiscsi_hba *phba, int ip_type,
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -07001114 struct be_cmd_get_if_info_resp **if_info)
Mike Christie0e438952012-04-03 23:41:51 -05001115{
1116 struct be_cmd_get_if_info_req *req;
1117 struct be_dma_mem nonemb_cmd;
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -07001118 uint32_t ioctl_size = sizeof(struct be_cmd_get_if_info_resp);
Mike Christie0e438952012-04-03 23:41:51 -05001119 int rc;
1120
1121 if (mgmt_get_all_if_id(phba))
1122 return -EIO;
1123
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -07001124 do {
1125 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1126 OPCODE_COMMON_ISCSI_NTWK_GET_IF_INFO,
1127 ioctl_size);
1128 if (rc)
1129 return rc;
Mike Christie0e438952012-04-03 23:41:51 -05001130
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -07001131 req = nonemb_cmd.va;
1132 req->interface_hndl = phba->interface_handle;
1133 req->ip_type = ip_type;
Mike Christie0e438952012-04-03 23:41:51 -05001134
Jayamohan Kallickal1f536d42013-09-28 15:35:56 -07001135 /* Allocate memory for if_info */
1136 *if_info = kzalloc(ioctl_size, GFP_KERNEL);
1137 if (!*if_info) {
1138 beiscsi_log(phba, KERN_ERR,
1139 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1140 "BG_%d : Memory Allocation Failure\n");
1141
1142 /* Free the DMA memory for the IOCTL issuing */
1143 pci_free_consistent(phba->ctrl.pdev,
1144 nonemb_cmd.size,
1145 nonemb_cmd.va,
1146 nonemb_cmd.dma);
1147 return -ENOMEM;
1148 }
1149
1150 rc = mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, *if_info,
1151 ioctl_size);
1152
1153 /* Check if the error is because of Insufficent_Buffer */
1154 if (rc == -EAGAIN) {
1155
1156 /* Get the new memory size */
1157 ioctl_size = ((struct be_cmd_resp_hdr *)
1158 nonemb_cmd.va)->actual_resp_len;
1159 ioctl_size += sizeof(struct be_cmd_req_hdr);
1160
1161 /* Free the previous allocated DMA memory */
1162 pci_free_consistent(phba->ctrl.pdev, nonemb_cmd.size,
1163 nonemb_cmd.va,
1164 nonemb_cmd.dma);
1165
1166 /* Free the virtual memory */
1167 kfree(*if_info);
1168 } else
1169 break;
1170 } while (true);
1171 return rc;
Mike Christie0e438952012-04-03 23:41:51 -05001172}
1173
1174int mgmt_get_nic_conf(struct beiscsi_hba *phba,
1175 struct be_cmd_get_nic_conf_resp *nic)
1176{
1177 struct be_dma_mem nonemb_cmd;
1178 int rc;
1179
1180 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1181 OPCODE_COMMON_ISCSI_NTWK_GET_NIC_CONFIG,
1182 sizeof(*nic));
1183 if (rc)
1184 return rc;
1185
1186 return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, nic, sizeof(*nic));
1187}
1188
1189
1190
John Soni Jose21771992012-04-03 23:41:49 -05001191unsigned int be_cmd_get_initname(struct beiscsi_hba *phba)
1192{
1193 unsigned int tag = 0;
1194 struct be_mcc_wrb *wrb;
1195 struct be_cmd_hba_name *req;
1196 struct be_ctrl_info *ctrl = &phba->ctrl;
1197
1198 spin_lock(&ctrl->mbox_lock);
1199 tag = alloc_mcc_tag(phba);
1200 if (!tag) {
1201 spin_unlock(&ctrl->mbox_lock);
1202 return tag;
1203 }
1204
1205 wrb = wrb_from_mccq(phba);
1206 req = embedded_payload(wrb);
1207 wrb->tag0 |= tag;
1208 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1209 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
1210 OPCODE_ISCSI_INI_CFG_GET_HBA_NAME,
1211 sizeof(*req));
1212
1213 be_mcc_notify(phba);
1214 spin_unlock(&ctrl->mbox_lock);
1215 return tag;
1216}
John Soni Josec62eef02012-04-03 23:41:52 -05001217
1218unsigned int be_cmd_get_port_speed(struct beiscsi_hba *phba)
1219{
1220 unsigned int tag = 0;
1221 struct be_mcc_wrb *wrb;
1222 struct be_cmd_ntwk_link_status_req *req;
1223 struct be_ctrl_info *ctrl = &phba->ctrl;
1224
1225 spin_lock(&ctrl->mbox_lock);
1226 tag = alloc_mcc_tag(phba);
1227 if (!tag) {
1228 spin_unlock(&ctrl->mbox_lock);
1229 return tag;
1230 }
1231
1232 wrb = wrb_from_mccq(phba);
1233 req = embedded_payload(wrb);
1234 wrb->tag0 |= tag;
1235 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1236 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1237 OPCODE_COMMON_NTWK_LINK_STATUS_QUERY,
1238 sizeof(*req));
1239
1240 be_mcc_notify(phba);
1241 spin_unlock(&ctrl->mbox_lock);
1242 return tag;
1243}
John Soni Jose9aef4202012-08-20 23:00:08 +05301244
1245/**
1246 * be_mgmt_get_boot_shandle()- Get the session handle
1247 * @phba: device priv structure instance
1248 * @s_handle: session handle returned for boot session.
1249 *
1250 * Get the boot target session handle. In case of
1251 * crashdump mode driver has to issue and MBX Cmd
1252 * for FW to login to boot target
1253 *
1254 * return
1255 * Success: 0
1256 * Failure: Non-Zero value
1257 *
1258 **/
1259int be_mgmt_get_boot_shandle(struct beiscsi_hba *phba,
1260 unsigned int *s_handle)
1261{
1262 struct be_cmd_get_boot_target_resp *boot_resp;
1263 struct be_mcc_wrb *wrb;
John Soni Josee175def2012-10-20 04:45:40 +05301264 unsigned int tag;
John Soni Jose9aef4202012-08-20 23:00:08 +05301265 uint8_t boot_retry = 3;
John Soni Josee175def2012-10-20 04:45:40 +05301266 int rc;
John Soni Jose9aef4202012-08-20 23:00:08 +05301267
1268 do {
1269 /* Get the Boot Target Session Handle and Count*/
1270 tag = mgmt_get_boot_target(phba);
1271 if (!tag) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301272 beiscsi_log(phba, KERN_ERR,
1273 BEISCSI_LOG_CONFIG | BEISCSI_LOG_INIT,
1274 "BG_%d : Getting Boot Target Info Failed\n");
John Soni Jose9aef4202012-08-20 23:00:08 +05301275 return -EAGAIN;
John Soni Josee175def2012-10-20 04:45:40 +05301276 }
John Soni Jose9aef4202012-08-20 23:00:08 +05301277
John Soni Josee175def2012-10-20 04:45:40 +05301278 rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
1279 if (rc) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301280 beiscsi_log(phba, KERN_ERR,
1281 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
John Soni Josee175def2012-10-20 04:45:40 +05301282 "BG_%d : MBX CMD get_boot_target Failed\n");
John Soni Jose9aef4202012-08-20 23:00:08 +05301283 return -EBUSY;
1284 }
John Soni Josee175def2012-10-20 04:45:40 +05301285
John Soni Jose9aef4202012-08-20 23:00:08 +05301286 boot_resp = embedded_payload(wrb);
1287
1288 /* Check if the there are any Boot targets configured */
1289 if (!boot_resp->boot_session_count) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301290 beiscsi_log(phba, KERN_INFO,
1291 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1292 "BG_%d ;No boot targets configured\n");
John Soni Jose9aef4202012-08-20 23:00:08 +05301293 return -ENXIO;
1294 }
1295
1296 /* FW returns the session handle of the boot session */
1297 if (boot_resp->boot_session_handle != INVALID_SESS_HANDLE) {
1298 *s_handle = boot_resp->boot_session_handle;
1299 return 0;
1300 }
1301
1302 /* Issue MBX Cmd to FW to login to the boot target */
1303 tag = mgmt_reopen_session(phba, BE_REOPEN_BOOT_SESSIONS,
1304 INVALID_SESS_HANDLE);
1305 if (!tag) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301306 beiscsi_log(phba, KERN_ERR,
1307 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1308 "BG_%d : mgmt_reopen_session Failed\n");
John Soni Jose9aef4202012-08-20 23:00:08 +05301309 return -EAGAIN;
John Soni Josee175def2012-10-20 04:45:40 +05301310 }
John Soni Jose9aef4202012-08-20 23:00:08 +05301311
John Soni Josee175def2012-10-20 04:45:40 +05301312 rc = beiscsi_mccq_compl(phba, tag, NULL, NULL);
1313 if (rc) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301314 beiscsi_log(phba, KERN_ERR,
1315 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
John Soni Josee175def2012-10-20 04:45:40 +05301316 "BG_%d : mgmt_reopen_session Failed");
1317 return rc;
John Soni Jose9aef4202012-08-20 23:00:08 +05301318 }
John Soni Jose9aef4202012-08-20 23:00:08 +05301319 } while (--boot_retry);
1320
1321 /* Couldn't log into the boot target */
John Soni Jose99bc5d52012-08-20 23:00:18 +05301322 beiscsi_log(phba, KERN_ERR,
1323 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1324 "BG_%d : Login to Boot Target Failed\n");
John Soni Jose9aef4202012-08-20 23:00:08 +05301325 return -ENXIO;
1326}
John Soni Jose6f722382012-08-20 23:00:43 +05301327
1328/**
1329 * mgmt_set_vlan()- Issue and wait for CMD completion
1330 * @phba: device private structure instance
1331 * @vlan_tag: VLAN tag
1332 *
1333 * Issue the MBX Cmd and wait for the completion of the
1334 * command.
1335 *
1336 * returns
1337 * Success: 0
1338 * Failure: Non-Xero Value
1339 **/
1340int mgmt_set_vlan(struct beiscsi_hba *phba,
1341 uint16_t vlan_tag)
1342{
John Soni Josee175def2012-10-20 04:45:40 +05301343 int rc;
1344 unsigned int tag;
1345 struct be_mcc_wrb *wrb = NULL;
John Soni Jose6f722382012-08-20 23:00:43 +05301346
1347 tag = be_cmd_set_vlan(phba, vlan_tag);
1348 if (!tag) {
1349 beiscsi_log(phba, KERN_ERR,
1350 (BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX),
1351 "BG_%d : VLAN Setting Failed\n");
1352 return -EBUSY;
John Soni Jose6f722382012-08-20 23:00:43 +05301353 }
1354
John Soni Josee175def2012-10-20 04:45:40 +05301355 rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
1356 if (rc) {
1357 beiscsi_log(phba, KERN_ERR,
1358 (BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX),
1359 "BS_%d : VLAN MBX Cmd Failed\n");
1360 return rc;
1361 }
1362 return rc;
John Soni Jose6f722382012-08-20 23:00:43 +05301363}
John Soni Jose5cac7592012-10-20 04:42:25 +05301364
1365/**
1366 * beiscsi_drvr_ver_disp()- Display the driver Name and Version
1367 * @dev: ptr to device not used.
1368 * @attr: device attribute, not used.
1369 * @buf: contains formatted text driver name and version
1370 *
1371 * return
1372 * size of the formatted string
1373 **/
1374ssize_t
1375beiscsi_drvr_ver_disp(struct device *dev, struct device_attribute *attr,
1376 char *buf)
1377{
1378 return snprintf(buf, PAGE_SIZE, BE_NAME "\n");
1379}
John Soni Joseacb96932012-10-20 04:44:35 +05301380
John Soni Jose26000db2012-10-20 04:45:06 +05301381/**
Jayamohan Kallickal22661e22013-04-05 20:38:28 -07001382 * beiscsi_fw_ver_disp()- Display Firmware Version
1383 * @dev: ptr to device not used.
1384 * @attr: device attribute, not used.
1385 * @buf: contains formatted text Firmware version
1386 *
1387 * return
1388 * size of the formatted string
1389 **/
1390ssize_t
1391beiscsi_fw_ver_disp(struct device *dev, struct device_attribute *attr,
1392 char *buf)
1393{
1394 struct Scsi_Host *shost = class_to_shost(dev);
1395 struct beiscsi_hba *phba = iscsi_host_priv(shost);
1396
1397 return snprintf(buf, PAGE_SIZE, "%s\n", phba->fw_ver_str);
1398}
1399
1400/**
Jayamohan Kallickal6103c1f2013-09-28 15:35:52 -07001401 * beiscsi_active_session_disp()- Display Sessions Active
Jayamohan Kallickal7ad4dfe2013-04-05 20:38:29 -07001402 * @dev: ptr to device not used.
1403 * @attr: device attribute, not used.
1404 * @buf: contains formatted text Session Count
1405 *
1406 * return
1407 * size of the formatted string
1408 **/
1409ssize_t
Jayamohan Kallickal6103c1f2013-09-28 15:35:52 -07001410beiscsi_active_session_disp(struct device *dev, struct device_attribute *attr,
Jayamohan Kallickal7ad4dfe2013-04-05 20:38:29 -07001411 char *buf)
1412{
1413 struct Scsi_Host *shost = class_to_shost(dev);
1414 struct beiscsi_hba *phba = iscsi_host_priv(shost);
Jayamohan Kallickal0a3db7c2013-09-28 15:35:49 -07001415 uint16_t avlbl_cids = 0, ulp_num, len = 0, total_cids = 0;
Jayamohan Kallickal7ad4dfe2013-04-05 20:38:29 -07001416
Jayamohan Kallickal0a3db7c2013-09-28 15:35:49 -07001417 for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) {
1418 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) {
1419 avlbl_cids = BEISCSI_ULP_AVLBL_CID(phba, ulp_num);
1420 total_cids = BEISCSI_GET_CID_COUNT(phba, ulp_num);
1421 len += snprintf(buf+len, PAGE_SIZE - len,
1422 "ULP%d : %d\n", ulp_num,
1423 (total_cids - avlbl_cids));
1424 } else
1425 len += snprintf(buf+len, PAGE_SIZE - len,
1426 "ULP%d : %d\n", ulp_num, 0);
1427 }
1428
1429 return len;
Jayamohan Kallickal7ad4dfe2013-04-05 20:38:29 -07001430}
1431
1432/**
Jayamohan Kallickal6103c1f2013-09-28 15:35:52 -07001433 * beiscsi_free_session_disp()- Display Avaliable Session
1434 * @dev: ptr to device not used.
1435 * @attr: device attribute, not used.
1436 * @buf: contains formatted text Session Count
1437 *
1438 * return
1439 * size of the formatted string
1440 **/
1441ssize_t
1442beiscsi_free_session_disp(struct device *dev, struct device_attribute *attr,
1443 char *buf)
1444{
1445 struct Scsi_Host *shost = class_to_shost(dev);
1446 struct beiscsi_hba *phba = iscsi_host_priv(shost);
1447 uint16_t ulp_num, len = 0;
1448
1449 for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) {
1450 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported))
1451 len += snprintf(buf+len, PAGE_SIZE - len,
1452 "ULP%d : %d\n", ulp_num,
1453 BEISCSI_ULP_AVLBL_CID(phba, ulp_num));
1454 else
1455 len += snprintf(buf+len, PAGE_SIZE - len,
1456 "ULP%d : %d\n", ulp_num, 0);
1457 }
1458
1459 return len;
1460}
1461
1462/**
John Soni Jose26000db2012-10-20 04:45:06 +05301463 * beiscsi_adap_family_disp()- Display adapter family.
1464 * @dev: ptr to device to get priv structure
1465 * @attr: device attribute, not used.
1466 * @buf: contains formatted text driver name and version
1467 *
1468 * return
1469 * size of the formatted string
1470 **/
1471ssize_t
1472beiscsi_adap_family_disp(struct device *dev, struct device_attribute *attr,
1473 char *buf)
1474{
1475 uint16_t dev_id = 0;
1476 struct Scsi_Host *shost = class_to_shost(dev);
1477 struct beiscsi_hba *phba = iscsi_host_priv(shost);
1478
1479 dev_id = phba->pcidev->device;
1480 switch (dev_id) {
1481 case BE_DEVICE_ID1:
1482 case OC_DEVICE_ID1:
1483 case OC_DEVICE_ID2:
1484 return snprintf(buf, PAGE_SIZE, "BE2 Adapter Family\n");
1485 break;
1486 case BE_DEVICE_ID2:
1487 case OC_DEVICE_ID3:
1488 return snprintf(buf, PAGE_SIZE, "BE3-R Adapter Family\n");
1489 break;
1490 case OC_SKH_ID1:
1491 return snprintf(buf, PAGE_SIZE, "Skyhawk-R Adapter Family\n");
1492 break;
1493 default:
1494 return snprintf(buf, PAGE_SIZE,
Masanari Iidab23f7a02013-04-18 00:12:55 +09001495 "Unknown Adapter Family: 0x%x\n", dev_id);
John Soni Jose26000db2012-10-20 04:45:06 +05301496 break;
1497 }
1498}
1499
Jayamohan Kallickald3fea9a2013-09-28 15:35:53 -07001500/**
1501 * beiscsi_phys_port()- Display Physical Port Identifier
1502 * @dev: ptr to device not used.
1503 * @attr: device attribute, not used.
1504 * @buf: contains formatted text port identifier
1505 *
1506 * return
1507 * size of the formatted string
1508 **/
1509ssize_t
1510beiscsi_phys_port_disp(struct device *dev, struct device_attribute *attr,
1511 char *buf)
1512{
1513 struct Scsi_Host *shost = class_to_shost(dev);
1514 struct beiscsi_hba *phba = iscsi_host_priv(shost);
1515
1516 return snprintf(buf, PAGE_SIZE, "Port Identifier : %d\n",
1517 phba->fw_config.phys_port);
1518}
John Soni Jose26000db2012-10-20 04:45:06 +05301519
John Soni Joseacb96932012-10-20 04:44:35 +05301520void beiscsi_offload_cxn_v0(struct beiscsi_offload_params *params,
1521 struct wrb_handle *pwrb_handle,
1522 struct be_mem_descriptor *mem_descr)
1523{
1524 struct iscsi_wrb *pwrb = pwrb_handle->pwrb;
1525
1526 memset(pwrb, 0, sizeof(*pwrb));
1527 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1528 max_send_data_segment_length, pwrb,
1529 params->dw[offsetof(struct amap_beiscsi_offload_params,
1530 max_send_data_segment_length) / 32]);
1531 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, type, pwrb,
1532 BE_TGT_CTX_UPDT_CMD);
1533 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1534 first_burst_length,
1535 pwrb,
1536 params->dw[offsetof(struct amap_beiscsi_offload_params,
1537 first_burst_length) / 32]);
1538 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, erl, pwrb,
1539 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1540 erl) / 32] & OFFLD_PARAMS_ERL));
1541 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, dde, pwrb,
1542 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1543 dde) / 32] & OFFLD_PARAMS_DDE) >> 2);
1544 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, hde, pwrb,
1545 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1546 hde) / 32] & OFFLD_PARAMS_HDE) >> 3);
1547 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ir2t, pwrb,
1548 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1549 ir2t) / 32] & OFFLD_PARAMS_IR2T) >> 4);
1550 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, imd, pwrb,
1551 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1552 imd) / 32] & OFFLD_PARAMS_IMD) >> 5);
1553 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, stat_sn,
1554 pwrb,
1555 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1556 exp_statsn) / 32] + 1));
1557 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, wrb_idx,
1558 pwrb, pwrb_handle->wrb_index);
1559
1560 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1561 max_burst_length, pwrb, params->dw[offsetof
1562 (struct amap_beiscsi_offload_params,
1563 max_burst_length) / 32]);
1564
1565 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ptr2nextwrb,
1566 pwrb, pwrb_handle->nxt_wrb_index);
1567 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1568 session_state, pwrb, 0);
1569 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, compltonack,
1570 pwrb, 1);
1571 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, notpredblq,
1572 pwrb, 0);
1573 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, mode, pwrb,
1574 0);
1575
1576 mem_descr += ISCSI_MEM_GLOBAL_HEADER;
1577 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1578 pad_buffer_addr_hi, pwrb,
1579 mem_descr->mem_array[0].bus_address.u.a32.address_hi);
1580 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1581 pad_buffer_addr_lo, pwrb,
1582 mem_descr->mem_array[0].bus_address.u.a32.address_lo);
1583}
1584
1585void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params,
1586 struct wrb_handle *pwrb_handle)
1587{
1588 struct iscsi_wrb *pwrb = pwrb_handle->pwrb;
1589
1590 memset(pwrb, 0, sizeof(*pwrb));
1591
John Soni Joseacb96932012-10-20 04:44:35 +05301592 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1593 max_burst_length, pwrb, params->dw[offsetof
1594 (struct amap_beiscsi_offload_params,
1595 max_burst_length) / 32]);
1596 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1597 type, pwrb,
1598 BE_TGT_CTX_UPDT_CMD);
1599 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1600 ptr2nextwrb,
1601 pwrb, pwrb_handle->nxt_wrb_index);
1602 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, wrb_idx,
1603 pwrb, pwrb_handle->wrb_index);
1604 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1605 max_send_data_segment_length, pwrb,
1606 params->dw[offsetof(struct amap_beiscsi_offload_params,
1607 max_send_data_segment_length) / 32]);
1608 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1609 first_burst_length, pwrb,
1610 params->dw[offsetof(struct amap_beiscsi_offload_params,
1611 first_burst_length) / 32]);
1612 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
Jayamohan Kallickal73316132013-09-28 15:35:41 -07001613 max_recv_dataseg_len, pwrb,
1614 params->dw[offsetof(struct amap_beiscsi_offload_params,
1615 max_recv_data_segment_length) / 32]);
John Soni Joseacb96932012-10-20 04:44:35 +05301616 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1617 max_cxns, pwrb, BEISCSI_MAX_CXNS);
1618 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, erl, pwrb,
1619 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1620 erl) / 32] & OFFLD_PARAMS_ERL));
1621 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, dde, pwrb,
1622 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1623 dde) / 32] & OFFLD_PARAMS_DDE) >> 2);
1624 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, hde, pwrb,
1625 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1626 hde) / 32] & OFFLD_PARAMS_HDE) >> 3);
1627 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1628 ir2t, pwrb,
1629 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1630 ir2t) / 32] & OFFLD_PARAMS_IR2T) >> 4);
1631 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, imd, pwrb,
1632 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1633 imd) / 32] & OFFLD_PARAMS_IMD) >> 5);
1634 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1635 data_seq_inorder,
1636 pwrb,
1637 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1638 data_seq_inorder) / 32] &
1639 OFFLD_PARAMS_DATA_SEQ_INORDER) >> 6);
1640 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1641 pdu_seq_inorder,
1642 pwrb,
1643 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1644 pdu_seq_inorder) / 32] &
1645 OFFLD_PARAMS_PDU_SEQ_INORDER) >> 7);
1646 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, max_r2t,
1647 pwrb,
1648 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1649 max_r2t) / 32] &
1650 OFFLD_PARAMS_MAX_R2T) >> 8);
1651 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, stat_sn,
1652 pwrb,
1653 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1654 exp_statsn) / 32] + 1));
1655}