2 * Copyright (C) 2005 - 2010 ServerEngines
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.
10 * Written by: Jayamohan Kallickal (jayamohank@serverengines.com)
12 * Contact Information:
13 * linux-drivers@serverengines.com
16 * 209 N. Fair Oaks Ave
24 unsigned char mgmt_get_fw_config(struct be_ctrl_info
*ctrl
,
25 struct beiscsi_hba
*phba
)
27 struct be_mcc_wrb
*wrb
= wrb_from_mbox(&ctrl
->mbox_mem
);
28 struct be_fw_cfg
*req
= embedded_payload(wrb
);
31 spin_lock(&ctrl
->mbox_lock
);
32 memset(wrb
, 0, sizeof(*wrb
));
34 be_wrb_hdr_prepare(wrb
, sizeof(*req
), true, 0);
36 be_cmd_hdr_prepare(&req
->hdr
, CMD_SUBSYSTEM_COMMON
,
37 OPCODE_COMMON_QUERY_FIRMWARE_CONFIG
, sizeof(*req
));
38 status
= be_mbox_notify(ctrl
);
40 struct be_fw_cfg
*pfw_cfg
;
42 phba
->fw_config
.phys_port
= pfw_cfg
->phys_port
;
43 phba
->fw_config
.iscsi_icd_start
=
44 pfw_cfg
->ulp
[0].icd_base
;
45 phba
->fw_config
.iscsi_icd_count
=
46 pfw_cfg
->ulp
[0].icd_count
;
47 phba
->fw_config
.iscsi_cid_start
=
48 pfw_cfg
->ulp
[0].sq_base
;
49 phba
->fw_config
.iscsi_cid_count
=
50 pfw_cfg
->ulp
[0].sq_count
;
51 if (phba
->fw_config
.iscsi_cid_count
> (BE2_MAX_SESSIONS
/ 2)) {
53 "FW reported MAX CXNS as %d \t"
54 "Max Supported = %d.\n",
55 phba
->fw_config
.iscsi_cid_count
,
57 phba
->fw_config
.iscsi_cid_count
= BE2_MAX_SESSIONS
/ 2;
60 shost_printk(KERN_WARNING
, phba
->shost
,
61 "Failed in mgmt_get_fw_config \n");
64 spin_unlock(&ctrl
->mbox_lock
);
68 unsigned char mgmt_check_supported_fw(struct be_ctrl_info
*ctrl
,
69 struct beiscsi_hba
*phba
)
71 struct be_dma_mem nonemb_cmd
;
72 struct be_mcc_wrb
*wrb
= wrb_from_mbox(&ctrl
->mbox_mem
);
73 struct be_mgmt_controller_attributes
*req
;
74 struct be_sge
*sge
= nonembedded_sgl(wrb
);
77 nonemb_cmd
.va
= pci_alloc_consistent(ctrl
->pdev
,
78 sizeof(struct be_mgmt_controller_attributes
),
80 if (nonemb_cmd
.va
== NULL
) {
82 "Failed to allocate memory for mgmt_check_supported_fw"
86 nonemb_cmd
.size
= sizeof(struct be_mgmt_controller_attributes
);
88 memset(req
, 0, sizeof(*req
));
89 spin_lock(&ctrl
->mbox_lock
);
90 memset(wrb
, 0, sizeof(*wrb
));
91 be_wrb_hdr_prepare(wrb
, sizeof(*req
), false, 1);
92 be_cmd_hdr_prepare(&req
->hdr
, CMD_SUBSYSTEM_COMMON
,
93 OPCODE_COMMON_GET_CNTL_ATTRIBUTES
, sizeof(*req
));
94 sge
->pa_hi
= cpu_to_le32(upper_32_bits(nonemb_cmd
.dma
));
95 sge
->pa_lo
= cpu_to_le32(nonemb_cmd
.dma
& 0xFFFFFFFF);
96 sge
->len
= cpu_to_le32(nonemb_cmd
.size
);
97 status
= be_mbox_notify(ctrl
);
99 struct be_mgmt_controller_attributes_resp
*resp
= nonemb_cmd
.va
;
100 SE_DEBUG(DBG_LVL_8
, "Firmware version of CMD: %s\n",
101 resp
->params
.hba_attribs
.flashrom_version_string
);
102 SE_DEBUG(DBG_LVL_8
, "Firmware version is : %s\n",
103 resp
->params
.hba_attribs
.firmware_version_string
);
105 "Developer Build, not performing version check...\n");
106 phba
->fw_config
.iscsi_features
=
107 resp
->params
.hba_attribs
.iscsi_features
;
108 SE_DEBUG(DBG_LVL_8
, " phba->fw_config.iscsi_features = %d\n",
109 phba
->fw_config
.iscsi_features
);
111 SE_DEBUG(DBG_LVL_1
, " Failed in mgmt_check_supported_fw\n");
112 spin_unlock(&ctrl
->mbox_lock
);
114 pci_free_consistent(ctrl
->pdev
, nonemb_cmd
.size
,
115 nonemb_cmd
.va
, nonemb_cmd
.dma
);
121 unsigned char mgmt_epfw_cleanup(struct beiscsi_hba
*phba
, unsigned short chute
)
123 struct be_ctrl_info
*ctrl
= &phba
->ctrl
;
124 struct be_mcc_wrb
*wrb
= wrb_from_mccq(phba
);
125 struct iscsi_cleanup_req
*req
= embedded_payload(wrb
);
128 spin_lock(&ctrl
->mbox_lock
);
129 memset(wrb
, 0, sizeof(*wrb
));
131 be_wrb_hdr_prepare(wrb
, sizeof(*req
), true, 0);
132 be_cmd_hdr_prepare(&req
->hdr
, CMD_SUBSYSTEM_ISCSI
,
133 OPCODE_COMMON_ISCSI_CLEANUP
, sizeof(*req
));
136 req
->hdr_ring_id
= 0;
137 req
->data_ring_id
= 0;
139 status
= be_mcc_notify_wait(phba
);
141 shost_printk(KERN_WARNING
, phba
->shost
,
142 " mgmt_epfw_cleanup , FAILED\n");
143 spin_unlock(&ctrl
->mbox_lock
);
147 unsigned char mgmt_invalidate_icds(struct beiscsi_hba
*phba
,
148 struct invalidate_command_table
*inv_tbl
,
149 unsigned int num_invalidate
, unsigned int cid
)
151 struct be_dma_mem nonemb_cmd
;
152 struct be_ctrl_info
*ctrl
= &phba
->ctrl
;
153 struct be_mcc_wrb
*wrb
;
155 struct invalidate_commands_params_in
*req
;
156 unsigned int i
, tag
= 0;
158 spin_lock(&ctrl
->mbox_lock
);
159 tag
= alloc_mcc_tag(phba
);
161 spin_unlock(&ctrl
->mbox_lock
);
165 nonemb_cmd
.va
= pci_alloc_consistent(ctrl
->pdev
,
166 sizeof(struct invalidate_commands_params_in
),
168 if (nonemb_cmd
.va
== NULL
) {
170 "Failed to allocate memory for"
171 "mgmt_invalidate_icds \n");
172 spin_unlock(&ctrl
->mbox_lock
);
175 nonemb_cmd
.size
= sizeof(struct invalidate_commands_params_in
);
177 memset(req
, 0, sizeof(*req
));
178 wrb
= wrb_from_mccq(phba
);
179 sge
= nonembedded_sgl(wrb
);
182 be_wrb_hdr_prepare(wrb
, sizeof(*req
), false, 1);
183 be_cmd_hdr_prepare(&req
->hdr
, CMD_SUBSYSTEM_ISCSI
,
184 OPCODE_COMMON_ISCSI_ERROR_RECOVERY_INVALIDATE_COMMANDS
,
187 req
->cleanup_type
= CMD_ISCSI_COMMAND_INVALIDATE
;
188 for (i
= 0; i
< num_invalidate
; i
++) {
189 req
->table
[i
].icd
= inv_tbl
->icd
;
190 req
->table
[i
].cid
= inv_tbl
->cid
;
194 sge
->pa_hi
= cpu_to_le32(upper_32_bits(nonemb_cmd
.dma
));
195 sge
->pa_lo
= cpu_to_le32(nonemb_cmd
.dma
& 0xFFFFFFFF);
196 sge
->len
= cpu_to_le32(nonemb_cmd
.size
);
199 spin_unlock(&ctrl
->mbox_lock
);
201 pci_free_consistent(ctrl
->pdev
, nonemb_cmd
.size
,
202 nonemb_cmd
.va
, nonemb_cmd
.dma
);
206 unsigned char mgmt_invalidate_connection(struct beiscsi_hba
*phba
,
207 struct beiscsi_endpoint
*beiscsi_ep
,
209 unsigned short issue_reset
,
210 unsigned short savecfg_flag
)
212 struct be_ctrl_info
*ctrl
= &phba
->ctrl
;
213 struct be_mcc_wrb
*wrb
;
214 struct iscsi_invalidate_connection_params_in
*req
;
215 unsigned int tag
= 0;
217 spin_lock(&ctrl
->mbox_lock
);
218 tag
= alloc_mcc_tag(phba
);
220 spin_unlock(&ctrl
->mbox_lock
);
223 wrb
= wrb_from_mccq(phba
);
225 req
= embedded_payload(wrb
);
227 be_wrb_hdr_prepare(wrb
, sizeof(*req
), true, 0);
228 be_cmd_hdr_prepare(&req
->hdr
, CMD_SUBSYSTEM_ISCSI_INI
,
229 OPCODE_ISCSI_INI_DRIVER_INVALIDATE_CONNECTION
,
231 req
->session_handle
= beiscsi_ep
->fw_handle
;
234 req
->cleanup_type
= CMD_ISCSI_CONNECTION_ISSUE_TCP_RST
;
236 req
->cleanup_type
= CMD_ISCSI_CONNECTION_INVALIDATE
;
237 req
->save_cfg
= savecfg_flag
;
239 spin_unlock(&ctrl
->mbox_lock
);
243 unsigned char mgmt_upload_connection(struct beiscsi_hba
*phba
,
244 unsigned short cid
, unsigned int upload_flag
)
246 struct be_ctrl_info
*ctrl
= &phba
->ctrl
;
247 struct be_mcc_wrb
*wrb
;
248 struct tcp_upload_params_in
*req
;
249 unsigned int tag
= 0;
251 spin_lock(&ctrl
->mbox_lock
);
252 tag
= alloc_mcc_tag(phba
);
254 spin_unlock(&ctrl
->mbox_lock
);
257 wrb
= wrb_from_mccq(phba
);
258 req
= embedded_payload(wrb
);
261 be_wrb_hdr_prepare(wrb
, sizeof(*req
), true, 0);
262 be_cmd_hdr_prepare(&req
->hdr
, CMD_COMMON_TCP_UPLOAD
,
263 OPCODE_COMMON_TCP_UPLOAD
, sizeof(*req
));
264 req
->id
= (unsigned short)cid
;
265 req
->upload_type
= (unsigned char)upload_flag
;
267 spin_unlock(&ctrl
->mbox_lock
);
271 int mgmt_open_connection(struct beiscsi_hba
*phba
,
272 struct sockaddr
*dst_addr
,
273 struct beiscsi_endpoint
*beiscsi_ep
)
275 struct hwi_controller
*phwi_ctrlr
;
276 struct hwi_context_memory
*phwi_context
;
277 struct sockaddr_in
*daddr_in
= (struct sockaddr_in
*)dst_addr
;
278 struct sockaddr_in6
*daddr_in6
= (struct sockaddr_in6
*)dst_addr
;
279 struct be_ctrl_info
*ctrl
= &phba
->ctrl
;
280 struct be_mcc_wrb
*wrb
;
281 struct tcp_connect_and_offload_in
*req
;
282 unsigned short def_hdr_id
;
283 unsigned short def_data_id
;
284 struct phys_addr template_address
= { 0, 0 };
285 struct phys_addr
*ptemplate_address
;
286 unsigned int tag
= 0;
288 unsigned short cid
= beiscsi_ep
->ep_cid
;
290 phwi_ctrlr
= phba
->phwi_ctrlr
;
291 phwi_context
= phwi_ctrlr
->phwi_ctxt
;
292 def_hdr_id
= (unsigned short)HWI_GET_DEF_HDRQ_ID(phba
);
293 def_data_id
= (unsigned short)HWI_GET_DEF_BUFQ_ID(phba
);
295 ptemplate_address
= &template_address
;
296 ISCSI_GET_PDU_TEMPLATE_ADDRESS(phba
, ptemplate_address
);
297 spin_lock(&ctrl
->mbox_lock
);
298 tag
= alloc_mcc_tag(phba
);
300 spin_unlock(&ctrl
->mbox_lock
);
303 wrb
= wrb_from_mccq(phba
);
304 req
= embedded_payload(wrb
);
307 be_wrb_hdr_prepare(wrb
, sizeof(*req
), true, 0);
308 be_cmd_hdr_prepare(&req
->hdr
, CMD_SUBSYSTEM_ISCSI
,
309 OPCODE_COMMON_ISCSI_TCP_CONNECT_AND_OFFLOAD
,
311 if (dst_addr
->sa_family
== PF_INET
) {
312 __be32 s_addr
= daddr_in
->sin_addr
.s_addr
;
313 req
->ip_address
.ip_type
= BE2_IPV4
;
314 req
->ip_address
.ip_address
[0] = s_addr
& 0x000000ff;
315 req
->ip_address
.ip_address
[1] = (s_addr
& 0x0000ff00) >> 8;
316 req
->ip_address
.ip_address
[2] = (s_addr
& 0x00ff0000) >> 16;
317 req
->ip_address
.ip_address
[3] = (s_addr
& 0xff000000) >> 24;
318 req
->tcp_port
= ntohs(daddr_in
->sin_port
);
319 beiscsi_ep
->dst_addr
= daddr_in
->sin_addr
.s_addr
;
320 beiscsi_ep
->dst_tcpport
= ntohs(daddr_in
->sin_port
);
321 beiscsi_ep
->ip_type
= BE2_IPV4
;
322 } else if (dst_addr
->sa_family
== PF_INET6
) {
323 req
->ip_address
.ip_type
= BE2_IPV6
;
324 memcpy(&req
->ip_address
.ip_address
,
325 &daddr_in6
->sin6_addr
.in6_u
.u6_addr8
, 16);
326 req
->tcp_port
= ntohs(daddr_in6
->sin6_port
);
327 beiscsi_ep
->dst_tcpport
= ntohs(daddr_in6
->sin6_port
);
328 memcpy(&beiscsi_ep
->dst6_addr
,
329 &daddr_in6
->sin6_addr
.in6_u
.u6_addr8
, 16);
330 beiscsi_ep
->ip_type
= BE2_IPV6
;
332 shost_printk(KERN_ERR
, phba
->shost
, "unknown addr family %d\n",
333 dst_addr
->sa_family
);
334 spin_unlock(&ctrl
->mbox_lock
);
339 i
= phba
->nxt_cqid
++;
340 if (phba
->nxt_cqid
== phba
->num_cpus
)
342 req
->cq_id
= phwi_context
->be_cq
[i
].id
;
343 SE_DEBUG(DBG_LVL_8
, "i=%d cq_id=%d \n", i
, req
->cq_id
);
344 req
->defq_id
= def_hdr_id
;
345 req
->hdr_ring_id
= def_hdr_id
;
346 req
->data_ring_id
= def_data_id
;
348 req
->dataout_template_pa
.lo
= ptemplate_address
->lo
;
349 req
->dataout_template_pa
.hi
= ptemplate_address
->hi
;
351 spin_unlock(&ctrl
->mbox_lock
);
355 unsigned int be_cmd_get_mac_addr(struct beiscsi_hba
*phba
)
357 struct be_ctrl_info
*ctrl
= &phba
->ctrl
;
358 struct be_mcc_wrb
*wrb
;
359 struct be_cmd_req_get_mac_addr
*req
;
360 unsigned int tag
= 0;
362 SE_DEBUG(DBG_LVL_8
, "In be_cmd_get_mac_addr\n");
363 spin_lock(&ctrl
->mbox_lock
);
364 tag
= alloc_mcc_tag(phba
);
366 spin_unlock(&ctrl
->mbox_lock
);
370 wrb
= wrb_from_mccq(phba
);
371 req
= embedded_payload(wrb
);
373 be_wrb_hdr_prepare(wrb
, sizeof(*req
), true, 0);
374 be_cmd_hdr_prepare(&req
->hdr
, CMD_SUBSYSTEM_ISCSI
,
375 OPCODE_COMMON_ISCSI_NTWK_GET_NIC_CONFIG
,
379 spin_unlock(&ctrl
->mbox_lock
);