blob: bcddc9fb23a2859a0da676325eb10545dd71eed2 [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
314 for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++)
315 if (pfw_cfg->ulp[ulp_num].ulp_mode &
316 BEISCSI_ULP_ISCSI_INI_MODE)
317 set_bit(ulp_num,
Jayamohan Kallickal8a86e832013-09-28 15:35:45 -0700318 &phba->fw_config.ulp_supported);
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700319
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530320 phba->fw_config.phys_port = pfw_cfg->phys_port;
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700321 for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) {
322 if (test_bit(ulp_num, &phba->fw_config.ulp_supported)) {
323
324 phba->fw_config.iscsi_cid_start[ulp_num] =
325 pfw_cfg->ulp[ulp_num].sq_base;
326 phba->fw_config.iscsi_cid_count[ulp_num] =
327 pfw_cfg->ulp[ulp_num].sq_count;
328
329 phba->fw_config.iscsi_icd_start[ulp_num] =
330 pfw_cfg->ulp[ulp_num].icd_base;
331 phba->fw_config.iscsi_icd_count[ulp_num] =
332 pfw_cfg->ulp[ulp_num].icd_count;
333
334 phba->fw_config.iscsi_chain_start[ulp_num] =
335 pfw_cfg->chain_icd[ulp_num].chain_base;
336 phba->fw_config.iscsi_chain_count[ulp_num] =
337 pfw_cfg->chain_icd[ulp_num].chain_count;
338
339 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
340 "BG_%d : Function loaded on ULP : %d\n"
341 "\tiscsi_cid_count : %d\n"
342 "\t iscsi_icd_count : %d\n",
343 ulp_num,
344 phba->fw_config.
345 iscsi_cid_count[ulp_num],
346 phba->fw_config.
347 iscsi_icd_count[ulp_num]);
348 }
Jayamohan Kallickal7da50872010-01-05 05:04:12 +0530349 }
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700350
351 phba->fw_config.dual_ulp_aware = (pfw_cfg->function_mode &
352 BEISCSI_FUNC_DUA_MODE);
353
354 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
355 "BG_%d : DUA Mode : 0x%x\n",
356 phba->fw_config.dual_ulp_aware);
357
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530358 } else {
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700359 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
John Soni Jose99bc5d52012-08-20 23:00:18 +0530360 "BG_%d : Failed in mgmt_get_fw_config\n");
Jayamohan Kallickal843ae752013-09-28 15:35:44 -0700361 status = -EINVAL;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530362 }
363
364 spin_unlock(&ctrl->mbox_lock);
365 return status;
366}
367
Jayamohan Kallickal03a12312010-07-22 04:17:16 +0530368int mgmt_check_supported_fw(struct be_ctrl_info *ctrl,
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530369 struct beiscsi_hba *phba)
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530370{
371 struct be_dma_mem nonemb_cmd;
372 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
373 struct be_mgmt_controller_attributes *req;
374 struct be_sge *sge = nonembedded_sgl(wrb);
375 int status = 0;
376
377 nonemb_cmd.va = pci_alloc_consistent(ctrl->pdev,
378 sizeof(struct be_mgmt_controller_attributes),
379 &nonemb_cmd.dma);
380 if (nonemb_cmd.va == NULL) {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530381 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
382 "BG_%d : Failed to allocate memory for "
383 "mgmt_check_supported_fw\n");
Jayamohan Kallickald3ad2bb2010-07-22 04:16:38 +0530384 return -ENOMEM;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530385 }
386 nonemb_cmd.size = sizeof(struct be_mgmt_controller_attributes);
387 req = nonemb_cmd.va;
Jayamohan Kallickalf98c96b2010-02-11 05:11:15 +0530388 memset(req, 0, sizeof(*req));
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530389 spin_lock(&ctrl->mbox_lock);
390 memset(wrb, 0, sizeof(*wrb));
391 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
392 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
393 OPCODE_COMMON_GET_CNTL_ATTRIBUTES, sizeof(*req));
394 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd.dma));
395 sge->pa_lo = cpu_to_le32(nonemb_cmd.dma & 0xFFFFFFFF);
396 sge->len = cpu_to_le32(nonemb_cmd.size);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530397 status = be_mbox_notify(ctrl);
398 if (!status) {
399 struct be_mgmt_controller_attributes_resp *resp = nonemb_cmd.va;
John Soni Jose99bc5d52012-08-20 23:00:18 +0530400 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
401 "BG_%d : Firmware Version of CMD : %s\n"
402 "Firmware Version is : %s\n"
403 "Developer Build, not performing version check...\n",
404 resp->params.hba_attribs
405 .flashrom_version_string,
406 resp->params.hba_attribs.
407 firmware_version_string);
408
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530409 phba->fw_config.iscsi_features =
410 resp->params.hba_attribs.iscsi_features;
John Soni Jose99bc5d52012-08-20 23:00:18 +0530411 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_INIT,
412 "BM_%d : phba->fw_config.iscsi_features = %d\n",
413 phba->fw_config.iscsi_features);
Jayamohan Kallickal22661e22013-04-05 20:38:28 -0700414 memcpy(phba->fw_ver_str, resp->params.hba_attribs.
415 firmware_version_string, BEISCSI_VER_STRLEN);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530416 } else
John Soni Jose99bc5d52012-08-20 23:00:18 +0530417 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_INIT,
418 "BG_%d : Failed in mgmt_check_supported_fw\n");
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530419 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530420 if (nonemb_cmd.va)
421 pci_free_consistent(ctrl->pdev, nonemb_cmd.size,
422 nonemb_cmd.va, nonemb_cmd.dma);
423
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530424 return status;
425}
426
Jayamohan Kallickalffce3e22012-04-03 23:41:50 -0500427unsigned int mgmt_vendor_specific_fw_cmd(struct be_ctrl_info *ctrl,
428 struct beiscsi_hba *phba,
429 struct bsg_job *job,
430 struct be_dma_mem *nonemb_cmd)
431{
432 struct be_cmd_resp_hdr *resp;
433 struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
434 struct be_sge *mcc_sge = nonembedded_sgl(wrb);
435 unsigned int tag = 0;
436 struct iscsi_bsg_request *bsg_req = job->request;
437 struct be_bsg_vendor_cmd *req = nonemb_cmd->va;
438 unsigned short region, sector_size, sector, offset;
439
440 nonemb_cmd->size = job->request_payload.payload_len;
441 memset(nonemb_cmd->va, 0, nonemb_cmd->size);
442 resp = nonemb_cmd->va;
443 region = bsg_req->rqst_data.h_vendor.vendor_cmd[1];
444 sector_size = bsg_req->rqst_data.h_vendor.vendor_cmd[2];
445 sector = bsg_req->rqst_data.h_vendor.vendor_cmd[3];
446 offset = bsg_req->rqst_data.h_vendor.vendor_cmd[4];
447 req->region = region;
448 req->sector = sector;
449 req->offset = offset;
450 spin_lock(&ctrl->mbox_lock);
451 memset(wrb, 0, sizeof(*wrb));
452
453 switch (bsg_req->rqst_data.h_vendor.vendor_cmd[0]) {
454 case BEISCSI_WRITE_FLASH:
455 offset = sector * sector_size + offset;
456 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
457 OPCODE_COMMON_WRITE_FLASH, sizeof(*req));
458 sg_copy_to_buffer(job->request_payload.sg_list,
459 job->request_payload.sg_cnt,
460 nonemb_cmd->va + offset, job->request_len);
461 break;
462 case BEISCSI_READ_FLASH:
463 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
464 OPCODE_COMMON_READ_FLASH, sizeof(*req));
465 break;
466 default:
John Soni Jose99bc5d52012-08-20 23:00:18 +0530467 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
468 "BG_%d : Unsupported cmd = 0x%x\n\n",
469 bsg_req->rqst_data.h_vendor.vendor_cmd[0]);
470
Jayamohan Kallickalffce3e22012-04-03 23:41:50 -0500471 spin_unlock(&ctrl->mbox_lock);
472 return -ENOSYS;
473 }
474
475 tag = alloc_mcc_tag(phba);
476 if (!tag) {
477 spin_unlock(&ctrl->mbox_lock);
478 return tag;
479 }
480
481 be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false,
482 job->request_payload.sg_cnt);
483 mcc_sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
484 mcc_sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
485 mcc_sge->len = cpu_to_le32(nonemb_cmd->size);
486 wrb->tag0 |= tag;
487
488 be_mcc_notify(phba);
489
490 spin_unlock(&ctrl->mbox_lock);
491 return tag;
492}
493
Jayamohan Kallickal03a12312010-07-22 04:17:16 +0530494int mgmt_epfw_cleanup(struct beiscsi_hba *phba, unsigned short chute)
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530495{
496 struct be_ctrl_info *ctrl = &phba->ctrl;
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530497 struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530498 struct iscsi_cleanup_req *req = embedded_payload(wrb);
499 int status = 0;
500
501 spin_lock(&ctrl->mbox_lock);
502 memset(wrb, 0, sizeof(*wrb));
503
504 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
505 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
506 OPCODE_COMMON_ISCSI_CLEANUP, sizeof(*req));
507
508 req->chute = chute;
Jayamohan Kallickal8a86e832013-09-28 15:35:45 -0700509 req->hdr_ring_id = cpu_to_le16(HWI_GET_DEF_HDRQ_ID(phba, 0));
510 req->data_ring_id = cpu_to_le16(HWI_GET_DEF_BUFQ_ID(phba, 0));
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530511
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530512 status = be_mcc_notify_wait(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530513 if (status)
John Soni Jose99bc5d52012-08-20 23:00:18 +0530514 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_INIT,
515 "BG_%d : mgmt_epfw_cleanup , FAILED\n");
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530516 spin_unlock(&ctrl->mbox_lock);
517 return status;
518}
519
Jayamohan Kallickal03a12312010-07-22 04:17:16 +0530520unsigned int mgmt_invalidate_icds(struct beiscsi_hba *phba,
Jayamohan Kallickal41831222010-02-20 08:02:39 +0530521 struct invalidate_command_table *inv_tbl,
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530522 unsigned int num_invalidate, unsigned int cid,
523 struct be_dma_mem *nonemb_cmd)
524
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530525{
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530526 struct be_ctrl_info *ctrl = &phba->ctrl;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530527 struct be_mcc_wrb *wrb;
528 struct be_sge *sge;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530529 struct invalidate_commands_params_in *req;
Jayamohan Kallickal41831222010-02-20 08:02:39 +0530530 unsigned int i, tag = 0;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530531
532 spin_lock(&ctrl->mbox_lock);
533 tag = alloc_mcc_tag(phba);
534 if (!tag) {
535 spin_unlock(&ctrl->mbox_lock);
536 return tag;
537 }
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530538
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530539 req = nonemb_cmd->va;
Jayamohan Kallickalf98c96b2010-02-11 05:11:15 +0530540 memset(req, 0, sizeof(*req));
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530541 wrb = wrb_from_mccq(phba);
542 sge = nonembedded_sgl(wrb);
543 wrb->tag0 |= tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530544
545 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
546 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
547 OPCODE_COMMON_ISCSI_ERROR_RECOVERY_INVALIDATE_COMMANDS,
548 sizeof(*req));
549 req->ref_handle = 0;
550 req->cleanup_type = CMD_ISCSI_COMMAND_INVALIDATE;
Jayamohan Kallickal41831222010-02-20 08:02:39 +0530551 for (i = 0; i < num_invalidate; i++) {
552 req->table[i].icd = inv_tbl->icd;
553 req->table[i].cid = inv_tbl->cid;
554 req->icd_count++;
555 inv_tbl++;
556 }
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530557 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
558 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
559 sge->len = cpu_to_le32(nonemb_cmd->size);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530560
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530561 be_mcc_notify(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530562 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530563 return tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530564}
565
Jayamohan Kallickal03a12312010-07-22 04:17:16 +0530566unsigned int mgmt_invalidate_connection(struct beiscsi_hba *phba,
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530567 struct beiscsi_endpoint *beiscsi_ep,
568 unsigned short cid,
569 unsigned short issue_reset,
570 unsigned short savecfg_flag)
571{
572 struct be_ctrl_info *ctrl = &phba->ctrl;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530573 struct be_mcc_wrb *wrb;
574 struct iscsi_invalidate_connection_params_in *req;
575 unsigned int tag = 0;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530576
577 spin_lock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530578 tag = alloc_mcc_tag(phba);
579 if (!tag) {
580 spin_unlock(&ctrl->mbox_lock);
581 return tag;
582 }
583 wrb = wrb_from_mccq(phba);
584 wrb->tag0 |= tag;
585 req = embedded_payload(wrb);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530586
587 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
588 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
589 OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION,
590 sizeof(*req));
591 req->session_handle = beiscsi_ep->fw_handle;
592 req->cid = cid;
593 if (issue_reset)
594 req->cleanup_type = CMD_ISCSI_CONNECTION_ISSUE_TCP_RST;
595 else
596 req->cleanup_type = CMD_ISCSI_CONNECTION_INVALIDATE;
597 req->save_cfg = savecfg_flag;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530598 be_mcc_notify(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530599 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530600 return tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530601}
602
Jayamohan Kallickal03a12312010-07-22 04:17:16 +0530603unsigned int mgmt_upload_connection(struct beiscsi_hba *phba,
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530604 unsigned short cid, unsigned int upload_flag)
605{
606 struct be_ctrl_info *ctrl = &phba->ctrl;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530607 struct be_mcc_wrb *wrb;
608 struct tcp_upload_params_in *req;
609 unsigned int tag = 0;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530610
611 spin_lock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530612 tag = alloc_mcc_tag(phba);
613 if (!tag) {
614 spin_unlock(&ctrl->mbox_lock);
615 return tag;
616 }
617 wrb = wrb_from_mccq(phba);
618 req = embedded_payload(wrb);
619 wrb->tag0 |= tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530620
621 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
622 be_cmd_hdr_prepare(&req->hdr, CMD_COMMON_TCP_UPLOAD,
623 OPCODE_COMMON_TCP_UPLOAD, sizeof(*req));
624 req->id = (unsigned short)cid;
625 req->upload_type = (unsigned char)upload_flag;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530626 be_mcc_notify(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530627 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530628 return tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530629}
630
Jayamohan Kallickal1e4be6f2013-09-28 15:35:50 -0700631/**
632 * mgmt_open_connection()- Establish a TCP CXN
633 * @dst_addr: Destination Address
634 * @beiscsi_ep: ptr to device endpoint struct
635 * @nonemb_cmd: ptr to memory allocated for command
636 *
637 * return
638 * Success: Tag number of the MBX Command issued
639 * Failure: Error code
640 **/
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530641int mgmt_open_connection(struct beiscsi_hba *phba,
642 struct sockaddr *dst_addr,
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530643 struct beiscsi_endpoint *beiscsi_ep,
644 struct be_dma_mem *nonemb_cmd)
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530645{
646 struct hwi_controller *phwi_ctrlr;
647 struct hwi_context_memory *phwi_context;
648 struct sockaddr_in *daddr_in = (struct sockaddr_in *)dst_addr;
649 struct sockaddr_in6 *daddr_in6 = (struct sockaddr_in6 *)dst_addr;
650 struct be_ctrl_info *ctrl = &phba->ctrl;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530651 struct be_mcc_wrb *wrb;
652 struct tcp_connect_and_offload_in *req;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530653 unsigned short def_hdr_id;
654 unsigned short def_data_id;
655 struct phys_addr template_address = { 0, 0 };
656 struct phys_addr *ptemplate_address;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530657 unsigned int tag = 0;
Jayamohan Kallickal1e4be6f2013-09-28 15:35:50 -0700658 unsigned int i, ulp_num;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530659 unsigned short cid = beiscsi_ep->ep_cid;
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530660 struct be_sge *sge;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530661
662 phwi_ctrlr = phba->phwi_ctrlr;
663 phwi_context = phwi_ctrlr->phwi_ctxt;
Jayamohan Kallickal1e4be6f2013-09-28 15:35:50 -0700664
665 ulp_num = phwi_ctrlr->wrb_context[BE_GET_CRI_FROM_CID(cid)].ulp_num;
666
667 def_hdr_id = (unsigned short)HWI_GET_DEF_HDRQ_ID(phba, ulp_num);
668 def_data_id = (unsigned short)HWI_GET_DEF_BUFQ_ID(phba, ulp_num);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530669
670 ptemplate_address = &template_address;
671 ISCSI_GET_PDU_TEMPLATE_ADDRESS(phba, ptemplate_address);
672 spin_lock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530673 tag = alloc_mcc_tag(phba);
674 if (!tag) {
675 spin_unlock(&ctrl->mbox_lock);
676 return tag;
677 }
678 wrb = wrb_from_mccq(phba);
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530679 memset(wrb, 0, sizeof(*wrb));
680 sge = nonembedded_sgl(wrb);
681
682 req = nonemb_cmd->va;
683 memset(req, 0, sizeof(*req));
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530684 wrb->tag0 |= tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530685
Jayamohan Kallickalb15d05b2010-08-12 23:36:06 +0530686 be_wrb_hdr_prepare(wrb, sizeof(*req), false, 1);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530687 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
688 OPCODE_COMMON_ISCSI_TCP_CONNECT_AND_OFFLOAD,
689 sizeof(*req));
690 if (dst_addr->sa_family == PF_INET) {
691 __be32 s_addr = daddr_in->sin_addr.s_addr;
692 req->ip_address.ip_type = BE2_IPV4;
Mike Christie0e438952012-04-03 23:41:51 -0500693 req->ip_address.addr[0] = s_addr & 0x000000ff;
694 req->ip_address.addr[1] = (s_addr & 0x0000ff00) >> 8;
695 req->ip_address.addr[2] = (s_addr & 0x00ff0000) >> 16;
696 req->ip_address.addr[3] = (s_addr & 0xff000000) >> 24;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530697 req->tcp_port = ntohs(daddr_in->sin_port);
698 beiscsi_ep->dst_addr = daddr_in->sin_addr.s_addr;
699 beiscsi_ep->dst_tcpport = ntohs(daddr_in->sin_port);
700 beiscsi_ep->ip_type = BE2_IPV4;
701 } else if (dst_addr->sa_family == PF_INET6) {
702 req->ip_address.ip_type = BE2_IPV6;
Mike Christie0e438952012-04-03 23:41:51 -0500703 memcpy(&req->ip_address.addr,
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530704 &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
705 req->tcp_port = ntohs(daddr_in6->sin6_port);
706 beiscsi_ep->dst_tcpport = ntohs(daddr_in6->sin6_port);
707 memcpy(&beiscsi_ep->dst6_addr,
708 &daddr_in6->sin6_addr.in6_u.u6_addr8, 16);
709 beiscsi_ep->ip_type = BE2_IPV6;
710 } else{
John Soni Jose99bc5d52012-08-20 23:00:18 +0530711 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
712 "BG_%d : unknown addr family %d\n",
713 dst_addr->sa_family);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530714 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal5db3f332010-07-22 04:24:22 +0530715 free_mcc_tag(&phba->ctrl, tag);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530716 return -EINVAL;
717
718 }
719 req->cid = cid;
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530720 i = phba->nxt_cqid++;
721 if (phba->nxt_cqid == phba->num_cpus)
722 phba->nxt_cqid = 0;
723 req->cq_id = phwi_context->be_cq[i].id;
John Soni Jose99bc5d52012-08-20 23:00:18 +0530724 beiscsi_log(phba, KERN_INFO, BEISCSI_LOG_CONFIG,
725 "BG_%d : i=%d cq_id=%d\n", i, req->cq_id);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530726 req->defq_id = def_hdr_id;
727 req->hdr_ring_id = def_hdr_id;
728 req->data_ring_id = def_data_id;
729 req->do_offload = 1;
730 req->dataout_template_pa.lo = ptemplate_address->lo;
731 req->dataout_template_pa.hi = ptemplate_address->hi;
Jayamohan Kallickal3cbb7a72010-07-22 04:27:47 +0530732 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
733 sge->pa_lo = cpu_to_le32(nonemb_cmd->dma & 0xFFFFFFFF);
734 sge->len = cpu_to_le32(nonemb_cmd->size);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530735 be_mcc_notify(phba);
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530736 spin_unlock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530737 return tag;
Jayamohan Kallickal6733b392009-09-05 07:36:35 +0530738}
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530739
Mike Christie0e438952012-04-03 23:41:51 -0500740unsigned int mgmt_get_all_if_id(struct beiscsi_hba *phba)
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530741{
742 struct be_ctrl_info *ctrl = &phba->ctrl;
Mike Christie0e438952012-04-03 23:41:51 -0500743 struct be_mcc_wrb *wrb = wrb_from_mbox(&ctrl->mbox_mem);
744 struct be_cmd_get_all_if_id_req *req = embedded_payload(wrb);
745 struct be_cmd_get_all_if_id_req *pbe_allid = req;
746 int status = 0;
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530747
Mike Christie0e438952012-04-03 23:41:51 -0500748 memset(wrb, 0, sizeof(*wrb));
749
750 spin_lock(&ctrl->mbox_lock);
751
752 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
753 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI,
754 OPCODE_COMMON_ISCSI_NTWK_GET_ALL_IF_ID,
755 sizeof(*req));
756 status = be_mbox_notify(ctrl);
757 if (!status)
758 phba->interface_handle = pbe_allid->if_hndl_list[0];
759 else {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530760 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
761 "BG_%d : Failed in mgmt_get_all_if_id\n");
Mike Christie0e438952012-04-03 23:41:51 -0500762 }
763 spin_unlock(&ctrl->mbox_lock);
764
765 return status;
766}
767
John Soni Josee175def2012-10-20 04:45:40 +0530768/*
769 * mgmt_exec_nonemb_cmd()- Execute Non Embedded MBX Cmd
770 * @phba: Driver priv structure
771 * @nonemb_cmd: Address of the MBX command issued
772 * @resp_buf: Buffer to copy the MBX cmd response
773 * @resp_buf_len: respone lenght to be copied
774 *
775 **/
Mike Christie0e438952012-04-03 23:41:51 -0500776static int mgmt_exec_nonemb_cmd(struct beiscsi_hba *phba,
777 struct be_dma_mem *nonemb_cmd, void *resp_buf,
778 int resp_buf_len)
779{
780 struct be_ctrl_info *ctrl = &phba->ctrl;
781 struct be_mcc_wrb *wrb = wrb_from_mccq(phba);
Mike Christie0e438952012-04-03 23:41:51 -0500782 struct be_sge *sge;
783 unsigned int tag;
784 int rc = 0;
785
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530786 spin_lock(&ctrl->mbox_lock);
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530787 tag = alloc_mcc_tag(phba);
788 if (!tag) {
789 spin_unlock(&ctrl->mbox_lock);
Mike Christie0e438952012-04-03 23:41:51 -0500790 rc = -ENOMEM;
791 goto free_cmd;
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530792 }
Mike Christie0e438952012-04-03 23:41:51 -0500793 memset(wrb, 0, sizeof(*wrb));
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530794 wrb->tag0 |= tag;
Mike Christie0e438952012-04-03 23:41:51 -0500795 sge = nonembedded_sgl(wrb);
796
797 be_wrb_hdr_prepare(wrb, nonemb_cmd->size, false, 1);
798 sge->pa_hi = cpu_to_le32(upper_32_bits(nonemb_cmd->dma));
John Soni Josee175def2012-10-20 04:45:40 +0530799 sge->pa_lo = cpu_to_le32(lower_32_bits(nonemb_cmd->dma));
Mike Christie0e438952012-04-03 23:41:51 -0500800 sge->len = cpu_to_le32(nonemb_cmd->size);
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530801
Jayamohan Kallickal756d29c2010-01-05 05:10:46 +0530802 be_mcc_notify(phba);
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530803 spin_unlock(&ctrl->mbox_lock);
Mike Christie0e438952012-04-03 23:41:51 -0500804
John Soni Josee175def2012-10-20 04:45:40 +0530805 rc = beiscsi_mccq_compl(phba, tag, NULL, nonemb_cmd->va);
806 if (rc) {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530807 beiscsi_log(phba, KERN_ERR,
808 BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX,
John Soni Josee175def2012-10-20 04:45:40 +0530809 "BG_%d : mgmt_exec_nonemb_cmd Failed status\n");
810
Mike Christie0e438952012-04-03 23:41:51 -0500811 rc = -EIO;
John Soni Josee175def2012-10-20 04:45:40 +0530812 goto free_cmd;
Mike Christie0e438952012-04-03 23:41:51 -0500813 }
814
815 if (resp_buf)
816 memcpy(resp_buf, nonemb_cmd->va, resp_buf_len);
817
Mike Christie0e438952012-04-03 23:41:51 -0500818free_cmd:
819 pci_free_consistent(ctrl->pdev, nonemb_cmd->size,
820 nonemb_cmd->va, nonemb_cmd->dma);
821 return rc;
Jayamohan Kallickalbfead3b2009-10-23 11:52:33 +0530822}
823
Mike Christie0e438952012-04-03 23:41:51 -0500824static int mgmt_alloc_cmd_data(struct beiscsi_hba *phba, struct be_dma_mem *cmd,
825 int iscsi_cmd, int size)
826{
Mike Christieb83d5432012-05-23 20:40:54 -0500827 cmd->va = pci_alloc_consistent(phba->ctrl.pdev, size, &cmd->dma);
Mike Christie0e438952012-04-03 23:41:51 -0500828 if (!cmd->va) {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530829 beiscsi_log(phba, KERN_ERR, BEISCSI_LOG_CONFIG,
830 "BG_%d : Failed to allocate memory for if info\n");
Mike Christie0e438952012-04-03 23:41:51 -0500831 return -ENOMEM;
832 }
Mike Christieb83d5432012-05-23 20:40:54 -0500833 memset(cmd->va, 0, size);
Mike Christie0e438952012-04-03 23:41:51 -0500834 cmd->size = size;
835 be_cmd_hdr_prepare(cmd->va, CMD_SUBSYSTEM_ISCSI, iscsi_cmd, size);
836 return 0;
837}
838
839static int
840mgmt_static_ip_modify(struct beiscsi_hba *phba,
841 struct be_cmd_get_if_info_resp *if_info,
842 struct iscsi_iface_param_info *ip_param,
843 struct iscsi_iface_param_info *subnet_param,
844 uint32_t ip_action)
845{
846 struct be_cmd_set_ip_addr_req *req;
847 struct be_dma_mem nonemb_cmd;
848 uint32_t ip_type;
849 int rc;
850
851 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
852 OPCODE_COMMON_ISCSI_NTWK_MODIFY_IP_ADDR,
853 sizeof(*req));
854 if (rc)
855 return rc;
856
857 ip_type = (ip_param->param == ISCSI_NET_PARAM_IPV6_ADDR) ?
858 BE2_IPV6 : BE2_IPV4 ;
859
860 req = nonemb_cmd.va;
861 req->ip_params.record_entry_count = 1;
862 req->ip_params.ip_record.action = ip_action;
863 req->ip_params.ip_record.interface_hndl =
864 phba->interface_handle;
865 req->ip_params.ip_record.ip_addr.size_of_structure =
866 sizeof(struct be_ip_addr_subnet_format);
867 req->ip_params.ip_record.ip_addr.ip_type = ip_type;
868
869 if (ip_action == IP_ACTION_ADD) {
870 memcpy(req->ip_params.ip_record.ip_addr.addr, ip_param->value,
871 ip_param->len);
872
873 if (subnet_param)
874 memcpy(req->ip_params.ip_record.ip_addr.subnet_mask,
875 subnet_param->value, subnet_param->len);
876 } else {
877 memcpy(req->ip_params.ip_record.ip_addr.addr,
878 if_info->ip_addr.addr, ip_param->len);
879
880 memcpy(req->ip_params.ip_record.ip_addr.subnet_mask,
881 if_info->ip_addr.subnet_mask, ip_param->len);
882 }
883
884 rc = mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
885 if (rc < 0)
John Soni Jose99bc5d52012-08-20 23:00:18 +0530886 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
887 "BG_%d : Failed to Modify existing IP Address\n");
Mike Christie0e438952012-04-03 23:41:51 -0500888 return rc;
889}
890
891static int mgmt_modify_gateway(struct beiscsi_hba *phba, uint8_t *gt_addr,
892 uint32_t gtway_action, uint32_t param_len)
893{
894 struct be_cmd_set_def_gateway_req *req;
895 struct be_dma_mem nonemb_cmd;
896 int rt_val;
897
898
899 rt_val = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
900 OPCODE_COMMON_ISCSI_NTWK_MODIFY_DEFAULT_GATEWAY,
901 sizeof(*req));
902 if (rt_val)
903 return rt_val;
904
905 req = nonemb_cmd.va;
906 req->action = gtway_action;
907 req->ip_addr.ip_type = BE2_IPV4;
908
909 memcpy(req->ip_addr.addr, gt_addr, param_len);
910
911 return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
912}
913
914int mgmt_set_ip(struct beiscsi_hba *phba,
915 struct iscsi_iface_param_info *ip_param,
916 struct iscsi_iface_param_info *subnet_param,
917 uint32_t boot_proto)
918{
919 struct be_cmd_get_def_gateway_resp gtway_addr_set;
920 struct be_cmd_get_if_info_resp if_info;
921 struct be_cmd_set_dhcp_req *dhcpreq;
922 struct be_cmd_rel_dhcp_req *reldhcp;
923 struct be_dma_mem nonemb_cmd;
924 uint8_t *gtway_addr;
925 uint32_t ip_type;
926 int rc;
927
928 if (mgmt_get_all_if_id(phba))
929 return -EIO;
930
931 memset(&if_info, 0, sizeof(if_info));
932 ip_type = (ip_param->param == ISCSI_NET_PARAM_IPV6_ADDR) ?
933 BE2_IPV6 : BE2_IPV4 ;
934
935 rc = mgmt_get_if_info(phba, ip_type, &if_info);
936 if (rc)
937 return rc;
938
939 if (boot_proto == ISCSI_BOOTPROTO_DHCP) {
940 if (if_info.dhcp_state) {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530941 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
942 "BG_%d : DHCP Already Enabled\n");
Mike Christie0e438952012-04-03 23:41:51 -0500943 return 0;
944 }
945 /* The ip_param->len is 1 in DHCP case. Setting
946 proper IP len as this it is used while
947 freeing the Static IP.
948 */
949 ip_param->len = (ip_param->param == ISCSI_NET_PARAM_IPV6_ADDR) ?
950 IP_V6_LEN : IP_V4_LEN;
951
952 } else {
953 if (if_info.dhcp_state) {
954
955 memset(&if_info, 0, sizeof(if_info));
956 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
957 OPCODE_COMMON_ISCSI_NTWK_REL_STATELESS_IP_ADDR,
958 sizeof(*reldhcp));
959
960 if (rc)
961 return rc;
962
963 reldhcp = nonemb_cmd.va;
964 reldhcp->interface_hndl = phba->interface_handle;
965 reldhcp->ip_type = ip_type;
966
967 rc = mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
968 if (rc < 0) {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530969 beiscsi_log(phba, KERN_WARNING,
970 BEISCSI_LOG_CONFIG,
971 "BG_%d : Failed to Delete existing dhcp\n");
Mike Christie0e438952012-04-03 23:41:51 -0500972 return rc;
973 }
974 }
975 }
976
977 /* Delete the Static IP Set */
978 if (if_info.ip_addr.addr[0]) {
979 rc = mgmt_static_ip_modify(phba, &if_info, ip_param, NULL,
980 IP_ACTION_DEL);
981 if (rc)
982 return rc;
983 }
984
985 /* Delete the Gateway settings if mode change is to DHCP */
986 if (boot_proto == ISCSI_BOOTPROTO_DHCP) {
987 memset(&gtway_addr_set, 0, sizeof(gtway_addr_set));
988 rc = mgmt_get_gateway(phba, BE2_IPV4, &gtway_addr_set);
989 if (rc) {
John Soni Jose99bc5d52012-08-20 23:00:18 +0530990 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
991 "BG_%d : Failed to Get Gateway Addr\n");
Mike Christie0e438952012-04-03 23:41:51 -0500992 return rc;
993 }
994
995 if (gtway_addr_set.ip_addr.addr[0]) {
996 gtway_addr = (uint8_t *)&gtway_addr_set.ip_addr.addr;
997 rc = mgmt_modify_gateway(phba, gtway_addr,
998 IP_ACTION_DEL, IP_V4_LEN);
999
1000 if (rc) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301001 beiscsi_log(phba, KERN_WARNING,
1002 BEISCSI_LOG_CONFIG,
1003 "BG_%d : Failed to clear Gateway Addr Set\n");
Mike Christie0e438952012-04-03 23:41:51 -05001004 return rc;
1005 }
1006 }
1007 }
1008
1009 /* Set Adapter to DHCP/Static Mode */
1010 if (boot_proto == ISCSI_BOOTPROTO_DHCP) {
1011 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1012 OPCODE_COMMON_ISCSI_NTWK_CONFIG_STATELESS_IP_ADDR,
1013 sizeof(*dhcpreq));
1014 if (rc)
1015 return rc;
1016
1017 dhcpreq = nonemb_cmd.va;
1018 dhcpreq->flags = BLOCKING;
1019 dhcpreq->retry_count = 1;
1020 dhcpreq->interface_hndl = phba->interface_handle;
1021 dhcpreq->ip_type = BE2_DHCP_V4;
1022
1023 return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, NULL, 0);
1024 } else {
1025 return mgmt_static_ip_modify(phba, &if_info, ip_param,
1026 subnet_param, IP_ACTION_ADD);
1027 }
1028
1029 return rc;
1030}
1031
1032int mgmt_set_gateway(struct beiscsi_hba *phba,
1033 struct iscsi_iface_param_info *gateway_param)
1034{
1035 struct be_cmd_get_def_gateway_resp gtway_addr_set;
1036 uint8_t *gtway_addr;
1037 int rt_val;
1038
1039 memset(&gtway_addr_set, 0, sizeof(gtway_addr_set));
1040 rt_val = mgmt_get_gateway(phba, BE2_IPV4, &gtway_addr_set);
1041 if (rt_val) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301042 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1043 "BG_%d : Failed to Get Gateway Addr\n");
Mike Christie0e438952012-04-03 23:41:51 -05001044 return rt_val;
1045 }
1046
1047 if (gtway_addr_set.ip_addr.addr[0]) {
1048 gtway_addr = (uint8_t *)&gtway_addr_set.ip_addr.addr;
1049 rt_val = mgmt_modify_gateway(phba, gtway_addr, IP_ACTION_DEL,
1050 gateway_param->len);
1051 if (rt_val) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301052 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1053 "BG_%d : Failed to clear Gateway Addr Set\n");
Mike Christie0e438952012-04-03 23:41:51 -05001054 return rt_val;
1055 }
1056 }
1057
1058 gtway_addr = (uint8_t *)&gateway_param->value;
1059 rt_val = mgmt_modify_gateway(phba, gtway_addr, IP_ACTION_ADD,
1060 gateway_param->len);
1061
1062 if (rt_val)
John Soni Jose99bc5d52012-08-20 23:00:18 +05301063 beiscsi_log(phba, KERN_WARNING, BEISCSI_LOG_CONFIG,
1064 "BG_%d : Failed to Set Gateway Addr\n");
Mike Christie0e438952012-04-03 23:41:51 -05001065
1066 return rt_val;
1067}
1068
1069int mgmt_get_gateway(struct beiscsi_hba *phba, int ip_type,
1070 struct be_cmd_get_def_gateway_resp *gateway)
1071{
1072 struct be_cmd_get_def_gateway_req *req;
1073 struct be_dma_mem nonemb_cmd;
1074 int rc;
1075
1076 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1077 OPCODE_COMMON_ISCSI_NTWK_GET_DEFAULT_GATEWAY,
1078 sizeof(*gateway));
1079 if (rc)
1080 return rc;
1081
1082 req = nonemb_cmd.va;
1083 req->ip_type = ip_type;
1084
1085 return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, gateway,
1086 sizeof(*gateway));
1087}
1088
1089int mgmt_get_if_info(struct beiscsi_hba *phba, int ip_type,
1090 struct be_cmd_get_if_info_resp *if_info)
1091{
1092 struct be_cmd_get_if_info_req *req;
1093 struct be_dma_mem nonemb_cmd;
1094 int rc;
1095
1096 if (mgmt_get_all_if_id(phba))
1097 return -EIO;
1098
1099 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1100 OPCODE_COMMON_ISCSI_NTWK_GET_IF_INFO,
1101 sizeof(*if_info));
1102 if (rc)
1103 return rc;
1104
1105 req = nonemb_cmd.va;
1106 req->interface_hndl = phba->interface_handle;
1107 req->ip_type = ip_type;
1108
1109 return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, if_info,
1110 sizeof(*if_info));
1111}
1112
1113int mgmt_get_nic_conf(struct beiscsi_hba *phba,
1114 struct be_cmd_get_nic_conf_resp *nic)
1115{
1116 struct be_dma_mem nonemb_cmd;
1117 int rc;
1118
1119 rc = mgmt_alloc_cmd_data(phba, &nonemb_cmd,
1120 OPCODE_COMMON_ISCSI_NTWK_GET_NIC_CONFIG,
1121 sizeof(*nic));
1122 if (rc)
1123 return rc;
1124
1125 return mgmt_exec_nonemb_cmd(phba, &nonemb_cmd, nic, sizeof(*nic));
1126}
1127
1128
1129
John Soni Jose21771992012-04-03 23:41:49 -05001130unsigned int be_cmd_get_initname(struct beiscsi_hba *phba)
1131{
1132 unsigned int tag = 0;
1133 struct be_mcc_wrb *wrb;
1134 struct be_cmd_hba_name *req;
1135 struct be_ctrl_info *ctrl = &phba->ctrl;
1136
1137 spin_lock(&ctrl->mbox_lock);
1138 tag = alloc_mcc_tag(phba);
1139 if (!tag) {
1140 spin_unlock(&ctrl->mbox_lock);
1141 return tag;
1142 }
1143
1144 wrb = wrb_from_mccq(phba);
1145 req = embedded_payload(wrb);
1146 wrb->tag0 |= tag;
1147 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1148 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_ISCSI_INI,
1149 OPCODE_ISCSI_INI_CFG_GET_HBA_NAME,
1150 sizeof(*req));
1151
1152 be_mcc_notify(phba);
1153 spin_unlock(&ctrl->mbox_lock);
1154 return tag;
1155}
John Soni Josec62eef02012-04-03 23:41:52 -05001156
1157unsigned int be_cmd_get_port_speed(struct beiscsi_hba *phba)
1158{
1159 unsigned int tag = 0;
1160 struct be_mcc_wrb *wrb;
1161 struct be_cmd_ntwk_link_status_req *req;
1162 struct be_ctrl_info *ctrl = &phba->ctrl;
1163
1164 spin_lock(&ctrl->mbox_lock);
1165 tag = alloc_mcc_tag(phba);
1166 if (!tag) {
1167 spin_unlock(&ctrl->mbox_lock);
1168 return tag;
1169 }
1170
1171 wrb = wrb_from_mccq(phba);
1172 req = embedded_payload(wrb);
1173 wrb->tag0 |= tag;
1174 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0);
1175 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
1176 OPCODE_COMMON_NTWK_LINK_STATUS_QUERY,
1177 sizeof(*req));
1178
1179 be_mcc_notify(phba);
1180 spin_unlock(&ctrl->mbox_lock);
1181 return tag;
1182}
John Soni Jose9aef4202012-08-20 23:00:08 +05301183
1184/**
1185 * be_mgmt_get_boot_shandle()- Get the session handle
1186 * @phba: device priv structure instance
1187 * @s_handle: session handle returned for boot session.
1188 *
1189 * Get the boot target session handle. In case of
1190 * crashdump mode driver has to issue and MBX Cmd
1191 * for FW to login to boot target
1192 *
1193 * return
1194 * Success: 0
1195 * Failure: Non-Zero value
1196 *
1197 **/
1198int be_mgmt_get_boot_shandle(struct beiscsi_hba *phba,
1199 unsigned int *s_handle)
1200{
1201 struct be_cmd_get_boot_target_resp *boot_resp;
1202 struct be_mcc_wrb *wrb;
John Soni Josee175def2012-10-20 04:45:40 +05301203 unsigned int tag;
John Soni Jose9aef4202012-08-20 23:00:08 +05301204 uint8_t boot_retry = 3;
John Soni Josee175def2012-10-20 04:45:40 +05301205 int rc;
John Soni Jose9aef4202012-08-20 23:00:08 +05301206
1207 do {
1208 /* Get the Boot Target Session Handle and Count*/
1209 tag = mgmt_get_boot_target(phba);
1210 if (!tag) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301211 beiscsi_log(phba, KERN_ERR,
1212 BEISCSI_LOG_CONFIG | BEISCSI_LOG_INIT,
1213 "BG_%d : Getting Boot Target Info Failed\n");
John Soni Jose9aef4202012-08-20 23:00:08 +05301214 return -EAGAIN;
John Soni Josee175def2012-10-20 04:45:40 +05301215 }
John Soni Jose9aef4202012-08-20 23:00:08 +05301216
John Soni Josee175def2012-10-20 04:45:40 +05301217 rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
1218 if (rc) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301219 beiscsi_log(phba, KERN_ERR,
1220 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
John Soni Josee175def2012-10-20 04:45:40 +05301221 "BG_%d : MBX CMD get_boot_target Failed\n");
John Soni Jose9aef4202012-08-20 23:00:08 +05301222 return -EBUSY;
1223 }
John Soni Josee175def2012-10-20 04:45:40 +05301224
John Soni Jose9aef4202012-08-20 23:00:08 +05301225 boot_resp = embedded_payload(wrb);
1226
1227 /* Check if the there are any Boot targets configured */
1228 if (!boot_resp->boot_session_count) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301229 beiscsi_log(phba, KERN_INFO,
1230 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1231 "BG_%d ;No boot targets configured\n");
John Soni Jose9aef4202012-08-20 23:00:08 +05301232 return -ENXIO;
1233 }
1234
1235 /* FW returns the session handle of the boot session */
1236 if (boot_resp->boot_session_handle != INVALID_SESS_HANDLE) {
1237 *s_handle = boot_resp->boot_session_handle;
1238 return 0;
1239 }
1240
1241 /* Issue MBX Cmd to FW to login to the boot target */
1242 tag = mgmt_reopen_session(phba, BE_REOPEN_BOOT_SESSIONS,
1243 INVALID_SESS_HANDLE);
1244 if (!tag) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301245 beiscsi_log(phba, KERN_ERR,
1246 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1247 "BG_%d : mgmt_reopen_session Failed\n");
John Soni Jose9aef4202012-08-20 23:00:08 +05301248 return -EAGAIN;
John Soni Josee175def2012-10-20 04:45:40 +05301249 }
John Soni Jose9aef4202012-08-20 23:00:08 +05301250
John Soni Josee175def2012-10-20 04:45:40 +05301251 rc = beiscsi_mccq_compl(phba, tag, NULL, NULL);
1252 if (rc) {
John Soni Jose99bc5d52012-08-20 23:00:18 +05301253 beiscsi_log(phba, KERN_ERR,
1254 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
John Soni Josee175def2012-10-20 04:45:40 +05301255 "BG_%d : mgmt_reopen_session Failed");
1256 return rc;
John Soni Jose9aef4202012-08-20 23:00:08 +05301257 }
John Soni Jose9aef4202012-08-20 23:00:08 +05301258 } while (--boot_retry);
1259
1260 /* Couldn't log into the boot target */
John Soni Jose99bc5d52012-08-20 23:00:18 +05301261 beiscsi_log(phba, KERN_ERR,
1262 BEISCSI_LOG_INIT | BEISCSI_LOG_CONFIG,
1263 "BG_%d : Login to Boot Target Failed\n");
John Soni Jose9aef4202012-08-20 23:00:08 +05301264 return -ENXIO;
1265}
John Soni Jose6f722382012-08-20 23:00:43 +05301266
1267/**
1268 * mgmt_set_vlan()- Issue and wait for CMD completion
1269 * @phba: device private structure instance
1270 * @vlan_tag: VLAN tag
1271 *
1272 * Issue the MBX Cmd and wait for the completion of the
1273 * command.
1274 *
1275 * returns
1276 * Success: 0
1277 * Failure: Non-Xero Value
1278 **/
1279int mgmt_set_vlan(struct beiscsi_hba *phba,
1280 uint16_t vlan_tag)
1281{
John Soni Josee175def2012-10-20 04:45:40 +05301282 int rc;
1283 unsigned int tag;
1284 struct be_mcc_wrb *wrb = NULL;
John Soni Jose6f722382012-08-20 23:00:43 +05301285
1286 tag = be_cmd_set_vlan(phba, vlan_tag);
1287 if (!tag) {
1288 beiscsi_log(phba, KERN_ERR,
1289 (BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX),
1290 "BG_%d : VLAN Setting Failed\n");
1291 return -EBUSY;
John Soni Jose6f722382012-08-20 23:00:43 +05301292 }
1293
John Soni Josee175def2012-10-20 04:45:40 +05301294 rc = beiscsi_mccq_compl(phba, tag, &wrb, NULL);
1295 if (rc) {
1296 beiscsi_log(phba, KERN_ERR,
1297 (BEISCSI_LOG_CONFIG | BEISCSI_LOG_MBOX),
1298 "BS_%d : VLAN MBX Cmd Failed\n");
1299 return rc;
1300 }
1301 return rc;
John Soni Jose6f722382012-08-20 23:00:43 +05301302}
John Soni Jose5cac7592012-10-20 04:42:25 +05301303
1304/**
1305 * beiscsi_drvr_ver_disp()- Display the driver Name and Version
1306 * @dev: ptr to device not used.
1307 * @attr: device attribute, not used.
1308 * @buf: contains formatted text driver name and version
1309 *
1310 * return
1311 * size of the formatted string
1312 **/
1313ssize_t
1314beiscsi_drvr_ver_disp(struct device *dev, struct device_attribute *attr,
1315 char *buf)
1316{
1317 return snprintf(buf, PAGE_SIZE, BE_NAME "\n");
1318}
John Soni Joseacb96932012-10-20 04:44:35 +05301319
John Soni Jose26000db2012-10-20 04:45:06 +05301320/**
Jayamohan Kallickal22661e22013-04-05 20:38:28 -07001321 * beiscsi_fw_ver_disp()- Display Firmware Version
1322 * @dev: ptr to device not used.
1323 * @attr: device attribute, not used.
1324 * @buf: contains formatted text Firmware version
1325 *
1326 * return
1327 * size of the formatted string
1328 **/
1329ssize_t
1330beiscsi_fw_ver_disp(struct device *dev, struct device_attribute *attr,
1331 char *buf)
1332{
1333 struct Scsi_Host *shost = class_to_shost(dev);
1334 struct beiscsi_hba *phba = iscsi_host_priv(shost);
1335
1336 return snprintf(buf, PAGE_SIZE, "%s\n", phba->fw_ver_str);
1337}
1338
1339/**
Jayamohan Kallickal7ad4dfe2013-04-05 20:38:29 -07001340 * beiscsi_active_cid_disp()- Display Sessions Active
1341 * @dev: ptr to device not used.
1342 * @attr: device attribute, not used.
1343 * @buf: contains formatted text Session Count
1344 *
1345 * return
1346 * size of the formatted string
1347 **/
1348ssize_t
1349beiscsi_active_cid_disp(struct device *dev, struct device_attribute *attr,
1350 char *buf)
1351{
1352 struct Scsi_Host *shost = class_to_shost(dev);
1353 struct beiscsi_hba *phba = iscsi_host_priv(shost);
Jayamohan Kallickal0a3db7c2013-09-28 15:35:49 -07001354 uint16_t avlbl_cids = 0, ulp_num, len = 0, total_cids = 0;
Jayamohan Kallickal7ad4dfe2013-04-05 20:38:29 -07001355
Jayamohan Kallickal0a3db7c2013-09-28 15:35:49 -07001356 for (ulp_num = 0; ulp_num < BEISCSI_ULP_COUNT; ulp_num++) {
1357 if (test_bit(ulp_num, (void *)&phba->fw_config.ulp_supported)) {
1358 avlbl_cids = BEISCSI_ULP_AVLBL_CID(phba, ulp_num);
1359 total_cids = BEISCSI_GET_CID_COUNT(phba, ulp_num);
1360 len += snprintf(buf+len, PAGE_SIZE - len,
1361 "ULP%d : %d\n", ulp_num,
1362 (total_cids - avlbl_cids));
1363 } else
1364 len += snprintf(buf+len, PAGE_SIZE - len,
1365 "ULP%d : %d\n", ulp_num, 0);
1366 }
1367
1368 return len;
Jayamohan Kallickal7ad4dfe2013-04-05 20:38:29 -07001369}
1370
1371/**
John Soni Jose26000db2012-10-20 04:45:06 +05301372 * beiscsi_adap_family_disp()- Display adapter family.
1373 * @dev: ptr to device to get priv structure
1374 * @attr: device attribute, not used.
1375 * @buf: contains formatted text driver name and version
1376 *
1377 * return
1378 * size of the formatted string
1379 **/
1380ssize_t
1381beiscsi_adap_family_disp(struct device *dev, struct device_attribute *attr,
1382 char *buf)
1383{
1384 uint16_t dev_id = 0;
1385 struct Scsi_Host *shost = class_to_shost(dev);
1386 struct beiscsi_hba *phba = iscsi_host_priv(shost);
1387
1388 dev_id = phba->pcidev->device;
1389 switch (dev_id) {
1390 case BE_DEVICE_ID1:
1391 case OC_DEVICE_ID1:
1392 case OC_DEVICE_ID2:
1393 return snprintf(buf, PAGE_SIZE, "BE2 Adapter Family\n");
1394 break;
1395 case BE_DEVICE_ID2:
1396 case OC_DEVICE_ID3:
1397 return snprintf(buf, PAGE_SIZE, "BE3-R Adapter Family\n");
1398 break;
1399 case OC_SKH_ID1:
1400 return snprintf(buf, PAGE_SIZE, "Skyhawk-R Adapter Family\n");
1401 break;
1402 default:
1403 return snprintf(buf, PAGE_SIZE,
Masanari Iidab23f7a02013-04-18 00:12:55 +09001404 "Unknown Adapter Family: 0x%x\n", dev_id);
John Soni Jose26000db2012-10-20 04:45:06 +05301405 break;
1406 }
1407}
1408
1409
John Soni Joseacb96932012-10-20 04:44:35 +05301410void beiscsi_offload_cxn_v0(struct beiscsi_offload_params *params,
1411 struct wrb_handle *pwrb_handle,
1412 struct be_mem_descriptor *mem_descr)
1413{
1414 struct iscsi_wrb *pwrb = pwrb_handle->pwrb;
1415
1416 memset(pwrb, 0, sizeof(*pwrb));
1417 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1418 max_send_data_segment_length, pwrb,
1419 params->dw[offsetof(struct amap_beiscsi_offload_params,
1420 max_send_data_segment_length) / 32]);
1421 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, type, pwrb,
1422 BE_TGT_CTX_UPDT_CMD);
1423 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1424 first_burst_length,
1425 pwrb,
1426 params->dw[offsetof(struct amap_beiscsi_offload_params,
1427 first_burst_length) / 32]);
1428 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, erl, pwrb,
1429 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1430 erl) / 32] & OFFLD_PARAMS_ERL));
1431 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, dde, pwrb,
1432 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1433 dde) / 32] & OFFLD_PARAMS_DDE) >> 2);
1434 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, hde, pwrb,
1435 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1436 hde) / 32] & OFFLD_PARAMS_HDE) >> 3);
1437 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ir2t, pwrb,
1438 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1439 ir2t) / 32] & OFFLD_PARAMS_IR2T) >> 4);
1440 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, imd, pwrb,
1441 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1442 imd) / 32] & OFFLD_PARAMS_IMD) >> 5);
1443 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, stat_sn,
1444 pwrb,
1445 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1446 exp_statsn) / 32] + 1));
1447 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, wrb_idx,
1448 pwrb, pwrb_handle->wrb_index);
1449
1450 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1451 max_burst_length, pwrb, params->dw[offsetof
1452 (struct amap_beiscsi_offload_params,
1453 max_burst_length) / 32]);
1454
1455 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, ptr2nextwrb,
1456 pwrb, pwrb_handle->nxt_wrb_index);
1457 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1458 session_state, pwrb, 0);
1459 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, compltonack,
1460 pwrb, 1);
1461 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, notpredblq,
1462 pwrb, 0);
1463 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb, mode, pwrb,
1464 0);
1465
1466 mem_descr += ISCSI_MEM_GLOBAL_HEADER;
1467 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1468 pad_buffer_addr_hi, pwrb,
1469 mem_descr->mem_array[0].bus_address.u.a32.address_hi);
1470 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb,
1471 pad_buffer_addr_lo, pwrb,
1472 mem_descr->mem_array[0].bus_address.u.a32.address_lo);
1473}
1474
1475void beiscsi_offload_cxn_v2(struct beiscsi_offload_params *params,
1476 struct wrb_handle *pwrb_handle)
1477{
1478 struct iscsi_wrb *pwrb = pwrb_handle->pwrb;
1479
1480 memset(pwrb, 0, sizeof(*pwrb));
1481
John Soni Joseacb96932012-10-20 04:44:35 +05301482 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1483 max_burst_length, pwrb, params->dw[offsetof
1484 (struct amap_beiscsi_offload_params,
1485 max_burst_length) / 32]);
1486 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1487 type, pwrb,
1488 BE_TGT_CTX_UPDT_CMD);
1489 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1490 ptr2nextwrb,
1491 pwrb, pwrb_handle->nxt_wrb_index);
1492 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, wrb_idx,
1493 pwrb, pwrb_handle->wrb_index);
1494 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1495 max_send_data_segment_length, pwrb,
1496 params->dw[offsetof(struct amap_beiscsi_offload_params,
1497 max_send_data_segment_length) / 32]);
1498 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1499 first_burst_length, pwrb,
1500 params->dw[offsetof(struct amap_beiscsi_offload_params,
1501 first_burst_length) / 32]);
1502 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
Jayamohan Kallickal73316132013-09-28 15:35:41 -07001503 max_recv_dataseg_len, pwrb,
1504 params->dw[offsetof(struct amap_beiscsi_offload_params,
1505 max_recv_data_segment_length) / 32]);
John Soni Joseacb96932012-10-20 04:44:35 +05301506 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1507 max_cxns, pwrb, BEISCSI_MAX_CXNS);
1508 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, erl, pwrb,
1509 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1510 erl) / 32] & OFFLD_PARAMS_ERL));
1511 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, dde, pwrb,
1512 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1513 dde) / 32] & OFFLD_PARAMS_DDE) >> 2);
1514 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, hde, pwrb,
1515 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1516 hde) / 32] & OFFLD_PARAMS_HDE) >> 3);
1517 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1518 ir2t, pwrb,
1519 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1520 ir2t) / 32] & OFFLD_PARAMS_IR2T) >> 4);
1521 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, imd, pwrb,
1522 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1523 imd) / 32] & OFFLD_PARAMS_IMD) >> 5);
1524 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1525 data_seq_inorder,
1526 pwrb,
1527 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1528 data_seq_inorder) / 32] &
1529 OFFLD_PARAMS_DATA_SEQ_INORDER) >> 6);
1530 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2,
1531 pdu_seq_inorder,
1532 pwrb,
1533 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1534 pdu_seq_inorder) / 32] &
1535 OFFLD_PARAMS_PDU_SEQ_INORDER) >> 7);
1536 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, max_r2t,
1537 pwrb,
1538 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1539 max_r2t) / 32] &
1540 OFFLD_PARAMS_MAX_R2T) >> 8);
1541 AMAP_SET_BITS(struct amap_iscsi_target_context_update_wrb_v2, stat_sn,
1542 pwrb,
1543 (params->dw[offsetof(struct amap_beiscsi_offload_params,
1544 exp_statsn) / 32] + 1));
1545}