xref: /openbmc/linux/drivers/scsi/qla4xxx/ql4_os.c (revision 6f039790)
1 /*
2  * QLogic iSCSI HBA Driver
3  * Copyright (c)  2003-2012 QLogic Corporation
4  *
5  * See LICENSE.qla4xxx for copyright and licensing details.
6  */
7 #include <linux/moduleparam.h>
8 #include <linux/slab.h>
9 #include <linux/blkdev.h>
10 #include <linux/iscsi_boot_sysfs.h>
11 #include <linux/inet.h>
12 
13 #include <scsi/scsi_tcq.h>
14 #include <scsi/scsicam.h>
15 
16 #include "ql4_def.h"
17 #include "ql4_version.h"
18 #include "ql4_glbl.h"
19 #include "ql4_dbg.h"
20 #include "ql4_inline.h"
21 #include "ql4_83xx.h"
22 
23 /*
24  * Driver version
25  */
26 static char qla4xxx_version_str[40];
27 
28 /*
29  * SRB allocation cache
30  */
31 static struct kmem_cache *srb_cachep;
32 
33 /*
34  * Module parameter information and variables
35  */
36 static int ql4xdisablesysfsboot = 1;
37 module_param(ql4xdisablesysfsboot, int, S_IRUGO | S_IWUSR);
38 MODULE_PARM_DESC(ql4xdisablesysfsboot,
39 		 " Set to disable exporting boot targets to sysfs.\n"
40 		 "\t\t  0 - Export boot targets\n"
41 		 "\t\t  1 - Do not export boot targets (Default)");
42 
43 int ql4xdontresethba;
44 module_param(ql4xdontresethba, int, S_IRUGO | S_IWUSR);
45 MODULE_PARM_DESC(ql4xdontresethba,
46 		 " Don't reset the HBA for driver recovery.\n"
47 		 "\t\t  0 - It will reset HBA (Default)\n"
48 		 "\t\t  1 - It will NOT reset HBA");
49 
50 int ql4xextended_error_logging;
51 module_param(ql4xextended_error_logging, int, S_IRUGO | S_IWUSR);
52 MODULE_PARM_DESC(ql4xextended_error_logging,
53 		 " Option to enable extended error logging.\n"
54 		 "\t\t  0 - no logging (Default)\n"
55 		 "\t\t  2 - debug logging");
56 
57 int ql4xenablemsix = 1;
58 module_param(ql4xenablemsix, int, S_IRUGO|S_IWUSR);
59 MODULE_PARM_DESC(ql4xenablemsix,
60 		 " Set to enable MSI or MSI-X interrupt mechanism.\n"
61 		 "\t\t  0 = enable INTx interrupt mechanism.\n"
62 		 "\t\t  1 = enable MSI-X interrupt mechanism (Default).\n"
63 		 "\t\t  2 = enable MSI interrupt mechanism.");
64 
65 #define QL4_DEF_QDEPTH 32
66 static int ql4xmaxqdepth = QL4_DEF_QDEPTH;
67 module_param(ql4xmaxqdepth, int, S_IRUGO | S_IWUSR);
68 MODULE_PARM_DESC(ql4xmaxqdepth,
69 		 " Maximum queue depth to report for target devices.\n"
70 		 "\t\t  Default: 32.");
71 
72 static int ql4xqfulltracking = 1;
73 module_param(ql4xqfulltracking, int, S_IRUGO | S_IWUSR);
74 MODULE_PARM_DESC(ql4xqfulltracking,
75 		 " Enable or disable dynamic tracking and adjustment of\n"
76 		 "\t\t scsi device queue depth.\n"
77 		 "\t\t  0 - Disable.\n"
78 		 "\t\t  1 - Enable. (Default)");
79 
80 static int ql4xsess_recovery_tmo = QL4_SESS_RECOVERY_TMO;
81 module_param(ql4xsess_recovery_tmo, int, S_IRUGO);
82 MODULE_PARM_DESC(ql4xsess_recovery_tmo,
83 		" Target Session Recovery Timeout.\n"
84 		"\t\t  Default: 120 sec.");
85 
86 int ql4xmdcapmask = 0x1F;
87 module_param(ql4xmdcapmask, int, S_IRUGO);
88 MODULE_PARM_DESC(ql4xmdcapmask,
89 		 " Set the Minidump driver capture mask level.\n"
90 		 "\t\t  Default is 0x1F.\n"
91 		 "\t\t  Can be set to 0x3, 0x7, 0xF, 0x1F, 0x3F, 0x7F");
92 
93 int ql4xenablemd = 1;
94 module_param(ql4xenablemd, int, S_IRUGO | S_IWUSR);
95 MODULE_PARM_DESC(ql4xenablemd,
96 		 " Set to enable minidump.\n"
97 		 "\t\t  0 - disable minidump\n"
98 		 "\t\t  1 - enable minidump (Default)");
99 
100 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha);
101 /*
102  * SCSI host template entry points
103  */
104 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha);
105 
106 /*
107  * iSCSI template entry points
108  */
109 static int qla4xxx_session_get_param(struct iscsi_cls_session *cls_sess,
110 				     enum iscsi_param param, char *buf);
111 static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn,
112 				  enum iscsi_param param, char *buf);
113 static int qla4xxx_host_get_param(struct Scsi_Host *shost,
114 				  enum iscsi_host_param param, char *buf);
115 static int qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data,
116 				   uint32_t len);
117 static int qla4xxx_get_iface_param(struct iscsi_iface *iface,
118 				   enum iscsi_param_type param_type,
119 				   int param, char *buf);
120 static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc);
121 static struct iscsi_endpoint *qla4xxx_ep_connect(struct Scsi_Host *shost,
122 						 struct sockaddr *dst_addr,
123 						 int non_blocking);
124 static int qla4xxx_ep_poll(struct iscsi_endpoint *ep, int timeout_ms);
125 static void qla4xxx_ep_disconnect(struct iscsi_endpoint *ep);
126 static int qla4xxx_get_ep_param(struct iscsi_endpoint *ep,
127 				enum iscsi_param param, char *buf);
128 static int qla4xxx_conn_start(struct iscsi_cls_conn *conn);
129 static struct iscsi_cls_conn *
130 qla4xxx_conn_create(struct iscsi_cls_session *cls_sess, uint32_t conn_idx);
131 static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session,
132 			     struct iscsi_cls_conn *cls_conn,
133 			     uint64_t transport_fd, int is_leading);
134 static void qla4xxx_conn_destroy(struct iscsi_cls_conn *conn);
135 static struct iscsi_cls_session *
136 qla4xxx_session_create(struct iscsi_endpoint *ep, uint16_t cmds_max,
137 			uint16_t qdepth, uint32_t initial_cmdsn);
138 static void qla4xxx_session_destroy(struct iscsi_cls_session *sess);
139 static void qla4xxx_task_work(struct work_struct *wdata);
140 static int qla4xxx_alloc_pdu(struct iscsi_task *, uint8_t);
141 static int qla4xxx_task_xmit(struct iscsi_task *);
142 static void qla4xxx_task_cleanup(struct iscsi_task *);
143 static void qla4xxx_fail_session(struct iscsi_cls_session *cls_session);
144 static void qla4xxx_conn_get_stats(struct iscsi_cls_conn *cls_conn,
145 				   struct iscsi_stats *stats);
146 static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num,
147 			     uint32_t iface_type, uint32_t payload_size,
148 			     uint32_t pid, struct sockaddr *dst_addr);
149 static int qla4xxx_get_chap_list(struct Scsi_Host *shost, uint16_t chap_tbl_idx,
150 				 uint32_t *num_entries, char *buf);
151 static int qla4xxx_delete_chap(struct Scsi_Host *shost, uint16_t chap_tbl_idx);
152 
153 /*
154  * SCSI host template entry points
155  */
156 static int qla4xxx_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *cmd);
157 static int qla4xxx_eh_abort(struct scsi_cmnd *cmd);
158 static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd);
159 static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd);
160 static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd);
161 static int qla4xxx_slave_alloc(struct scsi_device *device);
162 static int qla4xxx_slave_configure(struct scsi_device *device);
163 static void qla4xxx_slave_destroy(struct scsi_device *sdev);
164 static umode_t qla4_attr_is_visible(int param_type, int param);
165 static int qla4xxx_host_reset(struct Scsi_Host *shost, int reset_type);
166 static int qla4xxx_change_queue_depth(struct scsi_device *sdev, int qdepth,
167 				      int reason);
168 
169 static struct qla4_8xxx_legacy_intr_set legacy_intr[] =
170     QLA82XX_LEGACY_INTR_CONFIG;
171 
172 static struct scsi_host_template qla4xxx_driver_template = {
173 	.module			= THIS_MODULE,
174 	.name			= DRIVER_NAME,
175 	.proc_name		= DRIVER_NAME,
176 	.queuecommand		= qla4xxx_queuecommand,
177 
178 	.eh_abort_handler	= qla4xxx_eh_abort,
179 	.eh_device_reset_handler = qla4xxx_eh_device_reset,
180 	.eh_target_reset_handler = qla4xxx_eh_target_reset,
181 	.eh_host_reset_handler	= qla4xxx_eh_host_reset,
182 	.eh_timed_out		= qla4xxx_eh_cmd_timed_out,
183 
184 	.slave_configure	= qla4xxx_slave_configure,
185 	.slave_alloc		= qla4xxx_slave_alloc,
186 	.slave_destroy		= qla4xxx_slave_destroy,
187 	.change_queue_depth	= qla4xxx_change_queue_depth,
188 
189 	.this_id		= -1,
190 	.cmd_per_lun		= 3,
191 	.use_clustering		= ENABLE_CLUSTERING,
192 	.sg_tablesize		= SG_ALL,
193 
194 	.max_sectors		= 0xFFFF,
195 	.shost_attrs		= qla4xxx_host_attrs,
196 	.host_reset		= qla4xxx_host_reset,
197 	.vendor_id		= SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_QLOGIC,
198 };
199 
200 static struct iscsi_transport qla4xxx_iscsi_transport = {
201 	.owner			= THIS_MODULE,
202 	.name			= DRIVER_NAME,
203 	.caps			= CAP_TEXT_NEGO |
204 				  CAP_DATA_PATH_OFFLOAD | CAP_HDRDGST |
205 				  CAP_DATADGST | CAP_LOGIN_OFFLOAD |
206 				  CAP_MULTI_R2T,
207 	.attr_is_visible	= qla4_attr_is_visible,
208 	.create_session         = qla4xxx_session_create,
209 	.destroy_session        = qla4xxx_session_destroy,
210 	.start_conn             = qla4xxx_conn_start,
211 	.create_conn            = qla4xxx_conn_create,
212 	.bind_conn              = qla4xxx_conn_bind,
213 	.stop_conn              = iscsi_conn_stop,
214 	.destroy_conn           = qla4xxx_conn_destroy,
215 	.set_param              = iscsi_set_param,
216 	.get_conn_param		= qla4xxx_conn_get_param,
217 	.get_session_param	= qla4xxx_session_get_param,
218 	.get_ep_param           = qla4xxx_get_ep_param,
219 	.ep_connect		= qla4xxx_ep_connect,
220 	.ep_poll		= qla4xxx_ep_poll,
221 	.ep_disconnect		= qla4xxx_ep_disconnect,
222 	.get_stats		= qla4xxx_conn_get_stats,
223 	.send_pdu		= iscsi_conn_send_pdu,
224 	.xmit_task		= qla4xxx_task_xmit,
225 	.cleanup_task		= qla4xxx_task_cleanup,
226 	.alloc_pdu		= qla4xxx_alloc_pdu,
227 
228 	.get_host_param		= qla4xxx_host_get_param,
229 	.set_iface_param	= qla4xxx_iface_set_param,
230 	.get_iface_param	= qla4xxx_get_iface_param,
231 	.bsg_request		= qla4xxx_bsg_request,
232 	.send_ping		= qla4xxx_send_ping,
233 	.get_chap		= qla4xxx_get_chap_list,
234 	.delete_chap		= qla4xxx_delete_chap,
235 };
236 
237 static struct scsi_transport_template *qla4xxx_scsi_transport;
238 
239 static int qla4xxx_send_ping(struct Scsi_Host *shost, uint32_t iface_num,
240 			     uint32_t iface_type, uint32_t payload_size,
241 			     uint32_t pid, struct sockaddr *dst_addr)
242 {
243 	struct scsi_qla_host *ha = to_qla_host(shost);
244 	struct sockaddr_in *addr;
245 	struct sockaddr_in6 *addr6;
246 	uint32_t options = 0;
247 	uint8_t ipaddr[IPv6_ADDR_LEN];
248 	int rval;
249 
250 	memset(ipaddr, 0, IPv6_ADDR_LEN);
251 	/* IPv4 to IPv4 */
252 	if ((iface_type == ISCSI_IFACE_TYPE_IPV4) &&
253 	    (dst_addr->sa_family == AF_INET)) {
254 		addr = (struct sockaddr_in *)dst_addr;
255 		memcpy(ipaddr, &addr->sin_addr.s_addr, IP_ADDR_LEN);
256 		DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv4 Ping src: %pI4 "
257 				  "dest: %pI4\n", __func__,
258 				  &ha->ip_config.ip_address, ipaddr));
259 		rval = qla4xxx_ping_iocb(ha, options, payload_size, pid,
260 					 ipaddr);
261 		if (rval)
262 			rval = -EINVAL;
263 	} else if ((iface_type == ISCSI_IFACE_TYPE_IPV6) &&
264 		   (dst_addr->sa_family == AF_INET6)) {
265 		/* IPv6 to IPv6 */
266 		addr6 = (struct sockaddr_in6 *)dst_addr;
267 		memcpy(ipaddr, &addr6->sin6_addr.in6_u.u6_addr8, IPv6_ADDR_LEN);
268 
269 		options |= PING_IPV6_PROTOCOL_ENABLE;
270 
271 		/* Ping using LinkLocal address */
272 		if ((iface_num == 0) || (iface_num == 1)) {
273 			DEBUG2(ql4_printk(KERN_INFO, ha, "%s: LinkLocal Ping "
274 					  "src: %pI6 dest: %pI6\n", __func__,
275 					  &ha->ip_config.ipv6_link_local_addr,
276 					  ipaddr));
277 			options |= PING_IPV6_LINKLOCAL_ADDR;
278 			rval = qla4xxx_ping_iocb(ha, options, payload_size,
279 						 pid, ipaddr);
280 		} else {
281 			ql4_printk(KERN_WARNING, ha, "%s: iface num = %d "
282 				   "not supported\n", __func__, iface_num);
283 			rval = -ENOSYS;
284 			goto exit_send_ping;
285 		}
286 
287 		/*
288 		 * If ping using LinkLocal address fails, try ping using
289 		 * IPv6 address
290 		 */
291 		if (rval != QLA_SUCCESS) {
292 			options &= ~PING_IPV6_LINKLOCAL_ADDR;
293 			if (iface_num == 0) {
294 				options |= PING_IPV6_ADDR0;
295 				DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 "
296 						  "Ping src: %pI6 "
297 						  "dest: %pI6\n", __func__,
298 						  &ha->ip_config.ipv6_addr0,
299 						  ipaddr));
300 			} else if (iface_num == 1) {
301 				options |= PING_IPV6_ADDR1;
302 				DEBUG2(ql4_printk(KERN_INFO, ha, "%s: IPv6 "
303 						  "Ping src: %pI6 "
304 						  "dest: %pI6\n", __func__,
305 						  &ha->ip_config.ipv6_addr1,
306 						  ipaddr));
307 			}
308 			rval = qla4xxx_ping_iocb(ha, options, payload_size,
309 						 pid, ipaddr);
310 			if (rval)
311 				rval = -EINVAL;
312 		}
313 	} else
314 		rval = -ENOSYS;
315 exit_send_ping:
316 	return rval;
317 }
318 
319 static umode_t qla4_attr_is_visible(int param_type, int param)
320 {
321 	switch (param_type) {
322 	case ISCSI_HOST_PARAM:
323 		switch (param) {
324 		case ISCSI_HOST_PARAM_HWADDRESS:
325 		case ISCSI_HOST_PARAM_IPADDRESS:
326 		case ISCSI_HOST_PARAM_INITIATOR_NAME:
327 		case ISCSI_HOST_PARAM_PORT_STATE:
328 		case ISCSI_HOST_PARAM_PORT_SPEED:
329 			return S_IRUGO;
330 		default:
331 			return 0;
332 		}
333 	case ISCSI_PARAM:
334 		switch (param) {
335 		case ISCSI_PARAM_PERSISTENT_ADDRESS:
336 		case ISCSI_PARAM_PERSISTENT_PORT:
337 		case ISCSI_PARAM_CONN_ADDRESS:
338 		case ISCSI_PARAM_CONN_PORT:
339 		case ISCSI_PARAM_TARGET_NAME:
340 		case ISCSI_PARAM_TPGT:
341 		case ISCSI_PARAM_TARGET_ALIAS:
342 		case ISCSI_PARAM_MAX_BURST:
343 		case ISCSI_PARAM_MAX_R2T:
344 		case ISCSI_PARAM_FIRST_BURST:
345 		case ISCSI_PARAM_MAX_RECV_DLENGTH:
346 		case ISCSI_PARAM_MAX_XMIT_DLENGTH:
347 		case ISCSI_PARAM_IFACE_NAME:
348 		case ISCSI_PARAM_CHAP_OUT_IDX:
349 		case ISCSI_PARAM_CHAP_IN_IDX:
350 		case ISCSI_PARAM_USERNAME:
351 		case ISCSI_PARAM_PASSWORD:
352 		case ISCSI_PARAM_USERNAME_IN:
353 		case ISCSI_PARAM_PASSWORD_IN:
354 			return S_IRUGO;
355 		default:
356 			return 0;
357 		}
358 	case ISCSI_NET_PARAM:
359 		switch (param) {
360 		case ISCSI_NET_PARAM_IPV4_ADDR:
361 		case ISCSI_NET_PARAM_IPV4_SUBNET:
362 		case ISCSI_NET_PARAM_IPV4_GW:
363 		case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
364 		case ISCSI_NET_PARAM_IFACE_ENABLE:
365 		case ISCSI_NET_PARAM_IPV6_LINKLOCAL:
366 		case ISCSI_NET_PARAM_IPV6_ADDR:
367 		case ISCSI_NET_PARAM_IPV6_ROUTER:
368 		case ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG:
369 		case ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG:
370 		case ISCSI_NET_PARAM_VLAN_ID:
371 		case ISCSI_NET_PARAM_VLAN_PRIORITY:
372 		case ISCSI_NET_PARAM_VLAN_ENABLED:
373 		case ISCSI_NET_PARAM_MTU:
374 		case ISCSI_NET_PARAM_PORT:
375 			return S_IRUGO;
376 		default:
377 			return 0;
378 		}
379 	}
380 
381 	return 0;
382 }
383 
384 static int qla4xxx_get_chap_list(struct Scsi_Host *shost, uint16_t chap_tbl_idx,
385 				  uint32_t *num_entries, char *buf)
386 {
387 	struct scsi_qla_host *ha = to_qla_host(shost);
388 	struct ql4_chap_table *chap_table;
389 	struct iscsi_chap_rec *chap_rec;
390 	int max_chap_entries = 0;
391 	int valid_chap_entries = 0;
392 	int ret = 0, i;
393 
394 	if (is_qla8022(ha))
395 		max_chap_entries = (ha->hw.flt_chap_size / 2) /
396 					sizeof(struct ql4_chap_table);
397 	else
398 		max_chap_entries = MAX_CHAP_ENTRIES_40XX;
399 
400 	ql4_printk(KERN_INFO, ha, "%s: num_entries = %d, CHAP idx = %d\n",
401 			__func__, *num_entries, chap_tbl_idx);
402 
403 	if (!buf) {
404 		ret = -ENOMEM;
405 		goto exit_get_chap_list;
406 	}
407 
408 	chap_rec = (struct iscsi_chap_rec *) buf;
409 	mutex_lock(&ha->chap_sem);
410 	for (i = chap_tbl_idx; i < max_chap_entries; i++) {
411 		chap_table = (struct ql4_chap_table *)ha->chap_list + i;
412 		if (chap_table->cookie !=
413 		    __constant_cpu_to_le16(CHAP_VALID_COOKIE))
414 			continue;
415 
416 		chap_rec->chap_tbl_idx = i;
417 		strncpy(chap_rec->username, chap_table->name,
418 			ISCSI_CHAP_AUTH_NAME_MAX_LEN);
419 		strncpy(chap_rec->password, chap_table->secret,
420 			QL4_CHAP_MAX_SECRET_LEN);
421 		chap_rec->password_length = chap_table->secret_len;
422 
423 		if (chap_table->flags & BIT_7) /* local */
424 			chap_rec->chap_type = CHAP_TYPE_OUT;
425 
426 		if (chap_table->flags & BIT_6) /* peer */
427 			chap_rec->chap_type = CHAP_TYPE_IN;
428 
429 		chap_rec++;
430 
431 		valid_chap_entries++;
432 		if (valid_chap_entries == *num_entries)
433 			break;
434 		else
435 			continue;
436 	}
437 	mutex_unlock(&ha->chap_sem);
438 
439 exit_get_chap_list:
440 	ql4_printk(KERN_INFO, ha, "%s: Valid CHAP Entries = %d\n",
441 			__func__,  valid_chap_entries);
442 	*num_entries = valid_chap_entries;
443 	return ret;
444 }
445 
446 static int __qla4xxx_is_chap_active(struct device *dev, void *data)
447 {
448 	int ret = 0;
449 	uint16_t *chap_tbl_idx = (uint16_t *) data;
450 	struct iscsi_cls_session *cls_session;
451 	struct iscsi_session *sess;
452 	struct ddb_entry *ddb_entry;
453 
454 	if (!iscsi_is_session_dev(dev))
455 		goto exit_is_chap_active;
456 
457 	cls_session = iscsi_dev_to_session(dev);
458 	sess = cls_session->dd_data;
459 	ddb_entry = sess->dd_data;
460 
461 	if (iscsi_session_chkready(cls_session))
462 		goto exit_is_chap_active;
463 
464 	if (ddb_entry->chap_tbl_idx == *chap_tbl_idx)
465 		ret = 1;
466 
467 exit_is_chap_active:
468 	return ret;
469 }
470 
471 static int qla4xxx_is_chap_active(struct Scsi_Host *shost,
472 				  uint16_t chap_tbl_idx)
473 {
474 	int ret = 0;
475 
476 	ret = device_for_each_child(&shost->shost_gendev, &chap_tbl_idx,
477 				    __qla4xxx_is_chap_active);
478 
479 	return ret;
480 }
481 
482 static int qla4xxx_delete_chap(struct Scsi_Host *shost, uint16_t chap_tbl_idx)
483 {
484 	struct scsi_qla_host *ha = to_qla_host(shost);
485 	struct ql4_chap_table *chap_table;
486 	dma_addr_t chap_dma;
487 	int max_chap_entries = 0;
488 	uint32_t offset = 0;
489 	uint32_t chap_size;
490 	int ret = 0;
491 
492 	chap_table = dma_pool_alloc(ha->chap_dma_pool, GFP_KERNEL, &chap_dma);
493 	if (chap_table == NULL)
494 		return -ENOMEM;
495 
496 	memset(chap_table, 0, sizeof(struct ql4_chap_table));
497 
498 	if (is_qla8022(ha))
499 		max_chap_entries = (ha->hw.flt_chap_size / 2) /
500 				   sizeof(struct ql4_chap_table);
501 	else
502 		max_chap_entries = MAX_CHAP_ENTRIES_40XX;
503 
504 	if (chap_tbl_idx > max_chap_entries) {
505 		ret = -EINVAL;
506 		goto exit_delete_chap;
507 	}
508 
509 	/* Check if chap index is in use.
510 	 * If chap is in use don't delet chap entry */
511 	ret = qla4xxx_is_chap_active(shost, chap_tbl_idx);
512 	if (ret) {
513 		ql4_printk(KERN_INFO, ha, "CHAP entry %d is in use, cannot "
514 			   "delete from flash\n", chap_tbl_idx);
515 		ret = -EBUSY;
516 		goto exit_delete_chap;
517 	}
518 
519 	chap_size = sizeof(struct ql4_chap_table);
520 	if (is_qla40XX(ha))
521 		offset = FLASH_CHAP_OFFSET | (chap_tbl_idx * chap_size);
522 	else {
523 		offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2);
524 		/* flt_chap_size is CHAP table size for both ports
525 		 * so divide it by 2 to calculate the offset for second port
526 		 */
527 		if (ha->port_num == 1)
528 			offset += (ha->hw.flt_chap_size / 2);
529 		offset += (chap_tbl_idx * chap_size);
530 	}
531 
532 	ret = qla4xxx_get_flash(ha, chap_dma, offset, chap_size);
533 	if (ret != QLA_SUCCESS) {
534 		ret = -EINVAL;
535 		goto exit_delete_chap;
536 	}
537 
538 	DEBUG2(ql4_printk(KERN_INFO, ha, "Chap Cookie: x%x\n",
539 			  __le16_to_cpu(chap_table->cookie)));
540 
541 	if (__le16_to_cpu(chap_table->cookie) != CHAP_VALID_COOKIE) {
542 		ql4_printk(KERN_ERR, ha, "No valid chap entry found\n");
543 		goto exit_delete_chap;
544 	}
545 
546 	chap_table->cookie = __constant_cpu_to_le16(0xFFFF);
547 
548 	offset = FLASH_CHAP_OFFSET |
549 			(chap_tbl_idx * sizeof(struct ql4_chap_table));
550 	ret = qla4xxx_set_flash(ha, chap_dma, offset, chap_size,
551 				FLASH_OPT_RMW_COMMIT);
552 	if (ret == QLA_SUCCESS && ha->chap_list) {
553 		mutex_lock(&ha->chap_sem);
554 		/* Update ha chap_list cache */
555 		memcpy((struct ql4_chap_table *)ha->chap_list + chap_tbl_idx,
556 			chap_table, sizeof(struct ql4_chap_table));
557 		mutex_unlock(&ha->chap_sem);
558 	}
559 	if (ret != QLA_SUCCESS)
560 		ret =  -EINVAL;
561 
562 exit_delete_chap:
563 	dma_pool_free(ha->chap_dma_pool, chap_table, chap_dma);
564 	return ret;
565 }
566 
567 static int qla4xxx_get_iface_param(struct iscsi_iface *iface,
568 				   enum iscsi_param_type param_type,
569 				   int param, char *buf)
570 {
571 	struct Scsi_Host *shost = iscsi_iface_to_shost(iface);
572 	struct scsi_qla_host *ha = to_qla_host(shost);
573 	int len = -ENOSYS;
574 
575 	if (param_type != ISCSI_NET_PARAM)
576 		return -ENOSYS;
577 
578 	switch (param) {
579 	case ISCSI_NET_PARAM_IPV4_ADDR:
580 		len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address);
581 		break;
582 	case ISCSI_NET_PARAM_IPV4_SUBNET:
583 		len = sprintf(buf, "%pI4\n", &ha->ip_config.subnet_mask);
584 		break;
585 	case ISCSI_NET_PARAM_IPV4_GW:
586 		len = sprintf(buf, "%pI4\n", &ha->ip_config.gateway);
587 		break;
588 	case ISCSI_NET_PARAM_IFACE_ENABLE:
589 		if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
590 			len = sprintf(buf, "%s\n",
591 				      (ha->ip_config.ipv4_options &
592 				       IPOPT_IPV4_PROTOCOL_ENABLE) ?
593 				      "enabled" : "disabled");
594 		else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV6)
595 			len = sprintf(buf, "%s\n",
596 				      (ha->ip_config.ipv6_options &
597 				       IPV6_OPT_IPV6_PROTOCOL_ENABLE) ?
598 				       "enabled" : "disabled");
599 		break;
600 	case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
601 		len = sprintf(buf, "%s\n",
602 			      (ha->ip_config.tcp_options & TCPOPT_DHCP_ENABLE) ?
603 			      "dhcp" : "static");
604 		break;
605 	case ISCSI_NET_PARAM_IPV6_ADDR:
606 		if (iface->iface_num == 0)
607 			len = sprintf(buf, "%pI6\n", &ha->ip_config.ipv6_addr0);
608 		if (iface->iface_num == 1)
609 			len = sprintf(buf, "%pI6\n", &ha->ip_config.ipv6_addr1);
610 		break;
611 	case ISCSI_NET_PARAM_IPV6_LINKLOCAL:
612 		len = sprintf(buf, "%pI6\n",
613 			      &ha->ip_config.ipv6_link_local_addr);
614 		break;
615 	case ISCSI_NET_PARAM_IPV6_ROUTER:
616 		len = sprintf(buf, "%pI6\n",
617 			      &ha->ip_config.ipv6_default_router_addr);
618 		break;
619 	case ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG:
620 		len = sprintf(buf, "%s\n",
621 			      (ha->ip_config.ipv6_addl_options &
622 			       IPV6_ADDOPT_NEIGHBOR_DISCOVERY_ADDR_ENABLE) ?
623 			       "nd" : "static");
624 		break;
625 	case ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG:
626 		len = sprintf(buf, "%s\n",
627 			      (ha->ip_config.ipv6_addl_options &
628 			       IPV6_ADDOPT_AUTOCONFIG_LINK_LOCAL_ADDR) ?
629 			       "auto" : "static");
630 		break;
631 	case ISCSI_NET_PARAM_VLAN_ID:
632 		if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
633 			len = sprintf(buf, "%d\n",
634 				      (ha->ip_config.ipv4_vlan_tag &
635 				       ISCSI_MAX_VLAN_ID));
636 		else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV6)
637 			len = sprintf(buf, "%d\n",
638 				      (ha->ip_config.ipv6_vlan_tag &
639 				       ISCSI_MAX_VLAN_ID));
640 		break;
641 	case ISCSI_NET_PARAM_VLAN_PRIORITY:
642 		if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
643 			len = sprintf(buf, "%d\n",
644 				      ((ha->ip_config.ipv4_vlan_tag >> 13) &
645 					ISCSI_MAX_VLAN_PRIORITY));
646 		else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV6)
647 			len = sprintf(buf, "%d\n",
648 				      ((ha->ip_config.ipv6_vlan_tag >> 13) &
649 					ISCSI_MAX_VLAN_PRIORITY));
650 		break;
651 	case ISCSI_NET_PARAM_VLAN_ENABLED:
652 		if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
653 			len = sprintf(buf, "%s\n",
654 				      (ha->ip_config.ipv4_options &
655 				       IPOPT_VLAN_TAGGING_ENABLE) ?
656 				       "enabled" : "disabled");
657 		else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV6)
658 			len = sprintf(buf, "%s\n",
659 				      (ha->ip_config.ipv6_options &
660 				       IPV6_OPT_VLAN_TAGGING_ENABLE) ?
661 				       "enabled" : "disabled");
662 		break;
663 	case ISCSI_NET_PARAM_MTU:
664 		len = sprintf(buf, "%d\n", ha->ip_config.eth_mtu_size);
665 		break;
666 	case ISCSI_NET_PARAM_PORT:
667 		if (iface->iface_type == ISCSI_IFACE_TYPE_IPV4)
668 			len = sprintf(buf, "%d\n", ha->ip_config.ipv4_port);
669 		else if (iface->iface_type == ISCSI_IFACE_TYPE_IPV6)
670 			len = sprintf(buf, "%d\n", ha->ip_config.ipv6_port);
671 		break;
672 	default:
673 		len = -ENOSYS;
674 	}
675 
676 	return len;
677 }
678 
679 static struct iscsi_endpoint *
680 qla4xxx_ep_connect(struct Scsi_Host *shost, struct sockaddr *dst_addr,
681 		   int non_blocking)
682 {
683 	int ret;
684 	struct iscsi_endpoint *ep;
685 	struct qla_endpoint *qla_ep;
686 	struct scsi_qla_host *ha;
687 	struct sockaddr_in *addr;
688 	struct sockaddr_in6 *addr6;
689 
690 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
691 	if (!shost) {
692 		ret = -ENXIO;
693 		printk(KERN_ERR "%s: shost is NULL\n",
694 		       __func__);
695 		return ERR_PTR(ret);
696 	}
697 
698 	ha = iscsi_host_priv(shost);
699 
700 	ep = iscsi_create_endpoint(sizeof(struct qla_endpoint));
701 	if (!ep) {
702 		ret = -ENOMEM;
703 		return ERR_PTR(ret);
704 	}
705 
706 	qla_ep = ep->dd_data;
707 	memset(qla_ep, 0, sizeof(struct qla_endpoint));
708 	if (dst_addr->sa_family == AF_INET) {
709 		memcpy(&qla_ep->dst_addr, dst_addr, sizeof(struct sockaddr_in));
710 		addr = (struct sockaddr_in *)&qla_ep->dst_addr;
711 		DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI4\n", __func__,
712 				  (char *)&addr->sin_addr));
713 	} else if (dst_addr->sa_family == AF_INET6) {
714 		memcpy(&qla_ep->dst_addr, dst_addr,
715 		       sizeof(struct sockaddr_in6));
716 		addr6 = (struct sockaddr_in6 *)&qla_ep->dst_addr;
717 		DEBUG2(ql4_printk(KERN_INFO, ha, "%s: %pI6\n", __func__,
718 				  (char *)&addr6->sin6_addr));
719 	}
720 
721 	qla_ep->host = shost;
722 
723 	return ep;
724 }
725 
726 static int qla4xxx_ep_poll(struct iscsi_endpoint *ep, int timeout_ms)
727 {
728 	struct qla_endpoint *qla_ep;
729 	struct scsi_qla_host *ha;
730 	int ret = 0;
731 
732 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
733 	qla_ep = ep->dd_data;
734 	ha = to_qla_host(qla_ep->host);
735 
736 	if (adapter_up(ha) && !test_bit(AF_BUILD_DDB_LIST, &ha->flags))
737 		ret = 1;
738 
739 	return ret;
740 }
741 
742 static void qla4xxx_ep_disconnect(struct iscsi_endpoint *ep)
743 {
744 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
745 	iscsi_destroy_endpoint(ep);
746 }
747 
748 static int qla4xxx_get_ep_param(struct iscsi_endpoint *ep,
749 				enum iscsi_param param,
750 				char *buf)
751 {
752 	struct qla_endpoint *qla_ep = ep->dd_data;
753 	struct sockaddr *dst_addr;
754 
755 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
756 
757 	switch (param) {
758 	case ISCSI_PARAM_CONN_PORT:
759 	case ISCSI_PARAM_CONN_ADDRESS:
760 		if (!qla_ep)
761 			return -ENOTCONN;
762 
763 		dst_addr = (struct sockaddr *)&qla_ep->dst_addr;
764 		if (!dst_addr)
765 			return -ENOTCONN;
766 
767 		return iscsi_conn_get_addr_param((struct sockaddr_storage *)
768 						 &qla_ep->dst_addr, param, buf);
769 	default:
770 		return -ENOSYS;
771 	}
772 }
773 
774 static void qla4xxx_conn_get_stats(struct iscsi_cls_conn *cls_conn,
775 				   struct iscsi_stats *stats)
776 {
777 	struct iscsi_session *sess;
778 	struct iscsi_cls_session *cls_sess;
779 	struct ddb_entry *ddb_entry;
780 	struct scsi_qla_host *ha;
781 	struct ql_iscsi_stats *ql_iscsi_stats;
782 	int stats_size;
783 	int ret;
784 	dma_addr_t iscsi_stats_dma;
785 
786 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
787 
788 	cls_sess = iscsi_conn_to_session(cls_conn);
789 	sess = cls_sess->dd_data;
790 	ddb_entry = sess->dd_data;
791 	ha = ddb_entry->ha;
792 
793 	stats_size = PAGE_ALIGN(sizeof(struct ql_iscsi_stats));
794 	/* Allocate memory */
795 	ql_iscsi_stats = dma_alloc_coherent(&ha->pdev->dev, stats_size,
796 					    &iscsi_stats_dma, GFP_KERNEL);
797 	if (!ql_iscsi_stats) {
798 		ql4_printk(KERN_ERR, ha,
799 			   "Unable to allocate memory for iscsi stats\n");
800 		goto exit_get_stats;
801 	}
802 
803 	ret =  qla4xxx_get_mgmt_data(ha, ddb_entry->fw_ddb_index, stats_size,
804 				     iscsi_stats_dma);
805 	if (ret != QLA_SUCCESS) {
806 		ql4_printk(KERN_ERR, ha,
807 			   "Unable to retrieve iscsi stats\n");
808 		goto free_stats;
809 	}
810 
811 	/* octets */
812 	stats->txdata_octets = le64_to_cpu(ql_iscsi_stats->tx_data_octets);
813 	stats->rxdata_octets = le64_to_cpu(ql_iscsi_stats->rx_data_octets);
814 	/* xmit pdus */
815 	stats->noptx_pdus = le32_to_cpu(ql_iscsi_stats->tx_nopout_pdus);
816 	stats->scsicmd_pdus = le32_to_cpu(ql_iscsi_stats->tx_scsi_cmd_pdus);
817 	stats->tmfcmd_pdus = le32_to_cpu(ql_iscsi_stats->tx_tmf_cmd_pdus);
818 	stats->login_pdus = le32_to_cpu(ql_iscsi_stats->tx_login_cmd_pdus);
819 	stats->text_pdus = le32_to_cpu(ql_iscsi_stats->tx_text_cmd_pdus);
820 	stats->dataout_pdus = le32_to_cpu(ql_iscsi_stats->tx_scsi_write_pdus);
821 	stats->logout_pdus = le32_to_cpu(ql_iscsi_stats->tx_logout_cmd_pdus);
822 	stats->snack_pdus = le32_to_cpu(ql_iscsi_stats->tx_snack_req_pdus);
823 	/* recv pdus */
824 	stats->noprx_pdus = le32_to_cpu(ql_iscsi_stats->rx_nopin_pdus);
825 	stats->scsirsp_pdus = le32_to_cpu(ql_iscsi_stats->rx_scsi_resp_pdus);
826 	stats->tmfrsp_pdus = le32_to_cpu(ql_iscsi_stats->rx_tmf_resp_pdus);
827 	stats->textrsp_pdus = le32_to_cpu(ql_iscsi_stats->rx_text_resp_pdus);
828 	stats->datain_pdus = le32_to_cpu(ql_iscsi_stats->rx_scsi_read_pdus);
829 	stats->logoutrsp_pdus =
830 			le32_to_cpu(ql_iscsi_stats->rx_logout_resp_pdus);
831 	stats->r2t_pdus = le32_to_cpu(ql_iscsi_stats->rx_r2t_pdus);
832 	stats->async_pdus = le32_to_cpu(ql_iscsi_stats->rx_async_pdus);
833 	stats->rjt_pdus = le32_to_cpu(ql_iscsi_stats->rx_reject_pdus);
834 
835 free_stats:
836 	dma_free_coherent(&ha->pdev->dev, stats_size, ql_iscsi_stats,
837 			  iscsi_stats_dma);
838 exit_get_stats:
839 	return;
840 }
841 
842 static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc)
843 {
844 	struct iscsi_cls_session *session;
845 	struct iscsi_session *sess;
846 	unsigned long flags;
847 	enum blk_eh_timer_return ret = BLK_EH_NOT_HANDLED;
848 
849 	session = starget_to_session(scsi_target(sc->device));
850 	sess = session->dd_data;
851 
852 	spin_lock_irqsave(&session->lock, flags);
853 	if (session->state == ISCSI_SESSION_FAILED)
854 		ret = BLK_EH_RESET_TIMER;
855 	spin_unlock_irqrestore(&session->lock, flags);
856 
857 	return ret;
858 }
859 
860 static void qla4xxx_set_port_speed(struct Scsi_Host *shost)
861 {
862 	struct scsi_qla_host *ha = to_qla_host(shost);
863 	struct iscsi_cls_host *ihost = shost->shost_data;
864 	uint32_t speed = ISCSI_PORT_SPEED_UNKNOWN;
865 
866 	qla4xxx_get_firmware_state(ha);
867 
868 	switch (ha->addl_fw_state & 0x0F00) {
869 	case FW_ADDSTATE_LINK_SPEED_10MBPS:
870 		speed = ISCSI_PORT_SPEED_10MBPS;
871 		break;
872 	case FW_ADDSTATE_LINK_SPEED_100MBPS:
873 		speed = ISCSI_PORT_SPEED_100MBPS;
874 		break;
875 	case FW_ADDSTATE_LINK_SPEED_1GBPS:
876 		speed = ISCSI_PORT_SPEED_1GBPS;
877 		break;
878 	case FW_ADDSTATE_LINK_SPEED_10GBPS:
879 		speed = ISCSI_PORT_SPEED_10GBPS;
880 		break;
881 	}
882 	ihost->port_speed = speed;
883 }
884 
885 static void qla4xxx_set_port_state(struct Scsi_Host *shost)
886 {
887 	struct scsi_qla_host *ha = to_qla_host(shost);
888 	struct iscsi_cls_host *ihost = shost->shost_data;
889 	uint32_t state = ISCSI_PORT_STATE_DOWN;
890 
891 	if (test_bit(AF_LINK_UP, &ha->flags))
892 		state = ISCSI_PORT_STATE_UP;
893 
894 	ihost->port_state = state;
895 }
896 
897 static int qla4xxx_host_get_param(struct Scsi_Host *shost,
898 				  enum iscsi_host_param param, char *buf)
899 {
900 	struct scsi_qla_host *ha = to_qla_host(shost);
901 	int len;
902 
903 	switch (param) {
904 	case ISCSI_HOST_PARAM_HWADDRESS:
905 		len = sysfs_format_mac(buf, ha->my_mac, MAC_ADDR_LEN);
906 		break;
907 	case ISCSI_HOST_PARAM_IPADDRESS:
908 		len = sprintf(buf, "%pI4\n", &ha->ip_config.ip_address);
909 		break;
910 	case ISCSI_HOST_PARAM_INITIATOR_NAME:
911 		len = sprintf(buf, "%s\n", ha->name_string);
912 		break;
913 	case ISCSI_HOST_PARAM_PORT_STATE:
914 		qla4xxx_set_port_state(shost);
915 		len = sprintf(buf, "%s\n", iscsi_get_port_state_name(shost));
916 		break;
917 	case ISCSI_HOST_PARAM_PORT_SPEED:
918 		qla4xxx_set_port_speed(shost);
919 		len = sprintf(buf, "%s\n", iscsi_get_port_speed_name(shost));
920 		break;
921 	default:
922 		return -ENOSYS;
923 	}
924 
925 	return len;
926 }
927 
928 static void qla4xxx_create_ipv4_iface(struct scsi_qla_host *ha)
929 {
930 	if (ha->iface_ipv4)
931 		return;
932 
933 	/* IPv4 */
934 	ha->iface_ipv4 = iscsi_create_iface(ha->host,
935 					    &qla4xxx_iscsi_transport,
936 					    ISCSI_IFACE_TYPE_IPV4, 0, 0);
937 	if (!ha->iface_ipv4)
938 		ql4_printk(KERN_ERR, ha, "Could not create IPv4 iSCSI "
939 			   "iface0.\n");
940 }
941 
942 static void qla4xxx_create_ipv6_iface(struct scsi_qla_host *ha)
943 {
944 	if (!ha->iface_ipv6_0)
945 		/* IPv6 iface-0 */
946 		ha->iface_ipv6_0 = iscsi_create_iface(ha->host,
947 						      &qla4xxx_iscsi_transport,
948 						      ISCSI_IFACE_TYPE_IPV6, 0,
949 						      0);
950 	if (!ha->iface_ipv6_0)
951 		ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI "
952 			   "iface0.\n");
953 
954 	if (!ha->iface_ipv6_1)
955 		/* IPv6 iface-1 */
956 		ha->iface_ipv6_1 = iscsi_create_iface(ha->host,
957 						      &qla4xxx_iscsi_transport,
958 						      ISCSI_IFACE_TYPE_IPV6, 1,
959 						      0);
960 	if (!ha->iface_ipv6_1)
961 		ql4_printk(KERN_ERR, ha, "Could not create IPv6 iSCSI "
962 			   "iface1.\n");
963 }
964 
965 static void qla4xxx_create_ifaces(struct scsi_qla_host *ha)
966 {
967 	if (ha->ip_config.ipv4_options & IPOPT_IPV4_PROTOCOL_ENABLE)
968 		qla4xxx_create_ipv4_iface(ha);
969 
970 	if (ha->ip_config.ipv6_options & IPV6_OPT_IPV6_PROTOCOL_ENABLE)
971 		qla4xxx_create_ipv6_iface(ha);
972 }
973 
974 static void qla4xxx_destroy_ipv4_iface(struct scsi_qla_host *ha)
975 {
976 	if (ha->iface_ipv4) {
977 		iscsi_destroy_iface(ha->iface_ipv4);
978 		ha->iface_ipv4 = NULL;
979 	}
980 }
981 
982 static void qla4xxx_destroy_ipv6_iface(struct scsi_qla_host *ha)
983 {
984 	if (ha->iface_ipv6_0) {
985 		iscsi_destroy_iface(ha->iface_ipv6_0);
986 		ha->iface_ipv6_0 = NULL;
987 	}
988 	if (ha->iface_ipv6_1) {
989 		iscsi_destroy_iface(ha->iface_ipv6_1);
990 		ha->iface_ipv6_1 = NULL;
991 	}
992 }
993 
994 static void qla4xxx_destroy_ifaces(struct scsi_qla_host *ha)
995 {
996 	qla4xxx_destroy_ipv4_iface(ha);
997 	qla4xxx_destroy_ipv6_iface(ha);
998 }
999 
1000 static void qla4xxx_set_ipv6(struct scsi_qla_host *ha,
1001 			     struct iscsi_iface_param_info *iface_param,
1002 			     struct addr_ctrl_blk *init_fw_cb)
1003 {
1004 	/*
1005 	 * iface_num 0 is valid for IPv6 Addr, linklocal, router, autocfg.
1006 	 * iface_num 1 is valid only for IPv6 Addr.
1007 	 */
1008 	switch (iface_param->param) {
1009 	case ISCSI_NET_PARAM_IPV6_ADDR:
1010 		if (iface_param->iface_num & 0x1)
1011 			/* IPv6 Addr 1 */
1012 			memcpy(init_fw_cb->ipv6_addr1, iface_param->value,
1013 			       sizeof(init_fw_cb->ipv6_addr1));
1014 		else
1015 			/* IPv6 Addr 0 */
1016 			memcpy(init_fw_cb->ipv6_addr0, iface_param->value,
1017 			       sizeof(init_fw_cb->ipv6_addr0));
1018 		break;
1019 	case ISCSI_NET_PARAM_IPV6_LINKLOCAL:
1020 		if (iface_param->iface_num & 0x1)
1021 			break;
1022 		memcpy(init_fw_cb->ipv6_if_id, &iface_param->value[8],
1023 		       sizeof(init_fw_cb->ipv6_if_id));
1024 		break;
1025 	case ISCSI_NET_PARAM_IPV6_ROUTER:
1026 		if (iface_param->iface_num & 0x1)
1027 			break;
1028 		memcpy(init_fw_cb->ipv6_dflt_rtr_addr, iface_param->value,
1029 		       sizeof(init_fw_cb->ipv6_dflt_rtr_addr));
1030 		break;
1031 	case ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG:
1032 		/* Autocfg applies to even interface */
1033 		if (iface_param->iface_num & 0x1)
1034 			break;
1035 
1036 		if (iface_param->value[0] == ISCSI_IPV6_AUTOCFG_DISABLE)
1037 			init_fw_cb->ipv6_addtl_opts &=
1038 				cpu_to_le16(
1039 				  ~IPV6_ADDOPT_NEIGHBOR_DISCOVERY_ADDR_ENABLE);
1040 		else if (iface_param->value[0] == ISCSI_IPV6_AUTOCFG_ND_ENABLE)
1041 			init_fw_cb->ipv6_addtl_opts |=
1042 				cpu_to_le16(
1043 				  IPV6_ADDOPT_NEIGHBOR_DISCOVERY_ADDR_ENABLE);
1044 		else
1045 			ql4_printk(KERN_ERR, ha, "Invalid autocfg setting for "
1046 				   "IPv6 addr\n");
1047 		break;
1048 	case ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG:
1049 		/* Autocfg applies to even interface */
1050 		if (iface_param->iface_num & 0x1)
1051 			break;
1052 
1053 		if (iface_param->value[0] ==
1054 		    ISCSI_IPV6_LINKLOCAL_AUTOCFG_ENABLE)
1055 			init_fw_cb->ipv6_addtl_opts |= cpu_to_le16(
1056 					IPV6_ADDOPT_AUTOCONFIG_LINK_LOCAL_ADDR);
1057 		else if (iface_param->value[0] ==
1058 			 ISCSI_IPV6_LINKLOCAL_AUTOCFG_DISABLE)
1059 			init_fw_cb->ipv6_addtl_opts &= cpu_to_le16(
1060 				       ~IPV6_ADDOPT_AUTOCONFIG_LINK_LOCAL_ADDR);
1061 		else
1062 			ql4_printk(KERN_ERR, ha, "Invalid autocfg setting for "
1063 				   "IPv6 linklocal addr\n");
1064 		break;
1065 	case ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG:
1066 		/* Autocfg applies to even interface */
1067 		if (iface_param->iface_num & 0x1)
1068 			break;
1069 
1070 		if (iface_param->value[0] == ISCSI_IPV6_ROUTER_AUTOCFG_ENABLE)
1071 			memset(init_fw_cb->ipv6_dflt_rtr_addr, 0,
1072 			       sizeof(init_fw_cb->ipv6_dflt_rtr_addr));
1073 		break;
1074 	case ISCSI_NET_PARAM_IFACE_ENABLE:
1075 		if (iface_param->value[0] == ISCSI_IFACE_ENABLE) {
1076 			init_fw_cb->ipv6_opts |=
1077 				cpu_to_le16(IPV6_OPT_IPV6_PROTOCOL_ENABLE);
1078 			qla4xxx_create_ipv6_iface(ha);
1079 		} else {
1080 			init_fw_cb->ipv6_opts &=
1081 				cpu_to_le16(~IPV6_OPT_IPV6_PROTOCOL_ENABLE &
1082 					    0xFFFF);
1083 			qla4xxx_destroy_ipv6_iface(ha);
1084 		}
1085 		break;
1086 	case ISCSI_NET_PARAM_VLAN_TAG:
1087 		if (iface_param->len != sizeof(init_fw_cb->ipv6_vlan_tag))
1088 			break;
1089 		init_fw_cb->ipv6_vlan_tag =
1090 				cpu_to_be16(*(uint16_t *)iface_param->value);
1091 		break;
1092 	case ISCSI_NET_PARAM_VLAN_ENABLED:
1093 		if (iface_param->value[0] == ISCSI_VLAN_ENABLE)
1094 			init_fw_cb->ipv6_opts |=
1095 				cpu_to_le16(IPV6_OPT_VLAN_TAGGING_ENABLE);
1096 		else
1097 			init_fw_cb->ipv6_opts &=
1098 				cpu_to_le16(~IPV6_OPT_VLAN_TAGGING_ENABLE);
1099 		break;
1100 	case ISCSI_NET_PARAM_MTU:
1101 		init_fw_cb->eth_mtu_size =
1102 				cpu_to_le16(*(uint16_t *)iface_param->value);
1103 		break;
1104 	case ISCSI_NET_PARAM_PORT:
1105 		/* Autocfg applies to even interface */
1106 		if (iface_param->iface_num & 0x1)
1107 			break;
1108 
1109 		init_fw_cb->ipv6_port =
1110 				cpu_to_le16(*(uint16_t *)iface_param->value);
1111 		break;
1112 	default:
1113 		ql4_printk(KERN_ERR, ha, "Unknown IPv6 param = %d\n",
1114 			   iface_param->param);
1115 		break;
1116 	}
1117 }
1118 
1119 static void qla4xxx_set_ipv4(struct scsi_qla_host *ha,
1120 			     struct iscsi_iface_param_info *iface_param,
1121 			     struct addr_ctrl_blk *init_fw_cb)
1122 {
1123 	switch (iface_param->param) {
1124 	case ISCSI_NET_PARAM_IPV4_ADDR:
1125 		memcpy(init_fw_cb->ipv4_addr, iface_param->value,
1126 		       sizeof(init_fw_cb->ipv4_addr));
1127 		break;
1128 	case ISCSI_NET_PARAM_IPV4_SUBNET:
1129 		memcpy(init_fw_cb->ipv4_subnet,	iface_param->value,
1130 		       sizeof(init_fw_cb->ipv4_subnet));
1131 		break;
1132 	case ISCSI_NET_PARAM_IPV4_GW:
1133 		memcpy(init_fw_cb->ipv4_gw_addr, iface_param->value,
1134 		       sizeof(init_fw_cb->ipv4_gw_addr));
1135 		break;
1136 	case ISCSI_NET_PARAM_IPV4_BOOTPROTO:
1137 		if (iface_param->value[0] == ISCSI_BOOTPROTO_DHCP)
1138 			init_fw_cb->ipv4_tcp_opts |=
1139 					cpu_to_le16(TCPOPT_DHCP_ENABLE);
1140 		else if (iface_param->value[0] == ISCSI_BOOTPROTO_STATIC)
1141 			init_fw_cb->ipv4_tcp_opts &=
1142 					cpu_to_le16(~TCPOPT_DHCP_ENABLE);
1143 		else
1144 			ql4_printk(KERN_ERR, ha, "Invalid IPv4 bootproto\n");
1145 		break;
1146 	case ISCSI_NET_PARAM_IFACE_ENABLE:
1147 		if (iface_param->value[0] == ISCSI_IFACE_ENABLE) {
1148 			init_fw_cb->ipv4_ip_opts |=
1149 				cpu_to_le16(IPOPT_IPV4_PROTOCOL_ENABLE);
1150 			qla4xxx_create_ipv4_iface(ha);
1151 		} else {
1152 			init_fw_cb->ipv4_ip_opts &=
1153 				cpu_to_le16(~IPOPT_IPV4_PROTOCOL_ENABLE &
1154 					    0xFFFF);
1155 			qla4xxx_destroy_ipv4_iface(ha);
1156 		}
1157 		break;
1158 	case ISCSI_NET_PARAM_VLAN_TAG:
1159 		if (iface_param->len != sizeof(init_fw_cb->ipv4_vlan_tag))
1160 			break;
1161 		init_fw_cb->ipv4_vlan_tag =
1162 				cpu_to_be16(*(uint16_t *)iface_param->value);
1163 		break;
1164 	case ISCSI_NET_PARAM_VLAN_ENABLED:
1165 		if (iface_param->value[0] == ISCSI_VLAN_ENABLE)
1166 			init_fw_cb->ipv4_ip_opts |=
1167 					cpu_to_le16(IPOPT_VLAN_TAGGING_ENABLE);
1168 		else
1169 			init_fw_cb->ipv4_ip_opts &=
1170 					cpu_to_le16(~IPOPT_VLAN_TAGGING_ENABLE);
1171 		break;
1172 	case ISCSI_NET_PARAM_MTU:
1173 		init_fw_cb->eth_mtu_size =
1174 				cpu_to_le16(*(uint16_t *)iface_param->value);
1175 		break;
1176 	case ISCSI_NET_PARAM_PORT:
1177 		init_fw_cb->ipv4_port =
1178 				cpu_to_le16(*(uint16_t *)iface_param->value);
1179 		break;
1180 	default:
1181 		ql4_printk(KERN_ERR, ha, "Unknown IPv4 param = %d\n",
1182 			   iface_param->param);
1183 		break;
1184 	}
1185 }
1186 
1187 static void
1188 qla4xxx_initcb_to_acb(struct addr_ctrl_blk *init_fw_cb)
1189 {
1190 	struct addr_ctrl_blk_def *acb;
1191 	acb = (struct addr_ctrl_blk_def *)init_fw_cb;
1192 	memset(acb->reserved1, 0, sizeof(acb->reserved1));
1193 	memset(acb->reserved2, 0, sizeof(acb->reserved2));
1194 	memset(acb->reserved3, 0, sizeof(acb->reserved3));
1195 	memset(acb->reserved4, 0, sizeof(acb->reserved4));
1196 	memset(acb->reserved5, 0, sizeof(acb->reserved5));
1197 	memset(acb->reserved6, 0, sizeof(acb->reserved6));
1198 	memset(acb->reserved7, 0, sizeof(acb->reserved7));
1199 	memset(acb->reserved8, 0, sizeof(acb->reserved8));
1200 	memset(acb->reserved9, 0, sizeof(acb->reserved9));
1201 	memset(acb->reserved10, 0, sizeof(acb->reserved10));
1202 	memset(acb->reserved11, 0, sizeof(acb->reserved11));
1203 	memset(acb->reserved12, 0, sizeof(acb->reserved12));
1204 	memset(acb->reserved13, 0, sizeof(acb->reserved13));
1205 	memset(acb->reserved14, 0, sizeof(acb->reserved14));
1206 	memset(acb->reserved15, 0, sizeof(acb->reserved15));
1207 }
1208 
1209 static int
1210 qla4xxx_iface_set_param(struct Scsi_Host *shost, void *data, uint32_t len)
1211 {
1212 	struct scsi_qla_host *ha = to_qla_host(shost);
1213 	int rval = 0;
1214 	struct iscsi_iface_param_info *iface_param = NULL;
1215 	struct addr_ctrl_blk *init_fw_cb = NULL;
1216 	dma_addr_t init_fw_cb_dma;
1217 	uint32_t mbox_cmd[MBOX_REG_COUNT];
1218 	uint32_t mbox_sts[MBOX_REG_COUNT];
1219 	uint32_t rem = len;
1220 	struct nlattr *attr;
1221 
1222 	init_fw_cb = dma_alloc_coherent(&ha->pdev->dev,
1223 					sizeof(struct addr_ctrl_blk),
1224 					&init_fw_cb_dma, GFP_KERNEL);
1225 	if (!init_fw_cb) {
1226 		ql4_printk(KERN_ERR, ha, "%s: Unable to alloc init_cb\n",
1227 			   __func__);
1228 		return -ENOMEM;
1229 	}
1230 
1231 	memset(init_fw_cb, 0, sizeof(struct addr_ctrl_blk));
1232 	memset(&mbox_cmd, 0, sizeof(mbox_cmd));
1233 	memset(&mbox_sts, 0, sizeof(mbox_sts));
1234 
1235 	if (qla4xxx_get_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma)) {
1236 		ql4_printk(KERN_ERR, ha, "%s: get ifcb failed\n", __func__);
1237 		rval = -EIO;
1238 		goto exit_init_fw_cb;
1239 	}
1240 
1241 	nla_for_each_attr(attr, data, len, rem) {
1242 		iface_param = nla_data(attr);
1243 
1244 		if (iface_param->param_type != ISCSI_NET_PARAM)
1245 			continue;
1246 
1247 		switch (iface_param->iface_type) {
1248 		case ISCSI_IFACE_TYPE_IPV4:
1249 			switch (iface_param->iface_num) {
1250 			case 0:
1251 				qla4xxx_set_ipv4(ha, iface_param, init_fw_cb);
1252 				break;
1253 			default:
1254 				/* Cannot have more than one IPv4 interface */
1255 				ql4_printk(KERN_ERR, ha, "Invalid IPv4 iface "
1256 					   "number = %d\n",
1257 					   iface_param->iface_num);
1258 				break;
1259 			}
1260 			break;
1261 		case ISCSI_IFACE_TYPE_IPV6:
1262 			switch (iface_param->iface_num) {
1263 			case 0:
1264 			case 1:
1265 				qla4xxx_set_ipv6(ha, iface_param, init_fw_cb);
1266 				break;
1267 			default:
1268 				/* Cannot have more than two IPv6 interface */
1269 				ql4_printk(KERN_ERR, ha, "Invalid IPv6 iface "
1270 					   "number = %d\n",
1271 					   iface_param->iface_num);
1272 				break;
1273 			}
1274 			break;
1275 		default:
1276 			ql4_printk(KERN_ERR, ha, "Invalid iface type\n");
1277 			break;
1278 		}
1279 	}
1280 
1281 	init_fw_cb->cookie = cpu_to_le32(0x11BEAD5A);
1282 
1283 	rval = qla4xxx_set_flash(ha, init_fw_cb_dma, FLASH_SEGMENT_IFCB,
1284 				 sizeof(struct addr_ctrl_blk),
1285 				 FLASH_OPT_RMW_COMMIT);
1286 	if (rval != QLA_SUCCESS) {
1287 		ql4_printk(KERN_ERR, ha, "%s: set flash mbx failed\n",
1288 			   __func__);
1289 		rval = -EIO;
1290 		goto exit_init_fw_cb;
1291 	}
1292 
1293 	rval = qla4xxx_disable_acb(ha);
1294 	if (rval != QLA_SUCCESS) {
1295 		ql4_printk(KERN_ERR, ha, "%s: disable acb mbx failed\n",
1296 			   __func__);
1297 		rval = -EIO;
1298 		goto exit_init_fw_cb;
1299 	}
1300 
1301 	wait_for_completion_timeout(&ha->disable_acb_comp,
1302 				    DISABLE_ACB_TOV * HZ);
1303 
1304 	qla4xxx_initcb_to_acb(init_fw_cb);
1305 
1306 	rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb_dma);
1307 	if (rval != QLA_SUCCESS) {
1308 		ql4_printk(KERN_ERR, ha, "%s: set acb mbx failed\n",
1309 			   __func__);
1310 		rval = -EIO;
1311 		goto exit_init_fw_cb;
1312 	}
1313 
1314 	memset(init_fw_cb, 0, sizeof(struct addr_ctrl_blk));
1315 	qla4xxx_update_local_ifcb(ha, &mbox_cmd[0], &mbox_sts[0], init_fw_cb,
1316 				  init_fw_cb_dma);
1317 
1318 exit_init_fw_cb:
1319 	dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk),
1320 			  init_fw_cb, init_fw_cb_dma);
1321 
1322 	return rval;
1323 }
1324 
1325 static int qla4xxx_session_get_param(struct iscsi_cls_session *cls_sess,
1326 				     enum iscsi_param param, char *buf)
1327 {
1328 	struct iscsi_session *sess = cls_sess->dd_data;
1329 	struct ddb_entry *ddb_entry = sess->dd_data;
1330 	struct scsi_qla_host *ha = ddb_entry->ha;
1331 	int rval, len;
1332 	uint16_t idx;
1333 
1334 	switch (param) {
1335 	case ISCSI_PARAM_CHAP_IN_IDX:
1336 		rval = qla4xxx_get_chap_index(ha, sess->username_in,
1337 					      sess->password_in, BIDI_CHAP,
1338 					      &idx);
1339 		if (rval)
1340 			return -EINVAL;
1341 
1342 		len = sprintf(buf, "%hu\n", idx);
1343 		break;
1344 	case ISCSI_PARAM_CHAP_OUT_IDX:
1345 		rval = qla4xxx_get_chap_index(ha, sess->username,
1346 					      sess->password, LOCAL_CHAP,
1347 					      &idx);
1348 		if (rval)
1349 			return -EINVAL;
1350 
1351 		len = sprintf(buf, "%hu\n", idx);
1352 		break;
1353 	default:
1354 		return iscsi_session_get_param(cls_sess, param, buf);
1355 	}
1356 
1357 	return len;
1358 }
1359 
1360 static int qla4xxx_conn_get_param(struct iscsi_cls_conn *cls_conn,
1361 				  enum iscsi_param param, char *buf)
1362 {
1363 	struct iscsi_conn *conn;
1364 	struct qla_conn *qla_conn;
1365 	struct sockaddr *dst_addr;
1366 	int len = 0;
1367 
1368 	conn = cls_conn->dd_data;
1369 	qla_conn = conn->dd_data;
1370 	dst_addr = (struct sockaddr *)&qla_conn->qla_ep->dst_addr;
1371 
1372 	switch (param) {
1373 	case ISCSI_PARAM_CONN_PORT:
1374 	case ISCSI_PARAM_CONN_ADDRESS:
1375 		return iscsi_conn_get_addr_param((struct sockaddr_storage *)
1376 						 dst_addr, param, buf);
1377 	default:
1378 		return iscsi_conn_get_param(cls_conn, param, buf);
1379 	}
1380 
1381 	return len;
1382 
1383 }
1384 
1385 int qla4xxx_get_ddb_index(struct scsi_qla_host *ha, uint16_t *ddb_index)
1386 {
1387 	uint32_t mbx_sts = 0;
1388 	uint16_t tmp_ddb_index;
1389 	int ret;
1390 
1391 get_ddb_index:
1392 	tmp_ddb_index = find_first_zero_bit(ha->ddb_idx_map, MAX_DDB_ENTRIES);
1393 
1394 	if (tmp_ddb_index >= MAX_DDB_ENTRIES) {
1395 		DEBUG2(ql4_printk(KERN_INFO, ha,
1396 				  "Free DDB index not available\n"));
1397 		ret = QLA_ERROR;
1398 		goto exit_get_ddb_index;
1399 	}
1400 
1401 	if (test_and_set_bit(tmp_ddb_index, ha->ddb_idx_map))
1402 		goto get_ddb_index;
1403 
1404 	DEBUG2(ql4_printk(KERN_INFO, ha,
1405 			  "Found a free DDB index at %d\n", tmp_ddb_index));
1406 	ret = qla4xxx_req_ddb_entry(ha, tmp_ddb_index, &mbx_sts);
1407 	if (ret == QLA_ERROR) {
1408 		if (mbx_sts == MBOX_STS_COMMAND_ERROR) {
1409 			ql4_printk(KERN_INFO, ha,
1410 				   "DDB index = %d not available trying next\n",
1411 				   tmp_ddb_index);
1412 			goto get_ddb_index;
1413 		}
1414 		DEBUG2(ql4_printk(KERN_INFO, ha,
1415 				  "Free FW DDB not available\n"));
1416 	}
1417 
1418 	*ddb_index = tmp_ddb_index;
1419 
1420 exit_get_ddb_index:
1421 	return ret;
1422 }
1423 
1424 static int qla4xxx_match_ipaddress(struct scsi_qla_host *ha,
1425 				   struct ddb_entry *ddb_entry,
1426 				   char *existing_ipaddr,
1427 				   char *user_ipaddr)
1428 {
1429 	uint8_t dst_ipaddr[IPv6_ADDR_LEN];
1430 	char formatted_ipaddr[DDB_IPADDR_LEN];
1431 	int status = QLA_SUCCESS, ret = 0;
1432 
1433 	if (ddb_entry->fw_ddb_entry.options & DDB_OPT_IPV6_DEVICE) {
1434 		ret = in6_pton(user_ipaddr, strlen(user_ipaddr), dst_ipaddr,
1435 			       '\0', NULL);
1436 		if (ret == 0) {
1437 			status = QLA_ERROR;
1438 			goto out_match;
1439 		}
1440 		ret = sprintf(formatted_ipaddr, "%pI6", dst_ipaddr);
1441 	} else {
1442 		ret = in4_pton(user_ipaddr, strlen(user_ipaddr), dst_ipaddr,
1443 			       '\0', NULL);
1444 		if (ret == 0) {
1445 			status = QLA_ERROR;
1446 			goto out_match;
1447 		}
1448 		ret = sprintf(formatted_ipaddr, "%pI4", dst_ipaddr);
1449 	}
1450 
1451 	if (strcmp(existing_ipaddr, formatted_ipaddr))
1452 		status = QLA_ERROR;
1453 
1454 out_match:
1455 	return status;
1456 }
1457 
1458 static int qla4xxx_match_fwdb_session(struct scsi_qla_host *ha,
1459 				      struct iscsi_cls_conn *cls_conn)
1460 {
1461 	int idx = 0, max_ddbs, rval;
1462 	struct iscsi_cls_session *cls_sess = iscsi_conn_to_session(cls_conn);
1463 	struct iscsi_session *sess, *existing_sess;
1464 	struct iscsi_conn *conn, *existing_conn;
1465 	struct ddb_entry *ddb_entry;
1466 
1467 	sess = cls_sess->dd_data;
1468 	conn = cls_conn->dd_data;
1469 
1470 	if (sess->targetname == NULL ||
1471 	    conn->persistent_address == NULL ||
1472 	    conn->persistent_port == 0)
1473 		return QLA_ERROR;
1474 
1475 	max_ddbs =  is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX :
1476 				     MAX_DEV_DB_ENTRIES;
1477 
1478 	for (idx = 0; idx < max_ddbs; idx++) {
1479 		ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx);
1480 		if (ddb_entry == NULL)
1481 			continue;
1482 
1483 		if (ddb_entry->ddb_type != FLASH_DDB)
1484 			continue;
1485 
1486 		existing_sess = ddb_entry->sess->dd_data;
1487 		existing_conn = ddb_entry->conn->dd_data;
1488 
1489 		if (existing_sess->targetname == NULL ||
1490 		    existing_conn->persistent_address == NULL ||
1491 		    existing_conn->persistent_port == 0)
1492 			continue;
1493 
1494 		DEBUG2(ql4_printk(KERN_INFO, ha,
1495 				  "IQN = %s User IQN = %s\n",
1496 				  existing_sess->targetname,
1497 				  sess->targetname));
1498 
1499 		DEBUG2(ql4_printk(KERN_INFO, ha,
1500 				  "IP = %s User IP = %s\n",
1501 				  existing_conn->persistent_address,
1502 				  conn->persistent_address));
1503 
1504 		DEBUG2(ql4_printk(KERN_INFO, ha,
1505 				  "Port = %d User Port = %d\n",
1506 				  existing_conn->persistent_port,
1507 				  conn->persistent_port));
1508 
1509 		if (strcmp(existing_sess->targetname, sess->targetname))
1510 			continue;
1511 		rval = qla4xxx_match_ipaddress(ha, ddb_entry,
1512 					existing_conn->persistent_address,
1513 					conn->persistent_address);
1514 		if (rval == QLA_ERROR)
1515 			continue;
1516 		if (existing_conn->persistent_port != conn->persistent_port)
1517 			continue;
1518 		break;
1519 	}
1520 
1521 	if (idx == max_ddbs)
1522 		return QLA_ERROR;
1523 
1524 	DEBUG2(ql4_printk(KERN_INFO, ha,
1525 			  "Match found in fwdb sessions\n"));
1526 	return QLA_SUCCESS;
1527 }
1528 
1529 static struct iscsi_cls_session *
1530 qla4xxx_session_create(struct iscsi_endpoint *ep,
1531 			uint16_t cmds_max, uint16_t qdepth,
1532 			uint32_t initial_cmdsn)
1533 {
1534 	struct iscsi_cls_session *cls_sess;
1535 	struct scsi_qla_host *ha;
1536 	struct qla_endpoint *qla_ep;
1537 	struct ddb_entry *ddb_entry;
1538 	uint16_t ddb_index;
1539 	struct iscsi_session *sess;
1540 	struct sockaddr *dst_addr;
1541 	int ret;
1542 
1543 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
1544 	if (!ep) {
1545 		printk(KERN_ERR "qla4xxx: missing ep.\n");
1546 		return NULL;
1547 	}
1548 
1549 	qla_ep = ep->dd_data;
1550 	dst_addr = (struct sockaddr *)&qla_ep->dst_addr;
1551 	ha = to_qla_host(qla_ep->host);
1552 
1553 	ret = qla4xxx_get_ddb_index(ha, &ddb_index);
1554 	if (ret == QLA_ERROR)
1555 		return NULL;
1556 
1557 	cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, qla_ep->host,
1558 				       cmds_max, sizeof(struct ddb_entry),
1559 				       sizeof(struct ql4_task_data),
1560 				       initial_cmdsn, ddb_index);
1561 	if (!cls_sess)
1562 		return NULL;
1563 
1564 	sess = cls_sess->dd_data;
1565 	ddb_entry = sess->dd_data;
1566 	ddb_entry->fw_ddb_index = ddb_index;
1567 	ddb_entry->fw_ddb_device_state = DDB_DS_NO_CONNECTION_ACTIVE;
1568 	ddb_entry->ha = ha;
1569 	ddb_entry->sess = cls_sess;
1570 	ddb_entry->unblock_sess = qla4xxx_unblock_ddb;
1571 	ddb_entry->ddb_change = qla4xxx_ddb_change;
1572 	cls_sess->recovery_tmo = ql4xsess_recovery_tmo;
1573 	ha->fw_ddb_index_map[ddb_entry->fw_ddb_index] = ddb_entry;
1574 	ha->tot_ddbs++;
1575 
1576 	return cls_sess;
1577 }
1578 
1579 static void qla4xxx_session_destroy(struct iscsi_cls_session *cls_sess)
1580 {
1581 	struct iscsi_session *sess;
1582 	struct ddb_entry *ddb_entry;
1583 	struct scsi_qla_host *ha;
1584 	unsigned long flags, wtime;
1585 	struct dev_db_entry *fw_ddb_entry = NULL;
1586 	dma_addr_t fw_ddb_entry_dma;
1587 	uint32_t ddb_state;
1588 	int ret;
1589 
1590 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
1591 	sess = cls_sess->dd_data;
1592 	ddb_entry = sess->dd_data;
1593 	ha = ddb_entry->ha;
1594 
1595 	fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
1596 					  &fw_ddb_entry_dma, GFP_KERNEL);
1597 	if (!fw_ddb_entry) {
1598 		ql4_printk(KERN_ERR, ha,
1599 			   "%s: Unable to allocate dma buffer\n", __func__);
1600 		goto destroy_session;
1601 	}
1602 
1603 	wtime = jiffies + (HZ * LOGOUT_TOV);
1604 	do {
1605 		ret = qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index,
1606 					      fw_ddb_entry, fw_ddb_entry_dma,
1607 					      NULL, NULL, &ddb_state, NULL,
1608 					      NULL, NULL);
1609 		if (ret == QLA_ERROR)
1610 			goto destroy_session;
1611 
1612 		if ((ddb_state == DDB_DS_NO_CONNECTION_ACTIVE) ||
1613 		    (ddb_state == DDB_DS_SESSION_FAILED))
1614 			goto destroy_session;
1615 
1616 		schedule_timeout_uninterruptible(HZ);
1617 	} while ((time_after(wtime, jiffies)));
1618 
1619 destroy_session:
1620 	qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index);
1621 
1622 	spin_lock_irqsave(&ha->hardware_lock, flags);
1623 	qla4xxx_free_ddb(ha, ddb_entry);
1624 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
1625 
1626 	iscsi_session_teardown(cls_sess);
1627 
1628 	if (fw_ddb_entry)
1629 		dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
1630 				  fw_ddb_entry, fw_ddb_entry_dma);
1631 }
1632 
1633 static struct iscsi_cls_conn *
1634 qla4xxx_conn_create(struct iscsi_cls_session *cls_sess, uint32_t conn_idx)
1635 {
1636 	struct iscsi_cls_conn *cls_conn;
1637 	struct iscsi_session *sess;
1638 	struct ddb_entry *ddb_entry;
1639 
1640 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
1641 	cls_conn = iscsi_conn_setup(cls_sess, sizeof(struct qla_conn),
1642 				    conn_idx);
1643 	if (!cls_conn)
1644 		return NULL;
1645 
1646 	sess = cls_sess->dd_data;
1647 	ddb_entry = sess->dd_data;
1648 	ddb_entry->conn = cls_conn;
1649 
1650 	return cls_conn;
1651 }
1652 
1653 static int qla4xxx_conn_bind(struct iscsi_cls_session *cls_session,
1654 			     struct iscsi_cls_conn *cls_conn,
1655 			     uint64_t transport_fd, int is_leading)
1656 {
1657 	struct iscsi_conn *conn;
1658 	struct qla_conn *qla_conn;
1659 	struct iscsi_endpoint *ep;
1660 
1661 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
1662 
1663 	if (iscsi_conn_bind(cls_session, cls_conn, is_leading))
1664 		return -EINVAL;
1665 	ep = iscsi_lookup_endpoint(transport_fd);
1666 	conn = cls_conn->dd_data;
1667 	qla_conn = conn->dd_data;
1668 	qla_conn->qla_ep = ep->dd_data;
1669 	return 0;
1670 }
1671 
1672 static int qla4xxx_conn_start(struct iscsi_cls_conn *cls_conn)
1673 {
1674 	struct iscsi_cls_session *cls_sess = iscsi_conn_to_session(cls_conn);
1675 	struct iscsi_session *sess;
1676 	struct ddb_entry *ddb_entry;
1677 	struct scsi_qla_host *ha;
1678 	struct dev_db_entry *fw_ddb_entry = NULL;
1679 	dma_addr_t fw_ddb_entry_dma;
1680 	uint32_t mbx_sts = 0;
1681 	int ret = 0;
1682 	int status = QLA_SUCCESS;
1683 
1684 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
1685 	sess = cls_sess->dd_data;
1686 	ddb_entry = sess->dd_data;
1687 	ha = ddb_entry->ha;
1688 
1689 	/* Check if we have  matching FW DDB, if yes then do not
1690 	 * login to this target. This could cause target to logout previous
1691 	 * connection
1692 	 */
1693 	ret = qla4xxx_match_fwdb_session(ha, cls_conn);
1694 	if (ret == QLA_SUCCESS) {
1695 		ql4_printk(KERN_INFO, ha,
1696 			   "Session already exist in FW.\n");
1697 		ret = -EEXIST;
1698 		goto exit_conn_start;
1699 	}
1700 
1701 	fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
1702 					  &fw_ddb_entry_dma, GFP_KERNEL);
1703 	if (!fw_ddb_entry) {
1704 		ql4_printk(KERN_ERR, ha,
1705 			   "%s: Unable to allocate dma buffer\n", __func__);
1706 		ret = -ENOMEM;
1707 		goto exit_conn_start;
1708 	}
1709 
1710 	ret = qla4xxx_set_param_ddbentry(ha, ddb_entry, cls_conn, &mbx_sts);
1711 	if (ret) {
1712 		/* If iscsid is stopped and started then no need to do
1713 		* set param again since ddb state will be already
1714 		* active and FW does not allow set ddb to an
1715 		* active session.
1716 		*/
1717 		if (mbx_sts)
1718 			if (ddb_entry->fw_ddb_device_state ==
1719 						DDB_DS_SESSION_ACTIVE) {
1720 				ddb_entry->unblock_sess(ddb_entry->sess);
1721 				goto exit_set_param;
1722 			}
1723 
1724 		ql4_printk(KERN_ERR, ha, "%s: Failed set param for index[%d]\n",
1725 			   __func__, ddb_entry->fw_ddb_index);
1726 		goto exit_conn_start;
1727 	}
1728 
1729 	status = qla4xxx_conn_open(ha, ddb_entry->fw_ddb_index);
1730 	if (status == QLA_ERROR) {
1731 		ql4_printk(KERN_ERR, ha, "%s: Login failed: %s\n", __func__,
1732 			   sess->targetname);
1733 		ret = -EINVAL;
1734 		goto exit_conn_start;
1735 	}
1736 
1737 	if (ddb_entry->fw_ddb_device_state == DDB_DS_NO_CONNECTION_ACTIVE)
1738 		ddb_entry->fw_ddb_device_state = DDB_DS_LOGIN_IN_PROCESS;
1739 
1740 	DEBUG2(printk(KERN_INFO "%s: DDB state [%d]\n", __func__,
1741 		      ddb_entry->fw_ddb_device_state));
1742 
1743 exit_set_param:
1744 	ret = 0;
1745 
1746 exit_conn_start:
1747 	if (fw_ddb_entry)
1748 		dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
1749 				  fw_ddb_entry, fw_ddb_entry_dma);
1750 	return ret;
1751 }
1752 
1753 static void qla4xxx_conn_destroy(struct iscsi_cls_conn *cls_conn)
1754 {
1755 	struct iscsi_cls_session *cls_sess = iscsi_conn_to_session(cls_conn);
1756 	struct iscsi_session *sess;
1757 	struct scsi_qla_host *ha;
1758 	struct ddb_entry *ddb_entry;
1759 	int options;
1760 
1761 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
1762 	sess = cls_sess->dd_data;
1763 	ddb_entry = sess->dd_data;
1764 	ha = ddb_entry->ha;
1765 
1766 	options = LOGOUT_OPTION_CLOSE_SESSION;
1767 	if (qla4xxx_session_logout_ddb(ha, ddb_entry, options) == QLA_ERROR)
1768 		ql4_printk(KERN_ERR, ha, "%s: Logout failed\n", __func__);
1769 }
1770 
1771 static void qla4xxx_task_work(struct work_struct *wdata)
1772 {
1773 	struct ql4_task_data *task_data;
1774 	struct scsi_qla_host *ha;
1775 	struct passthru_status *sts;
1776 	struct iscsi_task *task;
1777 	struct iscsi_hdr *hdr;
1778 	uint8_t *data;
1779 	uint32_t data_len;
1780 	struct iscsi_conn *conn;
1781 	int hdr_len;
1782 	itt_t itt;
1783 
1784 	task_data = container_of(wdata, struct ql4_task_data, task_work);
1785 	ha = task_data->ha;
1786 	task = task_data->task;
1787 	sts = &task_data->sts;
1788 	hdr_len = sizeof(struct iscsi_hdr);
1789 
1790 	DEBUG3(printk(KERN_INFO "Status returned\n"));
1791 	DEBUG3(qla4xxx_dump_buffer(sts, 64));
1792 	DEBUG3(printk(KERN_INFO "Response buffer"));
1793 	DEBUG3(qla4xxx_dump_buffer(task_data->resp_buffer, 64));
1794 
1795 	conn = task->conn;
1796 
1797 	switch (sts->completionStatus) {
1798 	case PASSTHRU_STATUS_COMPLETE:
1799 		hdr = (struct iscsi_hdr *)task_data->resp_buffer;
1800 		/* Assign back the itt in hdr, until we use the PREASSIGN_TAG */
1801 		itt = sts->handle;
1802 		hdr->itt = itt;
1803 		data = task_data->resp_buffer + hdr_len;
1804 		data_len = task_data->resp_len - hdr_len;
1805 		iscsi_complete_pdu(conn, hdr, data, data_len);
1806 		break;
1807 	default:
1808 		ql4_printk(KERN_ERR, ha, "Passthru failed status = 0x%x\n",
1809 			   sts->completionStatus);
1810 		break;
1811 	}
1812 	return;
1813 }
1814 
1815 static int qla4xxx_alloc_pdu(struct iscsi_task *task, uint8_t opcode)
1816 {
1817 	struct ql4_task_data *task_data;
1818 	struct iscsi_session *sess;
1819 	struct ddb_entry *ddb_entry;
1820 	struct scsi_qla_host *ha;
1821 	int hdr_len;
1822 
1823 	sess = task->conn->session;
1824 	ddb_entry = sess->dd_data;
1825 	ha = ddb_entry->ha;
1826 	task_data = task->dd_data;
1827 	memset(task_data, 0, sizeof(struct ql4_task_data));
1828 
1829 	if (task->sc) {
1830 		ql4_printk(KERN_INFO, ha,
1831 			   "%s: SCSI Commands not implemented\n", __func__);
1832 		return -EINVAL;
1833 	}
1834 
1835 	hdr_len = sizeof(struct iscsi_hdr);
1836 	task_data->ha = ha;
1837 	task_data->task = task;
1838 
1839 	if (task->data_count) {
1840 		task_data->data_dma = dma_map_single(&ha->pdev->dev, task->data,
1841 						     task->data_count,
1842 						     PCI_DMA_TODEVICE);
1843 	}
1844 
1845 	DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n",
1846 		      __func__, task->conn->max_recv_dlength, hdr_len));
1847 
1848 	task_data->resp_len = task->conn->max_recv_dlength + hdr_len;
1849 	task_data->resp_buffer = dma_alloc_coherent(&ha->pdev->dev,
1850 						    task_data->resp_len,
1851 						    &task_data->resp_dma,
1852 						    GFP_ATOMIC);
1853 	if (!task_data->resp_buffer)
1854 		goto exit_alloc_pdu;
1855 
1856 	task_data->req_len = task->data_count + hdr_len;
1857 	task_data->req_buffer = dma_alloc_coherent(&ha->pdev->dev,
1858 						   task_data->req_len,
1859 						   &task_data->req_dma,
1860 						   GFP_ATOMIC);
1861 	if (!task_data->req_buffer)
1862 		goto exit_alloc_pdu;
1863 
1864 	task->hdr = task_data->req_buffer;
1865 
1866 	INIT_WORK(&task_data->task_work, qla4xxx_task_work);
1867 
1868 	return 0;
1869 
1870 exit_alloc_pdu:
1871 	if (task_data->resp_buffer)
1872 		dma_free_coherent(&ha->pdev->dev, task_data->resp_len,
1873 				  task_data->resp_buffer, task_data->resp_dma);
1874 
1875 	if (task_data->req_buffer)
1876 		dma_free_coherent(&ha->pdev->dev, task_data->req_len,
1877 				  task_data->req_buffer, task_data->req_dma);
1878 	return -ENOMEM;
1879 }
1880 
1881 static void qla4xxx_task_cleanup(struct iscsi_task *task)
1882 {
1883 	struct ql4_task_data *task_data;
1884 	struct iscsi_session *sess;
1885 	struct ddb_entry *ddb_entry;
1886 	struct scsi_qla_host *ha;
1887 	int hdr_len;
1888 
1889 	hdr_len = sizeof(struct iscsi_hdr);
1890 	sess = task->conn->session;
1891 	ddb_entry = sess->dd_data;
1892 	ha = ddb_entry->ha;
1893 	task_data = task->dd_data;
1894 
1895 	if (task->data_count) {
1896 		dma_unmap_single(&ha->pdev->dev, task_data->data_dma,
1897 				 task->data_count, PCI_DMA_TODEVICE);
1898 	}
1899 
1900 	DEBUG2(ql4_printk(KERN_INFO, ha, "%s: MaxRecvLen %u, iscsi hrd %d\n",
1901 		      __func__, task->conn->max_recv_dlength, hdr_len));
1902 
1903 	dma_free_coherent(&ha->pdev->dev, task_data->resp_len,
1904 			  task_data->resp_buffer, task_data->resp_dma);
1905 	dma_free_coherent(&ha->pdev->dev, task_data->req_len,
1906 			  task_data->req_buffer, task_data->req_dma);
1907 	return;
1908 }
1909 
1910 static int qla4xxx_task_xmit(struct iscsi_task *task)
1911 {
1912 	struct scsi_cmnd *sc = task->sc;
1913 	struct iscsi_session *sess = task->conn->session;
1914 	struct ddb_entry *ddb_entry = sess->dd_data;
1915 	struct scsi_qla_host *ha = ddb_entry->ha;
1916 
1917 	if (!sc)
1918 		return qla4xxx_send_passthru0(task);
1919 
1920 	ql4_printk(KERN_INFO, ha, "%s: scsi cmd xmit not implemented\n",
1921 		   __func__);
1922 	return -ENOSYS;
1923 }
1924 
1925 static void qla4xxx_copy_fwddb_param(struct scsi_qla_host *ha,
1926 				     struct dev_db_entry *fw_ddb_entry,
1927 				     struct iscsi_cls_session *cls_sess,
1928 				     struct iscsi_cls_conn *cls_conn)
1929 {
1930 	int buflen = 0;
1931 	struct iscsi_session *sess;
1932 	struct ddb_entry *ddb_entry;
1933 	struct iscsi_conn *conn;
1934 	char ip_addr[DDB_IPADDR_LEN];
1935 	uint16_t options = 0;
1936 
1937 	sess = cls_sess->dd_data;
1938 	ddb_entry = sess->dd_data;
1939 	conn = cls_conn->dd_data;
1940 
1941 	ddb_entry->chap_tbl_idx = le16_to_cpu(fw_ddb_entry->chap_tbl_idx);
1942 
1943 	conn->max_recv_dlength = BYTE_UNITS *
1944 			  le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len);
1945 
1946 	conn->max_xmit_dlength = BYTE_UNITS *
1947 			  le16_to_cpu(fw_ddb_entry->iscsi_max_snd_data_seg_len);
1948 
1949 	sess->initial_r2t_en =
1950 			    (BIT_10 & le16_to_cpu(fw_ddb_entry->iscsi_options));
1951 
1952 	sess->max_r2t = le16_to_cpu(fw_ddb_entry->iscsi_max_outsnd_r2t);
1953 
1954 	sess->imm_data_en = (BIT_11 & le16_to_cpu(fw_ddb_entry->iscsi_options));
1955 
1956 	sess->first_burst = BYTE_UNITS *
1957 			       le16_to_cpu(fw_ddb_entry->iscsi_first_burst_len);
1958 
1959 	sess->max_burst = BYTE_UNITS *
1960 				 le16_to_cpu(fw_ddb_entry->iscsi_max_burst_len);
1961 
1962 	sess->time2wait = le16_to_cpu(fw_ddb_entry->iscsi_def_time2wait);
1963 
1964 	sess->time2retain = le16_to_cpu(fw_ddb_entry->iscsi_def_time2retain);
1965 
1966 	conn->persistent_port = le16_to_cpu(fw_ddb_entry->port);
1967 
1968 	sess->tpgt = le32_to_cpu(fw_ddb_entry->tgt_portal_grp);
1969 
1970 	options = le16_to_cpu(fw_ddb_entry->options);
1971 	if (options & DDB_OPT_IPV6_DEVICE)
1972 		sprintf(ip_addr, "%pI6", fw_ddb_entry->ip_addr);
1973 	else
1974 		sprintf(ip_addr, "%pI4", fw_ddb_entry->ip_addr);
1975 
1976 	iscsi_set_param(cls_conn, ISCSI_PARAM_TARGET_NAME,
1977 			(char *)fw_ddb_entry->iscsi_name, buflen);
1978 	iscsi_set_param(cls_conn, ISCSI_PARAM_INITIATOR_NAME,
1979 			(char *)ha->name_string, buflen);
1980 	iscsi_set_param(cls_conn, ISCSI_PARAM_PERSISTENT_ADDRESS,
1981 			(char *)ip_addr, buflen);
1982 	iscsi_set_param(cls_conn, ISCSI_PARAM_TARGET_ALIAS,
1983 			(char *)fw_ddb_entry->iscsi_alias, buflen);
1984 }
1985 
1986 void qla4xxx_update_session_conn_fwddb_param(struct scsi_qla_host *ha,
1987 					     struct ddb_entry *ddb_entry)
1988 {
1989 	struct iscsi_cls_session *cls_sess;
1990 	struct iscsi_cls_conn *cls_conn;
1991 	uint32_t ddb_state;
1992 	dma_addr_t fw_ddb_entry_dma;
1993 	struct dev_db_entry *fw_ddb_entry;
1994 
1995 	fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
1996 					  &fw_ddb_entry_dma, GFP_KERNEL);
1997 	if (!fw_ddb_entry) {
1998 		ql4_printk(KERN_ERR, ha,
1999 			   "%s: Unable to allocate dma buffer\n", __func__);
2000 		goto exit_session_conn_fwddb_param;
2001 	}
2002 
2003 	if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry,
2004 				    fw_ddb_entry_dma, NULL, NULL, &ddb_state,
2005 				    NULL, NULL, NULL) == QLA_ERROR) {
2006 		DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed "
2007 				  "get_ddb_entry for fw_ddb_index %d\n",
2008 				  ha->host_no, __func__,
2009 				  ddb_entry->fw_ddb_index));
2010 		goto exit_session_conn_fwddb_param;
2011 	}
2012 
2013 	cls_sess = ddb_entry->sess;
2014 
2015 	cls_conn = ddb_entry->conn;
2016 
2017 	/* Update params */
2018 	qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn);
2019 
2020 exit_session_conn_fwddb_param:
2021 	if (fw_ddb_entry)
2022 		dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
2023 				  fw_ddb_entry, fw_ddb_entry_dma);
2024 }
2025 
2026 void qla4xxx_update_session_conn_param(struct scsi_qla_host *ha,
2027 				       struct ddb_entry *ddb_entry)
2028 {
2029 	struct iscsi_cls_session *cls_sess;
2030 	struct iscsi_cls_conn *cls_conn;
2031 	struct iscsi_session *sess;
2032 	struct iscsi_conn *conn;
2033 	uint32_t ddb_state;
2034 	dma_addr_t fw_ddb_entry_dma;
2035 	struct dev_db_entry *fw_ddb_entry;
2036 
2037 	fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
2038 					  &fw_ddb_entry_dma, GFP_KERNEL);
2039 	if (!fw_ddb_entry) {
2040 		ql4_printk(KERN_ERR, ha,
2041 			   "%s: Unable to allocate dma buffer\n", __func__);
2042 		goto exit_session_conn_param;
2043 	}
2044 
2045 	if (qla4xxx_get_fwddb_entry(ha, ddb_entry->fw_ddb_index, fw_ddb_entry,
2046 				    fw_ddb_entry_dma, NULL, NULL, &ddb_state,
2047 				    NULL, NULL, NULL) == QLA_ERROR) {
2048 		DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: failed "
2049 				  "get_ddb_entry for fw_ddb_index %d\n",
2050 				  ha->host_no, __func__,
2051 				  ddb_entry->fw_ddb_index));
2052 		goto exit_session_conn_param;
2053 	}
2054 
2055 	cls_sess = ddb_entry->sess;
2056 	sess = cls_sess->dd_data;
2057 
2058 	cls_conn = ddb_entry->conn;
2059 	conn = cls_conn->dd_data;
2060 
2061 	/* Update timers after login */
2062 	ddb_entry->default_relogin_timeout =
2063 		(le16_to_cpu(fw_ddb_entry->def_timeout) > LOGIN_TOV) &&
2064 		 (le16_to_cpu(fw_ddb_entry->def_timeout) < LOGIN_TOV * 10) ?
2065 		 le16_to_cpu(fw_ddb_entry->def_timeout) : LOGIN_TOV;
2066 	ddb_entry->default_time2wait =
2067 				le16_to_cpu(fw_ddb_entry->iscsi_def_time2wait);
2068 
2069 	/* Update params */
2070 	ddb_entry->chap_tbl_idx = le16_to_cpu(fw_ddb_entry->chap_tbl_idx);
2071 	conn->max_recv_dlength = BYTE_UNITS *
2072 			  le16_to_cpu(fw_ddb_entry->iscsi_max_rcv_data_seg_len);
2073 
2074 	conn->max_xmit_dlength = BYTE_UNITS *
2075 			  le16_to_cpu(fw_ddb_entry->iscsi_max_snd_data_seg_len);
2076 
2077 	sess->initial_r2t_en =
2078 			    (BIT_10 & le16_to_cpu(fw_ddb_entry->iscsi_options));
2079 
2080 	sess->max_r2t = le16_to_cpu(fw_ddb_entry->iscsi_max_outsnd_r2t);
2081 
2082 	sess->imm_data_en = (BIT_11 & le16_to_cpu(fw_ddb_entry->iscsi_options));
2083 
2084 	sess->first_burst = BYTE_UNITS *
2085 			       le16_to_cpu(fw_ddb_entry->iscsi_first_burst_len);
2086 
2087 	sess->max_burst = BYTE_UNITS *
2088 				 le16_to_cpu(fw_ddb_entry->iscsi_max_burst_len);
2089 
2090 	sess->time2wait = le16_to_cpu(fw_ddb_entry->iscsi_def_time2wait);
2091 
2092 	sess->time2retain = le16_to_cpu(fw_ddb_entry->iscsi_def_time2retain);
2093 
2094 	sess->tpgt = le32_to_cpu(fw_ddb_entry->tgt_portal_grp);
2095 
2096 	memcpy(sess->initiatorname, ha->name_string,
2097 	       min(sizeof(ha->name_string), sizeof(sess->initiatorname)));
2098 
2099 	iscsi_set_param(cls_conn, ISCSI_PARAM_TARGET_ALIAS,
2100 			(char *)fw_ddb_entry->iscsi_alias, 0);
2101 
2102 exit_session_conn_param:
2103 	if (fw_ddb_entry)
2104 		dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
2105 				  fw_ddb_entry, fw_ddb_entry_dma);
2106 }
2107 
2108 /*
2109  * Timer routines
2110  */
2111 
2112 static void qla4xxx_start_timer(struct scsi_qla_host *ha, void *func,
2113 				unsigned long interval)
2114 {
2115 	DEBUG(printk("scsi: %s: Starting timer thread for adapter %d\n",
2116 		     __func__, ha->host->host_no));
2117 	init_timer(&ha->timer);
2118 	ha->timer.expires = jiffies + interval * HZ;
2119 	ha->timer.data = (unsigned long)ha;
2120 	ha->timer.function = (void (*)(unsigned long))func;
2121 	add_timer(&ha->timer);
2122 	ha->timer_active = 1;
2123 }
2124 
2125 static void qla4xxx_stop_timer(struct scsi_qla_host *ha)
2126 {
2127 	del_timer_sync(&ha->timer);
2128 	ha->timer_active = 0;
2129 }
2130 
2131 /***
2132  * qla4xxx_mark_device_missing - blocks the session
2133  * @cls_session: Pointer to the session to be blocked
2134  * @ddb_entry: Pointer to device database entry
2135  *
2136  * This routine marks a device missing and close connection.
2137  **/
2138 void qla4xxx_mark_device_missing(struct iscsi_cls_session *cls_session)
2139 {
2140 	iscsi_block_session(cls_session);
2141 }
2142 
2143 /**
2144  * qla4xxx_mark_all_devices_missing - mark all devices as missing.
2145  * @ha: Pointer to host adapter structure.
2146  *
2147  * This routine marks a device missing and resets the relogin retry count.
2148  **/
2149 void qla4xxx_mark_all_devices_missing(struct scsi_qla_host *ha)
2150 {
2151 	iscsi_host_for_each_session(ha->host, qla4xxx_mark_device_missing);
2152 }
2153 
2154 static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha,
2155 				       struct ddb_entry *ddb_entry,
2156 				       struct scsi_cmnd *cmd)
2157 {
2158 	struct srb *srb;
2159 
2160 	srb = mempool_alloc(ha->srb_mempool, GFP_ATOMIC);
2161 	if (!srb)
2162 		return srb;
2163 
2164 	kref_init(&srb->srb_ref);
2165 	srb->ha = ha;
2166 	srb->ddb = ddb_entry;
2167 	srb->cmd = cmd;
2168 	srb->flags = 0;
2169 	CMD_SP(cmd) = (void *)srb;
2170 
2171 	return srb;
2172 }
2173 
2174 static void qla4xxx_srb_free_dma(struct scsi_qla_host *ha, struct srb *srb)
2175 {
2176 	struct scsi_cmnd *cmd = srb->cmd;
2177 
2178 	if (srb->flags & SRB_DMA_VALID) {
2179 		scsi_dma_unmap(cmd);
2180 		srb->flags &= ~SRB_DMA_VALID;
2181 	}
2182 	CMD_SP(cmd) = NULL;
2183 }
2184 
2185 void qla4xxx_srb_compl(struct kref *ref)
2186 {
2187 	struct srb *srb = container_of(ref, struct srb, srb_ref);
2188 	struct scsi_cmnd *cmd = srb->cmd;
2189 	struct scsi_qla_host *ha = srb->ha;
2190 
2191 	qla4xxx_srb_free_dma(ha, srb);
2192 
2193 	mempool_free(srb, ha->srb_mempool);
2194 
2195 	cmd->scsi_done(cmd);
2196 }
2197 
2198 /**
2199  * qla4xxx_queuecommand - scsi layer issues scsi command to driver.
2200  * @host: scsi host
2201  * @cmd: Pointer to Linux's SCSI command structure
2202  *
2203  * Remarks:
2204  * This routine is invoked by Linux to send a SCSI command to the driver.
2205  * The mid-level driver tries to ensure that queuecommand never gets
2206  * invoked concurrently with itself or the interrupt handler (although
2207  * the interrupt handler may call this routine as part of request-
2208  * completion handling).   Unfortunely, it sometimes calls the scheduler
2209  * in interrupt context which is a big NO! NO!.
2210  **/
2211 static int qla4xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd)
2212 {
2213 	struct scsi_qla_host *ha = to_qla_host(host);
2214 	struct ddb_entry *ddb_entry = cmd->device->hostdata;
2215 	struct iscsi_cls_session *sess = ddb_entry->sess;
2216 	struct srb *srb;
2217 	int rval;
2218 
2219 	if (test_bit(AF_EEH_BUSY, &ha->flags)) {
2220 		if (test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags))
2221 			cmd->result = DID_NO_CONNECT << 16;
2222 		else
2223 			cmd->result = DID_REQUEUE << 16;
2224 		goto qc_fail_command;
2225 	}
2226 
2227 	if (!sess) {
2228 		cmd->result = DID_IMM_RETRY << 16;
2229 		goto qc_fail_command;
2230 	}
2231 
2232 	rval = iscsi_session_chkready(sess);
2233 	if (rval) {
2234 		cmd->result = rval;
2235 		goto qc_fail_command;
2236 	}
2237 
2238 	if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) ||
2239 	    test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) ||
2240 	    test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
2241 	    test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) ||
2242 	    test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) ||
2243 	    !test_bit(AF_ONLINE, &ha->flags) ||
2244 	    !test_bit(AF_LINK_UP, &ha->flags) ||
2245 	    test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))
2246 		goto qc_host_busy;
2247 
2248 	srb = qla4xxx_get_new_srb(ha, ddb_entry, cmd);
2249 	if (!srb)
2250 		goto qc_host_busy;
2251 
2252 	rval = qla4xxx_send_command_to_isp(ha, srb);
2253 	if (rval != QLA_SUCCESS)
2254 		goto qc_host_busy_free_sp;
2255 
2256 	return 0;
2257 
2258 qc_host_busy_free_sp:
2259 	qla4xxx_srb_free_dma(ha, srb);
2260 	mempool_free(srb, ha->srb_mempool);
2261 
2262 qc_host_busy:
2263 	return SCSI_MLQUEUE_HOST_BUSY;
2264 
2265 qc_fail_command:
2266 	cmd->scsi_done(cmd);
2267 
2268 	return 0;
2269 }
2270 
2271 /**
2272  * qla4xxx_mem_free - frees memory allocated to adapter
2273  * @ha: Pointer to host adapter structure.
2274  *
2275  * Frees memory previously allocated by qla4xxx_mem_alloc
2276  **/
2277 static void qla4xxx_mem_free(struct scsi_qla_host *ha)
2278 {
2279 	if (ha->queues)
2280 		dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues,
2281 				  ha->queues_dma);
2282 
2283 	 if (ha->fw_dump)
2284 		vfree(ha->fw_dump);
2285 
2286 	ha->queues_len = 0;
2287 	ha->queues = NULL;
2288 	ha->queues_dma = 0;
2289 	ha->request_ring = NULL;
2290 	ha->request_dma = 0;
2291 	ha->response_ring = NULL;
2292 	ha->response_dma = 0;
2293 	ha->shadow_regs = NULL;
2294 	ha->shadow_regs_dma = 0;
2295 	ha->fw_dump = NULL;
2296 	ha->fw_dump_size = 0;
2297 
2298 	/* Free srb pool. */
2299 	if (ha->srb_mempool)
2300 		mempool_destroy(ha->srb_mempool);
2301 
2302 	ha->srb_mempool = NULL;
2303 
2304 	if (ha->chap_dma_pool)
2305 		dma_pool_destroy(ha->chap_dma_pool);
2306 
2307 	if (ha->chap_list)
2308 		vfree(ha->chap_list);
2309 	ha->chap_list = NULL;
2310 
2311 	if (ha->fw_ddb_dma_pool)
2312 		dma_pool_destroy(ha->fw_ddb_dma_pool);
2313 
2314 	/* release io space registers  */
2315 	if (is_qla8022(ha)) {
2316 		if (ha->nx_pcibase)
2317 			iounmap(
2318 			    (struct device_reg_82xx __iomem *)ha->nx_pcibase);
2319 	} else if (is_qla8032(ha)) {
2320 		if (ha->nx_pcibase)
2321 			iounmap(
2322 			    (struct device_reg_83xx __iomem *)ha->nx_pcibase);
2323 	} else if (ha->reg) {
2324 		iounmap(ha->reg);
2325 	}
2326 
2327 	if (ha->reset_tmplt.buff)
2328 		vfree(ha->reset_tmplt.buff);
2329 
2330 	pci_release_regions(ha->pdev);
2331 }
2332 
2333 /**
2334  * qla4xxx_mem_alloc - allocates memory for use by adapter.
2335  * @ha: Pointer to host adapter structure
2336  *
2337  * Allocates DMA memory for request and response queues. Also allocates memory
2338  * for srbs.
2339  **/
2340 static int qla4xxx_mem_alloc(struct scsi_qla_host *ha)
2341 {
2342 	unsigned long align;
2343 
2344 	/* Allocate contiguous block of DMA memory for queues. */
2345 	ha->queues_len = ((REQUEST_QUEUE_DEPTH * QUEUE_SIZE) +
2346 			  (RESPONSE_QUEUE_DEPTH * QUEUE_SIZE) +
2347 			  sizeof(struct shadow_regs) +
2348 			  MEM_ALIGN_VALUE +
2349 			  (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
2350 	ha->queues = dma_alloc_coherent(&ha->pdev->dev, ha->queues_len,
2351 					&ha->queues_dma, GFP_KERNEL);
2352 	if (ha->queues == NULL) {
2353 		ql4_printk(KERN_WARNING, ha,
2354 		    "Memory Allocation failed - queues.\n");
2355 
2356 		goto mem_alloc_error_exit;
2357 	}
2358 	memset(ha->queues, 0, ha->queues_len);
2359 
2360 	/*
2361 	 * As per RISC alignment requirements -- the bus-address must be a
2362 	 * multiple of the request-ring size (in bytes).
2363 	 */
2364 	align = 0;
2365 	if ((unsigned long)ha->queues_dma & (MEM_ALIGN_VALUE - 1))
2366 		align = MEM_ALIGN_VALUE - ((unsigned long)ha->queues_dma &
2367 					   (MEM_ALIGN_VALUE - 1));
2368 
2369 	/* Update request and response queue pointers. */
2370 	ha->request_dma = ha->queues_dma + align;
2371 	ha->request_ring = (struct queue_entry *) (ha->queues + align);
2372 	ha->response_dma = ha->queues_dma + align +
2373 		(REQUEST_QUEUE_DEPTH * QUEUE_SIZE);
2374 	ha->response_ring = (struct queue_entry *) (ha->queues + align +
2375 						    (REQUEST_QUEUE_DEPTH *
2376 						     QUEUE_SIZE));
2377 	ha->shadow_regs_dma = ha->queues_dma + align +
2378 		(REQUEST_QUEUE_DEPTH * QUEUE_SIZE) +
2379 		(RESPONSE_QUEUE_DEPTH * QUEUE_SIZE);
2380 	ha->shadow_regs = (struct shadow_regs *) (ha->queues + align +
2381 						  (REQUEST_QUEUE_DEPTH *
2382 						   QUEUE_SIZE) +
2383 						  (RESPONSE_QUEUE_DEPTH *
2384 						   QUEUE_SIZE));
2385 
2386 	/* Allocate memory for srb pool. */
2387 	ha->srb_mempool = mempool_create(SRB_MIN_REQ, mempool_alloc_slab,
2388 					 mempool_free_slab, srb_cachep);
2389 	if (ha->srb_mempool == NULL) {
2390 		ql4_printk(KERN_WARNING, ha,
2391 		    "Memory Allocation failed - SRB Pool.\n");
2392 
2393 		goto mem_alloc_error_exit;
2394 	}
2395 
2396 	ha->chap_dma_pool = dma_pool_create("ql4_chap", &ha->pdev->dev,
2397 					    CHAP_DMA_BLOCK_SIZE, 8, 0);
2398 
2399 	if (ha->chap_dma_pool == NULL) {
2400 		ql4_printk(KERN_WARNING, ha,
2401 		    "%s: chap_dma_pool allocation failed..\n", __func__);
2402 		goto mem_alloc_error_exit;
2403 	}
2404 
2405 	ha->fw_ddb_dma_pool = dma_pool_create("ql4_fw_ddb", &ha->pdev->dev,
2406 					      DDB_DMA_BLOCK_SIZE, 8, 0);
2407 
2408 	if (ha->fw_ddb_dma_pool == NULL) {
2409 		ql4_printk(KERN_WARNING, ha,
2410 			   "%s: fw_ddb_dma_pool allocation failed..\n",
2411 			   __func__);
2412 		goto mem_alloc_error_exit;
2413 	}
2414 
2415 	return QLA_SUCCESS;
2416 
2417 mem_alloc_error_exit:
2418 	qla4xxx_mem_free(ha);
2419 	return QLA_ERROR;
2420 }
2421 
2422 /**
2423  * qla4_8xxx_check_temp - Check the ISP82XX temperature.
2424  * @ha: adapter block pointer.
2425  *
2426  * Note: The caller should not hold the idc lock.
2427  **/
2428 static int qla4_8xxx_check_temp(struct scsi_qla_host *ha)
2429 {
2430 	uint32_t temp, temp_state, temp_val;
2431 	int status = QLA_SUCCESS;
2432 
2433 	temp = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_TEMP_STATE);
2434 
2435 	temp_state = qla82xx_get_temp_state(temp);
2436 	temp_val = qla82xx_get_temp_val(temp);
2437 
2438 	if (temp_state == QLA82XX_TEMP_PANIC) {
2439 		ql4_printk(KERN_WARNING, ha, "Device temperature %d degrees C"
2440 			   " exceeds maximum allowed. Hardware has been shut"
2441 			   " down.\n", temp_val);
2442 		status = QLA_ERROR;
2443 	} else if (temp_state == QLA82XX_TEMP_WARN) {
2444 		if (ha->temperature == QLA82XX_TEMP_NORMAL)
2445 			ql4_printk(KERN_WARNING, ha, "Device temperature %d"
2446 				   " degrees C exceeds operating range."
2447 				   " Immediate action needed.\n", temp_val);
2448 	} else {
2449 		if (ha->temperature == QLA82XX_TEMP_WARN)
2450 			ql4_printk(KERN_INFO, ha, "Device temperature is"
2451 				   " now %d degrees C in normal range.\n",
2452 				   temp_val);
2453 	}
2454 	ha->temperature = temp_state;
2455 	return status;
2456 }
2457 
2458 /**
2459  * qla4_8xxx_check_fw_alive  - Check firmware health
2460  * @ha: Pointer to host adapter structure.
2461  *
2462  * Context: Interrupt
2463  **/
2464 static int qla4_8xxx_check_fw_alive(struct scsi_qla_host *ha)
2465 {
2466 	uint32_t fw_heartbeat_counter;
2467 	int status = QLA_SUCCESS;
2468 
2469 	fw_heartbeat_counter = qla4_8xxx_rd_direct(ha,
2470 						   QLA8XXX_PEG_ALIVE_COUNTER);
2471 	/* If PEG_ALIVE_COUNTER is 0xffffffff, AER/EEH is in progress, ignore */
2472 	if (fw_heartbeat_counter == 0xffffffff) {
2473 		DEBUG2(printk(KERN_WARNING "scsi%ld: %s: Device in frozen "
2474 		    "state, QLA82XX_PEG_ALIVE_COUNTER is 0xffffffff\n",
2475 		    ha->host_no, __func__));
2476 		return status;
2477 	}
2478 
2479 	if (ha->fw_heartbeat_counter == fw_heartbeat_counter) {
2480 		ha->seconds_since_last_heartbeat++;
2481 		/* FW not alive after 2 seconds */
2482 		if (ha->seconds_since_last_heartbeat == 2) {
2483 			ha->seconds_since_last_heartbeat = 0;
2484 			qla4_8xxx_dump_peg_reg(ha);
2485 			status = QLA_ERROR;
2486 		}
2487 	} else
2488 		ha->seconds_since_last_heartbeat = 0;
2489 
2490 	ha->fw_heartbeat_counter = fw_heartbeat_counter;
2491 	return status;
2492 }
2493 
2494 static void qla4_8xxx_process_fw_error(struct scsi_qla_host *ha)
2495 {
2496 	uint32_t halt_status;
2497 	int halt_status_unrecoverable = 0;
2498 
2499 	halt_status = qla4_8xxx_rd_direct(ha, QLA8XXX_PEG_HALT_STATUS1);
2500 
2501 	if (is_qla8022(ha)) {
2502 		ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n",
2503 			   __func__);
2504 		qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98,
2505 				CRB_NIU_XG_PAUSE_CTL_P0 |
2506 				CRB_NIU_XG_PAUSE_CTL_P1);
2507 
2508 		if (QLA82XX_FWERROR_CODE(halt_status) == 0x67)
2509 			ql4_printk(KERN_ERR, ha, "%s: Firmware aborted with error code 0x00006700. Device is being reset\n",
2510 				   __func__);
2511 		if (halt_status & HALT_STATUS_UNRECOVERABLE)
2512 			halt_status_unrecoverable = 1;
2513 	} else if (is_qla8032(ha)) {
2514 		if (halt_status & QLA83XX_HALT_STATUS_FW_RESET)
2515 			ql4_printk(KERN_ERR, ha, "%s: Firmware error detected device is being reset\n",
2516 				   __func__);
2517 		else if (halt_status & QLA83XX_HALT_STATUS_UNRECOVERABLE)
2518 			halt_status_unrecoverable = 1;
2519 	}
2520 
2521 	/*
2522 	 * Since we cannot change dev_state in interrupt context,
2523 	 * set appropriate DPC flag then wakeup DPC
2524 	 */
2525 	if (halt_status_unrecoverable) {
2526 		set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags);
2527 	} else {
2528 		ql4_printk(KERN_INFO, ha, "%s: detect abort needed!\n",
2529 			   __func__);
2530 		set_bit(DPC_RESET_HA, &ha->dpc_flags);
2531 	}
2532 	qla4xxx_mailbox_premature_completion(ha);
2533 	qla4xxx_wake_dpc(ha);
2534 }
2535 
2536 /**
2537  * qla4_8xxx_watchdog - Poll dev state
2538  * @ha: Pointer to host adapter structure.
2539  *
2540  * Context: Interrupt
2541  **/
2542 void qla4_8xxx_watchdog(struct scsi_qla_host *ha)
2543 {
2544 	uint32_t dev_state;
2545 
2546 	/* don't poll if reset is going on */
2547 	if (!(test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) ||
2548 	    test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
2549 	    test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags))) {
2550 		dev_state = qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE);
2551 
2552 		if (qla4_8xxx_check_temp(ha)) {
2553 			if (is_qla8022(ha)) {
2554 				ql4_printk(KERN_INFO, ha, "disabling pause transmit on port 0 & 1.\n");
2555 				qla4_82xx_wr_32(ha, QLA82XX_CRB_NIU + 0x98,
2556 						CRB_NIU_XG_PAUSE_CTL_P0 |
2557 						CRB_NIU_XG_PAUSE_CTL_P1);
2558 			}
2559 			set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags);
2560 			qla4xxx_wake_dpc(ha);
2561 		} else if (dev_state == QLA8XXX_DEV_NEED_RESET &&
2562 			   !test_bit(DPC_RESET_HA, &ha->dpc_flags)) {
2563 			if (is_qla8032(ha) ||
2564 			    (is_qla8022(ha) && !ql4xdontresethba)) {
2565 				ql4_printk(KERN_INFO, ha, "%s: HW State: "
2566 				    "NEED RESET!\n", __func__);
2567 				set_bit(DPC_RESET_HA, &ha->dpc_flags);
2568 				qla4xxx_wake_dpc(ha);
2569 			}
2570 		} else if (dev_state == QLA8XXX_DEV_NEED_QUIESCENT &&
2571 		    !test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) {
2572 			ql4_printk(KERN_INFO, ha, "%s: HW State: NEED QUIES!\n",
2573 			    __func__);
2574 			set_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags);
2575 			qla4xxx_wake_dpc(ha);
2576 		} else  {
2577 			/* Check firmware health */
2578 			if (qla4_8xxx_check_fw_alive(ha))
2579 				qla4_8xxx_process_fw_error(ha);
2580 		}
2581 	}
2582 }
2583 
2584 static void qla4xxx_check_relogin_flash_ddb(struct iscsi_cls_session *cls_sess)
2585 {
2586 	struct iscsi_session *sess;
2587 	struct ddb_entry *ddb_entry;
2588 	struct scsi_qla_host *ha;
2589 
2590 	sess = cls_sess->dd_data;
2591 	ddb_entry = sess->dd_data;
2592 	ha = ddb_entry->ha;
2593 
2594 	if (!(ddb_entry->ddb_type == FLASH_DDB))
2595 		return;
2596 
2597 	if (adapter_up(ha) && !test_bit(DF_RELOGIN, &ddb_entry->flags) &&
2598 	    !iscsi_is_session_online(cls_sess)) {
2599 		if (atomic_read(&ddb_entry->retry_relogin_timer) !=
2600 		    INVALID_ENTRY) {
2601 			if (atomic_read(&ddb_entry->retry_relogin_timer) ==
2602 					0) {
2603 				atomic_set(&ddb_entry->retry_relogin_timer,
2604 					   INVALID_ENTRY);
2605 				set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags);
2606 				set_bit(DF_RELOGIN, &ddb_entry->flags);
2607 				DEBUG2(ql4_printk(KERN_INFO, ha,
2608 				       "%s: index [%d] login device\n",
2609 					__func__, ddb_entry->fw_ddb_index));
2610 			} else
2611 				atomic_dec(&ddb_entry->retry_relogin_timer);
2612 		}
2613 	}
2614 
2615 	/* Wait for relogin to timeout */
2616 	if (atomic_read(&ddb_entry->relogin_timer) &&
2617 	    (atomic_dec_and_test(&ddb_entry->relogin_timer) != 0)) {
2618 		/*
2619 		 * If the relogin times out and the device is
2620 		 * still NOT ONLINE then try and relogin again.
2621 		 */
2622 		if (!iscsi_is_session_online(cls_sess)) {
2623 			/* Reset retry relogin timer */
2624 			atomic_inc(&ddb_entry->relogin_retry_count);
2625 			DEBUG2(ql4_printk(KERN_INFO, ha,
2626 				"%s: index[%d] relogin timed out-retrying"
2627 				" relogin (%d), retry (%d)\n", __func__,
2628 				ddb_entry->fw_ddb_index,
2629 				atomic_read(&ddb_entry->relogin_retry_count),
2630 				ddb_entry->default_time2wait + 4));
2631 			set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags);
2632 			atomic_set(&ddb_entry->retry_relogin_timer,
2633 				   ddb_entry->default_time2wait + 4);
2634 		}
2635 	}
2636 }
2637 
2638 /**
2639  * qla4xxx_timer - checks every second for work to do.
2640  * @ha: Pointer to host adapter structure.
2641  **/
2642 static void qla4xxx_timer(struct scsi_qla_host *ha)
2643 {
2644 	int start_dpc = 0;
2645 	uint16_t w;
2646 
2647 	iscsi_host_for_each_session(ha->host, qla4xxx_check_relogin_flash_ddb);
2648 
2649 	/* If we are in the middle of AER/EEH processing
2650 	 * skip any processing and reschedule the timer
2651 	 */
2652 	if (test_bit(AF_EEH_BUSY, &ha->flags)) {
2653 		mod_timer(&ha->timer, jiffies + HZ);
2654 		return;
2655 	}
2656 
2657 	/* Hardware read to trigger an EEH error during mailbox waits. */
2658 	if (!pci_channel_offline(ha->pdev))
2659 		pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w);
2660 
2661 	if (is_qla80XX(ha))
2662 		qla4_8xxx_watchdog(ha);
2663 
2664 	if (is_qla40XX(ha)) {
2665 		/* Check for heartbeat interval. */
2666 		if (ha->firmware_options & FWOPT_HEARTBEAT_ENABLE &&
2667 		    ha->heartbeat_interval != 0) {
2668 			ha->seconds_since_last_heartbeat++;
2669 			if (ha->seconds_since_last_heartbeat >
2670 			    ha->heartbeat_interval + 2)
2671 				set_bit(DPC_RESET_HA, &ha->dpc_flags);
2672 		}
2673 	}
2674 
2675 	/* Process any deferred work. */
2676 	if (!list_empty(&ha->work_list))
2677 		start_dpc++;
2678 
2679 	/* Wakeup the dpc routine for this adapter, if needed. */
2680 	if (start_dpc ||
2681 	     test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
2682 	     test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags) ||
2683 	     test_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags) ||
2684 	     test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) ||
2685 	     test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) ||
2686 	     test_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags) ||
2687 	     test_bit(DPC_LINK_CHANGED, &ha->dpc_flags) ||
2688 	     test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) ||
2689 	     test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) ||
2690 	     test_bit(DPC_AEN, &ha->dpc_flags)) {
2691 		DEBUG2(printk("scsi%ld: %s: scheduling dpc routine"
2692 			      " - dpc flags = 0x%lx\n",
2693 			      ha->host_no, __func__, ha->dpc_flags));
2694 		qla4xxx_wake_dpc(ha);
2695 	}
2696 
2697 	/* Reschedule timer thread to call us back in one second */
2698 	mod_timer(&ha->timer, jiffies + HZ);
2699 
2700 	DEBUG2(ha->seconds_since_last_intr++);
2701 }
2702 
2703 /**
2704  * qla4xxx_cmd_wait - waits for all outstanding commands to complete
2705  * @ha: Pointer to host adapter structure.
2706  *
2707  * This routine stalls the driver until all outstanding commands are returned.
2708  * Caller must release the Hardware Lock prior to calling this routine.
2709  **/
2710 static int qla4xxx_cmd_wait(struct scsi_qla_host *ha)
2711 {
2712 	uint32_t index = 0;
2713 	unsigned long flags;
2714 	struct scsi_cmnd *cmd;
2715 
2716 	unsigned long wtime = jiffies + (WAIT_CMD_TOV * HZ);
2717 
2718 	DEBUG2(ql4_printk(KERN_INFO, ha, "Wait up to %d seconds for cmds to "
2719 	    "complete\n", WAIT_CMD_TOV));
2720 
2721 	while (!time_after_eq(jiffies, wtime)) {
2722 		spin_lock_irqsave(&ha->hardware_lock, flags);
2723 		/* Find a command that hasn't completed. */
2724 		for (index = 0; index < ha->host->can_queue; index++) {
2725 			cmd = scsi_host_find_tag(ha->host, index);
2726 			/*
2727 			 * We cannot just check if the index is valid,
2728 			 * becase if we are run from the scsi eh, then
2729 			 * the scsi/block layer is going to prevent
2730 			 * the tag from being released.
2731 			 */
2732 			if (cmd != NULL && CMD_SP(cmd))
2733 				break;
2734 		}
2735 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
2736 
2737 		/* If No Commands are pending, wait is complete */
2738 		if (index == ha->host->can_queue)
2739 			return QLA_SUCCESS;
2740 
2741 		msleep(1000);
2742 	}
2743 	/* If we timed out on waiting for commands to come back
2744 	 * return ERROR. */
2745 	return QLA_ERROR;
2746 }
2747 
2748 int qla4xxx_hw_reset(struct scsi_qla_host *ha)
2749 {
2750 	uint32_t ctrl_status;
2751 	unsigned long flags = 0;
2752 
2753 	DEBUG2(printk(KERN_ERR "scsi%ld: %s\n", ha->host_no, __func__));
2754 
2755 	if (ql4xxx_lock_drvr_wait(ha) != QLA_SUCCESS)
2756 		return QLA_ERROR;
2757 
2758 	spin_lock_irqsave(&ha->hardware_lock, flags);
2759 
2760 	/*
2761 	 * If the SCSI Reset Interrupt bit is set, clear it.
2762 	 * Otherwise, the Soft Reset won't work.
2763 	 */
2764 	ctrl_status = readw(&ha->reg->ctrl_status);
2765 	if ((ctrl_status & CSR_SCSI_RESET_INTR) != 0)
2766 		writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status);
2767 
2768 	/* Issue Soft Reset */
2769 	writel(set_rmask(CSR_SOFT_RESET), &ha->reg->ctrl_status);
2770 	readl(&ha->reg->ctrl_status);
2771 
2772 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
2773 	return QLA_SUCCESS;
2774 }
2775 
2776 /**
2777  * qla4xxx_soft_reset - performs soft reset.
2778  * @ha: Pointer to host adapter structure.
2779  **/
2780 int qla4xxx_soft_reset(struct scsi_qla_host *ha)
2781 {
2782 	uint32_t max_wait_time;
2783 	unsigned long flags = 0;
2784 	int status;
2785 	uint32_t ctrl_status;
2786 
2787 	status = qla4xxx_hw_reset(ha);
2788 	if (status != QLA_SUCCESS)
2789 		return status;
2790 
2791 	status = QLA_ERROR;
2792 	/* Wait until the Network Reset Intr bit is cleared */
2793 	max_wait_time = RESET_INTR_TOV;
2794 	do {
2795 		spin_lock_irqsave(&ha->hardware_lock, flags);
2796 		ctrl_status = readw(&ha->reg->ctrl_status);
2797 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
2798 
2799 		if ((ctrl_status & CSR_NET_RESET_INTR) == 0)
2800 			break;
2801 
2802 		msleep(1000);
2803 	} while ((--max_wait_time));
2804 
2805 	if ((ctrl_status & CSR_NET_RESET_INTR) != 0) {
2806 		DEBUG2(printk(KERN_WARNING
2807 			      "scsi%ld: Network Reset Intr not cleared by "
2808 			      "Network function, clearing it now!\n",
2809 			      ha->host_no));
2810 		spin_lock_irqsave(&ha->hardware_lock, flags);
2811 		writel(set_rmask(CSR_NET_RESET_INTR), &ha->reg->ctrl_status);
2812 		readl(&ha->reg->ctrl_status);
2813 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
2814 	}
2815 
2816 	/* Wait until the firmware tells us the Soft Reset is done */
2817 	max_wait_time = SOFT_RESET_TOV;
2818 	do {
2819 		spin_lock_irqsave(&ha->hardware_lock, flags);
2820 		ctrl_status = readw(&ha->reg->ctrl_status);
2821 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
2822 
2823 		if ((ctrl_status & CSR_SOFT_RESET) == 0) {
2824 			status = QLA_SUCCESS;
2825 			break;
2826 		}
2827 
2828 		msleep(1000);
2829 	} while ((--max_wait_time));
2830 
2831 	/*
2832 	 * Also, make sure that the SCSI Reset Interrupt bit has been cleared
2833 	 * after the soft reset has taken place.
2834 	 */
2835 	spin_lock_irqsave(&ha->hardware_lock, flags);
2836 	ctrl_status = readw(&ha->reg->ctrl_status);
2837 	if ((ctrl_status & CSR_SCSI_RESET_INTR) != 0) {
2838 		writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status);
2839 		readl(&ha->reg->ctrl_status);
2840 	}
2841 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
2842 
2843 	/* If soft reset fails then most probably the bios on other
2844 	 * function is also enabled.
2845 	 * Since the initialization is sequential the other fn
2846 	 * wont be able to acknowledge the soft reset.
2847 	 * Issue a force soft reset to workaround this scenario.
2848 	 */
2849 	if (max_wait_time == 0) {
2850 		/* Issue Force Soft Reset */
2851 		spin_lock_irqsave(&ha->hardware_lock, flags);
2852 		writel(set_rmask(CSR_FORCE_SOFT_RESET), &ha->reg->ctrl_status);
2853 		readl(&ha->reg->ctrl_status);
2854 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
2855 		/* Wait until the firmware tells us the Soft Reset is done */
2856 		max_wait_time = SOFT_RESET_TOV;
2857 		do {
2858 			spin_lock_irqsave(&ha->hardware_lock, flags);
2859 			ctrl_status = readw(&ha->reg->ctrl_status);
2860 			spin_unlock_irqrestore(&ha->hardware_lock, flags);
2861 
2862 			if ((ctrl_status & CSR_FORCE_SOFT_RESET) == 0) {
2863 				status = QLA_SUCCESS;
2864 				break;
2865 			}
2866 
2867 			msleep(1000);
2868 		} while ((--max_wait_time));
2869 	}
2870 
2871 	return status;
2872 }
2873 
2874 /**
2875  * qla4xxx_abort_active_cmds - returns all outstanding i/o requests to O.S.
2876  * @ha: Pointer to host adapter structure.
2877  * @res: returned scsi status
2878  *
2879  * This routine is called just prior to a HARD RESET to return all
2880  * outstanding commands back to the Operating System.
2881  * Caller should make sure that the following locks are released
2882  * before this calling routine: Hardware lock, and io_request_lock.
2883  **/
2884 static void qla4xxx_abort_active_cmds(struct scsi_qla_host *ha, int res)
2885 {
2886 	struct srb *srb;
2887 	int i;
2888 	unsigned long flags;
2889 
2890 	spin_lock_irqsave(&ha->hardware_lock, flags);
2891 	for (i = 0; i < ha->host->can_queue; i++) {
2892 		srb = qla4xxx_del_from_active_array(ha, i);
2893 		if (srb != NULL) {
2894 			srb->cmd->result = res;
2895 			kref_put(&srb->srb_ref, qla4xxx_srb_compl);
2896 		}
2897 	}
2898 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
2899 }
2900 
2901 void qla4xxx_dead_adapter_cleanup(struct scsi_qla_host *ha)
2902 {
2903 	clear_bit(AF_ONLINE, &ha->flags);
2904 
2905 	/* Disable the board */
2906 	ql4_printk(KERN_INFO, ha, "Disabling the board\n");
2907 
2908 	qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16);
2909 	qla4xxx_mark_all_devices_missing(ha);
2910 	clear_bit(AF_INIT_DONE, &ha->flags);
2911 }
2912 
2913 static void qla4xxx_fail_session(struct iscsi_cls_session *cls_session)
2914 {
2915 	struct iscsi_session *sess;
2916 	struct ddb_entry *ddb_entry;
2917 
2918 	sess = cls_session->dd_data;
2919 	ddb_entry = sess->dd_data;
2920 	ddb_entry->fw_ddb_device_state = DDB_DS_SESSION_FAILED;
2921 
2922 	if (ddb_entry->ddb_type == FLASH_DDB)
2923 		iscsi_block_session(ddb_entry->sess);
2924 	else
2925 		iscsi_session_failure(cls_session->dd_data,
2926 				      ISCSI_ERR_CONN_FAILED);
2927 }
2928 
2929 /**
2930  * qla4xxx_recover_adapter - recovers adapter after a fatal error
2931  * @ha: Pointer to host adapter structure.
2932  **/
2933 static int qla4xxx_recover_adapter(struct scsi_qla_host *ha)
2934 {
2935 	int status = QLA_ERROR;
2936 	uint8_t reset_chip = 0;
2937 	uint32_t dev_state;
2938 	unsigned long wait;
2939 
2940 	/* Stall incoming I/O until we are done */
2941 	scsi_block_requests(ha->host);
2942 	clear_bit(AF_ONLINE, &ha->flags);
2943 	clear_bit(AF_LINK_UP, &ha->flags);
2944 
2945 	DEBUG2(ql4_printk(KERN_INFO, ha, "%s: adapter OFFLINE\n", __func__));
2946 
2947 	set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags);
2948 
2949 	if (is_qla8032(ha) &&
2950 	    !test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) {
2951 		ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n",
2952 			   __func__);
2953 		/* disable pause frame for ISP83xx */
2954 		qla4_83xx_disable_pause(ha);
2955 	}
2956 
2957 	iscsi_host_for_each_session(ha->host, qla4xxx_fail_session);
2958 
2959 	if (test_bit(DPC_RESET_HA, &ha->dpc_flags))
2960 		reset_chip = 1;
2961 
2962 	/* For the DPC_RESET_HA_INTR case (ISP-4xxx specific)
2963 	 * do not reset adapter, jump to initialize_adapter */
2964 	if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) {
2965 		status = QLA_SUCCESS;
2966 		goto recover_ha_init_adapter;
2967 	}
2968 
2969 	/* For the ISP-8xxx adapter, issue a stop_firmware if invoked
2970 	 * from eh_host_reset or ioctl module */
2971 	if (is_qla80XX(ha) && !reset_chip &&
2972 	    test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) {
2973 
2974 		DEBUG2(ql4_printk(KERN_INFO, ha,
2975 		    "scsi%ld: %s - Performing stop_firmware...\n",
2976 		    ha->host_no, __func__));
2977 		status = ha->isp_ops->reset_firmware(ha);
2978 		if (status == QLA_SUCCESS) {
2979 			if (!test_bit(AF_FW_RECOVERY, &ha->flags))
2980 				qla4xxx_cmd_wait(ha);
2981 			ha->isp_ops->disable_intrs(ha);
2982 			qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
2983 			qla4xxx_abort_active_cmds(ha, DID_RESET << 16);
2984 		} else {
2985 			/* If the stop_firmware fails then
2986 			 * reset the entire chip */
2987 			reset_chip = 1;
2988 			clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags);
2989 			set_bit(DPC_RESET_HA, &ha->dpc_flags);
2990 		}
2991 	}
2992 
2993 	/* Issue full chip reset if recovering from a catastrophic error,
2994 	 * or if stop_firmware fails for ISP-8xxx.
2995 	 * This is the default case for ISP-4xxx */
2996 	if (is_qla40XX(ha) || reset_chip) {
2997 		if (is_qla40XX(ha))
2998 			goto chip_reset;
2999 
3000 		/* Check if 8XXX firmware is alive or not
3001 		 * We may have arrived here from NEED_RESET
3002 		 * detection only */
3003 		if (test_bit(AF_FW_RECOVERY, &ha->flags))
3004 			goto chip_reset;
3005 
3006 		wait = jiffies + (FW_ALIVE_WAIT_TOV * HZ);
3007 		while (time_before(jiffies, wait)) {
3008 			if (qla4_8xxx_check_fw_alive(ha)) {
3009 				qla4xxx_mailbox_premature_completion(ha);
3010 				break;
3011 			}
3012 
3013 			set_current_state(TASK_UNINTERRUPTIBLE);
3014 			schedule_timeout(HZ);
3015 		}
3016 chip_reset:
3017 		if (!test_bit(AF_FW_RECOVERY, &ha->flags))
3018 			qla4xxx_cmd_wait(ha);
3019 
3020 		qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
3021 		qla4xxx_abort_active_cmds(ha, DID_RESET << 16);
3022 		DEBUG2(ql4_printk(KERN_INFO, ha,
3023 		    "scsi%ld: %s - Performing chip reset..\n",
3024 		    ha->host_no, __func__));
3025 		status = ha->isp_ops->reset_chip(ha);
3026 	}
3027 
3028 	/* Flush any pending ddb changed AENs */
3029 	qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
3030 
3031 recover_ha_init_adapter:
3032 	/* Upon successful firmware/chip reset, re-initialize the adapter */
3033 	if (status == QLA_SUCCESS) {
3034 		/* For ISP-4xxx, force function 1 to always initialize
3035 		 * before function 3 to prevent both funcions from
3036 		 * stepping on top of the other */
3037 		if (is_qla40XX(ha) && (ha->mac_index == 3))
3038 			ssleep(6);
3039 
3040 		/* NOTE: AF_ONLINE flag set upon successful completion of
3041 		 *       qla4xxx_initialize_adapter */
3042 		status = qla4xxx_initialize_adapter(ha, RESET_ADAPTER);
3043 	}
3044 
3045 	/* Retry failed adapter initialization, if necessary
3046 	 * Do not retry initialize_adapter for RESET_HA_INTR (ISP-4xxx specific)
3047 	 * case to prevent ping-pong resets between functions */
3048 	if (!test_bit(AF_ONLINE, &ha->flags) &&
3049 	    !test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) {
3050 		/* Adapter initialization failed, see if we can retry
3051 		 * resetting the ha.
3052 		 * Since we don't want to block the DPC for too long
3053 		 * with multiple resets in the same thread,
3054 		 * utilize DPC to retry */
3055 		if (is_qla80XX(ha)) {
3056 			ha->isp_ops->idc_lock(ha);
3057 			dev_state = qla4_8xxx_rd_direct(ha,
3058 							QLA8XXX_CRB_DEV_STATE);
3059 			ha->isp_ops->idc_unlock(ha);
3060 			if (dev_state == QLA8XXX_DEV_FAILED) {
3061 				ql4_printk(KERN_INFO, ha, "%s: don't retry "
3062 					   "recover adapter. H/W is in Failed "
3063 					   "state\n", __func__);
3064 				qla4xxx_dead_adapter_cleanup(ha);
3065 				clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags);
3066 				clear_bit(DPC_RESET_HA, &ha->dpc_flags);
3067 				clear_bit(DPC_RESET_HA_FW_CONTEXT,
3068 						&ha->dpc_flags);
3069 				status = QLA_ERROR;
3070 
3071 				goto exit_recover;
3072 			}
3073 		}
3074 
3075 		if (!test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags)) {
3076 			ha->retry_reset_ha_cnt = MAX_RESET_HA_RETRIES;
3077 			DEBUG2(printk("scsi%ld: recover adapter - retrying "
3078 				      "(%d) more times\n", ha->host_no,
3079 				      ha->retry_reset_ha_cnt));
3080 			set_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags);
3081 			status = QLA_ERROR;
3082 		} else {
3083 			if (ha->retry_reset_ha_cnt > 0) {
3084 				/* Schedule another Reset HA--DPC will retry */
3085 				ha->retry_reset_ha_cnt--;
3086 				DEBUG2(printk("scsi%ld: recover adapter - "
3087 					      "retry remaining %d\n",
3088 					      ha->host_no,
3089 					      ha->retry_reset_ha_cnt));
3090 				status = QLA_ERROR;
3091 			}
3092 
3093 			if (ha->retry_reset_ha_cnt == 0) {
3094 				/* Recover adapter retries have been exhausted.
3095 				 * Adapter DEAD */
3096 				DEBUG2(printk("scsi%ld: recover adapter "
3097 					      "failed - board disabled\n",
3098 					      ha->host_no));
3099 				qla4xxx_dead_adapter_cleanup(ha);
3100 				clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags);
3101 				clear_bit(DPC_RESET_HA, &ha->dpc_flags);
3102 				clear_bit(DPC_RESET_HA_FW_CONTEXT,
3103 					  &ha->dpc_flags);
3104 				status = QLA_ERROR;
3105 			}
3106 		}
3107 	} else {
3108 		clear_bit(DPC_RESET_HA, &ha->dpc_flags);
3109 		clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags);
3110 		clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags);
3111 	}
3112 
3113 exit_recover:
3114 	ha->adapter_error_count++;
3115 
3116 	if (test_bit(AF_ONLINE, &ha->flags))
3117 		ha->isp_ops->enable_intrs(ha);
3118 
3119 	scsi_unblock_requests(ha->host);
3120 
3121 	clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags);
3122 	DEBUG2(printk("scsi%ld: recover adapter: %s\n", ha->host_no,
3123 	    status == QLA_ERROR ? "FAILED" : "SUCCEEDED"));
3124 
3125 	return status;
3126 }
3127 
3128 static void qla4xxx_relogin_devices(struct iscsi_cls_session *cls_session)
3129 {
3130 	struct iscsi_session *sess;
3131 	struct ddb_entry *ddb_entry;
3132 	struct scsi_qla_host *ha;
3133 
3134 	sess = cls_session->dd_data;
3135 	ddb_entry = sess->dd_data;
3136 	ha = ddb_entry->ha;
3137 	if (!iscsi_is_session_online(cls_session)) {
3138 		if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE) {
3139 			ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]"
3140 				   " unblock session\n", ha->host_no, __func__,
3141 				   ddb_entry->fw_ddb_index);
3142 			iscsi_unblock_session(ddb_entry->sess);
3143 		} else {
3144 			/* Trigger relogin */
3145 			if (ddb_entry->ddb_type == FLASH_DDB) {
3146 				if (!test_bit(DF_RELOGIN, &ddb_entry->flags))
3147 					qla4xxx_arm_relogin_timer(ddb_entry);
3148 			} else
3149 				iscsi_session_failure(cls_session->dd_data,
3150 						      ISCSI_ERR_CONN_FAILED);
3151 		}
3152 	}
3153 }
3154 
3155 int qla4xxx_unblock_flash_ddb(struct iscsi_cls_session *cls_session)
3156 {
3157 	struct iscsi_session *sess;
3158 	struct ddb_entry *ddb_entry;
3159 	struct scsi_qla_host *ha;
3160 
3161 	sess = cls_session->dd_data;
3162 	ddb_entry = sess->dd_data;
3163 	ha = ddb_entry->ha;
3164 	ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]"
3165 		   " unblock session\n", ha->host_no, __func__,
3166 		   ddb_entry->fw_ddb_index);
3167 
3168 	iscsi_unblock_session(ddb_entry->sess);
3169 
3170 	/* Start scan target */
3171 	if (test_bit(AF_ONLINE, &ha->flags)) {
3172 		ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]"
3173 			   " start scan\n", ha->host_no, __func__,
3174 			   ddb_entry->fw_ddb_index);
3175 		scsi_queue_work(ha->host, &ddb_entry->sess->scan_work);
3176 	}
3177 	return QLA_SUCCESS;
3178 }
3179 
3180 int qla4xxx_unblock_ddb(struct iscsi_cls_session *cls_session)
3181 {
3182 	struct iscsi_session *sess;
3183 	struct ddb_entry *ddb_entry;
3184 	struct scsi_qla_host *ha;
3185 	int status = QLA_SUCCESS;
3186 
3187 	sess = cls_session->dd_data;
3188 	ddb_entry = sess->dd_data;
3189 	ha = ddb_entry->ha;
3190 	ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]"
3191 		   " unblock user space session\n", ha->host_no, __func__,
3192 		   ddb_entry->fw_ddb_index);
3193 
3194 	if (!iscsi_is_session_online(cls_session)) {
3195 		iscsi_conn_start(ddb_entry->conn);
3196 		iscsi_conn_login_event(ddb_entry->conn,
3197 				       ISCSI_CONN_STATE_LOGGED_IN);
3198 	} else {
3199 		ql4_printk(KERN_INFO, ha,
3200 			   "scsi%ld: %s: ddb[%d] session [%d] already logged in\n",
3201 			   ha->host_no, __func__, ddb_entry->fw_ddb_index,
3202 			   cls_session->sid);
3203 		status = QLA_ERROR;
3204 	}
3205 
3206 	return status;
3207 }
3208 
3209 static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha)
3210 {
3211 	iscsi_host_for_each_session(ha->host, qla4xxx_relogin_devices);
3212 }
3213 
3214 static void qla4xxx_relogin_flash_ddb(struct iscsi_cls_session *cls_sess)
3215 {
3216 	uint16_t relogin_timer;
3217 	struct iscsi_session *sess;
3218 	struct ddb_entry *ddb_entry;
3219 	struct scsi_qla_host *ha;
3220 
3221 	sess = cls_sess->dd_data;
3222 	ddb_entry = sess->dd_data;
3223 	ha = ddb_entry->ha;
3224 
3225 	relogin_timer = max(ddb_entry->default_relogin_timeout,
3226 			    (uint16_t)RELOGIN_TOV);
3227 	atomic_set(&ddb_entry->relogin_timer, relogin_timer);
3228 
3229 	DEBUG2(ql4_printk(KERN_INFO, ha,
3230 			  "scsi%ld: Relogin index [%d]. TOV=%d\n", ha->host_no,
3231 			  ddb_entry->fw_ddb_index, relogin_timer));
3232 
3233 	qla4xxx_login_flash_ddb(cls_sess);
3234 }
3235 
3236 static void qla4xxx_dpc_relogin(struct iscsi_cls_session *cls_sess)
3237 {
3238 	struct iscsi_session *sess;
3239 	struct ddb_entry *ddb_entry;
3240 	struct scsi_qla_host *ha;
3241 
3242 	sess = cls_sess->dd_data;
3243 	ddb_entry = sess->dd_data;
3244 	ha = ddb_entry->ha;
3245 
3246 	if (!(ddb_entry->ddb_type == FLASH_DDB))
3247 		return;
3248 
3249 	if (test_and_clear_bit(DF_RELOGIN, &ddb_entry->flags) &&
3250 	    !iscsi_is_session_online(cls_sess)) {
3251 		DEBUG2(ql4_printk(KERN_INFO, ha,
3252 				  "relogin issued\n"));
3253 		qla4xxx_relogin_flash_ddb(cls_sess);
3254 	}
3255 }
3256 
3257 void qla4xxx_wake_dpc(struct scsi_qla_host *ha)
3258 {
3259 	if (ha->dpc_thread)
3260 		queue_work(ha->dpc_thread, &ha->dpc_work);
3261 }
3262 
3263 static struct qla4_work_evt *
3264 qla4xxx_alloc_work(struct scsi_qla_host *ha, uint32_t data_size,
3265 		   enum qla4_work_type type)
3266 {
3267 	struct qla4_work_evt *e;
3268 	uint32_t size = sizeof(struct qla4_work_evt) + data_size;
3269 
3270 	e = kzalloc(size, GFP_ATOMIC);
3271 	if (!e)
3272 		return NULL;
3273 
3274 	INIT_LIST_HEAD(&e->list);
3275 	e->type = type;
3276 	return e;
3277 }
3278 
3279 static void qla4xxx_post_work(struct scsi_qla_host *ha,
3280 			     struct qla4_work_evt *e)
3281 {
3282 	unsigned long flags;
3283 
3284 	spin_lock_irqsave(&ha->work_lock, flags);
3285 	list_add_tail(&e->list, &ha->work_list);
3286 	spin_unlock_irqrestore(&ha->work_lock, flags);
3287 	qla4xxx_wake_dpc(ha);
3288 }
3289 
3290 int qla4xxx_post_aen_work(struct scsi_qla_host *ha,
3291 			  enum iscsi_host_event_code aen_code,
3292 			  uint32_t data_size, uint8_t *data)
3293 {
3294 	struct qla4_work_evt *e;
3295 
3296 	e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_AEN);
3297 	if (!e)
3298 		return QLA_ERROR;
3299 
3300 	e->u.aen.code = aen_code;
3301 	e->u.aen.data_size = data_size;
3302 	memcpy(e->u.aen.data, data, data_size);
3303 
3304 	qla4xxx_post_work(ha, e);
3305 
3306 	return QLA_SUCCESS;
3307 }
3308 
3309 int qla4xxx_post_ping_evt_work(struct scsi_qla_host *ha,
3310 			       uint32_t status, uint32_t pid,
3311 			       uint32_t data_size, uint8_t *data)
3312 {
3313 	struct qla4_work_evt *e;
3314 
3315 	e = qla4xxx_alloc_work(ha, data_size, QLA4_EVENT_PING_STATUS);
3316 	if (!e)
3317 		return QLA_ERROR;
3318 
3319 	e->u.ping.status = status;
3320 	e->u.ping.pid = pid;
3321 	e->u.ping.data_size = data_size;
3322 	memcpy(e->u.ping.data, data, data_size);
3323 
3324 	qla4xxx_post_work(ha, e);
3325 
3326 	return QLA_SUCCESS;
3327 }
3328 
3329 static void qla4xxx_do_work(struct scsi_qla_host *ha)
3330 {
3331 	struct qla4_work_evt *e, *tmp;
3332 	unsigned long flags;
3333 	LIST_HEAD(work);
3334 
3335 	spin_lock_irqsave(&ha->work_lock, flags);
3336 	list_splice_init(&ha->work_list, &work);
3337 	spin_unlock_irqrestore(&ha->work_lock, flags);
3338 
3339 	list_for_each_entry_safe(e, tmp, &work, list) {
3340 		list_del_init(&e->list);
3341 
3342 		switch (e->type) {
3343 		case QLA4_EVENT_AEN:
3344 			iscsi_post_host_event(ha->host_no,
3345 					      &qla4xxx_iscsi_transport,
3346 					      e->u.aen.code,
3347 					      e->u.aen.data_size,
3348 					      e->u.aen.data);
3349 			break;
3350 		case QLA4_EVENT_PING_STATUS:
3351 			iscsi_ping_comp_event(ha->host_no,
3352 					      &qla4xxx_iscsi_transport,
3353 					      e->u.ping.status,
3354 					      e->u.ping.pid,
3355 					      e->u.ping.data_size,
3356 					      e->u.ping.data);
3357 			break;
3358 		default:
3359 			ql4_printk(KERN_WARNING, ha, "event type: 0x%x not "
3360 				   "supported", e->type);
3361 		}
3362 		kfree(e);
3363 	}
3364 }
3365 
3366 /**
3367  * qla4xxx_do_dpc - dpc routine
3368  * @data: in our case pointer to adapter structure
3369  *
3370  * This routine is a task that is schedule by the interrupt handler
3371  * to perform the background processing for interrupts.  We put it
3372  * on a task queue that is consumed whenever the scheduler runs; that's
3373  * so you can do anything (i.e. put the process to sleep etc).  In fact,
3374  * the mid-level tries to sleep when it reaches the driver threshold
3375  * "host->can_queue". This can cause a panic if we were in our interrupt code.
3376  **/
3377 static void qla4xxx_do_dpc(struct work_struct *work)
3378 {
3379 	struct scsi_qla_host *ha =
3380 		container_of(work, struct scsi_qla_host, dpc_work);
3381 	int status = QLA_ERROR;
3382 
3383 	DEBUG2(printk("scsi%ld: %s: DPC handler waking up."
3384 	    "flags = 0x%08lx, dpc_flags = 0x%08lx\n",
3385 	    ha->host_no, __func__, ha->flags, ha->dpc_flags))
3386 
3387 	/* Initialization not yet finished. Don't do anything yet. */
3388 	if (!test_bit(AF_INIT_DONE, &ha->flags))
3389 		return;
3390 
3391 	if (test_bit(AF_EEH_BUSY, &ha->flags)) {
3392 		DEBUG2(printk(KERN_INFO "scsi%ld: %s: flags = %lx\n",
3393 		    ha->host_no, __func__, ha->flags));
3394 		return;
3395 	}
3396 
3397 	/* post events to application */
3398 	qla4xxx_do_work(ha);
3399 
3400 	if (is_qla80XX(ha)) {
3401 		if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) {
3402 			if (is_qla8032(ha)) {
3403 				ql4_printk(KERN_INFO, ha, "%s: disabling pause transmit on port 0 & 1.\n",
3404 					   __func__);
3405 				/* disable pause frame for ISP83xx */
3406 				qla4_83xx_disable_pause(ha);
3407 			}
3408 
3409 			ha->isp_ops->idc_lock(ha);
3410 			qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE,
3411 					    QLA8XXX_DEV_FAILED);
3412 			ha->isp_ops->idc_unlock(ha);
3413 			ql4_printk(KERN_INFO, ha, "HW State: FAILED\n");
3414 			qla4_8xxx_device_state_handler(ha);
3415 		}
3416 
3417 		if (test_and_clear_bit(DPC_POST_IDC_ACK, &ha->dpc_flags))
3418 			qla4_83xx_post_idc_ack(ha);
3419 
3420 		if (test_and_clear_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) {
3421 			qla4_8xxx_need_qsnt_handler(ha);
3422 		}
3423 	}
3424 
3425 	if (!test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) &&
3426 	    (test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
3427 	    test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) ||
3428 	    test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))) {
3429 		if ((is_qla8022(ha) && ql4xdontresethba) ||
3430 		    (is_qla8032(ha) && qla4_83xx_idc_dontreset(ha))) {
3431 			DEBUG2(printk("scsi%ld: %s: Don't Reset HBA\n",
3432 			    ha->host_no, __func__));
3433 			clear_bit(DPC_RESET_HA, &ha->dpc_flags);
3434 			clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags);
3435 			clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags);
3436 			goto dpc_post_reset_ha;
3437 		}
3438 		if (test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) ||
3439 		    test_bit(DPC_RESET_HA, &ha->dpc_flags))
3440 			qla4xxx_recover_adapter(ha);
3441 
3442 		if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) {
3443 			uint8_t wait_time = RESET_INTR_TOV;
3444 
3445 			while ((readw(&ha->reg->ctrl_status) &
3446 				(CSR_SOFT_RESET | CSR_FORCE_SOFT_RESET)) != 0) {
3447 				if (--wait_time == 0)
3448 					break;
3449 				msleep(1000);
3450 			}
3451 			if (wait_time == 0)
3452 				DEBUG2(printk("scsi%ld: %s: SR|FSR "
3453 					      "bit not cleared-- resetting\n",
3454 					      ha->host_no, __func__));
3455 			qla4xxx_abort_active_cmds(ha, DID_RESET << 16);
3456 			if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) {
3457 				qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
3458 				status = qla4xxx_recover_adapter(ha);
3459 			}
3460 			clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags);
3461 			if (status == QLA_SUCCESS)
3462 				ha->isp_ops->enable_intrs(ha);
3463 		}
3464 	}
3465 
3466 dpc_post_reset_ha:
3467 	/* ---- process AEN? --- */
3468 	if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags))
3469 		qla4xxx_process_aen(ha, PROCESS_ALL_AENS);
3470 
3471 	/* ---- Get DHCP IP Address? --- */
3472 	if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags))
3473 		qla4xxx_get_dhcp_ip_address(ha);
3474 
3475 	/* ---- relogin device? --- */
3476 	if (adapter_up(ha) &&
3477 	    test_and_clear_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags)) {
3478 		iscsi_host_for_each_session(ha->host, qla4xxx_dpc_relogin);
3479 	}
3480 
3481 	/* ---- link change? --- */
3482 	if (test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) {
3483 		if (!test_bit(AF_LINK_UP, &ha->flags)) {
3484 			/* ---- link down? --- */
3485 			qla4xxx_mark_all_devices_missing(ha);
3486 		} else {
3487 			/* ---- link up? --- *
3488 			 * F/W will auto login to all devices ONLY ONCE after
3489 			 * link up during driver initialization and runtime
3490 			 * fatal error recovery.  Therefore, the driver must
3491 			 * manually relogin to devices when recovering from
3492 			 * connection failures, logouts, expired KATO, etc. */
3493 			if (test_and_clear_bit(AF_BUILD_DDB_LIST, &ha->flags)) {
3494 				qla4xxx_build_ddb_list(ha, ha->is_reset);
3495 				iscsi_host_for_each_session(ha->host,
3496 						qla4xxx_login_flash_ddb);
3497 			} else
3498 				qla4xxx_relogin_all_devices(ha);
3499 		}
3500 	}
3501 }
3502 
3503 /**
3504  * qla4xxx_free_adapter - release the adapter
3505  * @ha: pointer to adapter structure
3506  **/
3507 static void qla4xxx_free_adapter(struct scsi_qla_host *ha)
3508 {
3509 	qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16);
3510 
3511 	if (test_bit(AF_INTERRUPTS_ON, &ha->flags)) {
3512 		/* Turn-off interrupts on the card. */
3513 		ha->isp_ops->disable_intrs(ha);
3514 	}
3515 
3516 	if (is_qla40XX(ha)) {
3517 		writel(set_rmask(CSR_SCSI_PROCESSOR_INTR),
3518 		       &ha->reg->ctrl_status);
3519 		readl(&ha->reg->ctrl_status);
3520 	} else if (is_qla8022(ha)) {
3521 		writel(0, &ha->qla4_82xx_reg->host_int);
3522 		readl(&ha->qla4_82xx_reg->host_int);
3523 	} else if (is_qla8032(ha)) {
3524 		writel(0, &ha->qla4_83xx_reg->risc_intr);
3525 		readl(&ha->qla4_83xx_reg->risc_intr);
3526 	}
3527 
3528 	/* Remove timer thread, if present */
3529 	if (ha->timer_active)
3530 		qla4xxx_stop_timer(ha);
3531 
3532 	/* Kill the kernel thread for this host */
3533 	if (ha->dpc_thread)
3534 		destroy_workqueue(ha->dpc_thread);
3535 
3536 	/* Kill the kernel thread for this host */
3537 	if (ha->task_wq)
3538 		destroy_workqueue(ha->task_wq);
3539 
3540 	/* Put firmware in known state */
3541 	ha->isp_ops->reset_firmware(ha);
3542 
3543 	if (is_qla80XX(ha)) {
3544 		ha->isp_ops->idc_lock(ha);
3545 		qla4_8xxx_clear_drv_active(ha);
3546 		ha->isp_ops->idc_unlock(ha);
3547 	}
3548 
3549 	/* Detach interrupts */
3550 	if (test_and_clear_bit(AF_IRQ_ATTACHED, &ha->flags))
3551 		qla4xxx_free_irqs(ha);
3552 
3553 	/* free extra memory */
3554 	qla4xxx_mem_free(ha);
3555 }
3556 
3557 int qla4_8xxx_iospace_config(struct scsi_qla_host *ha)
3558 {
3559 	int status = 0;
3560 	unsigned long mem_base, mem_len, db_base, db_len;
3561 	struct pci_dev *pdev = ha->pdev;
3562 
3563 	status = pci_request_regions(pdev, DRIVER_NAME);
3564 	if (status) {
3565 		printk(KERN_WARNING
3566 		    "scsi(%ld) Failed to reserve PIO regions (%s) "
3567 		    "status=%d\n", ha->host_no, pci_name(pdev), status);
3568 		goto iospace_error_exit;
3569 	}
3570 
3571 	DEBUG2(printk(KERN_INFO "%s: revision-id=%d\n",
3572 	    __func__, pdev->revision));
3573 	ha->revision_id = pdev->revision;
3574 
3575 	/* remap phys address */
3576 	mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */
3577 	mem_len = pci_resource_len(pdev, 0);
3578 	DEBUG2(printk(KERN_INFO "%s: ioremap from %lx a size of %lx\n",
3579 	    __func__, mem_base, mem_len));
3580 
3581 	/* mapping of pcibase pointer */
3582 	ha->nx_pcibase = (unsigned long)ioremap(mem_base, mem_len);
3583 	if (!ha->nx_pcibase) {
3584 		printk(KERN_ERR
3585 		    "cannot remap MMIO (%s), aborting\n", pci_name(pdev));
3586 		pci_release_regions(ha->pdev);
3587 		goto iospace_error_exit;
3588 	}
3589 
3590 	/* Mapping of IO base pointer, door bell read and write pointer */
3591 
3592 	/* mapping of IO base pointer */
3593 	if (is_qla8022(ha)) {
3594 		ha->qla4_82xx_reg = (struct device_reg_82xx  __iomem *)
3595 				    ((uint8_t *)ha->nx_pcibase + 0xbc000 +
3596 				     (ha->pdev->devfn << 11));
3597 		ha->nx_db_wr_ptr = (ha->pdev->devfn == 4 ? QLA82XX_CAM_RAM_DB1 :
3598 				    QLA82XX_CAM_RAM_DB2);
3599 	} else if (is_qla8032(ha)) {
3600 		ha->qla4_83xx_reg = (struct device_reg_83xx __iomem *)
3601 				    ((uint8_t *)ha->nx_pcibase);
3602 	}
3603 
3604 	db_base = pci_resource_start(pdev, 4);  /* doorbell is on bar 4 */
3605 	db_len = pci_resource_len(pdev, 4);
3606 
3607 	return 0;
3608 iospace_error_exit:
3609 	return -ENOMEM;
3610 }
3611 
3612 /***
3613  * qla4xxx_iospace_config - maps registers
3614  * @ha: pointer to adapter structure
3615  *
3616  * This routines maps HBA's registers from the pci address space
3617  * into the kernel virtual address space for memory mapped i/o.
3618  **/
3619 int qla4xxx_iospace_config(struct scsi_qla_host *ha)
3620 {
3621 	unsigned long pio, pio_len, pio_flags;
3622 	unsigned long mmio, mmio_len, mmio_flags;
3623 
3624 	pio = pci_resource_start(ha->pdev, 0);
3625 	pio_len = pci_resource_len(ha->pdev, 0);
3626 	pio_flags = pci_resource_flags(ha->pdev, 0);
3627 	if (pio_flags & IORESOURCE_IO) {
3628 		if (pio_len < MIN_IOBASE_LEN) {
3629 			ql4_printk(KERN_WARNING, ha,
3630 				"Invalid PCI I/O region size\n");
3631 			pio = 0;
3632 		}
3633 	} else {
3634 		ql4_printk(KERN_WARNING, ha, "region #0 not a PIO resource\n");
3635 		pio = 0;
3636 	}
3637 
3638 	/* Use MMIO operations for all accesses. */
3639 	mmio = pci_resource_start(ha->pdev, 1);
3640 	mmio_len = pci_resource_len(ha->pdev, 1);
3641 	mmio_flags = pci_resource_flags(ha->pdev, 1);
3642 
3643 	if (!(mmio_flags & IORESOURCE_MEM)) {
3644 		ql4_printk(KERN_ERR, ha,
3645 		    "region #0 not an MMIO resource, aborting\n");
3646 
3647 		goto iospace_error_exit;
3648 	}
3649 
3650 	if (mmio_len < MIN_IOBASE_LEN) {
3651 		ql4_printk(KERN_ERR, ha,
3652 		    "Invalid PCI mem region size, aborting\n");
3653 		goto iospace_error_exit;
3654 	}
3655 
3656 	if (pci_request_regions(ha->pdev, DRIVER_NAME)) {
3657 		ql4_printk(KERN_WARNING, ha,
3658 		    "Failed to reserve PIO/MMIO regions\n");
3659 
3660 		goto iospace_error_exit;
3661 	}
3662 
3663 	ha->pio_address = pio;
3664 	ha->pio_length = pio_len;
3665 	ha->reg = ioremap(mmio, MIN_IOBASE_LEN);
3666 	if (!ha->reg) {
3667 		ql4_printk(KERN_ERR, ha,
3668 		    "cannot remap MMIO, aborting\n");
3669 
3670 		goto iospace_error_exit;
3671 	}
3672 
3673 	return 0;
3674 
3675 iospace_error_exit:
3676 	return -ENOMEM;
3677 }
3678 
3679 static struct isp_operations qla4xxx_isp_ops = {
3680 	.iospace_config         = qla4xxx_iospace_config,
3681 	.pci_config             = qla4xxx_pci_config,
3682 	.disable_intrs          = qla4xxx_disable_intrs,
3683 	.enable_intrs           = qla4xxx_enable_intrs,
3684 	.start_firmware         = qla4xxx_start_firmware,
3685 	.intr_handler           = qla4xxx_intr_handler,
3686 	.interrupt_service_routine = qla4xxx_interrupt_service_routine,
3687 	.reset_chip             = qla4xxx_soft_reset,
3688 	.reset_firmware         = qla4xxx_hw_reset,
3689 	.queue_iocb             = qla4xxx_queue_iocb,
3690 	.complete_iocb          = qla4xxx_complete_iocb,
3691 	.rd_shdw_req_q_out      = qla4xxx_rd_shdw_req_q_out,
3692 	.rd_shdw_rsp_q_in       = qla4xxx_rd_shdw_rsp_q_in,
3693 	.get_sys_info           = qla4xxx_get_sys_info,
3694 	.queue_mailbox_command	= qla4xxx_queue_mbox_cmd,
3695 	.process_mailbox_interrupt = qla4xxx_process_mbox_intr,
3696 };
3697 
3698 static struct isp_operations qla4_82xx_isp_ops = {
3699 	.iospace_config         = qla4_8xxx_iospace_config,
3700 	.pci_config             = qla4_8xxx_pci_config,
3701 	.disable_intrs          = qla4_82xx_disable_intrs,
3702 	.enable_intrs           = qla4_82xx_enable_intrs,
3703 	.start_firmware         = qla4_8xxx_load_risc,
3704 	.restart_firmware	= qla4_82xx_try_start_fw,
3705 	.intr_handler           = qla4_82xx_intr_handler,
3706 	.interrupt_service_routine = qla4_82xx_interrupt_service_routine,
3707 	.need_reset		= qla4_8xxx_need_reset,
3708 	.reset_chip             = qla4_82xx_isp_reset,
3709 	.reset_firmware         = qla4_8xxx_stop_firmware,
3710 	.queue_iocb             = qla4_82xx_queue_iocb,
3711 	.complete_iocb          = qla4_82xx_complete_iocb,
3712 	.rd_shdw_req_q_out      = qla4_82xx_rd_shdw_req_q_out,
3713 	.rd_shdw_rsp_q_in       = qla4_82xx_rd_shdw_rsp_q_in,
3714 	.get_sys_info           = qla4_8xxx_get_sys_info,
3715 	.rd_reg_direct		= qla4_82xx_rd_32,
3716 	.wr_reg_direct		= qla4_82xx_wr_32,
3717 	.rd_reg_indirect	= qla4_82xx_md_rd_32,
3718 	.wr_reg_indirect	= qla4_82xx_md_wr_32,
3719 	.idc_lock		= qla4_82xx_idc_lock,
3720 	.idc_unlock		= qla4_82xx_idc_unlock,
3721 	.rom_lock_recovery	= qla4_82xx_rom_lock_recovery,
3722 	.queue_mailbox_command	= qla4_82xx_queue_mbox_cmd,
3723 	.process_mailbox_interrupt = qla4_82xx_process_mbox_intr,
3724 };
3725 
3726 static struct isp_operations qla4_83xx_isp_ops = {
3727 	.iospace_config		= qla4_8xxx_iospace_config,
3728 	.pci_config		= qla4_8xxx_pci_config,
3729 	.disable_intrs		= qla4_83xx_disable_intrs,
3730 	.enable_intrs		= qla4_83xx_enable_intrs,
3731 	.start_firmware		= qla4_8xxx_load_risc,
3732 	.restart_firmware	= qla4_83xx_start_firmware,
3733 	.intr_handler		= qla4_83xx_intr_handler,
3734 	.interrupt_service_routine = qla4_83xx_interrupt_service_routine,
3735 	.need_reset		= qla4_8xxx_need_reset,
3736 	.reset_chip		= qla4_83xx_isp_reset,
3737 	.reset_firmware		= qla4_8xxx_stop_firmware,
3738 	.queue_iocb		= qla4_83xx_queue_iocb,
3739 	.complete_iocb		= qla4_83xx_complete_iocb,
3740 	.rd_shdw_req_q_out	= qla4_83xx_rd_shdw_req_q_out,
3741 	.rd_shdw_rsp_q_in	= qla4_83xx_rd_shdw_rsp_q_in,
3742 	.get_sys_info		= qla4_8xxx_get_sys_info,
3743 	.rd_reg_direct		= qla4_83xx_rd_reg,
3744 	.wr_reg_direct		= qla4_83xx_wr_reg,
3745 	.rd_reg_indirect	= qla4_83xx_rd_reg_indirect,
3746 	.wr_reg_indirect	= qla4_83xx_wr_reg_indirect,
3747 	.idc_lock		= qla4_83xx_drv_lock,
3748 	.idc_unlock		= qla4_83xx_drv_unlock,
3749 	.rom_lock_recovery	= qla4_83xx_rom_lock_recovery,
3750 	.queue_mailbox_command	= qla4_83xx_queue_mbox_cmd,
3751 	.process_mailbox_interrupt = qla4_83xx_process_mbox_intr,
3752 };
3753 
3754 uint16_t qla4xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha)
3755 {
3756 	return (uint16_t)le32_to_cpu(ha->shadow_regs->req_q_out);
3757 }
3758 
3759 uint16_t qla4_82xx_rd_shdw_req_q_out(struct scsi_qla_host *ha)
3760 {
3761 	return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->req_q_out));
3762 }
3763 
3764 uint16_t qla4_83xx_rd_shdw_req_q_out(struct scsi_qla_host *ha)
3765 {
3766 	return (uint16_t)le32_to_cpu(readl(&ha->qla4_83xx_reg->req_q_out));
3767 }
3768 
3769 uint16_t qla4xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha)
3770 {
3771 	return (uint16_t)le32_to_cpu(ha->shadow_regs->rsp_q_in);
3772 }
3773 
3774 uint16_t qla4_82xx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha)
3775 {
3776 	return (uint16_t)le32_to_cpu(readl(&ha->qla4_82xx_reg->rsp_q_in));
3777 }
3778 
3779 uint16_t qla4_83xx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha)
3780 {
3781 	return (uint16_t)le32_to_cpu(readl(&ha->qla4_83xx_reg->rsp_q_in));
3782 }
3783 
3784 static ssize_t qla4xxx_show_boot_eth_info(void *data, int type, char *buf)
3785 {
3786 	struct scsi_qla_host *ha = data;
3787 	char *str = buf;
3788 	int rc;
3789 
3790 	switch (type) {
3791 	case ISCSI_BOOT_ETH_FLAGS:
3792 		rc = sprintf(str, "%d\n", SYSFS_FLAG_FW_SEL_BOOT);
3793 		break;
3794 	case ISCSI_BOOT_ETH_INDEX:
3795 		rc = sprintf(str, "0\n");
3796 		break;
3797 	case ISCSI_BOOT_ETH_MAC:
3798 		rc = sysfs_format_mac(str, ha->my_mac,
3799 				      MAC_ADDR_LEN);
3800 		break;
3801 	default:
3802 		rc = -ENOSYS;
3803 		break;
3804 	}
3805 	return rc;
3806 }
3807 
3808 static umode_t qla4xxx_eth_get_attr_visibility(void *data, int type)
3809 {
3810 	int rc;
3811 
3812 	switch (type) {
3813 	case ISCSI_BOOT_ETH_FLAGS:
3814 	case ISCSI_BOOT_ETH_MAC:
3815 	case ISCSI_BOOT_ETH_INDEX:
3816 		rc = S_IRUGO;
3817 		break;
3818 	default:
3819 		rc = 0;
3820 		break;
3821 	}
3822 	return rc;
3823 }
3824 
3825 static ssize_t qla4xxx_show_boot_ini_info(void *data, int type, char *buf)
3826 {
3827 	struct scsi_qla_host *ha = data;
3828 	char *str = buf;
3829 	int rc;
3830 
3831 	switch (type) {
3832 	case ISCSI_BOOT_INI_INITIATOR_NAME:
3833 		rc = sprintf(str, "%s\n", ha->name_string);
3834 		break;
3835 	default:
3836 		rc = -ENOSYS;
3837 		break;
3838 	}
3839 	return rc;
3840 }
3841 
3842 static umode_t qla4xxx_ini_get_attr_visibility(void *data, int type)
3843 {
3844 	int rc;
3845 
3846 	switch (type) {
3847 	case ISCSI_BOOT_INI_INITIATOR_NAME:
3848 		rc = S_IRUGO;
3849 		break;
3850 	default:
3851 		rc = 0;
3852 		break;
3853 	}
3854 	return rc;
3855 }
3856 
3857 static ssize_t
3858 qla4xxx_show_boot_tgt_info(struct ql4_boot_session_info *boot_sess, int type,
3859 			   char *buf)
3860 {
3861 	struct ql4_conn_info *boot_conn = &boot_sess->conn_list[0];
3862 	char *str = buf;
3863 	int rc;
3864 
3865 	switch (type) {
3866 	case ISCSI_BOOT_TGT_NAME:
3867 		rc = sprintf(buf, "%s\n", (char *)&boot_sess->target_name);
3868 		break;
3869 	case ISCSI_BOOT_TGT_IP_ADDR:
3870 		if (boot_sess->conn_list[0].dest_ipaddr.ip_type == 0x1)
3871 			rc = sprintf(buf, "%pI4\n",
3872 				     &boot_conn->dest_ipaddr.ip_address);
3873 		else
3874 			rc = sprintf(str, "%pI6\n",
3875 				     &boot_conn->dest_ipaddr.ip_address);
3876 		break;
3877 	case ISCSI_BOOT_TGT_PORT:
3878 			rc = sprintf(str, "%d\n", boot_conn->dest_port);
3879 		break;
3880 	case ISCSI_BOOT_TGT_CHAP_NAME:
3881 		rc = sprintf(str,  "%.*s\n",
3882 			     boot_conn->chap.target_chap_name_length,
3883 			     (char *)&boot_conn->chap.target_chap_name);
3884 		break;
3885 	case ISCSI_BOOT_TGT_CHAP_SECRET:
3886 		rc = sprintf(str,  "%.*s\n",
3887 			     boot_conn->chap.target_secret_length,
3888 			     (char *)&boot_conn->chap.target_secret);
3889 		break;
3890 	case ISCSI_BOOT_TGT_REV_CHAP_NAME:
3891 		rc = sprintf(str,  "%.*s\n",
3892 			     boot_conn->chap.intr_chap_name_length,
3893 			     (char *)&boot_conn->chap.intr_chap_name);
3894 		break;
3895 	case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
3896 		rc = sprintf(str,  "%.*s\n",
3897 			     boot_conn->chap.intr_secret_length,
3898 			     (char *)&boot_conn->chap.intr_secret);
3899 		break;
3900 	case ISCSI_BOOT_TGT_FLAGS:
3901 		rc = sprintf(str, "%d\n", SYSFS_FLAG_FW_SEL_BOOT);
3902 		break;
3903 	case ISCSI_BOOT_TGT_NIC_ASSOC:
3904 		rc = sprintf(str, "0\n");
3905 		break;
3906 	default:
3907 		rc = -ENOSYS;
3908 		break;
3909 	}
3910 	return rc;
3911 }
3912 
3913 static ssize_t qla4xxx_show_boot_tgt_pri_info(void *data, int type, char *buf)
3914 {
3915 	struct scsi_qla_host *ha = data;
3916 	struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_pri_sess);
3917 
3918 	return qla4xxx_show_boot_tgt_info(boot_sess, type, buf);
3919 }
3920 
3921 static ssize_t qla4xxx_show_boot_tgt_sec_info(void *data, int type, char *buf)
3922 {
3923 	struct scsi_qla_host *ha = data;
3924 	struct ql4_boot_session_info *boot_sess = &(ha->boot_tgt.boot_sec_sess);
3925 
3926 	return qla4xxx_show_boot_tgt_info(boot_sess, type, buf);
3927 }
3928 
3929 static umode_t qla4xxx_tgt_get_attr_visibility(void *data, int type)
3930 {
3931 	int rc;
3932 
3933 	switch (type) {
3934 	case ISCSI_BOOT_TGT_NAME:
3935 	case ISCSI_BOOT_TGT_IP_ADDR:
3936 	case ISCSI_BOOT_TGT_PORT:
3937 	case ISCSI_BOOT_TGT_CHAP_NAME:
3938 	case ISCSI_BOOT_TGT_CHAP_SECRET:
3939 	case ISCSI_BOOT_TGT_REV_CHAP_NAME:
3940 	case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
3941 	case ISCSI_BOOT_TGT_NIC_ASSOC:
3942 	case ISCSI_BOOT_TGT_FLAGS:
3943 		rc = S_IRUGO;
3944 		break;
3945 	default:
3946 		rc = 0;
3947 		break;
3948 	}
3949 	return rc;
3950 }
3951 
3952 static void qla4xxx_boot_release(void *data)
3953 {
3954 	struct scsi_qla_host *ha = data;
3955 
3956 	scsi_host_put(ha->host);
3957 }
3958 
3959 static int get_fw_boot_info(struct scsi_qla_host *ha, uint16_t ddb_index[])
3960 {
3961 	dma_addr_t buf_dma;
3962 	uint32_t addr, pri_addr, sec_addr;
3963 	uint32_t offset;
3964 	uint16_t func_num;
3965 	uint8_t val;
3966 	uint8_t *buf = NULL;
3967 	size_t size = 13 * sizeof(uint8_t);
3968 	int ret = QLA_SUCCESS;
3969 
3970 	func_num = PCI_FUNC(ha->pdev->devfn);
3971 
3972 	ql4_printk(KERN_INFO, ha, "%s: Get FW boot info for 0x%x func %d\n",
3973 		   __func__, ha->pdev->device, func_num);
3974 
3975 	if (is_qla40XX(ha)) {
3976 		if (func_num == 1) {
3977 			addr = NVRAM_PORT0_BOOT_MODE;
3978 			pri_addr = NVRAM_PORT0_BOOT_PRI_TGT;
3979 			sec_addr = NVRAM_PORT0_BOOT_SEC_TGT;
3980 		} else if (func_num == 3) {
3981 			addr = NVRAM_PORT1_BOOT_MODE;
3982 			pri_addr = NVRAM_PORT1_BOOT_PRI_TGT;
3983 			sec_addr = NVRAM_PORT1_BOOT_SEC_TGT;
3984 		} else {
3985 			ret = QLA_ERROR;
3986 			goto exit_boot_info;
3987 		}
3988 
3989 		/* Check Boot Mode */
3990 		val = rd_nvram_byte(ha, addr);
3991 		if (!(val & 0x07)) {
3992 			DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Adapter boot "
3993 					  "options : 0x%x\n", __func__, val));
3994 			ret = QLA_ERROR;
3995 			goto exit_boot_info;
3996 		}
3997 
3998 		/* get primary valid target index */
3999 		val = rd_nvram_byte(ha, pri_addr);
4000 		if (val & BIT_7)
4001 			ddb_index[0] = (val & 0x7f);
4002 
4003 		/* get secondary valid target index */
4004 		val = rd_nvram_byte(ha, sec_addr);
4005 		if (val & BIT_7)
4006 			ddb_index[1] = (val & 0x7f);
4007 
4008 	} else if (is_qla8022(ha)) {
4009 		buf = dma_alloc_coherent(&ha->pdev->dev, size,
4010 					 &buf_dma, GFP_KERNEL);
4011 		if (!buf) {
4012 			DEBUG2(ql4_printk(KERN_ERR, ha,
4013 					  "%s: Unable to allocate dma buffer\n",
4014 					   __func__));
4015 			ret = QLA_ERROR;
4016 			goto exit_boot_info;
4017 		}
4018 
4019 		if (ha->port_num == 0)
4020 			offset = BOOT_PARAM_OFFSET_PORT0;
4021 		else if (ha->port_num == 1)
4022 			offset = BOOT_PARAM_OFFSET_PORT1;
4023 		else {
4024 			ret = QLA_ERROR;
4025 			goto exit_boot_info_free;
4026 		}
4027 		addr = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_iscsi_param * 4) +
4028 		       offset;
4029 		if (qla4xxx_get_flash(ha, buf_dma, addr,
4030 				      13 * sizeof(uint8_t)) != QLA_SUCCESS) {
4031 			DEBUG2(ql4_printk(KERN_ERR, ha, "scsi%ld: %s: Get Flash"
4032 					  " failed\n", ha->host_no, __func__));
4033 			ret = QLA_ERROR;
4034 			goto exit_boot_info_free;
4035 		}
4036 		/* Check Boot Mode */
4037 		if (!(buf[1] & 0x07)) {
4038 			DEBUG2(ql4_printk(KERN_INFO, ha, "Firmware boot options"
4039 					  " : 0x%x\n", buf[1]));
4040 			ret = QLA_ERROR;
4041 			goto exit_boot_info_free;
4042 		}
4043 
4044 		/* get primary valid target index */
4045 		if (buf[2] & BIT_7)
4046 			ddb_index[0] = buf[2] & 0x7f;
4047 
4048 		/* get secondary valid target index */
4049 		if (buf[11] & BIT_7)
4050 			ddb_index[1] = buf[11] & 0x7f;
4051 	} else {
4052 		ret = QLA_ERROR;
4053 		goto exit_boot_info;
4054 	}
4055 
4056 	DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary target ID %d, Secondary"
4057 			  " target ID %d\n", __func__, ddb_index[0],
4058 			  ddb_index[1]));
4059 
4060 exit_boot_info_free:
4061 	dma_free_coherent(&ha->pdev->dev, size, buf, buf_dma);
4062 exit_boot_info:
4063 	ha->pri_ddb_idx = ddb_index[0];
4064 	ha->sec_ddb_idx = ddb_index[1];
4065 	return ret;
4066 }
4067 
4068 /**
4069  * qla4xxx_get_bidi_chap - Get a BIDI CHAP user and password
4070  * @ha: pointer to adapter structure
4071  * @username: CHAP username to be returned
4072  * @password: CHAP password to be returned
4073  *
4074  * If a boot entry has BIDI CHAP enabled then we need to set the BIDI CHAP
4075  * user and password in the sysfs entry in /sys/firmware/iscsi_boot#/.
4076  * So from the CHAP cache find the first BIDI CHAP entry and set it
4077  * to the boot record in sysfs.
4078  **/
4079 static int qla4xxx_get_bidi_chap(struct scsi_qla_host *ha, char *username,
4080 			    char *password)
4081 {
4082 	int i, ret = -EINVAL;
4083 	int max_chap_entries = 0;
4084 	struct ql4_chap_table *chap_table;
4085 
4086 	if (is_qla8022(ha))
4087 		max_chap_entries = (ha->hw.flt_chap_size / 2) /
4088 						sizeof(struct ql4_chap_table);
4089 	else
4090 		max_chap_entries = MAX_CHAP_ENTRIES_40XX;
4091 
4092 	if (!ha->chap_list) {
4093 		ql4_printk(KERN_ERR, ha, "Do not have CHAP table cache\n");
4094 		return ret;
4095 	}
4096 
4097 	mutex_lock(&ha->chap_sem);
4098 	for (i = 0; i < max_chap_entries; i++) {
4099 		chap_table = (struct ql4_chap_table *)ha->chap_list + i;
4100 		if (chap_table->cookie !=
4101 		    __constant_cpu_to_le16(CHAP_VALID_COOKIE)) {
4102 			continue;
4103 		}
4104 
4105 		if (chap_table->flags & BIT_7) /* local */
4106 			continue;
4107 
4108 		if (!(chap_table->flags & BIT_6)) /* Not BIDI */
4109 			continue;
4110 
4111 		strncpy(password, chap_table->secret, QL4_CHAP_MAX_SECRET_LEN);
4112 		strncpy(username, chap_table->name, QL4_CHAP_MAX_NAME_LEN);
4113 		ret = 0;
4114 		break;
4115 	}
4116 	mutex_unlock(&ha->chap_sem);
4117 
4118 	return ret;
4119 }
4120 
4121 
4122 static int qla4xxx_get_boot_target(struct scsi_qla_host *ha,
4123 				   struct ql4_boot_session_info *boot_sess,
4124 				   uint16_t ddb_index)
4125 {
4126 	struct ql4_conn_info *boot_conn = &boot_sess->conn_list[0];
4127 	struct dev_db_entry *fw_ddb_entry;
4128 	dma_addr_t fw_ddb_entry_dma;
4129 	uint16_t idx;
4130 	uint16_t options;
4131 	int ret = QLA_SUCCESS;
4132 
4133 	fw_ddb_entry = dma_alloc_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
4134 					  &fw_ddb_entry_dma, GFP_KERNEL);
4135 	if (!fw_ddb_entry) {
4136 		DEBUG2(ql4_printk(KERN_ERR, ha,
4137 				  "%s: Unable to allocate dma buffer.\n",
4138 				  __func__));
4139 		ret = QLA_ERROR;
4140 		return ret;
4141 	}
4142 
4143 	if (qla4xxx_bootdb_by_index(ha, fw_ddb_entry,
4144 				   fw_ddb_entry_dma, ddb_index)) {
4145 		DEBUG2(ql4_printk(KERN_INFO, ha, "%s: No Flash DDB found at "
4146 				  "index [%d]\n", __func__, ddb_index));
4147 		ret = QLA_ERROR;
4148 		goto exit_boot_target;
4149 	}
4150 
4151 	/* Update target name and IP from DDB */
4152 	memcpy(boot_sess->target_name, fw_ddb_entry->iscsi_name,
4153 	       min(sizeof(boot_sess->target_name),
4154 		   sizeof(fw_ddb_entry->iscsi_name)));
4155 
4156 	options = le16_to_cpu(fw_ddb_entry->options);
4157 	if (options & DDB_OPT_IPV6_DEVICE) {
4158 		memcpy(&boot_conn->dest_ipaddr.ip_address,
4159 		       &fw_ddb_entry->ip_addr[0], IPv6_ADDR_LEN);
4160 	} else {
4161 		boot_conn->dest_ipaddr.ip_type = 0x1;
4162 		memcpy(&boot_conn->dest_ipaddr.ip_address,
4163 		       &fw_ddb_entry->ip_addr[0], IP_ADDR_LEN);
4164 	}
4165 
4166 	boot_conn->dest_port = le16_to_cpu(fw_ddb_entry->port);
4167 
4168 	/* update chap information */
4169 	idx = __le16_to_cpu(fw_ddb_entry->chap_tbl_idx);
4170 
4171 	if (BIT_7 & le16_to_cpu(fw_ddb_entry->iscsi_options))	{
4172 
4173 		DEBUG2(ql4_printk(KERN_INFO, ha, "Setting chap\n"));
4174 
4175 		ret = qla4xxx_get_chap(ha, (char *)&boot_conn->chap.
4176 				       target_chap_name,
4177 				       (char *)&boot_conn->chap.target_secret,
4178 				       idx);
4179 		if (ret) {
4180 			ql4_printk(KERN_ERR, ha, "Failed to set chap\n");
4181 			ret = QLA_ERROR;
4182 			goto exit_boot_target;
4183 		}
4184 
4185 		boot_conn->chap.target_chap_name_length = QL4_CHAP_MAX_NAME_LEN;
4186 		boot_conn->chap.target_secret_length = QL4_CHAP_MAX_SECRET_LEN;
4187 	}
4188 
4189 	if (BIT_4 & le16_to_cpu(fw_ddb_entry->iscsi_options)) {
4190 
4191 		DEBUG2(ql4_printk(KERN_INFO, ha, "Setting BIDI chap\n"));
4192 
4193 		ret = qla4xxx_get_bidi_chap(ha,
4194 				    (char *)&boot_conn->chap.intr_chap_name,
4195 				    (char *)&boot_conn->chap.intr_secret);
4196 
4197 		if (ret) {
4198 			ql4_printk(KERN_ERR, ha, "Failed to set BIDI chap\n");
4199 			ret = QLA_ERROR;
4200 			goto exit_boot_target;
4201 		}
4202 
4203 		boot_conn->chap.intr_chap_name_length = QL4_CHAP_MAX_NAME_LEN;
4204 		boot_conn->chap.intr_secret_length = QL4_CHAP_MAX_SECRET_LEN;
4205 	}
4206 
4207 exit_boot_target:
4208 	dma_free_coherent(&ha->pdev->dev, sizeof(*fw_ddb_entry),
4209 			  fw_ddb_entry, fw_ddb_entry_dma);
4210 	return ret;
4211 }
4212 
4213 static int qla4xxx_get_boot_info(struct scsi_qla_host *ha)
4214 {
4215 	uint16_t ddb_index[2];
4216 	int ret = QLA_ERROR;
4217 	int rval;
4218 
4219 	memset(ddb_index, 0, sizeof(ddb_index));
4220 	ddb_index[0] = 0xffff;
4221 	ddb_index[1] = 0xffff;
4222 	ret = get_fw_boot_info(ha, ddb_index);
4223 	if (ret != QLA_SUCCESS) {
4224 		DEBUG2(ql4_printk(KERN_INFO, ha,
4225 				"%s: No boot target configured.\n", __func__));
4226 		return ret;
4227 	}
4228 
4229 	if (ql4xdisablesysfsboot)
4230 		return QLA_SUCCESS;
4231 
4232 	if (ddb_index[0] == 0xffff)
4233 		goto sec_target;
4234 
4235 	rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_pri_sess),
4236 				      ddb_index[0]);
4237 	if (rval != QLA_SUCCESS) {
4238 		DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Primary boot target not "
4239 				  "configured\n", __func__));
4240 	} else
4241 		ret = QLA_SUCCESS;
4242 
4243 sec_target:
4244 	if (ddb_index[1] == 0xffff)
4245 		goto exit_get_boot_info;
4246 
4247 	rval = qla4xxx_get_boot_target(ha, &(ha->boot_tgt.boot_sec_sess),
4248 				      ddb_index[1]);
4249 	if (rval != QLA_SUCCESS) {
4250 		DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Secondary boot target not"
4251 				  " configured\n", __func__));
4252 	} else
4253 		ret = QLA_SUCCESS;
4254 
4255 exit_get_boot_info:
4256 	return ret;
4257 }
4258 
4259 static int qla4xxx_setup_boot_info(struct scsi_qla_host *ha)
4260 {
4261 	struct iscsi_boot_kobj *boot_kobj;
4262 
4263 	if (qla4xxx_get_boot_info(ha) != QLA_SUCCESS)
4264 		return QLA_ERROR;
4265 
4266 	if (ql4xdisablesysfsboot) {
4267 		ql4_printk(KERN_INFO, ha,
4268 			   "%s: syfsboot disabled - driver will trigger login "
4269 			   "and publish session for discovery .\n", __func__);
4270 		return QLA_SUCCESS;
4271 	}
4272 
4273 
4274 	ha->boot_kset = iscsi_boot_create_host_kset(ha->host->host_no);
4275 	if (!ha->boot_kset)
4276 		goto kset_free;
4277 
4278 	if (!scsi_host_get(ha->host))
4279 		goto kset_free;
4280 	boot_kobj = iscsi_boot_create_target(ha->boot_kset, 0, ha,
4281 					     qla4xxx_show_boot_tgt_pri_info,
4282 					     qla4xxx_tgt_get_attr_visibility,
4283 					     qla4xxx_boot_release);
4284 	if (!boot_kobj)
4285 		goto put_host;
4286 
4287 	if (!scsi_host_get(ha->host))
4288 		goto kset_free;
4289 	boot_kobj = iscsi_boot_create_target(ha->boot_kset, 1, ha,
4290 					     qla4xxx_show_boot_tgt_sec_info,
4291 					     qla4xxx_tgt_get_attr_visibility,
4292 					     qla4xxx_boot_release);
4293 	if (!boot_kobj)
4294 		goto put_host;
4295 
4296 	if (!scsi_host_get(ha->host))
4297 		goto kset_free;
4298 	boot_kobj = iscsi_boot_create_initiator(ha->boot_kset, 0, ha,
4299 					       qla4xxx_show_boot_ini_info,
4300 					       qla4xxx_ini_get_attr_visibility,
4301 					       qla4xxx_boot_release);
4302 	if (!boot_kobj)
4303 		goto put_host;
4304 
4305 	if (!scsi_host_get(ha->host))
4306 		goto kset_free;
4307 	boot_kobj = iscsi_boot_create_ethernet(ha->boot_kset, 0, ha,
4308 					       qla4xxx_show_boot_eth_info,
4309 					       qla4xxx_eth_get_attr_visibility,
4310 					       qla4xxx_boot_release);
4311 	if (!boot_kobj)
4312 		goto put_host;
4313 
4314 	return QLA_SUCCESS;
4315 
4316 put_host:
4317 	scsi_host_put(ha->host);
4318 kset_free:
4319 	iscsi_boot_destroy_kset(ha->boot_kset);
4320 	return -ENOMEM;
4321 }
4322 
4323 
4324 /**
4325  * qla4xxx_create chap_list - Create CHAP list from FLASH
4326  * @ha: pointer to adapter structure
4327  *
4328  * Read flash and make a list of CHAP entries, during login when a CHAP entry
4329  * is received, it will be checked in this list. If entry exist then the CHAP
4330  * entry index is set in the DDB. If CHAP entry does not exist in this list
4331  * then a new entry is added in FLASH in CHAP table and the index obtained is
4332  * used in the DDB.
4333  **/
4334 static void qla4xxx_create_chap_list(struct scsi_qla_host *ha)
4335 {
4336 	int rval = 0;
4337 	uint8_t *chap_flash_data = NULL;
4338 	uint32_t offset;
4339 	dma_addr_t chap_dma;
4340 	uint32_t chap_size = 0;
4341 
4342 	if (is_qla40XX(ha))
4343 		chap_size = MAX_CHAP_ENTRIES_40XX  *
4344 					sizeof(struct ql4_chap_table);
4345 	else	/* Single region contains CHAP info for both
4346 		 * ports which is divided into half for each port.
4347 		 */
4348 		chap_size = ha->hw.flt_chap_size / 2;
4349 
4350 	chap_flash_data = dma_alloc_coherent(&ha->pdev->dev, chap_size,
4351 					  &chap_dma, GFP_KERNEL);
4352 	if (!chap_flash_data) {
4353 		ql4_printk(KERN_ERR, ha, "No memory for chap_flash_data\n");
4354 		return;
4355 	}
4356 	if (is_qla40XX(ha))
4357 		offset = FLASH_CHAP_OFFSET;
4358 	else {
4359 		offset = FLASH_RAW_ACCESS_ADDR + (ha->hw.flt_region_chap << 2);
4360 		if (ha->port_num == 1)
4361 			offset += chap_size;
4362 	}
4363 
4364 	rval = qla4xxx_get_flash(ha, chap_dma, offset, chap_size);
4365 	if (rval != QLA_SUCCESS)
4366 		goto exit_chap_list;
4367 
4368 	if (ha->chap_list == NULL)
4369 		ha->chap_list = vmalloc(chap_size);
4370 	if (ha->chap_list == NULL) {
4371 		ql4_printk(KERN_ERR, ha, "No memory for ha->chap_list\n");
4372 		goto exit_chap_list;
4373 	}
4374 
4375 	memcpy(ha->chap_list, chap_flash_data, chap_size);
4376 
4377 exit_chap_list:
4378 	dma_free_coherent(&ha->pdev->dev, chap_size,
4379 			chap_flash_data, chap_dma);
4380 }
4381 
4382 static void qla4xxx_get_param_ddb(struct ddb_entry *ddb_entry,
4383 				  struct ql4_tuple_ddb *tddb)
4384 {
4385 	struct scsi_qla_host *ha;
4386 	struct iscsi_cls_session *cls_sess;
4387 	struct iscsi_cls_conn *cls_conn;
4388 	struct iscsi_session *sess;
4389 	struct iscsi_conn *conn;
4390 
4391 	DEBUG2(printk(KERN_INFO "Func: %s\n", __func__));
4392 	ha = ddb_entry->ha;
4393 	cls_sess = ddb_entry->sess;
4394 	sess = cls_sess->dd_data;
4395 	cls_conn = ddb_entry->conn;
4396 	conn = cls_conn->dd_data;
4397 
4398 	tddb->tpgt = sess->tpgt;
4399 	tddb->port = conn->persistent_port;
4400 	strncpy(tddb->iscsi_name, sess->targetname, ISCSI_NAME_SIZE);
4401 	strncpy(tddb->ip_addr, conn->persistent_address, DDB_IPADDR_LEN);
4402 }
4403 
4404 static void qla4xxx_convert_param_ddb(struct dev_db_entry *fw_ddb_entry,
4405 				      struct ql4_tuple_ddb *tddb,
4406 				      uint8_t *flash_isid)
4407 {
4408 	uint16_t options = 0;
4409 
4410 	tddb->tpgt = le32_to_cpu(fw_ddb_entry->tgt_portal_grp);
4411 	memcpy(&tddb->iscsi_name[0], &fw_ddb_entry->iscsi_name[0],
4412 	       min(sizeof(tddb->iscsi_name), sizeof(fw_ddb_entry->iscsi_name)));
4413 
4414 	options = le16_to_cpu(fw_ddb_entry->options);
4415 	if (options & DDB_OPT_IPV6_DEVICE)
4416 		sprintf(tddb->ip_addr, "%pI6", fw_ddb_entry->ip_addr);
4417 	else
4418 		sprintf(tddb->ip_addr, "%pI4", fw_ddb_entry->ip_addr);
4419 
4420 	tddb->port = le16_to_cpu(fw_ddb_entry->port);
4421 
4422 	if (flash_isid == NULL)
4423 		memcpy(&tddb->isid[0], &fw_ddb_entry->isid[0],
4424 		       sizeof(tddb->isid));
4425 	else
4426 		memcpy(&tddb->isid[0], &flash_isid[0], sizeof(tddb->isid));
4427 }
4428 
4429 static int qla4xxx_compare_tuple_ddb(struct scsi_qla_host *ha,
4430 				     struct ql4_tuple_ddb *old_tddb,
4431 				     struct ql4_tuple_ddb *new_tddb,
4432 				     uint8_t is_isid_compare)
4433 {
4434 	if (strcmp(old_tddb->iscsi_name, new_tddb->iscsi_name))
4435 		return QLA_ERROR;
4436 
4437 	if (strcmp(old_tddb->ip_addr, new_tddb->ip_addr))
4438 		return QLA_ERROR;
4439 
4440 	if (old_tddb->port != new_tddb->port)
4441 		return QLA_ERROR;
4442 
4443 	/* For multi sessions, driver generates the ISID, so do not compare
4444 	 * ISID in reset path since it would be a comparison between the
4445 	 * driver generated ISID and firmware generated ISID. This could
4446 	 * lead to adding duplicated DDBs in the list as driver generated
4447 	 * ISID would not match firmware generated ISID.
4448 	 */
4449 	if (is_isid_compare) {
4450 		DEBUG2(ql4_printk(KERN_INFO, ha, "%s: old ISID [%02x%02x%02x"
4451 			"%02x%02x%02x] New ISID [%02x%02x%02x%02x%02x%02x]\n",
4452 			__func__, old_tddb->isid[5], old_tddb->isid[4],
4453 			old_tddb->isid[3], old_tddb->isid[2], old_tddb->isid[1],
4454 			old_tddb->isid[0], new_tddb->isid[5], new_tddb->isid[4],
4455 			new_tddb->isid[3], new_tddb->isid[2], new_tddb->isid[1],
4456 			new_tddb->isid[0]));
4457 
4458 		if (memcmp(&old_tddb->isid[0], &new_tddb->isid[0],
4459 			   sizeof(old_tddb->isid)))
4460 			return QLA_ERROR;
4461 	}
4462 
4463 	DEBUG2(ql4_printk(KERN_INFO, ha,
4464 			  "Match Found, fw[%d,%d,%s,%s], [%d,%d,%s,%s]",
4465 			  old_tddb->port, old_tddb->tpgt, old_tddb->ip_addr,
4466 			  old_tddb->iscsi_name, new_tddb->port, new_tddb->tpgt,
4467 			  new_tddb->ip_addr, new_tddb->iscsi_name));
4468 
4469 	return QLA_SUCCESS;
4470 }
4471 
4472 static int qla4xxx_is_session_exists(struct scsi_qla_host *ha,
4473 				     struct dev_db_entry *fw_ddb_entry)
4474 {
4475 	struct ddb_entry *ddb_entry;
4476 	struct ql4_tuple_ddb *fw_tddb = NULL;
4477 	struct ql4_tuple_ddb *tmp_tddb = NULL;
4478 	int idx;
4479 	int ret = QLA_ERROR;
4480 
4481 	fw_tddb = vzalloc(sizeof(*fw_tddb));
4482 	if (!fw_tddb) {
4483 		DEBUG2(ql4_printk(KERN_WARNING, ha,
4484 				  "Memory Allocation failed.\n"));
4485 		ret = QLA_SUCCESS;
4486 		goto exit_check;
4487 	}
4488 
4489 	tmp_tddb = vzalloc(sizeof(*tmp_tddb));
4490 	if (!tmp_tddb) {
4491 		DEBUG2(ql4_printk(KERN_WARNING, ha,
4492 				  "Memory Allocation failed.\n"));
4493 		ret = QLA_SUCCESS;
4494 		goto exit_check;
4495 	}
4496 
4497 	qla4xxx_convert_param_ddb(fw_ddb_entry, fw_tddb, NULL);
4498 
4499 	for (idx = 0; idx < MAX_DDB_ENTRIES; idx++) {
4500 		ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx);
4501 		if (ddb_entry == NULL)
4502 			continue;
4503 
4504 		qla4xxx_get_param_ddb(ddb_entry, tmp_tddb);
4505 		if (!qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, false)) {
4506 			ret = QLA_SUCCESS; /* found */
4507 			goto exit_check;
4508 		}
4509 	}
4510 
4511 exit_check:
4512 	if (fw_tddb)
4513 		vfree(fw_tddb);
4514 	if (tmp_tddb)
4515 		vfree(tmp_tddb);
4516 	return ret;
4517 }
4518 
4519 /**
4520  * qla4xxx_check_existing_isid - check if target with same isid exist
4521  *				 in target list
4522  * @list_nt: list of target
4523  * @isid: isid to check
4524  *
4525  * This routine return QLA_SUCCESS if target with same isid exist
4526  **/
4527 static int qla4xxx_check_existing_isid(struct list_head *list_nt, uint8_t *isid)
4528 {
4529 	struct qla_ddb_index *nt_ddb_idx, *nt_ddb_idx_tmp;
4530 	struct dev_db_entry *fw_ddb_entry;
4531 
4532 	list_for_each_entry_safe(nt_ddb_idx, nt_ddb_idx_tmp, list_nt, list) {
4533 		fw_ddb_entry = &nt_ddb_idx->fw_ddb;
4534 
4535 		if (memcmp(&fw_ddb_entry->isid[0], &isid[0],
4536 			   sizeof(nt_ddb_idx->fw_ddb.isid)) == 0) {
4537 			return QLA_SUCCESS;
4538 		}
4539 	}
4540 	return QLA_ERROR;
4541 }
4542 
4543 /**
4544  * qla4xxx_update_isid - compare ddbs and updated isid
4545  * @ha: Pointer to host adapter structure.
4546  * @list_nt: list of nt target
4547  * @fw_ddb_entry: firmware ddb entry
4548  *
4549  * This routine update isid if ddbs have same iqn, same isid and
4550  * different IP addr.
4551  * Return QLA_SUCCESS if isid is updated.
4552  **/
4553 static int qla4xxx_update_isid(struct scsi_qla_host *ha,
4554 			       struct list_head *list_nt,
4555 			       struct dev_db_entry *fw_ddb_entry)
4556 {
4557 	uint8_t base_value, i;
4558 
4559 	base_value = fw_ddb_entry->isid[1] & 0x1f;
4560 	for (i = 0; i < 8; i++) {
4561 		fw_ddb_entry->isid[1] = (base_value | (i << 5));
4562 		if (qla4xxx_check_existing_isid(list_nt, fw_ddb_entry->isid))
4563 			break;
4564 	}
4565 
4566 	if (!qla4xxx_check_existing_isid(list_nt, fw_ddb_entry->isid))
4567 		return QLA_ERROR;
4568 
4569 	return QLA_SUCCESS;
4570 }
4571 
4572 /**
4573  * qla4xxx_should_update_isid - check if isid need to update
4574  * @ha: Pointer to host adapter structure.
4575  * @old_tddb: ddb tuple
4576  * @new_tddb: ddb tuple
4577  *
4578  * Return QLA_SUCCESS if different IP, different PORT, same iqn,
4579  * same isid
4580  **/
4581 static int qla4xxx_should_update_isid(struct scsi_qla_host *ha,
4582 				      struct ql4_tuple_ddb *old_tddb,
4583 				      struct ql4_tuple_ddb *new_tddb)
4584 {
4585 	if (strcmp(old_tddb->ip_addr, new_tddb->ip_addr) == 0) {
4586 		/* Same ip */
4587 		if (old_tddb->port == new_tddb->port)
4588 			return QLA_ERROR;
4589 	}
4590 
4591 	if (strcmp(old_tddb->iscsi_name, new_tddb->iscsi_name))
4592 		/* different iqn */
4593 		return QLA_ERROR;
4594 
4595 	if (memcmp(&old_tddb->isid[0], &new_tddb->isid[0],
4596 		   sizeof(old_tddb->isid)))
4597 		/* different isid */
4598 		return QLA_ERROR;
4599 
4600 	return QLA_SUCCESS;
4601 }
4602 
4603 /**
4604  * qla4xxx_is_flash_ddb_exists - check if fw_ddb_entry already exists in list_nt
4605  * @ha: Pointer to host adapter structure.
4606  * @list_nt: list of nt target.
4607  * @fw_ddb_entry: firmware ddb entry.
4608  *
4609  * This routine check if fw_ddb_entry already exists in list_nt to avoid
4610  * duplicate ddb in list_nt.
4611  * Return QLA_SUCCESS if duplicate ddb exit in list_nl.
4612  * Note: This function also update isid of DDB if required.
4613  **/
4614 
4615 static int qla4xxx_is_flash_ddb_exists(struct scsi_qla_host *ha,
4616 				       struct list_head *list_nt,
4617 				       struct dev_db_entry *fw_ddb_entry)
4618 {
4619 	struct qla_ddb_index  *nt_ddb_idx, *nt_ddb_idx_tmp;
4620 	struct ql4_tuple_ddb *fw_tddb = NULL;
4621 	struct ql4_tuple_ddb *tmp_tddb = NULL;
4622 	int rval, ret = QLA_ERROR;
4623 
4624 	fw_tddb = vzalloc(sizeof(*fw_tddb));
4625 	if (!fw_tddb) {
4626 		DEBUG2(ql4_printk(KERN_WARNING, ha,
4627 				  "Memory Allocation failed.\n"));
4628 		ret = QLA_SUCCESS;
4629 		goto exit_check;
4630 	}
4631 
4632 	tmp_tddb = vzalloc(sizeof(*tmp_tddb));
4633 	if (!tmp_tddb) {
4634 		DEBUG2(ql4_printk(KERN_WARNING, ha,
4635 				  "Memory Allocation failed.\n"));
4636 		ret = QLA_SUCCESS;
4637 		goto exit_check;
4638 	}
4639 
4640 	qla4xxx_convert_param_ddb(fw_ddb_entry, fw_tddb, NULL);
4641 
4642 	list_for_each_entry_safe(nt_ddb_idx, nt_ddb_idx_tmp, list_nt, list) {
4643 		qla4xxx_convert_param_ddb(&nt_ddb_idx->fw_ddb, tmp_tddb,
4644 					  nt_ddb_idx->flash_isid);
4645 		ret = qla4xxx_compare_tuple_ddb(ha, fw_tddb, tmp_tddb, true);
4646 		/* found duplicate ddb */
4647 		if (ret == QLA_SUCCESS)
4648 			goto exit_check;
4649 	}
4650 
4651 	list_for_each_entry_safe(nt_ddb_idx, nt_ddb_idx_tmp, list_nt, list) {
4652 		qla4xxx_convert_param_ddb(&nt_ddb_idx->fw_ddb, tmp_tddb, NULL);
4653 
4654 		ret = qla4xxx_should_update_isid(ha, tmp_tddb, fw_tddb);
4655 		if (ret == QLA_SUCCESS) {
4656 			rval = qla4xxx_update_isid(ha, list_nt, fw_ddb_entry);
4657 			if (rval == QLA_SUCCESS)
4658 				ret = QLA_ERROR;
4659 			else
4660 				ret = QLA_SUCCESS;
4661 
4662 			goto exit_check;
4663 		}
4664 	}
4665 
4666 exit_check:
4667 	if (fw_tddb)
4668 		vfree(fw_tddb);
4669 	if (tmp_tddb)
4670 		vfree(tmp_tddb);
4671 	return ret;
4672 }
4673 
4674 static void qla4xxx_free_ddb_list(struct list_head *list_ddb)
4675 {
4676 	struct qla_ddb_index  *ddb_idx, *ddb_idx_tmp;
4677 
4678 	list_for_each_entry_safe(ddb_idx, ddb_idx_tmp, list_ddb, list) {
4679 		list_del_init(&ddb_idx->list);
4680 		vfree(ddb_idx);
4681 	}
4682 }
4683 
4684 static struct iscsi_endpoint *qla4xxx_get_ep_fwdb(struct scsi_qla_host *ha,
4685 					struct dev_db_entry *fw_ddb_entry)
4686 {
4687 	struct iscsi_endpoint *ep;
4688 	struct sockaddr_in *addr;
4689 	struct sockaddr_in6 *addr6;
4690 	struct sockaddr *dst_addr;
4691 	char *ip;
4692 
4693 	/* TODO: need to destroy on unload iscsi_endpoint*/
4694 	dst_addr = vmalloc(sizeof(*dst_addr));
4695 	if (!dst_addr)
4696 		return NULL;
4697 
4698 	if (fw_ddb_entry->options & DDB_OPT_IPV6_DEVICE) {
4699 		dst_addr->sa_family = AF_INET6;
4700 		addr6 = (struct sockaddr_in6 *)dst_addr;
4701 		ip = (char *)&addr6->sin6_addr;
4702 		memcpy(ip, fw_ddb_entry->ip_addr, IPv6_ADDR_LEN);
4703 		addr6->sin6_port = htons(le16_to_cpu(fw_ddb_entry->port));
4704 
4705 	} else {
4706 		dst_addr->sa_family = AF_INET;
4707 		addr = (struct sockaddr_in *)dst_addr;
4708 		ip = (char *)&addr->sin_addr;
4709 		memcpy(ip, fw_ddb_entry->ip_addr, IP_ADDR_LEN);
4710 		addr->sin_port = htons(le16_to_cpu(fw_ddb_entry->port));
4711 	}
4712 
4713 	ep = qla4xxx_ep_connect(ha->host, dst_addr, 0);
4714 	vfree(dst_addr);
4715 	return ep;
4716 }
4717 
4718 static int qla4xxx_verify_boot_idx(struct scsi_qla_host *ha, uint16_t idx)
4719 {
4720 	if (ql4xdisablesysfsboot)
4721 		return QLA_SUCCESS;
4722 	if (idx == ha->pri_ddb_idx || idx == ha->sec_ddb_idx)
4723 		return QLA_ERROR;
4724 	return QLA_SUCCESS;
4725 }
4726 
4727 static void qla4xxx_setup_flash_ddb_entry(struct scsi_qla_host *ha,
4728 					  struct ddb_entry *ddb_entry)
4729 {
4730 	uint16_t def_timeout;
4731 
4732 	ddb_entry->ddb_type = FLASH_DDB;
4733 	ddb_entry->fw_ddb_index = INVALID_ENTRY;
4734 	ddb_entry->fw_ddb_device_state = DDB_DS_NO_CONNECTION_ACTIVE;
4735 	ddb_entry->ha = ha;
4736 	ddb_entry->unblock_sess = qla4xxx_unblock_flash_ddb;
4737 	ddb_entry->ddb_change = qla4xxx_flash_ddb_change;
4738 
4739 	atomic_set(&ddb_entry->retry_relogin_timer, INVALID_ENTRY);
4740 	atomic_set(&ddb_entry->relogin_timer, 0);
4741 	atomic_set(&ddb_entry->relogin_retry_count, 0);
4742 	def_timeout = le16_to_cpu(ddb_entry->fw_ddb_entry.def_timeout);
4743 	ddb_entry->default_relogin_timeout =
4744 		(def_timeout > LOGIN_TOV) && (def_timeout < LOGIN_TOV * 10) ?
4745 		def_timeout : LOGIN_TOV;
4746 	ddb_entry->default_time2wait =
4747 		le16_to_cpu(ddb_entry->fw_ddb_entry.iscsi_def_time2wait);
4748 }
4749 
4750 static void qla4xxx_wait_for_ip_configuration(struct scsi_qla_host *ha)
4751 {
4752 	uint32_t idx = 0;
4753 	uint32_t ip_idx[IP_ADDR_COUNT] = {0, 1, 2, 3}; /* 4 IP interfaces */
4754 	uint32_t sts[MBOX_REG_COUNT];
4755 	uint32_t ip_state;
4756 	unsigned long wtime;
4757 	int ret;
4758 
4759 	wtime = jiffies + (HZ * IP_CONFIG_TOV);
4760 	do {
4761 		for (idx = 0; idx < IP_ADDR_COUNT; idx++) {
4762 			if (ip_idx[idx] == -1)
4763 				continue;
4764 
4765 			ret = qla4xxx_get_ip_state(ha, 0, ip_idx[idx], sts);
4766 
4767 			if (ret == QLA_ERROR) {
4768 				ip_idx[idx] = -1;
4769 				continue;
4770 			}
4771 
4772 			ip_state = (sts[1] & IP_STATE_MASK) >> IP_STATE_SHIFT;
4773 
4774 			DEBUG2(ql4_printk(KERN_INFO, ha,
4775 					  "Waiting for IP state for idx = %d, state = 0x%x\n",
4776 					  ip_idx[idx], ip_state));
4777 			if (ip_state == IP_ADDRSTATE_UNCONFIGURED ||
4778 			    ip_state == IP_ADDRSTATE_INVALID ||
4779 			    ip_state == IP_ADDRSTATE_PREFERRED ||
4780 			    ip_state == IP_ADDRSTATE_DEPRICATED ||
4781 			    ip_state == IP_ADDRSTATE_DISABLING)
4782 				ip_idx[idx] = -1;
4783 		}
4784 
4785 		/* Break if all IP states checked */
4786 		if ((ip_idx[0] == -1) &&
4787 		    (ip_idx[1] == -1) &&
4788 		    (ip_idx[2] == -1) &&
4789 		    (ip_idx[3] == -1))
4790 			break;
4791 		schedule_timeout_uninterruptible(HZ);
4792 	} while (time_after(wtime, jiffies));
4793 }
4794 
4795 static void qla4xxx_build_st_list(struct scsi_qla_host *ha,
4796 				  struct list_head *list_st)
4797 {
4798 	struct qla_ddb_index  *st_ddb_idx;
4799 	int max_ddbs;
4800 	int fw_idx_size;
4801 	struct dev_db_entry *fw_ddb_entry;
4802 	dma_addr_t fw_ddb_dma;
4803 	int ret;
4804 	uint32_t idx = 0, next_idx = 0;
4805 	uint32_t state = 0, conn_err = 0;
4806 	uint16_t conn_id = 0;
4807 
4808 	fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL,
4809 				      &fw_ddb_dma);
4810 	if (fw_ddb_entry == NULL) {
4811 		DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n"));
4812 		goto exit_st_list;
4813 	}
4814 
4815 	max_ddbs =  is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX :
4816 				     MAX_DEV_DB_ENTRIES;
4817 	fw_idx_size = sizeof(struct qla_ddb_index);
4818 
4819 	for (idx = 0; idx < max_ddbs; idx = next_idx) {
4820 		ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma,
4821 					      NULL, &next_idx, &state,
4822 					      &conn_err, NULL, &conn_id);
4823 		if (ret == QLA_ERROR)
4824 			break;
4825 
4826 		/* Ignore DDB if invalid state (unassigned) */
4827 		if (state == DDB_DS_UNASSIGNED)
4828 			goto continue_next_st;
4829 
4830 		/* Check if ST, add to the list_st */
4831 		if (strlen((char *) fw_ddb_entry->iscsi_name) != 0)
4832 			goto continue_next_st;
4833 
4834 		st_ddb_idx = vzalloc(fw_idx_size);
4835 		if (!st_ddb_idx)
4836 			break;
4837 
4838 		st_ddb_idx->fw_ddb_idx = idx;
4839 
4840 		list_add_tail(&st_ddb_idx->list, list_st);
4841 continue_next_st:
4842 		if (next_idx == 0)
4843 			break;
4844 	}
4845 
4846 exit_st_list:
4847 	if (fw_ddb_entry)
4848 		dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma);
4849 }
4850 
4851 /**
4852  * qla4xxx_remove_failed_ddb - Remove inactive or failed ddb from list
4853  * @ha: pointer to adapter structure
4854  * @list_ddb: List from which failed ddb to be removed
4855  *
4856  * Iterate over the list of DDBs and find and remove DDBs that are either in
4857  * no connection active state or failed state
4858  **/
4859 static void qla4xxx_remove_failed_ddb(struct scsi_qla_host *ha,
4860 				      struct list_head *list_ddb)
4861 {
4862 	struct qla_ddb_index  *ddb_idx, *ddb_idx_tmp;
4863 	uint32_t next_idx = 0;
4864 	uint32_t state = 0, conn_err = 0;
4865 	int ret;
4866 
4867 	list_for_each_entry_safe(ddb_idx, ddb_idx_tmp, list_ddb, list) {
4868 		ret = qla4xxx_get_fwddb_entry(ha, ddb_idx->fw_ddb_idx,
4869 					      NULL, 0, NULL, &next_idx, &state,
4870 					      &conn_err, NULL, NULL);
4871 		if (ret == QLA_ERROR)
4872 			continue;
4873 
4874 		if (state == DDB_DS_NO_CONNECTION_ACTIVE ||
4875 		    state == DDB_DS_SESSION_FAILED) {
4876 			list_del_init(&ddb_idx->list);
4877 			vfree(ddb_idx);
4878 		}
4879 	}
4880 }
4881 
4882 static int qla4xxx_sess_conn_setup(struct scsi_qla_host *ha,
4883 				   struct dev_db_entry *fw_ddb_entry,
4884 				   int is_reset)
4885 {
4886 	struct iscsi_cls_session *cls_sess;
4887 	struct iscsi_session *sess;
4888 	struct iscsi_cls_conn *cls_conn;
4889 	struct iscsi_endpoint *ep;
4890 	uint16_t cmds_max = 32;
4891 	uint16_t conn_id = 0;
4892 	uint32_t initial_cmdsn = 0;
4893 	int ret = QLA_SUCCESS;
4894 
4895 	struct ddb_entry *ddb_entry = NULL;
4896 
4897 	/* Create session object, with INVALID_ENTRY,
4898 	 * the targer_id would get set when we issue the login
4899 	 */
4900 	cls_sess = iscsi_session_setup(&qla4xxx_iscsi_transport, ha->host,
4901 				       cmds_max, sizeof(struct ddb_entry),
4902 				       sizeof(struct ql4_task_data),
4903 				       initial_cmdsn, INVALID_ENTRY);
4904 	if (!cls_sess) {
4905 		ret = QLA_ERROR;
4906 		goto exit_setup;
4907 	}
4908 
4909 	/*
4910 	 * so calling module_put function to decrement the
4911 	 * reference count.
4912 	 **/
4913 	module_put(qla4xxx_iscsi_transport.owner);
4914 	sess = cls_sess->dd_data;
4915 	ddb_entry = sess->dd_data;
4916 	ddb_entry->sess = cls_sess;
4917 
4918 	cls_sess->recovery_tmo = ql4xsess_recovery_tmo;
4919 	memcpy(&ddb_entry->fw_ddb_entry, fw_ddb_entry,
4920 	       sizeof(struct dev_db_entry));
4921 
4922 	qla4xxx_setup_flash_ddb_entry(ha, ddb_entry);
4923 
4924 	cls_conn = iscsi_conn_setup(cls_sess, sizeof(struct qla_conn), conn_id);
4925 
4926 	if (!cls_conn) {
4927 		ret = QLA_ERROR;
4928 		goto exit_setup;
4929 	}
4930 
4931 	ddb_entry->conn = cls_conn;
4932 
4933 	/* Setup ep, for displaying attributes in sysfs */
4934 	ep = qla4xxx_get_ep_fwdb(ha, fw_ddb_entry);
4935 	if (ep) {
4936 		ep->conn = cls_conn;
4937 		cls_conn->ep = ep;
4938 	} else {
4939 		DEBUG2(ql4_printk(KERN_ERR, ha, "Unable to get ep\n"));
4940 		ret = QLA_ERROR;
4941 		goto exit_setup;
4942 	}
4943 
4944 	/* Update sess/conn params */
4945 	qla4xxx_copy_fwddb_param(ha, fw_ddb_entry, cls_sess, cls_conn);
4946 
4947 	if (is_reset == RESET_ADAPTER) {
4948 		iscsi_block_session(cls_sess);
4949 		/* Use the relogin path to discover new devices
4950 		 *  by short-circuting the logic of setting
4951 		 *  timer to relogin - instead set the flags
4952 		 *  to initiate login right away.
4953 		 */
4954 		set_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags);
4955 		set_bit(DF_RELOGIN, &ddb_entry->flags);
4956 	}
4957 
4958 exit_setup:
4959 	return ret;
4960 }
4961 
4962 static void qla4xxx_build_nt_list(struct scsi_qla_host *ha,
4963 				  struct list_head *list_nt, int is_reset)
4964 {
4965 	struct dev_db_entry *fw_ddb_entry;
4966 	dma_addr_t fw_ddb_dma;
4967 	int max_ddbs;
4968 	int fw_idx_size;
4969 	int ret;
4970 	uint32_t idx = 0, next_idx = 0;
4971 	uint32_t state = 0, conn_err = 0;
4972 	uint16_t conn_id = 0;
4973 	struct qla_ddb_index  *nt_ddb_idx;
4974 
4975 	fw_ddb_entry = dma_pool_alloc(ha->fw_ddb_dma_pool, GFP_KERNEL,
4976 				      &fw_ddb_dma);
4977 	if (fw_ddb_entry == NULL) {
4978 		DEBUG2(ql4_printk(KERN_ERR, ha, "Out of memory\n"));
4979 		goto exit_nt_list;
4980 	}
4981 	max_ddbs =  is_qla40XX(ha) ? MAX_DEV_DB_ENTRIES_40XX :
4982 				     MAX_DEV_DB_ENTRIES;
4983 	fw_idx_size = sizeof(struct qla_ddb_index);
4984 
4985 	for (idx = 0; idx < max_ddbs; idx = next_idx) {
4986 		ret = qla4xxx_get_fwddb_entry(ha, idx, fw_ddb_entry, fw_ddb_dma,
4987 					      NULL, &next_idx, &state,
4988 					      &conn_err, NULL, &conn_id);
4989 		if (ret == QLA_ERROR)
4990 			break;
4991 
4992 		if (qla4xxx_verify_boot_idx(ha, idx) != QLA_SUCCESS)
4993 			goto continue_next_nt;
4994 
4995 		/* Check if NT, then add to list it */
4996 		if (strlen((char *) fw_ddb_entry->iscsi_name) == 0)
4997 			goto continue_next_nt;
4998 
4999 		if (!(state == DDB_DS_NO_CONNECTION_ACTIVE ||
5000 		    state == DDB_DS_SESSION_FAILED))
5001 			goto continue_next_nt;
5002 
5003 		DEBUG2(ql4_printk(KERN_INFO, ha,
5004 				  "Adding  DDB to session = 0x%x\n", idx));
5005 		if (is_reset == INIT_ADAPTER) {
5006 			nt_ddb_idx = vmalloc(fw_idx_size);
5007 			if (!nt_ddb_idx)
5008 				break;
5009 
5010 			nt_ddb_idx->fw_ddb_idx = idx;
5011 
5012 			/* Copy original isid as it may get updated in function
5013 			 * qla4xxx_update_isid(). We need original isid in
5014 			 * function qla4xxx_compare_tuple_ddb to find duplicate
5015 			 * target */
5016 			memcpy(&nt_ddb_idx->flash_isid[0],
5017 			       &fw_ddb_entry->isid[0],
5018 			       sizeof(nt_ddb_idx->flash_isid));
5019 
5020 			ret = qla4xxx_is_flash_ddb_exists(ha, list_nt,
5021 							  fw_ddb_entry);
5022 			if (ret == QLA_SUCCESS) {
5023 				/* free nt_ddb_idx and do not add to list_nt */
5024 				vfree(nt_ddb_idx);
5025 				goto continue_next_nt;
5026 			}
5027 
5028 			/* Copy updated isid */
5029 			memcpy(&nt_ddb_idx->fw_ddb, fw_ddb_entry,
5030 			       sizeof(struct dev_db_entry));
5031 
5032 			list_add_tail(&nt_ddb_idx->list, list_nt);
5033 		} else if (is_reset == RESET_ADAPTER) {
5034 			if (qla4xxx_is_session_exists(ha, fw_ddb_entry) ==
5035 								QLA_SUCCESS)
5036 				goto continue_next_nt;
5037 		}
5038 
5039 		ret = qla4xxx_sess_conn_setup(ha, fw_ddb_entry, is_reset);
5040 		if (ret == QLA_ERROR)
5041 			goto exit_nt_list;
5042 
5043 continue_next_nt:
5044 		if (next_idx == 0)
5045 			break;
5046 	}
5047 
5048 exit_nt_list:
5049 	if (fw_ddb_entry)
5050 		dma_pool_free(ha->fw_ddb_dma_pool, fw_ddb_entry, fw_ddb_dma);
5051 }
5052 
5053 /**
5054  * qla4xxx_build_ddb_list - Build ddb list and setup sessions
5055  * @ha: pointer to adapter structure
5056  * @is_reset: Is this init path or reset path
5057  *
5058  * Create a list of sendtargets (st) from firmware DDBs, issue send targets
5059  * using connection open, then create the list of normal targets (nt)
5060  * from firmware DDBs. Based on the list of nt setup session and connection
5061  * objects.
5062  **/
5063 void qla4xxx_build_ddb_list(struct scsi_qla_host *ha, int is_reset)
5064 {
5065 	uint16_t tmo = 0;
5066 	struct list_head list_st, list_nt;
5067 	struct qla_ddb_index  *st_ddb_idx, *st_ddb_idx_tmp;
5068 	unsigned long wtime;
5069 
5070 	if (!test_bit(AF_LINK_UP, &ha->flags)) {
5071 		set_bit(AF_BUILD_DDB_LIST, &ha->flags);
5072 		ha->is_reset = is_reset;
5073 		return;
5074 	}
5075 
5076 	INIT_LIST_HEAD(&list_st);
5077 	INIT_LIST_HEAD(&list_nt);
5078 
5079 	qla4xxx_build_st_list(ha, &list_st);
5080 
5081 	/* Before issuing conn open mbox, ensure all IPs states are configured
5082 	 * Note, conn open fails if IPs are not configured
5083 	 */
5084 	qla4xxx_wait_for_ip_configuration(ha);
5085 
5086 	/* Go thru the STs and fire the sendtargets by issuing conn open mbx */
5087 	list_for_each_entry_safe(st_ddb_idx, st_ddb_idx_tmp, &list_st, list) {
5088 		qla4xxx_conn_open(ha, st_ddb_idx->fw_ddb_idx);
5089 	}
5090 
5091 	/* Wait to ensure all sendtargets are done for min 12 sec wait */
5092 	tmo = ((ha->def_timeout > LOGIN_TOV) &&
5093 	       (ha->def_timeout < LOGIN_TOV * 10) ?
5094 	       ha->def_timeout : LOGIN_TOV);
5095 
5096 	DEBUG2(ql4_printk(KERN_INFO, ha,
5097 			  "Default time to wait for build ddb %d\n", tmo));
5098 
5099 	wtime = jiffies + (HZ * tmo);
5100 	do {
5101 		if (list_empty(&list_st))
5102 			break;
5103 
5104 		qla4xxx_remove_failed_ddb(ha, &list_st);
5105 		schedule_timeout_uninterruptible(HZ / 10);
5106 	} while (time_after(wtime, jiffies));
5107 
5108 	/* Free up the sendtargets list */
5109 	qla4xxx_free_ddb_list(&list_st);
5110 
5111 	qla4xxx_build_nt_list(ha, &list_nt, is_reset);
5112 
5113 	qla4xxx_free_ddb_list(&list_nt);
5114 
5115 	qla4xxx_free_ddb_index(ha);
5116 }
5117 
5118 /**
5119  * qla4xxx_probe_adapter - callback function to probe HBA
5120  * @pdev: pointer to pci_dev structure
5121  * @pci_device_id: pointer to pci_device entry
5122  *
5123  * This routine will probe for Qlogic 4xxx iSCSI host adapters.
5124  * It returns zero if successful. It also initializes all data necessary for
5125  * the driver.
5126  **/
5127 static int qla4xxx_probe_adapter(struct pci_dev *pdev,
5128 				 const struct pci_device_id *ent)
5129 {
5130 	int ret = -ENODEV, status;
5131 	struct Scsi_Host *host;
5132 	struct scsi_qla_host *ha;
5133 	uint8_t init_retry_count = 0;
5134 	char buf[34];
5135 	struct qla4_8xxx_legacy_intr_set *nx_legacy_intr;
5136 	uint32_t dev_state;
5137 
5138 	if (pci_enable_device(pdev))
5139 		return -1;
5140 
5141 	host = iscsi_host_alloc(&qla4xxx_driver_template, sizeof(*ha), 0);
5142 	if (host == NULL) {
5143 		printk(KERN_WARNING
5144 		       "qla4xxx: Couldn't allocate host from scsi layer!\n");
5145 		goto probe_disable_device;
5146 	}
5147 
5148 	/* Clear our data area */
5149 	ha = to_qla_host(host);
5150 	memset(ha, 0, sizeof(*ha));
5151 
5152 	/* Save the information from PCI BIOS.	*/
5153 	ha->pdev = pdev;
5154 	ha->host = host;
5155 	ha->host_no = host->host_no;
5156 	ha->func_num = PCI_FUNC(ha->pdev->devfn);
5157 
5158 	pci_enable_pcie_error_reporting(pdev);
5159 
5160 	/* Setup Runtime configurable options */
5161 	if (is_qla8022(ha)) {
5162 		ha->isp_ops = &qla4_82xx_isp_ops;
5163 		ha->reg_tbl = (uint32_t *) qla4_82xx_reg_tbl;
5164 		ha->qdr_sn_window = -1;
5165 		ha->ddr_mn_window = -1;
5166 		ha->curr_window = 255;
5167 		nx_legacy_intr = &legacy_intr[ha->func_num];
5168 		ha->nx_legacy_intr.int_vec_bit = nx_legacy_intr->int_vec_bit;
5169 		ha->nx_legacy_intr.tgt_status_reg =
5170 			nx_legacy_intr->tgt_status_reg;
5171 		ha->nx_legacy_intr.tgt_mask_reg = nx_legacy_intr->tgt_mask_reg;
5172 		ha->nx_legacy_intr.pci_int_reg = nx_legacy_intr->pci_int_reg;
5173 	} else if (is_qla8032(ha)) {
5174 		ha->isp_ops = &qla4_83xx_isp_ops;
5175 		ha->reg_tbl = (uint32_t *)qla4_83xx_reg_tbl;
5176 	} else {
5177 		ha->isp_ops = &qla4xxx_isp_ops;
5178 	}
5179 
5180 	if (is_qla80XX(ha)) {
5181 		rwlock_init(&ha->hw_lock);
5182 		ha->pf_bit = ha->func_num << 16;
5183 		/* Set EEH reset type to fundamental if required by hba */
5184 		pdev->needs_freset = 1;
5185 	}
5186 
5187 	/* Configure PCI I/O space. */
5188 	ret = ha->isp_ops->iospace_config(ha);
5189 	if (ret)
5190 		goto probe_failed_ioconfig;
5191 
5192 	ql4_printk(KERN_INFO, ha, "Found an ISP%04x, irq %d, iobase 0x%p\n",
5193 		   pdev->device, pdev->irq, ha->reg);
5194 
5195 	qla4xxx_config_dma_addressing(ha);
5196 
5197 	/* Initialize lists and spinlocks. */
5198 	INIT_LIST_HEAD(&ha->free_srb_q);
5199 
5200 	mutex_init(&ha->mbox_sem);
5201 	mutex_init(&ha->chap_sem);
5202 	init_completion(&ha->mbx_intr_comp);
5203 	init_completion(&ha->disable_acb_comp);
5204 
5205 	spin_lock_init(&ha->hardware_lock);
5206 	spin_lock_init(&ha->work_lock);
5207 
5208 	/* Initialize work list */
5209 	INIT_LIST_HEAD(&ha->work_list);
5210 
5211 	/* Allocate dma buffers */
5212 	if (qla4xxx_mem_alloc(ha)) {
5213 		ql4_printk(KERN_WARNING, ha,
5214 		    "[ERROR] Failed to allocate memory for adapter\n");
5215 
5216 		ret = -ENOMEM;
5217 		goto probe_failed;
5218 	}
5219 
5220 	host->cmd_per_lun = 3;
5221 	host->max_channel = 0;
5222 	host->max_lun = MAX_LUNS - 1;
5223 	host->max_id = MAX_TARGETS;
5224 	host->max_cmd_len = IOCB_MAX_CDB_LEN;
5225 	host->can_queue = MAX_SRBS ;
5226 	host->transportt = qla4xxx_scsi_transport;
5227 
5228 	ret = scsi_init_shared_tag_map(host, MAX_SRBS);
5229 	if (ret) {
5230 		ql4_printk(KERN_WARNING, ha,
5231 			   "%s: scsi_init_shared_tag_map failed\n", __func__);
5232 		goto probe_failed;
5233 	}
5234 
5235 	pci_set_drvdata(pdev, ha);
5236 
5237 	ret = scsi_add_host(host, &pdev->dev);
5238 	if (ret)
5239 		goto probe_failed;
5240 
5241 	if (is_qla80XX(ha))
5242 		qla4_8xxx_get_flash_info(ha);
5243 
5244 	if (is_qla8032(ha)) {
5245 		qla4_83xx_read_reset_template(ha);
5246 		/*
5247 		 * NOTE: If ql4dontresethba==1, set IDC_CTRL DONTRESET_BIT0.
5248 		 * If DONRESET_BIT0 is set, drivers should not set dev_state
5249 		 * to NEED_RESET. But if NEED_RESET is set, drivers should
5250 		 * should honor the reset.
5251 		 */
5252 		if (ql4xdontresethba == 1)
5253 			qla4_83xx_set_idc_dontreset(ha);
5254 	}
5255 
5256 	/*
5257 	 * Initialize the Host adapter request/response queues and
5258 	 * firmware
5259 	 * NOTE: interrupts enabled upon successful completion
5260 	 */
5261 	status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER);
5262 
5263 	/* Dont retry adapter initialization if IRQ allocation failed */
5264 	if (!test_bit(AF_IRQ_ATTACHED, &ha->flags))
5265 		goto skip_retry_init;
5266 
5267 	while ((!test_bit(AF_ONLINE, &ha->flags)) &&
5268 	    init_retry_count++ < MAX_INIT_RETRIES) {
5269 
5270 		if (is_qla80XX(ha)) {
5271 			ha->isp_ops->idc_lock(ha);
5272 			dev_state = qla4_8xxx_rd_direct(ha,
5273 							QLA82XX_CRB_DEV_STATE);
5274 			ha->isp_ops->idc_unlock(ha);
5275 			if (dev_state == QLA8XXX_DEV_FAILED) {
5276 				ql4_printk(KERN_WARNING, ha, "%s: don't retry "
5277 				    "initialize adapter. H/W is in failed state\n",
5278 				    __func__);
5279 				break;
5280 			}
5281 		}
5282 		DEBUG2(printk("scsi: %s: retrying adapter initialization "
5283 			      "(%d)\n", __func__, init_retry_count));
5284 
5285 		if (ha->isp_ops->reset_chip(ha) == QLA_ERROR)
5286 			continue;
5287 
5288 		status = qla4xxx_initialize_adapter(ha, INIT_ADAPTER);
5289 	}
5290 
5291 skip_retry_init:
5292 	if (!test_bit(AF_ONLINE, &ha->flags)) {
5293 		ql4_printk(KERN_WARNING, ha, "Failed to initialize adapter\n");
5294 
5295 		if ((is_qla8022(ha) && ql4xdontresethba) ||
5296 		    (is_qla8032(ha) && qla4_83xx_idc_dontreset(ha))) {
5297 			/* Put the device in failed state. */
5298 			DEBUG2(printk(KERN_ERR "HW STATE: FAILED\n"));
5299 			ha->isp_ops->idc_lock(ha);
5300 			qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE,
5301 					    QLA8XXX_DEV_FAILED);
5302 			ha->isp_ops->idc_unlock(ha);
5303 		}
5304 		ret = -ENODEV;
5305 		goto remove_host;
5306 	}
5307 
5308 	/* Startup the kernel thread for this host adapter. */
5309 	DEBUG2(printk("scsi: %s: Starting kernel thread for "
5310 		      "qla4xxx_dpc\n", __func__));
5311 	sprintf(buf, "qla4xxx_%lu_dpc", ha->host_no);
5312 	ha->dpc_thread = create_singlethread_workqueue(buf);
5313 	if (!ha->dpc_thread) {
5314 		ql4_printk(KERN_WARNING, ha, "Unable to start DPC thread!\n");
5315 		ret = -ENODEV;
5316 		goto remove_host;
5317 	}
5318 	INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc);
5319 
5320 	sprintf(buf, "qla4xxx_%lu_task", ha->host_no);
5321 	ha->task_wq = alloc_workqueue(buf, WQ_MEM_RECLAIM, 1);
5322 	if (!ha->task_wq) {
5323 		ql4_printk(KERN_WARNING, ha, "Unable to start task thread!\n");
5324 		ret = -ENODEV;
5325 		goto remove_host;
5326 	}
5327 
5328 	/*
5329 	 * For ISP-8XXX, request_irqs is called in qla4_8xxx_load_risc
5330 	 * (which is called indirectly by qla4xxx_initialize_adapter),
5331 	 * so that irqs will be registered after crbinit but before
5332 	 * mbx_intr_enable.
5333 	 */
5334 	if (is_qla40XX(ha)) {
5335 		ret = qla4xxx_request_irqs(ha);
5336 		if (ret) {
5337 			ql4_printk(KERN_WARNING, ha, "Failed to reserve "
5338 			    "interrupt %d already in use.\n", pdev->irq);
5339 			goto remove_host;
5340 		}
5341 	}
5342 
5343 	pci_save_state(ha->pdev);
5344 	ha->isp_ops->enable_intrs(ha);
5345 
5346 	/* Start timer thread. */
5347 	qla4xxx_start_timer(ha, qla4xxx_timer, 1);
5348 
5349 	set_bit(AF_INIT_DONE, &ha->flags);
5350 
5351 	qla4_8xxx_alloc_sysfs_attr(ha);
5352 
5353 	printk(KERN_INFO
5354 	       " QLogic iSCSI HBA Driver version: %s\n"
5355 	       "  QLogic ISP%04x @ %s, host#=%ld, fw=%02d.%02d.%02d.%02d\n",
5356 	       qla4xxx_version_str, ha->pdev->device, pci_name(ha->pdev),
5357 	       ha->host_no, ha->firmware_version[0], ha->firmware_version[1],
5358 	       ha->patch_number, ha->build_number);
5359 
5360 	/* Set the driver version */
5361 	if (is_qla80XX(ha))
5362 		qla4_8xxx_set_param(ha, SET_DRVR_VERSION);
5363 
5364 	if (qla4xxx_setup_boot_info(ha))
5365 		ql4_printk(KERN_ERR, ha,
5366 			   "%s: No iSCSI boot target configured\n", __func__);
5367 
5368 		/* Perform the build ddb list and login to each */
5369 	qla4xxx_build_ddb_list(ha, INIT_ADAPTER);
5370 	iscsi_host_for_each_session(ha->host, qla4xxx_login_flash_ddb);
5371 
5372 	qla4xxx_create_chap_list(ha);
5373 
5374 	qla4xxx_create_ifaces(ha);
5375 	return 0;
5376 
5377 remove_host:
5378 	scsi_remove_host(ha->host);
5379 
5380 probe_failed:
5381 	qla4xxx_free_adapter(ha);
5382 
5383 probe_failed_ioconfig:
5384 	pci_disable_pcie_error_reporting(pdev);
5385 	scsi_host_put(ha->host);
5386 
5387 probe_disable_device:
5388 	pci_disable_device(pdev);
5389 
5390 	return ret;
5391 }
5392 
5393 /**
5394  * qla4xxx_prevent_other_port_reinit - prevent other port from re-initialize
5395  * @ha: pointer to adapter structure
5396  *
5397  * Mark the other ISP-4xxx port to indicate that the driver is being removed,
5398  * so that the other port will not re-initialize while in the process of
5399  * removing the ha due to driver unload or hba hotplug.
5400  **/
5401 static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha)
5402 {
5403 	struct scsi_qla_host *other_ha = NULL;
5404 	struct pci_dev *other_pdev = NULL;
5405 	int fn = ISP4XXX_PCI_FN_2;
5406 
5407 	/*iscsi function numbers for ISP4xxx is 1 and 3*/
5408 	if (PCI_FUNC(ha->pdev->devfn) & BIT_1)
5409 		fn = ISP4XXX_PCI_FN_1;
5410 
5411 	other_pdev =
5412 		pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus),
5413 		ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn),
5414 		fn));
5415 
5416 	/* Get other_ha if other_pdev is valid and state is enable*/
5417 	if (other_pdev) {
5418 		if (atomic_read(&other_pdev->enable_cnt)) {
5419 			other_ha = pci_get_drvdata(other_pdev);
5420 			if (other_ha) {
5421 				set_bit(AF_HA_REMOVAL, &other_ha->flags);
5422 				DEBUG2(ql4_printk(KERN_INFO, ha, "%s: "
5423 				    "Prevent %s reinit\n", __func__,
5424 				    dev_name(&other_ha->pdev->dev)));
5425 			}
5426 		}
5427 		pci_dev_put(other_pdev);
5428 	}
5429 }
5430 
5431 static void qla4xxx_destroy_fw_ddb_session(struct scsi_qla_host *ha)
5432 {
5433 	struct ddb_entry *ddb_entry;
5434 	int options;
5435 	int idx;
5436 
5437 	for (idx = 0; idx < MAX_DDB_ENTRIES; idx++) {
5438 
5439 		ddb_entry = qla4xxx_lookup_ddb_by_fw_index(ha, idx);
5440 		if ((ddb_entry != NULL) &&
5441 		    (ddb_entry->ddb_type == FLASH_DDB)) {
5442 
5443 			options = LOGOUT_OPTION_CLOSE_SESSION;
5444 			if (qla4xxx_session_logout_ddb(ha, ddb_entry, options)
5445 			    == QLA_ERROR)
5446 				ql4_printk(KERN_ERR, ha, "%s: Logout failed\n",
5447 					   __func__);
5448 
5449 			qla4xxx_clear_ddb_entry(ha, ddb_entry->fw_ddb_index);
5450 			/*
5451 			 * we have decremented the reference count of the driver
5452 			 * when we setup the session to have the driver unload
5453 			 * to be seamless without actually destroying the
5454 			 * session
5455 			 **/
5456 			try_module_get(qla4xxx_iscsi_transport.owner);
5457 			iscsi_destroy_endpoint(ddb_entry->conn->ep);
5458 			qla4xxx_free_ddb(ha, ddb_entry);
5459 			iscsi_session_teardown(ddb_entry->sess);
5460 		}
5461 	}
5462 }
5463 /**
5464  * qla4xxx_remove_adapter - callback function to remove adapter.
5465  * @pci_dev: PCI device pointer
5466  **/
5467 static void qla4xxx_remove_adapter(struct pci_dev *pdev)
5468 {
5469 	struct scsi_qla_host *ha;
5470 
5471 	/*
5472 	 * If the PCI device is disabled then it means probe_adapter had
5473 	 * failed and resources already cleaned up on probe_adapter exit.
5474 	 */
5475 	if (!pci_is_enabled(pdev))
5476 		return;
5477 
5478 	ha = pci_get_drvdata(pdev);
5479 
5480 	if (is_qla40XX(ha))
5481 		qla4xxx_prevent_other_port_reinit(ha);
5482 
5483 	/* destroy iface from sysfs */
5484 	qla4xxx_destroy_ifaces(ha);
5485 
5486 	if ((!ql4xdisablesysfsboot) && ha->boot_kset)
5487 		iscsi_boot_destroy_kset(ha->boot_kset);
5488 
5489 	qla4xxx_destroy_fw_ddb_session(ha);
5490 	qla4_8xxx_free_sysfs_attr(ha);
5491 
5492 	scsi_remove_host(ha->host);
5493 
5494 	qla4xxx_free_adapter(ha);
5495 
5496 	scsi_host_put(ha->host);
5497 
5498 	pci_disable_pcie_error_reporting(pdev);
5499 	pci_disable_device(pdev);
5500 	pci_set_drvdata(pdev, NULL);
5501 }
5502 
5503 /**
5504  * qla4xxx_config_dma_addressing() - Configure OS DMA addressing method.
5505  * @ha: HA context
5506  *
5507  * At exit, the @ha's flags.enable_64bit_addressing set to indicated
5508  * supported addressing method.
5509  */
5510 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha)
5511 {
5512 	int retval;
5513 
5514 	/* Update our PCI device dma_mask for full 64 bit mask */
5515 	if (pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(64)) == 0) {
5516 		if (pci_set_consistent_dma_mask(ha->pdev, DMA_BIT_MASK(64))) {
5517 			dev_dbg(&ha->pdev->dev,
5518 				  "Failed to set 64 bit PCI consistent mask; "
5519 				   "using 32 bit.\n");
5520 			retval = pci_set_consistent_dma_mask(ha->pdev,
5521 							     DMA_BIT_MASK(32));
5522 		}
5523 	} else
5524 		retval = pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(32));
5525 }
5526 
5527 static int qla4xxx_slave_alloc(struct scsi_device *sdev)
5528 {
5529 	struct iscsi_cls_session *cls_sess;
5530 	struct iscsi_session *sess;
5531 	struct ddb_entry *ddb;
5532 	int queue_depth = QL4_DEF_QDEPTH;
5533 
5534 	cls_sess = starget_to_session(sdev->sdev_target);
5535 	sess = cls_sess->dd_data;
5536 	ddb = sess->dd_data;
5537 
5538 	sdev->hostdata = ddb;
5539 	sdev->tagged_supported = 1;
5540 
5541 	if (ql4xmaxqdepth != 0 && ql4xmaxqdepth <= 0xffffU)
5542 		queue_depth = ql4xmaxqdepth;
5543 
5544 	scsi_activate_tcq(sdev, queue_depth);
5545 	return 0;
5546 }
5547 
5548 static int qla4xxx_slave_configure(struct scsi_device *sdev)
5549 {
5550 	sdev->tagged_supported = 1;
5551 	return 0;
5552 }
5553 
5554 static void qla4xxx_slave_destroy(struct scsi_device *sdev)
5555 {
5556 	scsi_deactivate_tcq(sdev, 1);
5557 }
5558 
5559 static int qla4xxx_change_queue_depth(struct scsi_device *sdev, int qdepth,
5560 				      int reason)
5561 {
5562 	if (!ql4xqfulltracking)
5563 		return -EOPNOTSUPP;
5564 
5565 	return iscsi_change_queue_depth(sdev, qdepth, reason);
5566 }
5567 
5568 /**
5569  * qla4xxx_del_from_active_array - returns an active srb
5570  * @ha: Pointer to host adapter structure.
5571  * @index: index into the active_array
5572  *
5573  * This routine removes and returns the srb at the specified index
5574  **/
5575 struct srb *qla4xxx_del_from_active_array(struct scsi_qla_host *ha,
5576     uint32_t index)
5577 {
5578 	struct srb *srb = NULL;
5579 	struct scsi_cmnd *cmd = NULL;
5580 
5581 	cmd = scsi_host_find_tag(ha->host, index);
5582 	if (!cmd)
5583 		return srb;
5584 
5585 	srb = (struct srb *)CMD_SP(cmd);
5586 	if (!srb)
5587 		return srb;
5588 
5589 	/* update counters */
5590 	if (srb->flags & SRB_DMA_VALID) {
5591 		ha->req_q_count += srb->iocb_cnt;
5592 		ha->iocb_cnt -= srb->iocb_cnt;
5593 		if (srb->cmd)
5594 			srb->cmd->host_scribble =
5595 				(unsigned char *)(unsigned long) MAX_SRBS;
5596 	}
5597 	return srb;
5598 }
5599 
5600 /**
5601  * qla4xxx_eh_wait_on_command - waits for command to be returned by firmware
5602  * @ha: Pointer to host adapter structure.
5603  * @cmd: Scsi Command to wait on.
5604  *
5605  * This routine waits for the command to be returned by the Firmware
5606  * for some max time.
5607  **/
5608 static int qla4xxx_eh_wait_on_command(struct scsi_qla_host *ha,
5609 				      struct scsi_cmnd *cmd)
5610 {
5611 	int done = 0;
5612 	struct srb *rp;
5613 	uint32_t max_wait_time = EH_WAIT_CMD_TOV;
5614 	int ret = SUCCESS;
5615 
5616 	/* Dont wait on command if PCI error is being handled
5617 	 * by PCI AER driver
5618 	 */
5619 	if (unlikely(pci_channel_offline(ha->pdev)) ||
5620 	    (test_bit(AF_EEH_BUSY, &ha->flags))) {
5621 		ql4_printk(KERN_WARNING, ha, "scsi%ld: Return from %s\n",
5622 		    ha->host_no, __func__);
5623 		return ret;
5624 	}
5625 
5626 	do {
5627 		/* Checking to see if its returned to OS */
5628 		rp = (struct srb *) CMD_SP(cmd);
5629 		if (rp == NULL) {
5630 			done++;
5631 			break;
5632 		}
5633 
5634 		msleep(2000);
5635 	} while (max_wait_time--);
5636 
5637 	return done;
5638 }
5639 
5640 /**
5641  * qla4xxx_wait_for_hba_online - waits for HBA to come online
5642  * @ha: Pointer to host adapter structure
5643  **/
5644 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha)
5645 {
5646 	unsigned long wait_online;
5647 
5648 	wait_online = jiffies + (HBA_ONLINE_TOV * HZ);
5649 	while (time_before(jiffies, wait_online)) {
5650 
5651 		if (adapter_up(ha))
5652 			return QLA_SUCCESS;
5653 
5654 		msleep(2000);
5655 	}
5656 
5657 	return QLA_ERROR;
5658 }
5659 
5660 /**
5661  * qla4xxx_eh_wait_for_commands - wait for active cmds to finish.
5662  * @ha: pointer to HBA
5663  * @t: target id
5664  * @l: lun id
5665  *
5666  * This function waits for all outstanding commands to a lun to complete. It
5667  * returns 0 if all pending commands are returned and 1 otherwise.
5668  **/
5669 static int qla4xxx_eh_wait_for_commands(struct scsi_qla_host *ha,
5670 					struct scsi_target *stgt,
5671 					struct scsi_device *sdev)
5672 {
5673 	int cnt;
5674 	int status = 0;
5675 	struct scsi_cmnd *cmd;
5676 
5677 	/*
5678 	 * Waiting for all commands for the designated target or dev
5679 	 * in the active array
5680 	 */
5681 	for (cnt = 0; cnt < ha->host->can_queue; cnt++) {
5682 		cmd = scsi_host_find_tag(ha->host, cnt);
5683 		if (cmd && stgt == scsi_target(cmd->device) &&
5684 		    (!sdev || sdev == cmd->device)) {
5685 			if (!qla4xxx_eh_wait_on_command(ha, cmd)) {
5686 				status++;
5687 				break;
5688 			}
5689 		}
5690 	}
5691 	return status;
5692 }
5693 
5694 /**
5695  * qla4xxx_eh_abort - callback for abort task.
5696  * @cmd: Pointer to Linux's SCSI command structure
5697  *
5698  * This routine is called by the Linux OS to abort the specified
5699  * command.
5700  **/
5701 static int qla4xxx_eh_abort(struct scsi_cmnd *cmd)
5702 {
5703 	struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
5704 	unsigned int id = cmd->device->id;
5705 	unsigned int lun = cmd->device->lun;
5706 	unsigned long flags;
5707 	struct srb *srb = NULL;
5708 	int ret = SUCCESS;
5709 	int wait = 0;
5710 
5711 	ql4_printk(KERN_INFO, ha,
5712 	    "scsi%ld:%d:%d: Abort command issued cmd=%p\n",
5713 	    ha->host_no, id, lun, cmd);
5714 
5715 	spin_lock_irqsave(&ha->hardware_lock, flags);
5716 	srb = (struct srb *) CMD_SP(cmd);
5717 	if (!srb) {
5718 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
5719 		return SUCCESS;
5720 	}
5721 	kref_get(&srb->srb_ref);
5722 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
5723 
5724 	if (qla4xxx_abort_task(ha, srb) != QLA_SUCCESS) {
5725 		DEBUG3(printk("scsi%ld:%d:%d: Abort_task mbx failed.\n",
5726 		    ha->host_no, id, lun));
5727 		ret = FAILED;
5728 	} else {
5729 		DEBUG3(printk("scsi%ld:%d:%d: Abort_task mbx success.\n",
5730 		    ha->host_no, id, lun));
5731 		wait = 1;
5732 	}
5733 
5734 	kref_put(&srb->srb_ref, qla4xxx_srb_compl);
5735 
5736 	/* Wait for command to complete */
5737 	if (wait) {
5738 		if (!qla4xxx_eh_wait_on_command(ha, cmd)) {
5739 			DEBUG2(printk("scsi%ld:%d:%d: Abort handler timed out\n",
5740 			    ha->host_no, id, lun));
5741 			ret = FAILED;
5742 		}
5743 	}
5744 
5745 	ql4_printk(KERN_INFO, ha,
5746 	    "scsi%ld:%d:%d: Abort command - %s\n",
5747 	    ha->host_no, id, lun, (ret == SUCCESS) ? "succeeded" : "failed");
5748 
5749 	return ret;
5750 }
5751 
5752 /**
5753  * qla4xxx_eh_device_reset - callback for target reset.
5754  * @cmd: Pointer to Linux's SCSI command structure
5755  *
5756  * This routine is called by the Linux OS to reset all luns on the
5757  * specified target.
5758  **/
5759 static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
5760 {
5761 	struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
5762 	struct ddb_entry *ddb_entry = cmd->device->hostdata;
5763 	int ret = FAILED, stat;
5764 
5765 	if (!ddb_entry)
5766 		return ret;
5767 
5768 	ret = iscsi_block_scsi_eh(cmd);
5769 	if (ret)
5770 		return ret;
5771 	ret = FAILED;
5772 
5773 	ql4_printk(KERN_INFO, ha,
5774 		   "scsi%ld:%d:%d:%d: DEVICE RESET ISSUED.\n", ha->host_no,
5775 		   cmd->device->channel, cmd->device->id, cmd->device->lun);
5776 
5777 	DEBUG2(printk(KERN_INFO
5778 		      "scsi%ld: DEVICE_RESET cmd=%p jiffies = 0x%lx, to=%x,"
5779 		      "dpc_flags=%lx, status=%x allowed=%d\n", ha->host_no,
5780 		      cmd, jiffies, cmd->request->timeout / HZ,
5781 		      ha->dpc_flags, cmd->result, cmd->allowed));
5782 
5783 	/* FIXME: wait for hba to go online */
5784 	stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun);
5785 	if (stat != QLA_SUCCESS) {
5786 		ql4_printk(KERN_INFO, ha, "DEVICE RESET FAILED. %d\n", stat);
5787 		goto eh_dev_reset_done;
5788 	}
5789 
5790 	if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device),
5791 					 cmd->device)) {
5792 		ql4_printk(KERN_INFO, ha,
5793 			   "DEVICE RESET FAILED - waiting for "
5794 			   "commands.\n");
5795 		goto eh_dev_reset_done;
5796 	}
5797 
5798 	/* Send marker. */
5799 	if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun,
5800 		MM_LUN_RESET) != QLA_SUCCESS)
5801 		goto eh_dev_reset_done;
5802 
5803 	ql4_printk(KERN_INFO, ha,
5804 		   "scsi(%ld:%d:%d:%d): DEVICE RESET SUCCEEDED.\n",
5805 		   ha->host_no, cmd->device->channel, cmd->device->id,
5806 		   cmd->device->lun);
5807 
5808 	ret = SUCCESS;
5809 
5810 eh_dev_reset_done:
5811 
5812 	return ret;
5813 }
5814 
5815 /**
5816  * qla4xxx_eh_target_reset - callback for target reset.
5817  * @cmd: Pointer to Linux's SCSI command structure
5818  *
5819  * This routine is called by the Linux OS to reset the target.
5820  **/
5821 static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd)
5822 {
5823 	struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
5824 	struct ddb_entry *ddb_entry = cmd->device->hostdata;
5825 	int stat, ret;
5826 
5827 	if (!ddb_entry)
5828 		return FAILED;
5829 
5830 	ret = iscsi_block_scsi_eh(cmd);
5831 	if (ret)
5832 		return ret;
5833 
5834 	starget_printk(KERN_INFO, scsi_target(cmd->device),
5835 		       "WARM TARGET RESET ISSUED.\n");
5836 
5837 	DEBUG2(printk(KERN_INFO
5838 		      "scsi%ld: TARGET_DEVICE_RESET cmd=%p jiffies = 0x%lx, "
5839 		      "to=%x,dpc_flags=%lx, status=%x allowed=%d\n",
5840 		      ha->host_no, cmd, jiffies, cmd->request->timeout / HZ,
5841 		      ha->dpc_flags, cmd->result, cmd->allowed));
5842 
5843 	stat = qla4xxx_reset_target(ha, ddb_entry);
5844 	if (stat != QLA_SUCCESS) {
5845 		starget_printk(KERN_INFO, scsi_target(cmd->device),
5846 			       "WARM TARGET RESET FAILED.\n");
5847 		return FAILED;
5848 	}
5849 
5850 	if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device),
5851 					 NULL)) {
5852 		starget_printk(KERN_INFO, scsi_target(cmd->device),
5853 			       "WARM TARGET DEVICE RESET FAILED - "
5854 			       "waiting for commands.\n");
5855 		return FAILED;
5856 	}
5857 
5858 	/* Send marker. */
5859 	if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun,
5860 		MM_TGT_WARM_RESET) != QLA_SUCCESS) {
5861 		starget_printk(KERN_INFO, scsi_target(cmd->device),
5862 			       "WARM TARGET DEVICE RESET FAILED - "
5863 			       "marker iocb failed.\n");
5864 		return FAILED;
5865 	}
5866 
5867 	starget_printk(KERN_INFO, scsi_target(cmd->device),
5868 		       "WARM TARGET RESET SUCCEEDED.\n");
5869 	return SUCCESS;
5870 }
5871 
5872 /**
5873  * qla4xxx_is_eh_active - check if error handler is running
5874  * @shost: Pointer to SCSI Host struct
5875  *
5876  * This routine finds that if reset host is called in EH
5877  * scenario or from some application like sg_reset
5878  **/
5879 static int qla4xxx_is_eh_active(struct Scsi_Host *shost)
5880 {
5881 	if (shost->shost_state == SHOST_RECOVERY)
5882 		return 1;
5883 	return 0;
5884 }
5885 
5886 /**
5887  * qla4xxx_eh_host_reset - kernel callback
5888  * @cmd: Pointer to Linux's SCSI command structure
5889  *
5890  * This routine is invoked by the Linux kernel to perform fatal error
5891  * recovery on the specified adapter.
5892  **/
5893 static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd)
5894 {
5895 	int return_status = FAILED;
5896 	struct scsi_qla_host *ha;
5897 
5898 	ha = to_qla_host(cmd->device->host);
5899 
5900 	if (is_qla8032(ha) && ql4xdontresethba)
5901 		qla4_83xx_set_idc_dontreset(ha);
5902 
5903 	/*
5904 	 * For ISP8324, if IDC_CTRL DONTRESET_BIT0 is set by other
5905 	 * protocol drivers, we should not set device_state to
5906 	 * NEED_RESET
5907 	 */
5908 	if (ql4xdontresethba ||
5909 	    (is_qla8032(ha) && qla4_83xx_idc_dontreset(ha))) {
5910 		DEBUG2(printk("scsi%ld: %s: Don't Reset HBA\n",
5911 		     ha->host_no, __func__));
5912 
5913 		/* Clear outstanding srb in queues */
5914 		if (qla4xxx_is_eh_active(cmd->device->host))
5915 			qla4xxx_abort_active_cmds(ha, DID_ABORT << 16);
5916 
5917 		return FAILED;
5918 	}
5919 
5920 	ql4_printk(KERN_INFO, ha,
5921 		   "scsi(%ld:%d:%d:%d): HOST RESET ISSUED.\n", ha->host_no,
5922 		   cmd->device->channel, cmd->device->id, cmd->device->lun);
5923 
5924 	if (qla4xxx_wait_for_hba_online(ha) != QLA_SUCCESS) {
5925 		DEBUG2(printk("scsi%ld:%d: %s: Unable to reset host.  Adapter "
5926 			      "DEAD.\n", ha->host_no, cmd->device->channel,
5927 			      __func__));
5928 
5929 		return FAILED;
5930 	}
5931 
5932 	if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) {
5933 		if (is_qla80XX(ha))
5934 			set_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags);
5935 		else
5936 			set_bit(DPC_RESET_HA, &ha->dpc_flags);
5937 	}
5938 
5939 	if (qla4xxx_recover_adapter(ha) == QLA_SUCCESS)
5940 		return_status = SUCCESS;
5941 
5942 	ql4_printk(KERN_INFO, ha, "HOST RESET %s.\n",
5943 		   return_status == FAILED ? "FAILED" : "SUCCEEDED");
5944 
5945 	return return_status;
5946 }
5947 
5948 static int qla4xxx_context_reset(struct scsi_qla_host *ha)
5949 {
5950 	uint32_t mbox_cmd[MBOX_REG_COUNT];
5951 	uint32_t mbox_sts[MBOX_REG_COUNT];
5952 	struct addr_ctrl_blk_def *acb = NULL;
5953 	uint32_t acb_len = sizeof(struct addr_ctrl_blk_def);
5954 	int rval = QLA_SUCCESS;
5955 	dma_addr_t acb_dma;
5956 
5957 	acb = dma_alloc_coherent(&ha->pdev->dev,
5958 				 sizeof(struct addr_ctrl_blk_def),
5959 				 &acb_dma, GFP_KERNEL);
5960 	if (!acb) {
5961 		ql4_printk(KERN_ERR, ha, "%s: Unable to alloc acb\n",
5962 			   __func__);
5963 		rval = -ENOMEM;
5964 		goto exit_port_reset;
5965 	}
5966 
5967 	memset(acb, 0, acb_len);
5968 
5969 	rval = qla4xxx_get_acb(ha, acb_dma, PRIMARI_ACB, acb_len);
5970 	if (rval != QLA_SUCCESS) {
5971 		rval = -EIO;
5972 		goto exit_free_acb;
5973 	}
5974 
5975 	rval = qla4xxx_disable_acb(ha);
5976 	if (rval != QLA_SUCCESS) {
5977 		rval = -EIO;
5978 		goto exit_free_acb;
5979 	}
5980 
5981 	wait_for_completion_timeout(&ha->disable_acb_comp,
5982 				    DISABLE_ACB_TOV * HZ);
5983 
5984 	rval = qla4xxx_set_acb(ha, &mbox_cmd[0], &mbox_sts[0], acb_dma);
5985 	if (rval != QLA_SUCCESS) {
5986 		rval = -EIO;
5987 		goto exit_free_acb;
5988 	}
5989 
5990 exit_free_acb:
5991 	dma_free_coherent(&ha->pdev->dev, sizeof(struct addr_ctrl_blk_def),
5992 			  acb, acb_dma);
5993 exit_port_reset:
5994 	DEBUG2(ql4_printk(KERN_INFO, ha, "%s %s\n", __func__,
5995 			  rval == QLA_SUCCESS ? "SUCCEEDED" : "FAILED"));
5996 	return rval;
5997 }
5998 
5999 static int qla4xxx_host_reset(struct Scsi_Host *shost, int reset_type)
6000 {
6001 	struct scsi_qla_host *ha = to_qla_host(shost);
6002 	int rval = QLA_SUCCESS;
6003 
6004 	if (ql4xdontresethba) {
6005 		DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Don't Reset HBA\n",
6006 				  __func__));
6007 		rval = -EPERM;
6008 		goto exit_host_reset;
6009 	}
6010 
6011 	rval = qla4xxx_wait_for_hba_online(ha);
6012 	if (rval != QLA_SUCCESS) {
6013 		DEBUG2(ql4_printk(KERN_INFO, ha, "%s: Unable to reset host "
6014 				  "adapter\n", __func__));
6015 		rval = -EIO;
6016 		goto exit_host_reset;
6017 	}
6018 
6019 	if (test_bit(DPC_RESET_HA, &ha->dpc_flags))
6020 		goto recover_adapter;
6021 
6022 	switch (reset_type) {
6023 	case SCSI_ADAPTER_RESET:
6024 		set_bit(DPC_RESET_HA, &ha->dpc_flags);
6025 		break;
6026 	case SCSI_FIRMWARE_RESET:
6027 		if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) {
6028 			if (is_qla80XX(ha))
6029 				/* set firmware context reset */
6030 				set_bit(DPC_RESET_HA_FW_CONTEXT,
6031 					&ha->dpc_flags);
6032 			else {
6033 				rval = qla4xxx_context_reset(ha);
6034 				goto exit_host_reset;
6035 			}
6036 		}
6037 		break;
6038 	}
6039 
6040 recover_adapter:
6041 	rval = qla4xxx_recover_adapter(ha);
6042 	if (rval != QLA_SUCCESS) {
6043 		DEBUG2(ql4_printk(KERN_INFO, ha, "%s: recover adapter fail\n",
6044 				  __func__));
6045 		rval = -EIO;
6046 	}
6047 
6048 exit_host_reset:
6049 	return rval;
6050 }
6051 
6052 /* PCI AER driver recovers from all correctable errors w/o
6053  * driver intervention. For uncorrectable errors PCI AER
6054  * driver calls the following device driver's callbacks
6055  *
6056  * - Fatal Errors - link_reset
6057  * - Non-Fatal Errors - driver's pci_error_detected() which
6058  * returns CAN_RECOVER, NEED_RESET or DISCONNECT.
6059  *
6060  * PCI AER driver calls
6061  * CAN_RECOVER - driver's pci_mmio_enabled(), mmio_enabled
6062  *               returns RECOVERED or NEED_RESET if fw_hung
6063  * NEED_RESET - driver's slot_reset()
6064  * DISCONNECT - device is dead & cannot recover
6065  * RECOVERED - driver's pci_resume()
6066  */
6067 static pci_ers_result_t
6068 qla4xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
6069 {
6070 	struct scsi_qla_host *ha = pci_get_drvdata(pdev);
6071 
6072 	ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: error detected:state %x\n",
6073 	    ha->host_no, __func__, state);
6074 
6075 	if (!is_aer_supported(ha))
6076 		return PCI_ERS_RESULT_NONE;
6077 
6078 	switch (state) {
6079 	case pci_channel_io_normal:
6080 		clear_bit(AF_EEH_BUSY, &ha->flags);
6081 		return PCI_ERS_RESULT_CAN_RECOVER;
6082 	case pci_channel_io_frozen:
6083 		set_bit(AF_EEH_BUSY, &ha->flags);
6084 		qla4xxx_mailbox_premature_completion(ha);
6085 		qla4xxx_free_irqs(ha);
6086 		pci_disable_device(pdev);
6087 		/* Return back all IOs */
6088 		qla4xxx_abort_active_cmds(ha, DID_RESET << 16);
6089 		return PCI_ERS_RESULT_NEED_RESET;
6090 	case pci_channel_io_perm_failure:
6091 		set_bit(AF_EEH_BUSY, &ha->flags);
6092 		set_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags);
6093 		qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16);
6094 		return PCI_ERS_RESULT_DISCONNECT;
6095 	}
6096 	return PCI_ERS_RESULT_NEED_RESET;
6097 }
6098 
6099 /**
6100  * qla4xxx_pci_mmio_enabled() gets called if
6101  * qla4xxx_pci_error_detected() returns PCI_ERS_RESULT_CAN_RECOVER
6102  * and read/write to the device still works.
6103  **/
6104 static pci_ers_result_t
6105 qla4xxx_pci_mmio_enabled(struct pci_dev *pdev)
6106 {
6107 	struct scsi_qla_host *ha = pci_get_drvdata(pdev);
6108 
6109 	if (!is_aer_supported(ha))
6110 		return PCI_ERS_RESULT_NONE;
6111 
6112 	return PCI_ERS_RESULT_RECOVERED;
6113 }
6114 
6115 static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha)
6116 {
6117 	uint32_t rval = QLA_ERROR;
6118 	uint32_t ret = 0;
6119 	int fn;
6120 	struct pci_dev *other_pdev = NULL;
6121 
6122 	ql4_printk(KERN_WARNING, ha, "scsi%ld: In %s\n", ha->host_no, __func__);
6123 
6124 	set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags);
6125 
6126 	if (test_bit(AF_ONLINE, &ha->flags)) {
6127 		clear_bit(AF_ONLINE, &ha->flags);
6128 		clear_bit(AF_LINK_UP, &ha->flags);
6129 		iscsi_host_for_each_session(ha->host, qla4xxx_fail_session);
6130 		qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
6131 	}
6132 
6133 	fn = PCI_FUNC(ha->pdev->devfn);
6134 	while (fn > 0) {
6135 		fn--;
6136 		ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Finding PCI device at "
6137 		    "func %x\n", ha->host_no, __func__, fn);
6138 		/* Get the pci device given the domain, bus,
6139 		 * slot/function number */
6140 		other_pdev =
6141 		    pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus),
6142 		    ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn),
6143 		    fn));
6144 
6145 		if (!other_pdev)
6146 			continue;
6147 
6148 		if (atomic_read(&other_pdev->enable_cnt)) {
6149 			ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Found PCI "
6150 			    "func in enabled state%x\n", ha->host_no,
6151 			    __func__, fn);
6152 			pci_dev_put(other_pdev);
6153 			break;
6154 		}
6155 		pci_dev_put(other_pdev);
6156 	}
6157 
6158 	/* The first function on the card, the reset owner will
6159 	 * start & initialize the firmware. The other functions
6160 	 * on the card will reset the firmware context
6161 	 */
6162 	if (!fn) {
6163 		ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn being reset "
6164 		    "0x%x is the owner\n", ha->host_no, __func__,
6165 		    ha->pdev->devfn);
6166 
6167 		ha->isp_ops->idc_lock(ha);
6168 		qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE,
6169 				    QLA8XXX_DEV_COLD);
6170 		ha->isp_ops->idc_unlock(ha);
6171 
6172 		rval = qla4_8xxx_update_idc_reg(ha);
6173 		if (rval == QLA_ERROR) {
6174 			ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: FAILED\n",
6175 				   ha->host_no, __func__);
6176 			ha->isp_ops->idc_lock(ha);
6177 			qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE,
6178 					    QLA8XXX_DEV_FAILED);
6179 			ha->isp_ops->idc_unlock(ha);
6180 			goto exit_error_recovery;
6181 		}
6182 
6183 		clear_bit(AF_FW_RECOVERY, &ha->flags);
6184 		rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER);
6185 
6186 		if (rval != QLA_SUCCESS) {
6187 			ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: "
6188 			    "FAILED\n", ha->host_no, __func__);
6189 			ha->isp_ops->idc_lock(ha);
6190 			qla4_8xxx_clear_drv_active(ha);
6191 			qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE,
6192 					    QLA8XXX_DEV_FAILED);
6193 			ha->isp_ops->idc_unlock(ha);
6194 		} else {
6195 			ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: "
6196 			    "READY\n", ha->host_no, __func__);
6197 			ha->isp_ops->idc_lock(ha);
6198 			qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DEV_STATE,
6199 					    QLA8XXX_DEV_READY);
6200 			/* Clear driver state register */
6201 			qla4_8xxx_wr_direct(ha, QLA8XXX_CRB_DRV_STATE, 0);
6202 			qla4_8xxx_set_drv_active(ha);
6203 			ha->isp_ops->idc_unlock(ha);
6204 			ret = qla4xxx_request_irqs(ha);
6205 			if (ret) {
6206 				ql4_printk(KERN_WARNING, ha, "Failed to "
6207 				    "reserve interrupt %d already in use.\n",
6208 				    ha->pdev->irq);
6209 				rval = QLA_ERROR;
6210 			} else {
6211 				ha->isp_ops->enable_intrs(ha);
6212 				rval = QLA_SUCCESS;
6213 			}
6214 		}
6215 	} else {
6216 		ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn 0x%x is not "
6217 		    "the reset owner\n", ha->host_no, __func__,
6218 		    ha->pdev->devfn);
6219 		if ((qla4_8xxx_rd_direct(ha, QLA8XXX_CRB_DEV_STATE) ==
6220 		     QLA8XXX_DEV_READY)) {
6221 			clear_bit(AF_FW_RECOVERY, &ha->flags);
6222 			rval = qla4xxx_initialize_adapter(ha, RESET_ADAPTER);
6223 			if (rval == QLA_SUCCESS) {
6224 				ret = qla4xxx_request_irqs(ha);
6225 				if (ret) {
6226 					ql4_printk(KERN_WARNING, ha, "Failed to"
6227 					    " reserve interrupt %d already in"
6228 					    " use.\n", ha->pdev->irq);
6229 					rval = QLA_ERROR;
6230 				} else {
6231 					ha->isp_ops->enable_intrs(ha);
6232 					rval = QLA_SUCCESS;
6233 				}
6234 			}
6235 			ha->isp_ops->idc_lock(ha);
6236 			qla4_8xxx_set_drv_active(ha);
6237 			ha->isp_ops->idc_unlock(ha);
6238 		}
6239 	}
6240 exit_error_recovery:
6241 	clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags);
6242 	return rval;
6243 }
6244 
6245 static pci_ers_result_t
6246 qla4xxx_pci_slot_reset(struct pci_dev *pdev)
6247 {
6248 	pci_ers_result_t ret = PCI_ERS_RESULT_DISCONNECT;
6249 	struct scsi_qla_host *ha = pci_get_drvdata(pdev);
6250 	int rc;
6251 
6252 	ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: slot_reset\n",
6253 	    ha->host_no, __func__);
6254 
6255 	if (!is_aer_supported(ha))
6256 		return PCI_ERS_RESULT_NONE;
6257 
6258 	/* Restore the saved state of PCIe device -
6259 	 * BAR registers, PCI Config space, PCIX, MSI,
6260 	 * IOV states
6261 	 */
6262 	pci_restore_state(pdev);
6263 
6264 	/* pci_restore_state() clears the saved_state flag of the device
6265 	 * save restored state which resets saved_state flag
6266 	 */
6267 	pci_save_state(pdev);
6268 
6269 	/* Initialize device or resume if in suspended state */
6270 	rc = pci_enable_device(pdev);
6271 	if (rc) {
6272 		ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Can't re-enable "
6273 		    "device after reset\n", ha->host_no, __func__);
6274 		goto exit_slot_reset;
6275 	}
6276 
6277 	ha->isp_ops->disable_intrs(ha);
6278 
6279 	if (is_qla80XX(ha)) {
6280 		if (qla4_8xxx_error_recovery(ha) == QLA_SUCCESS) {
6281 			ret = PCI_ERS_RESULT_RECOVERED;
6282 			goto exit_slot_reset;
6283 		} else
6284 			goto exit_slot_reset;
6285 	}
6286 
6287 exit_slot_reset:
6288 	ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Return=%x\n"
6289 	    "device after reset\n", ha->host_no, __func__, ret);
6290 	return ret;
6291 }
6292 
6293 static void
6294 qla4xxx_pci_resume(struct pci_dev *pdev)
6295 {
6296 	struct scsi_qla_host *ha = pci_get_drvdata(pdev);
6297 	int ret;
6298 
6299 	ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: pci_resume\n",
6300 	    ha->host_no, __func__);
6301 
6302 	ret = qla4xxx_wait_for_hba_online(ha);
6303 	if (ret != QLA_SUCCESS) {
6304 		ql4_printk(KERN_ERR, ha, "scsi%ld: %s: the device failed to "
6305 		    "resume I/O from slot/link_reset\n", ha->host_no,
6306 		     __func__);
6307 	}
6308 
6309 	pci_cleanup_aer_uncorrect_error_status(pdev);
6310 	clear_bit(AF_EEH_BUSY, &ha->flags);
6311 }
6312 
6313 static const struct pci_error_handlers qla4xxx_err_handler = {
6314 	.error_detected = qla4xxx_pci_error_detected,
6315 	.mmio_enabled = qla4xxx_pci_mmio_enabled,
6316 	.slot_reset = qla4xxx_pci_slot_reset,
6317 	.resume = qla4xxx_pci_resume,
6318 };
6319 
6320 static struct pci_device_id qla4xxx_pci_tbl[] = {
6321 	{
6322 		.vendor		= PCI_VENDOR_ID_QLOGIC,
6323 		.device		= PCI_DEVICE_ID_QLOGIC_ISP4010,
6324 		.subvendor	= PCI_ANY_ID,
6325 		.subdevice	= PCI_ANY_ID,
6326 	},
6327 	{
6328 		.vendor		= PCI_VENDOR_ID_QLOGIC,
6329 		.device		= PCI_DEVICE_ID_QLOGIC_ISP4022,
6330 		.subvendor	= PCI_ANY_ID,
6331 		.subdevice	= PCI_ANY_ID,
6332 	},
6333 	{
6334 		.vendor		= PCI_VENDOR_ID_QLOGIC,
6335 		.device		= PCI_DEVICE_ID_QLOGIC_ISP4032,
6336 		.subvendor	= PCI_ANY_ID,
6337 		.subdevice	= PCI_ANY_ID,
6338 	},
6339 	{
6340 		.vendor         = PCI_VENDOR_ID_QLOGIC,
6341 		.device         = PCI_DEVICE_ID_QLOGIC_ISP8022,
6342 		.subvendor      = PCI_ANY_ID,
6343 		.subdevice      = PCI_ANY_ID,
6344 	},
6345 	{
6346 		.vendor		= PCI_VENDOR_ID_QLOGIC,
6347 		.device		= PCI_DEVICE_ID_QLOGIC_ISP8324,
6348 		.subvendor	= PCI_ANY_ID,
6349 		.subdevice	= PCI_ANY_ID,
6350 	},
6351 	{0, 0},
6352 };
6353 MODULE_DEVICE_TABLE(pci, qla4xxx_pci_tbl);
6354 
6355 static struct pci_driver qla4xxx_pci_driver = {
6356 	.name		= DRIVER_NAME,
6357 	.id_table	= qla4xxx_pci_tbl,
6358 	.probe		= qla4xxx_probe_adapter,
6359 	.remove		= qla4xxx_remove_adapter,
6360 	.err_handler = &qla4xxx_err_handler,
6361 };
6362 
6363 static int __init qla4xxx_module_init(void)
6364 {
6365 	int ret;
6366 
6367 	/* Allocate cache for SRBs. */
6368 	srb_cachep = kmem_cache_create("qla4xxx_srbs", sizeof(struct srb), 0,
6369 				       SLAB_HWCACHE_ALIGN, NULL);
6370 	if (srb_cachep == NULL) {
6371 		printk(KERN_ERR
6372 		       "%s: Unable to allocate SRB cache..."
6373 		       "Failing load!\n", DRIVER_NAME);
6374 		ret = -ENOMEM;
6375 		goto no_srp_cache;
6376 	}
6377 
6378 	/* Derive version string. */
6379 	strcpy(qla4xxx_version_str, QLA4XXX_DRIVER_VERSION);
6380 	if (ql4xextended_error_logging)
6381 		strcat(qla4xxx_version_str, "-debug");
6382 
6383 	qla4xxx_scsi_transport =
6384 		iscsi_register_transport(&qla4xxx_iscsi_transport);
6385 	if (!qla4xxx_scsi_transport){
6386 		ret = -ENODEV;
6387 		goto release_srb_cache;
6388 	}
6389 
6390 	ret = pci_register_driver(&qla4xxx_pci_driver);
6391 	if (ret)
6392 		goto unregister_transport;
6393 
6394 	printk(KERN_INFO "QLogic iSCSI HBA Driver\n");
6395 	return 0;
6396 
6397 unregister_transport:
6398 	iscsi_unregister_transport(&qla4xxx_iscsi_transport);
6399 release_srb_cache:
6400 	kmem_cache_destroy(srb_cachep);
6401 no_srp_cache:
6402 	return ret;
6403 }
6404 
6405 static void __exit qla4xxx_module_exit(void)
6406 {
6407 	pci_unregister_driver(&qla4xxx_pci_driver);
6408 	iscsi_unregister_transport(&qla4xxx_iscsi_transport);
6409 	kmem_cache_destroy(srb_cachep);
6410 }
6411 
6412 module_init(qla4xxx_module_init);
6413 module_exit(qla4xxx_module_exit);
6414 
6415 MODULE_AUTHOR("QLogic Corporation");
6416 MODULE_DESCRIPTION("QLogic iSCSI HBA Driver");
6417 MODULE_LICENSE("GPL");
6418 MODULE_VERSION(QLA4XXX_DRIVER_VERSION);
6419