1 /*
2  * QLogic iSCSI HBA Driver
3  * Copyright (c)  2003-2010 QLogic Corporation
4  *
5  * See LICENSE.qla4xxx for copyright and licensing details.
6  */
7 #include <linux/moduleparam.h>
8 #include <linux/slab.h>
9 
10 #include <scsi/scsi_tcq.h>
11 #include <scsi/scsicam.h>
12 
13 #include "ql4_def.h"
14 #include "ql4_version.h"
15 #include "ql4_glbl.h"
16 #include "ql4_dbg.h"
17 #include "ql4_inline.h"
18 
19 /*
20  * Driver version
21  */
22 static char qla4xxx_version_str[40];
23 
24 /*
25  * SRB allocation cache
26  */
27 static struct kmem_cache *srb_cachep;
28 
29 /*
30  * Module parameter information and variables
31  */
32 int ql4xdontresethba = 0;
33 module_param(ql4xdontresethba, int, S_IRUGO | S_IWUSR);
34 MODULE_PARM_DESC(ql4xdontresethba,
35 		"Don't reset the HBA for driver recovery \n"
36 		" 0 - It will reset HBA (Default)\n"
37 		" 1 - It will NOT reset HBA");
38 
39 int ql4xextended_error_logging = 0; /* 0 = off, 1 = log errors */
40 module_param(ql4xextended_error_logging, int, S_IRUGO | S_IWUSR);
41 MODULE_PARM_DESC(ql4xextended_error_logging,
42 		 "Option to enable extended error logging, "
43 		 "Default is 0 - no logging, 1 - debug logging");
44 
45 int ql4xenablemsix = 1;
46 module_param(ql4xenablemsix, int, S_IRUGO|S_IWUSR);
47 MODULE_PARM_DESC(ql4xenablemsix,
48 		"Set to enable MSI or MSI-X interrupt mechanism.\n"
49 		" 0 = enable INTx interrupt mechanism.\n"
50 		" 1 = enable MSI-X interrupt mechanism (Default).\n"
51 		" 2 = enable MSI interrupt mechanism.");
52 
53 #define QL4_DEF_QDEPTH 32
54 static int ql4xmaxqdepth = QL4_DEF_QDEPTH;
55 module_param(ql4xmaxqdepth, int, S_IRUGO | S_IWUSR);
56 MODULE_PARM_DESC(ql4xmaxqdepth,
57 		"Maximum queue depth to report for target devices.\n"
58 		" Default: 32.");
59 
60 static int ql4xsess_recovery_tmo = QL4_SESS_RECOVERY_TMO;
61 module_param(ql4xsess_recovery_tmo, int, S_IRUGO);
62 MODULE_PARM_DESC(ql4xsess_recovery_tmo,
63 		"Target Session Recovery Timeout.\n"
64 		" Default: 30 sec.");
65 
66 /*
67  * SCSI host template entry points
68  */
69 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha);
70 
71 /*
72  * iSCSI template entry points
73  */
74 static int qla4xxx_tgt_dscvr(struct Scsi_Host *shost,
75 			     enum iscsi_tgt_dscvr type, uint32_t enable,
76 			     struct sockaddr *dst_addr);
77 static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn,
78 				  enum iscsi_param param, char *buf);
79 static int qla4xxx_sess_get_param(struct iscsi_cls_session *sess,
80 				  enum iscsi_param param, char *buf);
81 static int qla4xxx_host_get_param(struct Scsi_Host *shost,
82 				  enum iscsi_host_param param, char *buf);
83 static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session);
84 static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc);
85 
86 /*
87  * SCSI host template entry points
88  */
89 static int qla4xxx_queuecommand(struct Scsi_Host *h, struct scsi_cmnd *cmd);
90 static int qla4xxx_eh_abort(struct scsi_cmnd *cmd);
91 static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd);
92 static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd);
93 static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd);
94 static int qla4xxx_slave_alloc(struct scsi_device *device);
95 static int qla4xxx_slave_configure(struct scsi_device *device);
96 static void qla4xxx_slave_destroy(struct scsi_device *sdev);
97 static void qla4xxx_scan_start(struct Scsi_Host *shost);
98 
99 static struct qla4_8xxx_legacy_intr_set legacy_intr[] =
100     QLA82XX_LEGACY_INTR_CONFIG;
101 
102 static struct scsi_host_template qla4xxx_driver_template = {
103 	.module			= THIS_MODULE,
104 	.name			= DRIVER_NAME,
105 	.proc_name		= DRIVER_NAME,
106 	.queuecommand		= qla4xxx_queuecommand,
107 
108 	.eh_abort_handler	= qla4xxx_eh_abort,
109 	.eh_device_reset_handler = qla4xxx_eh_device_reset,
110 	.eh_target_reset_handler = qla4xxx_eh_target_reset,
111 	.eh_host_reset_handler	= qla4xxx_eh_host_reset,
112 	.eh_timed_out		= qla4xxx_eh_cmd_timed_out,
113 
114 	.slave_configure	= qla4xxx_slave_configure,
115 	.slave_alloc		= qla4xxx_slave_alloc,
116 	.slave_destroy		= qla4xxx_slave_destroy,
117 
118 	.scan_finished		= iscsi_scan_finished,
119 	.scan_start		= qla4xxx_scan_start,
120 
121 	.this_id		= -1,
122 	.cmd_per_lun		= 3,
123 	.use_clustering		= ENABLE_CLUSTERING,
124 	.sg_tablesize		= SG_ALL,
125 
126 	.max_sectors		= 0xFFFF,
127 };
128 
129 static struct iscsi_transport qla4xxx_iscsi_transport = {
130 	.owner			= THIS_MODULE,
131 	.name			= DRIVER_NAME,
132 	.caps			= CAP_FW_DB | CAP_SENDTARGETS_OFFLOAD |
133 				  CAP_DATA_PATH_OFFLOAD,
134 	.param_mask		= ISCSI_CONN_PORT | ISCSI_CONN_ADDRESS |
135 				  ISCSI_TARGET_NAME | ISCSI_TPGT |
136 				  ISCSI_TARGET_ALIAS,
137 	.host_param_mask	= ISCSI_HOST_HWADDRESS |
138 				  ISCSI_HOST_IPADDRESS |
139 				  ISCSI_HOST_INITIATOR_NAME,
140 	.tgt_dscvr		= qla4xxx_tgt_dscvr,
141 	.get_conn_param		= qla4xxx_conn_get_param,
142 	.get_session_param	= qla4xxx_sess_get_param,
143 	.get_host_param		= qla4xxx_host_get_param,
144 	.session_recovery_timedout = qla4xxx_recovery_timedout,
145 };
146 
147 static struct scsi_transport_template *qla4xxx_scsi_transport;
148 
qla4xxx_eh_cmd_timed_out(struct scsi_cmnd * sc)149 static enum blk_eh_timer_return qla4xxx_eh_cmd_timed_out(struct scsi_cmnd *sc)
150 {
151 	struct iscsi_cls_session *session;
152 	struct ddb_entry *ddb_entry;
153 
154 	session = starget_to_session(scsi_target(sc->device));
155 	ddb_entry = session->dd_data;
156 
157 	/* if we are not logged in then the LLD is going to clean up the cmd */
158 	if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE)
159 		return BLK_EH_RESET_TIMER;
160 	else
161 		return BLK_EH_NOT_HANDLED;
162 }
163 
qla4xxx_recovery_timedout(struct iscsi_cls_session * session)164 static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session)
165 {
166 	struct ddb_entry *ddb_entry = session->dd_data;
167 	struct scsi_qla_host *ha = ddb_entry->ha;
168 
169 	if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE) {
170 		atomic_set(&ddb_entry->state, DDB_STATE_DEAD);
171 
172 		DEBUG2(printk("scsi%ld: %s: ddb [%d] session recovery timeout "
173 			      "of (%d) secs exhausted, marking device DEAD.\n",
174 			      ha->host_no, __func__, ddb_entry->fw_ddb_index,
175 			      ddb_entry->sess->recovery_tmo));
176 	}
177 }
178 
qla4xxx_host_get_param(struct Scsi_Host * shost,enum iscsi_host_param param,char * buf)179 static int qla4xxx_host_get_param(struct Scsi_Host *shost,
180 				  enum iscsi_host_param param, char *buf)
181 {
182 	struct scsi_qla_host *ha = to_qla_host(shost);
183 	int len;
184 
185 	switch (param) {
186 	case ISCSI_HOST_PARAM_HWADDRESS:
187 		len = sysfs_format_mac(buf, ha->my_mac, MAC_ADDR_LEN);
188 		break;
189 	case ISCSI_HOST_PARAM_IPADDRESS:
190 		len = sprintf(buf, "%d.%d.%d.%d\n", ha->ip_address[0],
191 			      ha->ip_address[1], ha->ip_address[2],
192 			      ha->ip_address[3]);
193 		break;
194 	case ISCSI_HOST_PARAM_INITIATOR_NAME:
195 		len = sprintf(buf, "%s\n", ha->name_string);
196 		break;
197 	default:
198 		return -ENOSYS;
199 	}
200 
201 	return len;
202 }
203 
qla4xxx_sess_get_param(struct iscsi_cls_session * sess,enum iscsi_param param,char * buf)204 static int qla4xxx_sess_get_param(struct iscsi_cls_session *sess,
205 				  enum iscsi_param param, char *buf)
206 {
207 	struct ddb_entry *ddb_entry = sess->dd_data;
208 	int len;
209 
210 	switch (param) {
211 	case ISCSI_PARAM_TARGET_NAME:
212 		len = snprintf(buf, PAGE_SIZE - 1, "%s\n",
213 			       ddb_entry->iscsi_name);
214 		break;
215 	case ISCSI_PARAM_TPGT:
216 		len = sprintf(buf, "%u\n", ddb_entry->tpgt);
217 		break;
218 	case ISCSI_PARAM_TARGET_ALIAS:
219 		len = snprintf(buf, PAGE_SIZE - 1, "%s\n",
220 		    ddb_entry->iscsi_alias);
221 		break;
222 	default:
223 		return -ENOSYS;
224 	}
225 
226 	return len;
227 }
228 
qla4xxx_conn_get_param(struct iscsi_cls_conn * conn,enum iscsi_param param,char * buf)229 static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn,
230 				  enum iscsi_param param, char *buf)
231 {
232 	struct iscsi_cls_session *session;
233 	struct ddb_entry *ddb_entry;
234 	int len;
235 
236 	session = iscsi_dev_to_session(conn->dev.parent);
237 	ddb_entry = session->dd_data;
238 
239 	switch (param) {
240 	case ISCSI_PARAM_CONN_PORT:
241 		len = sprintf(buf, "%hu\n", ddb_entry->port);
242 		break;
243 	case ISCSI_PARAM_CONN_ADDRESS:
244 		/* TODO: what are the ipv6 bits */
245 		len = sprintf(buf, "%pI4\n", &ddb_entry->ip_addr);
246 		break;
247 	default:
248 		return -ENOSYS;
249 	}
250 
251 	return len;
252 }
253 
qla4xxx_tgt_dscvr(struct Scsi_Host * shost,enum iscsi_tgt_dscvr type,uint32_t enable,struct sockaddr * dst_addr)254 static int qla4xxx_tgt_dscvr(struct Scsi_Host *shost,
255 			     enum iscsi_tgt_dscvr type, uint32_t enable,
256 			     struct sockaddr *dst_addr)
257 {
258 	struct scsi_qla_host *ha;
259 	struct sockaddr_in *addr;
260 	struct sockaddr_in6 *addr6;
261 	int ret = 0;
262 
263 	ha = (struct scsi_qla_host *) shost->hostdata;
264 
265 	switch (type) {
266 	case ISCSI_TGT_DSCVR_SEND_TARGETS:
267 		if (dst_addr->sa_family == AF_INET) {
268 			addr = (struct sockaddr_in *)dst_addr;
269 			if (qla4xxx_send_tgts(ha, (char *)&addr->sin_addr,
270 					      addr->sin_port) != QLA_SUCCESS)
271 				ret = -EIO;
272 		} else if (dst_addr->sa_family == AF_INET6) {
273 			/*
274 			 * TODO: fix qla4xxx_send_tgts
275 			 */
276 			addr6 = (struct sockaddr_in6 *)dst_addr;
277 			if (qla4xxx_send_tgts(ha, (char *)&addr6->sin6_addr,
278 					      addr6->sin6_port) != QLA_SUCCESS)
279 				ret = -EIO;
280 		} else
281 			ret = -ENOSYS;
282 		break;
283 	default:
284 		ret = -ENOSYS;
285 	}
286 	return ret;
287 }
288 
qla4xxx_destroy_sess(struct ddb_entry * ddb_entry)289 void qla4xxx_destroy_sess(struct ddb_entry *ddb_entry)
290 {
291 	if (!ddb_entry->sess)
292 		return;
293 
294 	if (ddb_entry->conn) {
295 		atomic_set(&ddb_entry->state, DDB_STATE_DEAD);
296 		iscsi_remove_session(ddb_entry->sess);
297 	}
298 	iscsi_free_session(ddb_entry->sess);
299 }
300 
qla4xxx_add_sess(struct ddb_entry * ddb_entry)301 int qla4xxx_add_sess(struct ddb_entry *ddb_entry)
302 {
303 	int err;
304 
305 	ddb_entry->sess->recovery_tmo = ql4xsess_recovery_tmo;
306 
307 	err = iscsi_add_session(ddb_entry->sess, ddb_entry->fw_ddb_index);
308 	if (err) {
309 		DEBUG2(printk(KERN_ERR "Could not add session.\n"));
310 		return err;
311 	}
312 
313 	ddb_entry->conn = iscsi_create_conn(ddb_entry->sess, 0, 0);
314 	if (!ddb_entry->conn) {
315 		iscsi_remove_session(ddb_entry->sess);
316 		DEBUG2(printk(KERN_ERR "Could not add connection.\n"));
317 		return -ENOMEM;
318 	}
319 
320 	/* finally ready to go */
321 	iscsi_unblock_session(ddb_entry->sess);
322 	return 0;
323 }
324 
qla4xxx_alloc_sess(struct scsi_qla_host * ha)325 struct ddb_entry *qla4xxx_alloc_sess(struct scsi_qla_host *ha)
326 {
327 	struct ddb_entry *ddb_entry;
328 	struct iscsi_cls_session *sess;
329 
330 	sess = iscsi_alloc_session(ha->host, &qla4xxx_iscsi_transport,
331 				   sizeof(struct ddb_entry));
332 	if (!sess)
333 		return NULL;
334 
335 	ddb_entry = sess->dd_data;
336 	memset(ddb_entry, 0, sizeof(*ddb_entry));
337 	ddb_entry->ha = ha;
338 	ddb_entry->sess = sess;
339 	return ddb_entry;
340 }
341 
qla4xxx_scan_start(struct Scsi_Host * shost)342 static void qla4xxx_scan_start(struct Scsi_Host *shost)
343 {
344 	struct scsi_qla_host *ha = shost_priv(shost);
345 	struct ddb_entry *ddb_entry, *ddbtemp;
346 
347 	/* finish setup of sessions that were already setup in firmware */
348 	list_for_each_entry_safe(ddb_entry, ddbtemp, &ha->ddb_list, list) {
349 		if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE)
350 			qla4xxx_add_sess(ddb_entry);
351 	}
352 }
353 
354 /*
355  * Timer routines
356  */
357 
qla4xxx_start_timer(struct scsi_qla_host * ha,void * func,unsigned long interval)358 static void qla4xxx_start_timer(struct scsi_qla_host *ha, void *func,
359 				unsigned long interval)
360 {
361 	DEBUG(printk("scsi: %s: Starting timer thread for adapter %d\n",
362 		     __func__, ha->host->host_no));
363 	init_timer(&ha->timer);
364 	ha->timer.expires = jiffies + interval * HZ;
365 	ha->timer.data = (unsigned long)ha;
366 	ha->timer.function = (void (*)(unsigned long))func;
367 	add_timer(&ha->timer);
368 	ha->timer_active = 1;
369 }
370 
qla4xxx_stop_timer(struct scsi_qla_host * ha)371 static void qla4xxx_stop_timer(struct scsi_qla_host *ha)
372 {
373 	del_timer_sync(&ha->timer);
374 	ha->timer_active = 0;
375 }
376 
377 /***
378  * qla4xxx_mark_device_missing - mark a device as missing.
379  * @ha: Pointer to host adapter structure.
380  * @ddb_entry: Pointer to device database entry
381  *
382  * This routine marks a device missing and close connection.
383  **/
qla4xxx_mark_device_missing(struct scsi_qla_host * ha,struct ddb_entry * ddb_entry)384 void qla4xxx_mark_device_missing(struct scsi_qla_host *ha,
385 				 struct ddb_entry *ddb_entry)
386 {
387 	if ((atomic_read(&ddb_entry->state) != DDB_STATE_DEAD)) {
388 		atomic_set(&ddb_entry->state, DDB_STATE_MISSING);
389 		DEBUG2(printk("scsi%ld: ddb [%d] marked MISSING\n",
390 		    ha->host_no, ddb_entry->fw_ddb_index));
391 	} else
392 		DEBUG2(printk("scsi%ld: ddb [%d] DEAD\n", ha->host_no,
393 		    ddb_entry->fw_ddb_index))
394 
395 	iscsi_block_session(ddb_entry->sess);
396 	iscsi_conn_error_event(ddb_entry->conn, ISCSI_ERR_CONN_FAILED);
397 }
398 
399 /**
400  * qla4xxx_mark_all_devices_missing - mark all devices as missing.
401  * @ha: Pointer to host adapter structure.
402  *
403  * This routine marks a device missing and resets the relogin retry count.
404  **/
qla4xxx_mark_all_devices_missing(struct scsi_qla_host * ha)405 void qla4xxx_mark_all_devices_missing(struct scsi_qla_host *ha)
406 {
407 	struct ddb_entry *ddb_entry, *ddbtemp;
408 	list_for_each_entry_safe(ddb_entry, ddbtemp, &ha->ddb_list, list) {
409 		qla4xxx_mark_device_missing(ha, ddb_entry);
410 	}
411 }
412 
qla4xxx_get_new_srb(struct scsi_qla_host * ha,struct ddb_entry * ddb_entry,struct scsi_cmnd * cmd,void (* done)(struct scsi_cmnd *))413 static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha,
414 				       struct ddb_entry *ddb_entry,
415 				       struct scsi_cmnd *cmd,
416 				       void (*done)(struct scsi_cmnd *))
417 {
418 	struct srb *srb;
419 
420 	srb = mempool_alloc(ha->srb_mempool, GFP_ATOMIC);
421 	if (!srb)
422 		return srb;
423 
424 	kref_init(&srb->srb_ref);
425 	srb->ha = ha;
426 	srb->ddb = ddb_entry;
427 	srb->cmd = cmd;
428 	srb->flags = 0;
429 	CMD_SP(cmd) = (void *)srb;
430 	cmd->scsi_done = done;
431 
432 	return srb;
433 }
434 
qla4xxx_srb_free_dma(struct scsi_qla_host * ha,struct srb * srb)435 static void qla4xxx_srb_free_dma(struct scsi_qla_host *ha, struct srb *srb)
436 {
437 	struct scsi_cmnd *cmd = srb->cmd;
438 
439 	if (srb->flags & SRB_DMA_VALID) {
440 		scsi_dma_unmap(cmd);
441 		srb->flags &= ~SRB_DMA_VALID;
442 	}
443 	CMD_SP(cmd) = NULL;
444 }
445 
qla4xxx_srb_compl(struct kref * ref)446 void qla4xxx_srb_compl(struct kref *ref)
447 {
448 	struct srb *srb = container_of(ref, struct srb, srb_ref);
449 	struct scsi_cmnd *cmd = srb->cmd;
450 	struct scsi_qla_host *ha = srb->ha;
451 
452 	qla4xxx_srb_free_dma(ha, srb);
453 
454 	mempool_free(srb, ha->srb_mempool);
455 
456 	cmd->scsi_done(cmd);
457 }
458 
459 /**
460  * qla4xxx_queuecommand - scsi layer issues scsi command to driver.
461  * @cmd: Pointer to Linux's SCSI command structure
462  * @done_fn: Function that the driver calls to notify the SCSI mid-layer
463  *	that the command has been processed.
464  *
465  * Remarks:
466  * This routine is invoked by Linux to send a SCSI command to the driver.
467  * The mid-level driver tries to ensure that queuecommand never gets
468  * invoked concurrently with itself or the interrupt handler (although
469  * the interrupt handler may call this routine as part of request-
470  * completion handling).   Unfortunely, it sometimes calls the scheduler
471  * in interrupt context which is a big NO! NO!.
472  **/
qla4xxx_queuecommand_lck(struct scsi_cmnd * cmd,void (* done)(struct scsi_cmnd *))473 static int qla4xxx_queuecommand_lck(struct scsi_cmnd *cmd,
474 				void (*done)(struct scsi_cmnd *))
475 {
476 	struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
477 	struct ddb_entry *ddb_entry = cmd->device->hostdata;
478 	struct iscsi_cls_session *sess = ddb_entry->sess;
479 	struct srb *srb;
480 	int rval;
481 
482 	if (test_bit(AF_EEH_BUSY, &ha->flags)) {
483 		if (test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags))
484 			cmd->result = DID_NO_CONNECT << 16;
485 		else
486 			cmd->result = DID_REQUEUE << 16;
487 		goto qc_fail_command;
488 	}
489 
490 	if (!sess) {
491 		cmd->result = DID_IMM_RETRY << 16;
492 		goto qc_fail_command;
493 	}
494 
495 	rval = iscsi_session_chkready(sess);
496 	if (rval) {
497 		cmd->result = rval;
498 		goto qc_fail_command;
499 	}
500 
501 	if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE) {
502 		if (atomic_read(&ddb_entry->state) == DDB_STATE_DEAD) {
503 			cmd->result = DID_NO_CONNECT << 16;
504 			goto qc_fail_command;
505 		}
506 		return SCSI_MLQUEUE_TARGET_BUSY;
507 	}
508 
509 	if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) ||
510 	    test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) ||
511 	    test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
512 	    test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) ||
513 	    test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) ||
514 	    !test_bit(AF_ONLINE, &ha->flags) ||
515 	    test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))
516 		goto qc_host_busy;
517 
518 	spin_unlock_irq(ha->host->host_lock);
519 
520 	srb = qla4xxx_get_new_srb(ha, ddb_entry, cmd, done);
521 	if (!srb)
522 		goto qc_host_busy_lock;
523 
524 	rval = qla4xxx_send_command_to_isp(ha, srb);
525 	if (rval != QLA_SUCCESS)
526 		goto qc_host_busy_free_sp;
527 
528 	spin_lock_irq(ha->host->host_lock);
529 	return 0;
530 
531 qc_host_busy_free_sp:
532 	qla4xxx_srb_free_dma(ha, srb);
533 	mempool_free(srb, ha->srb_mempool);
534 
535 qc_host_busy_lock:
536 	spin_lock_irq(ha->host->host_lock);
537 
538 qc_host_busy:
539 	return SCSI_MLQUEUE_HOST_BUSY;
540 
541 qc_fail_command:
542 	done(cmd);
543 
544 	return 0;
545 }
546 
DEF_SCSI_QCMD(qla4xxx_queuecommand)547 static DEF_SCSI_QCMD(qla4xxx_queuecommand)
548 
549 /**
550  * qla4xxx_mem_free - frees memory allocated to adapter
551  * @ha: Pointer to host adapter structure.
552  *
553  * Frees memory previously allocated by qla4xxx_mem_alloc
554  **/
555 static void qla4xxx_mem_free(struct scsi_qla_host *ha)
556 {
557 	if (ha->queues)
558 		dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues,
559 				  ha->queues_dma);
560 
561 	ha->queues_len = 0;
562 	ha->queues = NULL;
563 	ha->queues_dma = 0;
564 	ha->request_ring = NULL;
565 	ha->request_dma = 0;
566 	ha->response_ring = NULL;
567 	ha->response_dma = 0;
568 	ha->shadow_regs = NULL;
569 	ha->shadow_regs_dma = 0;
570 
571 	/* Free srb pool. */
572 	if (ha->srb_mempool)
573 		mempool_destroy(ha->srb_mempool);
574 
575 	ha->srb_mempool = NULL;
576 
577 	/* release io space registers  */
578 	if (is_qla8022(ha)) {
579 		if (ha->nx_pcibase)
580 			iounmap(
581 			    (struct device_reg_82xx __iomem *)ha->nx_pcibase);
582 	} else if (ha->reg)
583 		iounmap(ha->reg);
584 	pci_release_regions(ha->pdev);
585 }
586 
587 /**
588  * qla4xxx_mem_alloc - allocates memory for use by adapter.
589  * @ha: Pointer to host adapter structure
590  *
591  * Allocates DMA memory for request and response queues. Also allocates memory
592  * for srbs.
593  **/
qla4xxx_mem_alloc(struct scsi_qla_host * ha)594 static int qla4xxx_mem_alloc(struct scsi_qla_host *ha)
595 {
596 	unsigned long align;
597 
598 	/* Allocate contiguous block of DMA memory for queues. */
599 	ha->queues_len = ((REQUEST_QUEUE_DEPTH * QUEUE_SIZE) +
600 			  (RESPONSE_QUEUE_DEPTH * QUEUE_SIZE) +
601 			  sizeof(struct shadow_regs) +
602 			  MEM_ALIGN_VALUE +
603 			  (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
604 	ha->queues = dma_alloc_coherent(&ha->pdev->dev, ha->queues_len,
605 					&ha->queues_dma, GFP_KERNEL);
606 	if (ha->queues == NULL) {
607 		ql4_printk(KERN_WARNING, ha,
608 		    "Memory Allocation failed - queues.\n");
609 
610 		goto mem_alloc_error_exit;
611 	}
612 	memset(ha->queues, 0, ha->queues_len);
613 
614 	/*
615 	 * As per RISC alignment requirements -- the bus-address must be a
616 	 * multiple of the request-ring size (in bytes).
617 	 */
618 	align = 0;
619 	if ((unsigned long)ha->queues_dma & (MEM_ALIGN_VALUE - 1))
620 		align = MEM_ALIGN_VALUE - ((unsigned long)ha->queues_dma &
621 					   (MEM_ALIGN_VALUE - 1));
622 
623 	/* Update request and response queue pointers. */
624 	ha->request_dma = ha->queues_dma + align;
625 	ha->request_ring = (struct queue_entry *) (ha->queues + align);
626 	ha->response_dma = ha->queues_dma + align +
627 		(REQUEST_QUEUE_DEPTH * QUEUE_SIZE);
628 	ha->response_ring = (struct queue_entry *) (ha->queues + align +
629 						    (REQUEST_QUEUE_DEPTH *
630 						     QUEUE_SIZE));
631 	ha->shadow_regs_dma = ha->queues_dma + align +
632 		(REQUEST_QUEUE_DEPTH * QUEUE_SIZE) +
633 		(RESPONSE_QUEUE_DEPTH * QUEUE_SIZE);
634 	ha->shadow_regs = (struct shadow_regs *) (ha->queues + align +
635 						  (REQUEST_QUEUE_DEPTH *
636 						   QUEUE_SIZE) +
637 						  (RESPONSE_QUEUE_DEPTH *
638 						   QUEUE_SIZE));
639 
640 	/* Allocate memory for srb pool. */
641 	ha->srb_mempool = mempool_create(SRB_MIN_REQ, mempool_alloc_slab,
642 					 mempool_free_slab, srb_cachep);
643 	if (ha->srb_mempool == NULL) {
644 		ql4_printk(KERN_WARNING, ha,
645 		    "Memory Allocation failed - SRB Pool.\n");
646 
647 		goto mem_alloc_error_exit;
648 	}
649 
650 	return QLA_SUCCESS;
651 
652 mem_alloc_error_exit:
653 	qla4xxx_mem_free(ha);
654 	return QLA_ERROR;
655 }
656 
657 /**
658  * qla4_8xxx_check_fw_alive  - Check firmware health
659  * @ha: Pointer to host adapter structure.
660  *
661  * Context: Interrupt
662  **/
qla4_8xxx_check_fw_alive(struct scsi_qla_host * ha)663 static void qla4_8xxx_check_fw_alive(struct scsi_qla_host *ha)
664 {
665 	uint32_t fw_heartbeat_counter, halt_status;
666 
667 	fw_heartbeat_counter = qla4_8xxx_rd_32(ha, QLA82XX_PEG_ALIVE_COUNTER);
668 	/* If PEG_ALIVE_COUNTER is 0xffffffff, AER/EEH is in progress, ignore */
669 	if (fw_heartbeat_counter == 0xffffffff) {
670 		DEBUG2(printk(KERN_WARNING "scsi%ld: %s: Device in frozen "
671 		    "state, QLA82XX_PEG_ALIVE_COUNTER is 0xffffffff\n",
672 		    ha->host_no, __func__));
673 		return;
674 	}
675 
676 	if (ha->fw_heartbeat_counter == fw_heartbeat_counter) {
677 		ha->seconds_since_last_heartbeat++;
678 		/* FW not alive after 2 seconds */
679 		if (ha->seconds_since_last_heartbeat == 2) {
680 			ha->seconds_since_last_heartbeat = 0;
681 			halt_status = qla4_8xxx_rd_32(ha,
682 			    QLA82XX_PEG_HALT_STATUS1);
683 
684 			/* Since we cannot change dev_state in interrupt
685 			 * context, set appropriate DPC flag then wakeup
686 			 * DPC */
687 			if (halt_status & HALT_STATUS_UNRECOVERABLE)
688 				set_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags);
689 			else {
690 				printk("scsi%ld: %s: detect abort needed!\n",
691 				    ha->host_no, __func__);
692 				set_bit(DPC_RESET_HA, &ha->dpc_flags);
693 			}
694 			qla4xxx_wake_dpc(ha);
695 			qla4xxx_mailbox_premature_completion(ha);
696 		}
697 	} else
698 		ha->seconds_since_last_heartbeat = 0;
699 
700 	ha->fw_heartbeat_counter = fw_heartbeat_counter;
701 }
702 
703 /**
704  * qla4_8xxx_watchdog - Poll dev state
705  * @ha: Pointer to host adapter structure.
706  *
707  * Context: Interrupt
708  **/
qla4_8xxx_watchdog(struct scsi_qla_host * ha)709 void qla4_8xxx_watchdog(struct scsi_qla_host *ha)
710 {
711 	uint32_t dev_state;
712 
713 	dev_state = qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE);
714 
715 	/* don't poll if reset is going on */
716 	if (!(test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) ||
717 	    test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
718 	    test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags))) {
719 		if (dev_state == QLA82XX_DEV_NEED_RESET &&
720 		    !test_bit(DPC_RESET_HA, &ha->dpc_flags)) {
721 			if (!ql4xdontresethba) {
722 				ql4_printk(KERN_INFO, ha, "%s: HW State: "
723 				    "NEED RESET!\n", __func__);
724 				set_bit(DPC_RESET_HA, &ha->dpc_flags);
725 				qla4xxx_wake_dpc(ha);
726 				qla4xxx_mailbox_premature_completion(ha);
727 			}
728 		} else if (dev_state == QLA82XX_DEV_NEED_QUIESCENT &&
729 		    !test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) {
730 			ql4_printk(KERN_INFO, ha, "%s: HW State: NEED QUIES!\n",
731 			    __func__);
732 			set_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags);
733 			qla4xxx_wake_dpc(ha);
734 		} else  {
735 			/* Check firmware health */
736 			qla4_8xxx_check_fw_alive(ha);
737 		}
738 	}
739 }
740 
741 /**
742  * qla4xxx_timer - checks every second for work to do.
743  * @ha: Pointer to host adapter structure.
744  **/
qla4xxx_timer(struct scsi_qla_host * ha)745 static void qla4xxx_timer(struct scsi_qla_host *ha)
746 {
747 	struct ddb_entry *ddb_entry, *dtemp;
748 	int start_dpc = 0;
749 	uint16_t w;
750 
751 	/* If we are in the middle of AER/EEH processing
752 	 * skip any processing and reschedule the timer
753 	 */
754 	if (test_bit(AF_EEH_BUSY, &ha->flags)) {
755 		mod_timer(&ha->timer, jiffies + HZ);
756 		return;
757 	}
758 
759 	/* Hardware read to trigger an EEH error during mailbox waits. */
760 	if (!pci_channel_offline(ha->pdev))
761 		pci_read_config_word(ha->pdev, PCI_VENDOR_ID, &w);
762 
763 	if (is_qla8022(ha)) {
764 		qla4_8xxx_watchdog(ha);
765 	}
766 
767 	/* Search for relogin's to time-out and port down retry. */
768 	list_for_each_entry_safe(ddb_entry, dtemp, &ha->ddb_list, list) {
769 		/* Count down time between sending relogins */
770 		if (adapter_up(ha) &&
771 		    !test_bit(DF_RELOGIN, &ddb_entry->flags) &&
772 		    atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE) {
773 			if (atomic_read(&ddb_entry->retry_relogin_timer) !=
774 			    INVALID_ENTRY) {
775 				if (atomic_read(&ddb_entry->retry_relogin_timer)
776 				    		== 0) {
777 					atomic_set(&ddb_entry->
778 						retry_relogin_timer,
779 						INVALID_ENTRY);
780 					set_bit(DPC_RELOGIN_DEVICE,
781 						&ha->dpc_flags);
782 					set_bit(DF_RELOGIN, &ddb_entry->flags);
783 					DEBUG2(printk("scsi%ld: %s: ddb [%d]"
784 						      " login device\n",
785 						      ha->host_no, __func__,
786 						      ddb_entry->fw_ddb_index));
787 				} else
788 					atomic_dec(&ddb_entry->
789 							retry_relogin_timer);
790 			}
791 		}
792 
793 		/* Wait for relogin to timeout */
794 		if (atomic_read(&ddb_entry->relogin_timer) &&
795 		    (atomic_dec_and_test(&ddb_entry->relogin_timer) != 0)) {
796 			/*
797 			 * If the relogin times out and the device is
798 			 * still NOT ONLINE then try and relogin again.
799 			 */
800 			if (atomic_read(&ddb_entry->state) !=
801 			    DDB_STATE_ONLINE &&
802 			    ddb_entry->fw_ddb_device_state ==
803 			    DDB_DS_SESSION_FAILED) {
804 				/* Reset retry relogin timer */
805 				atomic_inc(&ddb_entry->relogin_retry_count);
806 				DEBUG2(printk("scsi%ld: ddb [%d] relogin"
807 					      " timed out-retrying"
808 					      " relogin (%d)\n",
809 					      ha->host_no,
810 					      ddb_entry->fw_ddb_index,
811 					      atomic_read(&ddb_entry->
812 							  relogin_retry_count))
813 					);
814 				start_dpc++;
815 				DEBUG(printk("scsi%ld:%d:%d: ddb [%d] "
816 					     "initiate relogin after"
817 					     " %d seconds\n",
818 					     ha->host_no, ddb_entry->bus,
819 					     ddb_entry->target,
820 					     ddb_entry->fw_ddb_index,
821 					     ddb_entry->default_time2wait + 4)
822 					);
823 
824 				atomic_set(&ddb_entry->retry_relogin_timer,
825 					   ddb_entry->default_time2wait + 4);
826 			}
827 		}
828 	}
829 
830 	if (!is_qla8022(ha)) {
831 		/* Check for heartbeat interval. */
832 		if (ha->firmware_options & FWOPT_HEARTBEAT_ENABLE &&
833 		    ha->heartbeat_interval != 0) {
834 			ha->seconds_since_last_heartbeat++;
835 			if (ha->seconds_since_last_heartbeat >
836 			    ha->heartbeat_interval + 2)
837 				set_bit(DPC_RESET_HA, &ha->dpc_flags);
838 		}
839 	}
840 
841 	/* Wakeup the dpc routine for this adapter, if needed. */
842 	if ((start_dpc ||
843 	     test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
844 	     test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags) ||
845 	     test_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags) ||
846 	     test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) ||
847 	     test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) ||
848 	     test_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags) ||
849 	     test_bit(DPC_LINK_CHANGED, &ha->dpc_flags) ||
850 	     test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags) ||
851 	     test_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags) ||
852 	     test_bit(DPC_AEN, &ha->dpc_flags)) &&
853 	     !test_bit(AF_DPC_SCHEDULED, &ha->flags) &&
854 	     ha->dpc_thread) {
855 		DEBUG2(printk("scsi%ld: %s: scheduling dpc routine"
856 			      " - dpc flags = 0x%lx\n",
857 			      ha->host_no, __func__, ha->dpc_flags));
858 		qla4xxx_wake_dpc(ha);
859 	}
860 
861 	/* Reschedule timer thread to call us back in one second */
862 	mod_timer(&ha->timer, jiffies + HZ);
863 
864 	DEBUG2(ha->seconds_since_last_intr++);
865 }
866 
867 /**
868  * qla4xxx_cmd_wait - waits for all outstanding commands to complete
869  * @ha: Pointer to host adapter structure.
870  *
871  * This routine stalls the driver until all outstanding commands are returned.
872  * Caller must release the Hardware Lock prior to calling this routine.
873  **/
qla4xxx_cmd_wait(struct scsi_qla_host * ha)874 static int qla4xxx_cmd_wait(struct scsi_qla_host *ha)
875 {
876 	uint32_t index = 0;
877 	unsigned long flags;
878 	struct scsi_cmnd *cmd;
879 
880 	unsigned long wtime = jiffies + (WAIT_CMD_TOV * HZ);
881 
882 	DEBUG2(ql4_printk(KERN_INFO, ha, "Wait up to %d seconds for cmds to "
883 	    "complete\n", WAIT_CMD_TOV));
884 
885 	while (!time_after_eq(jiffies, wtime)) {
886 		spin_lock_irqsave(&ha->hardware_lock, flags);
887 		/* Find a command that hasn't completed. */
888 		for (index = 0; index < ha->host->can_queue; index++) {
889 			cmd = scsi_host_find_tag(ha->host, index);
890 			/*
891 			 * We cannot just check if the index is valid,
892 			 * becase if we are run from the scsi eh, then
893 			 * the scsi/block layer is going to prevent
894 			 * the tag from being released.
895 			 */
896 			if (cmd != NULL && CMD_SP(cmd))
897 				break;
898 		}
899 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
900 
901 		/* If No Commands are pending, wait is complete */
902 		if (index == ha->host->can_queue)
903 			return QLA_SUCCESS;
904 
905 		msleep(1000);
906 	}
907 	/* If we timed out on waiting for commands to come back
908 	 * return ERROR. */
909 	return QLA_ERROR;
910 }
911 
qla4xxx_hw_reset(struct scsi_qla_host * ha)912 int qla4xxx_hw_reset(struct scsi_qla_host *ha)
913 {
914 	uint32_t ctrl_status;
915 	unsigned long flags = 0;
916 
917 	DEBUG2(printk(KERN_ERR "scsi%ld: %s\n", ha->host_no, __func__));
918 
919 	if (ql4xxx_lock_drvr_wait(ha) != QLA_SUCCESS)
920 		return QLA_ERROR;
921 
922 	spin_lock_irqsave(&ha->hardware_lock, flags);
923 
924 	/*
925 	 * If the SCSI Reset Interrupt bit is set, clear it.
926 	 * Otherwise, the Soft Reset won't work.
927 	 */
928 	ctrl_status = readw(&ha->reg->ctrl_status);
929 	if ((ctrl_status & CSR_SCSI_RESET_INTR) != 0)
930 		writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status);
931 
932 	/* Issue Soft Reset */
933 	writel(set_rmask(CSR_SOFT_RESET), &ha->reg->ctrl_status);
934 	readl(&ha->reg->ctrl_status);
935 
936 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
937 	return QLA_SUCCESS;
938 }
939 
940 /**
941  * qla4xxx_soft_reset - performs soft reset.
942  * @ha: Pointer to host adapter structure.
943  **/
qla4xxx_soft_reset(struct scsi_qla_host * ha)944 int qla4xxx_soft_reset(struct scsi_qla_host *ha)
945 {
946 	uint32_t max_wait_time;
947 	unsigned long flags = 0;
948 	int status;
949 	uint32_t ctrl_status;
950 
951 	status = qla4xxx_hw_reset(ha);
952 	if (status != QLA_SUCCESS)
953 		return status;
954 
955 	status = QLA_ERROR;
956 	/* Wait until the Network Reset Intr bit is cleared */
957 	max_wait_time = RESET_INTR_TOV;
958 	do {
959 		spin_lock_irqsave(&ha->hardware_lock, flags);
960 		ctrl_status = readw(&ha->reg->ctrl_status);
961 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
962 
963 		if ((ctrl_status & CSR_NET_RESET_INTR) == 0)
964 			break;
965 
966 		msleep(1000);
967 	} while ((--max_wait_time));
968 
969 	if ((ctrl_status & CSR_NET_RESET_INTR) != 0) {
970 		DEBUG2(printk(KERN_WARNING
971 			      "scsi%ld: Network Reset Intr not cleared by "
972 			      "Network function, clearing it now!\n",
973 			      ha->host_no));
974 		spin_lock_irqsave(&ha->hardware_lock, flags);
975 		writel(set_rmask(CSR_NET_RESET_INTR), &ha->reg->ctrl_status);
976 		readl(&ha->reg->ctrl_status);
977 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
978 	}
979 
980 	/* Wait until the firmware tells us the Soft Reset is done */
981 	max_wait_time = SOFT_RESET_TOV;
982 	do {
983 		spin_lock_irqsave(&ha->hardware_lock, flags);
984 		ctrl_status = readw(&ha->reg->ctrl_status);
985 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
986 
987 		if ((ctrl_status & CSR_SOFT_RESET) == 0) {
988 			status = QLA_SUCCESS;
989 			break;
990 		}
991 
992 		msleep(1000);
993 	} while ((--max_wait_time));
994 
995 	/*
996 	 * Also, make sure that the SCSI Reset Interrupt bit has been cleared
997 	 * after the soft reset has taken place.
998 	 */
999 	spin_lock_irqsave(&ha->hardware_lock, flags);
1000 	ctrl_status = readw(&ha->reg->ctrl_status);
1001 	if ((ctrl_status & CSR_SCSI_RESET_INTR) != 0) {
1002 		writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status);
1003 		readl(&ha->reg->ctrl_status);
1004 	}
1005 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
1006 
1007 	/* If soft reset fails then most probably the bios on other
1008 	 * function is also enabled.
1009 	 * Since the initialization is sequential the other fn
1010 	 * wont be able to acknowledge the soft reset.
1011 	 * Issue a force soft reset to workaround this scenario.
1012 	 */
1013 	if (max_wait_time == 0) {
1014 		/* Issue Force Soft Reset */
1015 		spin_lock_irqsave(&ha->hardware_lock, flags);
1016 		writel(set_rmask(CSR_FORCE_SOFT_RESET), &ha->reg->ctrl_status);
1017 		readl(&ha->reg->ctrl_status);
1018 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
1019 		/* Wait until the firmware tells us the Soft Reset is done */
1020 		max_wait_time = SOFT_RESET_TOV;
1021 		do {
1022 			spin_lock_irqsave(&ha->hardware_lock, flags);
1023 			ctrl_status = readw(&ha->reg->ctrl_status);
1024 			spin_unlock_irqrestore(&ha->hardware_lock, flags);
1025 
1026 			if ((ctrl_status & CSR_FORCE_SOFT_RESET) == 0) {
1027 				status = QLA_SUCCESS;
1028 				break;
1029 			}
1030 
1031 			msleep(1000);
1032 		} while ((--max_wait_time));
1033 	}
1034 
1035 	return status;
1036 }
1037 
1038 /**
1039  * qla4xxx_abort_active_cmds - returns all outstanding i/o requests to O.S.
1040  * @ha: Pointer to host adapter structure.
1041  * @res: returned scsi status
1042  *
1043  * This routine is called just prior to a HARD RESET to return all
1044  * outstanding commands back to the Operating System.
1045  * Caller should make sure that the following locks are released
1046  * before this calling routine: Hardware lock, and io_request_lock.
1047  **/
qla4xxx_abort_active_cmds(struct scsi_qla_host * ha,int res)1048 static void qla4xxx_abort_active_cmds(struct scsi_qla_host *ha, int res)
1049 {
1050 	struct srb *srb;
1051 	int i;
1052 	unsigned long flags;
1053 
1054 	spin_lock_irqsave(&ha->hardware_lock, flags);
1055 	for (i = 0; i < ha->host->can_queue; i++) {
1056 		srb = qla4xxx_del_from_active_array(ha, i);
1057 		if (srb != NULL) {
1058 			srb->cmd->result = res;
1059 			kref_put(&srb->srb_ref, qla4xxx_srb_compl);
1060 		}
1061 	}
1062 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
1063 }
1064 
qla4xxx_dead_adapter_cleanup(struct scsi_qla_host * ha)1065 void qla4xxx_dead_adapter_cleanup(struct scsi_qla_host *ha)
1066 {
1067 	clear_bit(AF_ONLINE, &ha->flags);
1068 
1069 	/* Disable the board */
1070 	ql4_printk(KERN_INFO, ha, "Disabling the board\n");
1071 
1072 	qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16);
1073 	qla4xxx_mark_all_devices_missing(ha);
1074 	clear_bit(AF_INIT_DONE, &ha->flags);
1075 }
1076 
1077 /**
1078  * qla4xxx_recover_adapter - recovers adapter after a fatal error
1079  * @ha: Pointer to host adapter structure.
1080  **/
qla4xxx_recover_adapter(struct scsi_qla_host * ha)1081 static int qla4xxx_recover_adapter(struct scsi_qla_host *ha)
1082 {
1083 	int status = QLA_ERROR;
1084 	uint8_t reset_chip = 0;
1085 
1086 	/* Stall incoming I/O until we are done */
1087 	scsi_block_requests(ha->host);
1088 	clear_bit(AF_ONLINE, &ha->flags);
1089 
1090 	DEBUG2(ql4_printk(KERN_INFO, ha, "%s: adapter OFFLINE\n", __func__));
1091 
1092 	set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags);
1093 
1094 	if (test_bit(DPC_RESET_HA, &ha->dpc_flags))
1095 		reset_chip = 1;
1096 
1097 	/* For the DPC_RESET_HA_INTR case (ISP-4xxx specific)
1098 	 * do not reset adapter, jump to initialize_adapter */
1099 	if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) {
1100 		status = QLA_SUCCESS;
1101 		goto recover_ha_init_adapter;
1102 	}
1103 
1104 	/* For the ISP-82xx adapter, issue a stop_firmware if invoked
1105 	 * from eh_host_reset or ioctl module */
1106 	if (is_qla8022(ha) && !reset_chip &&
1107 	    test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags)) {
1108 
1109 		DEBUG2(ql4_printk(KERN_INFO, ha,
1110 		    "scsi%ld: %s - Performing stop_firmware...\n",
1111 		    ha->host_no, __func__));
1112 		status = ha->isp_ops->reset_firmware(ha);
1113 		if (status == QLA_SUCCESS) {
1114 			if (!test_bit(AF_FW_RECOVERY, &ha->flags))
1115 				qla4xxx_cmd_wait(ha);
1116 			ha->isp_ops->disable_intrs(ha);
1117 			qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
1118 			qla4xxx_abort_active_cmds(ha, DID_RESET << 16);
1119 		} else {
1120 			/* If the stop_firmware fails then
1121 			 * reset the entire chip */
1122 			reset_chip = 1;
1123 			clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags);
1124 			set_bit(DPC_RESET_HA, &ha->dpc_flags);
1125 		}
1126 	}
1127 
1128 	/* Issue full chip reset if recovering from a catastrophic error,
1129 	 * or if stop_firmware fails for ISP-82xx.
1130 	 * This is the default case for ISP-4xxx */
1131 	if (!is_qla8022(ha) || reset_chip) {
1132 		if (!test_bit(AF_FW_RECOVERY, &ha->flags))
1133 			qla4xxx_cmd_wait(ha);
1134 		qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
1135 		qla4xxx_abort_active_cmds(ha, DID_RESET << 16);
1136 		DEBUG2(ql4_printk(KERN_INFO, ha,
1137 		    "scsi%ld: %s - Performing chip reset..\n",
1138 		    ha->host_no, __func__));
1139 		status = ha->isp_ops->reset_chip(ha);
1140 	}
1141 
1142 	/* Flush any pending ddb changed AENs */
1143 	qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
1144 
1145 recover_ha_init_adapter:
1146 	/* Upon successful firmware/chip reset, re-initialize the adapter */
1147 	if (status == QLA_SUCCESS) {
1148 		/* For ISP-4xxx, force function 1 to always initialize
1149 		 * before function 3 to prevent both funcions from
1150 		 * stepping on top of the other */
1151 		if (!is_qla8022(ha) && (ha->mac_index == 3))
1152 			ssleep(6);
1153 
1154 		/* NOTE: AF_ONLINE flag set upon successful completion of
1155 		 *       qla4xxx_initialize_adapter */
1156 		status = qla4xxx_initialize_adapter(ha, PRESERVE_DDB_LIST);
1157 	}
1158 
1159 	/* Retry failed adapter initialization, if necessary
1160 	 * Do not retry initialize_adapter for RESET_HA_INTR (ISP-4xxx specific)
1161 	 * case to prevent ping-pong resets between functions */
1162 	if (!test_bit(AF_ONLINE, &ha->flags) &&
1163 	    !test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) {
1164 		/* Adapter initialization failed, see if we can retry
1165 		 * resetting the ha.
1166 		 * Since we don't want to block the DPC for too long
1167 		 * with multiple resets in the same thread,
1168 		 * utilize DPC to retry */
1169 		if (!test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags)) {
1170 			ha->retry_reset_ha_cnt = MAX_RESET_HA_RETRIES;
1171 			DEBUG2(printk("scsi%ld: recover adapter - retrying "
1172 				      "(%d) more times\n", ha->host_no,
1173 				      ha->retry_reset_ha_cnt));
1174 			set_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags);
1175 			status = QLA_ERROR;
1176 		} else {
1177 			if (ha->retry_reset_ha_cnt > 0) {
1178 				/* Schedule another Reset HA--DPC will retry */
1179 				ha->retry_reset_ha_cnt--;
1180 				DEBUG2(printk("scsi%ld: recover adapter - "
1181 					      "retry remaining %d\n",
1182 					      ha->host_no,
1183 					      ha->retry_reset_ha_cnt));
1184 				status = QLA_ERROR;
1185 			}
1186 
1187 			if (ha->retry_reset_ha_cnt == 0) {
1188 				/* Recover adapter retries have been exhausted.
1189 				 * Adapter DEAD */
1190 				DEBUG2(printk("scsi%ld: recover adapter "
1191 					      "failed - board disabled\n",
1192 					      ha->host_no));
1193 				qla4xxx_dead_adapter_cleanup(ha);
1194 				clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags);
1195 				clear_bit(DPC_RESET_HA, &ha->dpc_flags);
1196 				clear_bit(DPC_RESET_HA_FW_CONTEXT,
1197 					  &ha->dpc_flags);
1198 				status = QLA_ERROR;
1199 			}
1200 		}
1201 	} else {
1202 		clear_bit(DPC_RESET_HA, &ha->dpc_flags);
1203 		clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags);
1204 		clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags);
1205 	}
1206 
1207 	ha->adapter_error_count++;
1208 
1209 	if (test_bit(AF_ONLINE, &ha->flags))
1210 		ha->isp_ops->enable_intrs(ha);
1211 
1212 	scsi_unblock_requests(ha->host);
1213 
1214 	clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags);
1215 	DEBUG2(printk("scsi%ld: recover adapter: %s\n", ha->host_no,
1216 	    status == QLA_ERROR ? "FAILED" : "SUCCEEDED"));
1217 
1218 	return status;
1219 }
1220 
qla4xxx_relogin_all_devices(struct scsi_qla_host * ha)1221 static void qla4xxx_relogin_all_devices(struct scsi_qla_host *ha)
1222 {
1223 	struct ddb_entry *ddb_entry, *dtemp;
1224 
1225 	list_for_each_entry_safe(ddb_entry, dtemp, &ha->ddb_list, list) {
1226 		if ((atomic_read(&ddb_entry->state) == DDB_STATE_MISSING) ||
1227 		    (atomic_read(&ddb_entry->state) == DDB_STATE_DEAD)) {
1228 			if (ddb_entry->fw_ddb_device_state ==
1229 			    DDB_DS_SESSION_ACTIVE) {
1230 				atomic_set(&ddb_entry->state, DDB_STATE_ONLINE);
1231 				ql4_printk(KERN_INFO, ha, "scsi%ld: %s: ddb[%d]"
1232 				    " marked ONLINE\n",	ha->host_no, __func__,
1233 				    ddb_entry->fw_ddb_index);
1234 
1235 				iscsi_unblock_session(ddb_entry->sess);
1236 			} else
1237 				qla4xxx_relogin_device(ha, ddb_entry);
1238 		}
1239 	}
1240 }
1241 
qla4xxx_wake_dpc(struct scsi_qla_host * ha)1242 void qla4xxx_wake_dpc(struct scsi_qla_host *ha)
1243 {
1244 	if (ha->dpc_thread &&
1245 	    !test_bit(AF_DPC_SCHEDULED, &ha->flags)) {
1246 		set_bit(AF_DPC_SCHEDULED, &ha->flags);
1247 		queue_work(ha->dpc_thread, &ha->dpc_work);
1248 	}
1249 }
1250 
1251 /**
1252  * qla4xxx_do_dpc - dpc routine
1253  * @data: in our case pointer to adapter structure
1254  *
1255  * This routine is a task that is schedule by the interrupt handler
1256  * to perform the background processing for interrupts.  We put it
1257  * on a task queue that is consumed whenever the scheduler runs; that's
1258  * so you can do anything (i.e. put the process to sleep etc).  In fact,
1259  * the mid-level tries to sleep when it reaches the driver threshold
1260  * "host->can_queue". This can cause a panic if we were in our interrupt code.
1261  **/
qla4xxx_do_dpc(struct work_struct * work)1262 static void qla4xxx_do_dpc(struct work_struct *work)
1263 {
1264 	struct scsi_qla_host *ha =
1265 		container_of(work, struct scsi_qla_host, dpc_work);
1266 	struct ddb_entry *ddb_entry, *dtemp;
1267 	int status = QLA_ERROR;
1268 
1269 	DEBUG2(printk("scsi%ld: %s: DPC handler waking up."
1270 	    "flags = 0x%08lx, dpc_flags = 0x%08lx\n",
1271 	    ha->host_no, __func__, ha->flags, ha->dpc_flags))
1272 
1273 	/* Initialization not yet finished. Don't do anything yet. */
1274 	if (!test_bit(AF_INIT_DONE, &ha->flags))
1275 		goto do_dpc_exit;
1276 
1277 	if (test_bit(AF_EEH_BUSY, &ha->flags)) {
1278 		DEBUG2(printk(KERN_INFO "scsi%ld: %s: flags = %lx\n",
1279 		    ha->host_no, __func__, ha->flags));
1280 		goto do_dpc_exit;
1281 	}
1282 
1283 	if (is_qla8022(ha)) {
1284 		if (test_bit(DPC_HA_UNRECOVERABLE, &ha->dpc_flags)) {
1285 			qla4_8xxx_idc_lock(ha);
1286 			qla4_8xxx_wr_32(ha, QLA82XX_CRB_DEV_STATE,
1287 			    QLA82XX_DEV_FAILED);
1288 			qla4_8xxx_idc_unlock(ha);
1289 			ql4_printk(KERN_INFO, ha, "HW State: FAILED\n");
1290 			qla4_8xxx_device_state_handler(ha);
1291 		}
1292 		if (test_and_clear_bit(DPC_HA_NEED_QUIESCENT, &ha->dpc_flags)) {
1293 			qla4_8xxx_need_qsnt_handler(ha);
1294 		}
1295 	}
1296 
1297 	if (!test_bit(DPC_RESET_ACTIVE, &ha->dpc_flags) &&
1298 	    (test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
1299 	    test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) ||
1300 	    test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags))) {
1301 		if (ql4xdontresethba) {
1302 			DEBUG2(printk("scsi%ld: %s: Don't Reset HBA\n",
1303 			    ha->host_no, __func__));
1304 			clear_bit(DPC_RESET_HA, &ha->dpc_flags);
1305 			clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags);
1306 			clear_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags);
1307 			goto dpc_post_reset_ha;
1308 		}
1309 		if (test_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags) ||
1310 		    test_bit(DPC_RESET_HA, &ha->dpc_flags))
1311 			qla4xxx_recover_adapter(ha);
1312 
1313 		if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) {
1314 			uint8_t wait_time = RESET_INTR_TOV;
1315 
1316 			while ((readw(&ha->reg->ctrl_status) &
1317 				(CSR_SOFT_RESET | CSR_FORCE_SOFT_RESET)) != 0) {
1318 				if (--wait_time == 0)
1319 					break;
1320 				msleep(1000);
1321 			}
1322 			if (wait_time == 0)
1323 				DEBUG2(printk("scsi%ld: %s: SR|FSR "
1324 					      "bit not cleared-- resetting\n",
1325 					      ha->host_no, __func__));
1326 			qla4xxx_abort_active_cmds(ha, DID_RESET << 16);
1327 			if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) {
1328 				qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
1329 				status = qla4xxx_recover_adapter(ha);
1330 			}
1331 			clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags);
1332 			if (status == QLA_SUCCESS)
1333 				ha->isp_ops->enable_intrs(ha);
1334 		}
1335 	}
1336 
1337 dpc_post_reset_ha:
1338 	/* ---- process AEN? --- */
1339 	if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags))
1340 		qla4xxx_process_aen(ha, PROCESS_ALL_AENS);
1341 
1342 	/* ---- Get DHCP IP Address? --- */
1343 	if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags))
1344 		qla4xxx_get_dhcp_ip_address(ha);
1345 
1346 	/* ---- link change? --- */
1347 	if (test_and_clear_bit(DPC_LINK_CHANGED, &ha->dpc_flags)) {
1348 		if (!test_bit(AF_LINK_UP, &ha->flags)) {
1349 			/* ---- link down? --- */
1350 			qla4xxx_mark_all_devices_missing(ha);
1351 		} else {
1352 			/* ---- link up? --- *
1353 			 * F/W will auto login to all devices ONLY ONCE after
1354 			 * link up during driver initialization and runtime
1355 			 * fatal error recovery.  Therefore, the driver must
1356 			 * manually relogin to devices when recovering from
1357 			 * connection failures, logouts, expired KATO, etc. */
1358 
1359 			qla4xxx_relogin_all_devices(ha);
1360 		}
1361 	}
1362 
1363 	/* ---- relogin device? --- */
1364 	if (adapter_up(ha) &&
1365 	    test_and_clear_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags)) {
1366 		list_for_each_entry_safe(ddb_entry, dtemp,
1367 					 &ha->ddb_list, list) {
1368 			if (test_and_clear_bit(DF_RELOGIN, &ddb_entry->flags) &&
1369 			    atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE)
1370 				qla4xxx_relogin_device(ha, ddb_entry);
1371 
1372 			/*
1373 			 * If mbx cmd times out there is no point
1374 			 * in continuing further.
1375 			 * With large no of targets this can hang
1376 			 * the system.
1377 			 */
1378 			if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) {
1379 				printk(KERN_WARNING "scsi%ld: %s: "
1380 				       "need to reset hba\n",
1381 				       ha->host_no, __func__);
1382 				break;
1383 			}
1384 		}
1385 	}
1386 
1387 do_dpc_exit:
1388 	clear_bit(AF_DPC_SCHEDULED, &ha->flags);
1389 }
1390 
1391 /**
1392  * qla4xxx_free_adapter - release the adapter
1393  * @ha: pointer to adapter structure
1394  **/
qla4xxx_free_adapter(struct scsi_qla_host * ha)1395 static void qla4xxx_free_adapter(struct scsi_qla_host *ha)
1396 {
1397 
1398 	if (test_bit(AF_INTERRUPTS_ON, &ha->flags)) {
1399 		/* Turn-off interrupts on the card. */
1400 		ha->isp_ops->disable_intrs(ha);
1401 	}
1402 
1403 	/* Remove timer thread, if present */
1404 	if (ha->timer_active)
1405 		qla4xxx_stop_timer(ha);
1406 
1407 	/* Kill the kernel thread for this host */
1408 	if (ha->dpc_thread)
1409 		destroy_workqueue(ha->dpc_thread);
1410 
1411 	/* Put firmware in known state */
1412 	ha->isp_ops->reset_firmware(ha);
1413 
1414 	if (is_qla8022(ha)) {
1415 		qla4_8xxx_idc_lock(ha);
1416 		qla4_8xxx_clear_drv_active(ha);
1417 		qla4_8xxx_idc_unlock(ha);
1418 	}
1419 
1420 	/* Detach interrupts */
1421 	if (test_and_clear_bit(AF_IRQ_ATTACHED, &ha->flags))
1422 		qla4xxx_free_irqs(ha);
1423 
1424 	/* free extra memory */
1425 	qla4xxx_mem_free(ha);
1426 }
1427 
qla4_8xxx_iospace_config(struct scsi_qla_host * ha)1428 int qla4_8xxx_iospace_config(struct scsi_qla_host *ha)
1429 {
1430 	int status = 0;
1431 	uint8_t revision_id;
1432 	unsigned long mem_base, mem_len, db_base, db_len;
1433 	struct pci_dev *pdev = ha->pdev;
1434 
1435 	status = pci_request_regions(pdev, DRIVER_NAME);
1436 	if (status) {
1437 		printk(KERN_WARNING
1438 		    "scsi(%ld) Failed to reserve PIO regions (%s) "
1439 		    "status=%d\n", ha->host_no, pci_name(pdev), status);
1440 		goto iospace_error_exit;
1441 	}
1442 
1443 	pci_read_config_byte(pdev, PCI_REVISION_ID, &revision_id);
1444 	DEBUG2(printk(KERN_INFO "%s: revision-id=%d\n",
1445 	    __func__, revision_id));
1446 	ha->revision_id = revision_id;
1447 
1448 	/* remap phys address */
1449 	mem_base = pci_resource_start(pdev, 0); /* 0 is for BAR 0 */
1450 	mem_len = pci_resource_len(pdev, 0);
1451 	DEBUG2(printk(KERN_INFO "%s: ioremap from %lx a size of %lx\n",
1452 	    __func__, mem_base, mem_len));
1453 
1454 	/* mapping of pcibase pointer */
1455 	ha->nx_pcibase = (unsigned long)ioremap(mem_base, mem_len);
1456 	if (!ha->nx_pcibase) {
1457 		printk(KERN_ERR
1458 		    "cannot remap MMIO (%s), aborting\n", pci_name(pdev));
1459 		pci_release_regions(ha->pdev);
1460 		goto iospace_error_exit;
1461 	}
1462 
1463 	/* Mapping of IO base pointer, door bell read and write pointer */
1464 
1465 	/* mapping of IO base pointer */
1466 	ha->qla4_8xxx_reg =
1467 	    (struct device_reg_82xx  __iomem *)((uint8_t *)ha->nx_pcibase +
1468 	    0xbc000 + (ha->pdev->devfn << 11));
1469 
1470 	db_base = pci_resource_start(pdev, 4);  /* doorbell is on bar 4 */
1471 	db_len = pci_resource_len(pdev, 4);
1472 
1473 	ha->nx_db_wr_ptr = (ha->pdev->devfn == 4 ? QLA82XX_CAM_RAM_DB1 :
1474 	    QLA82XX_CAM_RAM_DB2);
1475 
1476 	return 0;
1477 iospace_error_exit:
1478 	return -ENOMEM;
1479 }
1480 
1481 /***
1482  * qla4xxx_iospace_config - maps registers
1483  * @ha: pointer to adapter structure
1484  *
1485  * This routines maps HBA's registers from the pci address space
1486  * into the kernel virtual address space for memory mapped i/o.
1487  **/
qla4xxx_iospace_config(struct scsi_qla_host * ha)1488 int qla4xxx_iospace_config(struct scsi_qla_host *ha)
1489 {
1490 	unsigned long pio, pio_len, pio_flags;
1491 	unsigned long mmio, mmio_len, mmio_flags;
1492 
1493 	pio = pci_resource_start(ha->pdev, 0);
1494 	pio_len = pci_resource_len(ha->pdev, 0);
1495 	pio_flags = pci_resource_flags(ha->pdev, 0);
1496 	if (pio_flags & IORESOURCE_IO) {
1497 		if (pio_len < MIN_IOBASE_LEN) {
1498 			ql4_printk(KERN_WARNING, ha,
1499 				"Invalid PCI I/O region size\n");
1500 			pio = 0;
1501 		}
1502 	} else {
1503 		ql4_printk(KERN_WARNING, ha, "region #0 not a PIO resource\n");
1504 		pio = 0;
1505 	}
1506 
1507 	/* Use MMIO operations for all accesses. */
1508 	mmio = pci_resource_start(ha->pdev, 1);
1509 	mmio_len = pci_resource_len(ha->pdev, 1);
1510 	mmio_flags = pci_resource_flags(ha->pdev, 1);
1511 
1512 	if (!(mmio_flags & IORESOURCE_MEM)) {
1513 		ql4_printk(KERN_ERR, ha,
1514 		    "region #0 not an MMIO resource, aborting\n");
1515 
1516 		goto iospace_error_exit;
1517 	}
1518 
1519 	if (mmio_len < MIN_IOBASE_LEN) {
1520 		ql4_printk(KERN_ERR, ha,
1521 		    "Invalid PCI mem region size, aborting\n");
1522 		goto iospace_error_exit;
1523 	}
1524 
1525 	if (pci_request_regions(ha->pdev, DRIVER_NAME)) {
1526 		ql4_printk(KERN_WARNING, ha,
1527 		    "Failed to reserve PIO/MMIO regions\n");
1528 
1529 		goto iospace_error_exit;
1530 	}
1531 
1532 	ha->pio_address = pio;
1533 	ha->pio_length = pio_len;
1534 	ha->reg = ioremap(mmio, MIN_IOBASE_LEN);
1535 	if (!ha->reg) {
1536 		ql4_printk(KERN_ERR, ha,
1537 		    "cannot remap MMIO, aborting\n");
1538 
1539 		goto iospace_error_exit;
1540 	}
1541 
1542 	return 0;
1543 
1544 iospace_error_exit:
1545 	return -ENOMEM;
1546 }
1547 
1548 static struct isp_operations qla4xxx_isp_ops = {
1549 	.iospace_config         = qla4xxx_iospace_config,
1550 	.pci_config             = qla4xxx_pci_config,
1551 	.disable_intrs          = qla4xxx_disable_intrs,
1552 	.enable_intrs           = qla4xxx_enable_intrs,
1553 	.start_firmware         = qla4xxx_start_firmware,
1554 	.intr_handler           = qla4xxx_intr_handler,
1555 	.interrupt_service_routine = qla4xxx_interrupt_service_routine,
1556 	.reset_chip             = qla4xxx_soft_reset,
1557 	.reset_firmware         = qla4xxx_hw_reset,
1558 	.queue_iocb             = qla4xxx_queue_iocb,
1559 	.complete_iocb          = qla4xxx_complete_iocb,
1560 	.rd_shdw_req_q_out      = qla4xxx_rd_shdw_req_q_out,
1561 	.rd_shdw_rsp_q_in       = qla4xxx_rd_shdw_rsp_q_in,
1562 	.get_sys_info           = qla4xxx_get_sys_info,
1563 };
1564 
1565 static struct isp_operations qla4_8xxx_isp_ops = {
1566 	.iospace_config         = qla4_8xxx_iospace_config,
1567 	.pci_config             = qla4_8xxx_pci_config,
1568 	.disable_intrs          = qla4_8xxx_disable_intrs,
1569 	.enable_intrs           = qla4_8xxx_enable_intrs,
1570 	.start_firmware         = qla4_8xxx_load_risc,
1571 	.intr_handler           = qla4_8xxx_intr_handler,
1572 	.interrupt_service_routine = qla4_8xxx_interrupt_service_routine,
1573 	.reset_chip             = qla4_8xxx_isp_reset,
1574 	.reset_firmware         = qla4_8xxx_stop_firmware,
1575 	.queue_iocb             = qla4_8xxx_queue_iocb,
1576 	.complete_iocb          = qla4_8xxx_complete_iocb,
1577 	.rd_shdw_req_q_out      = qla4_8xxx_rd_shdw_req_q_out,
1578 	.rd_shdw_rsp_q_in       = qla4_8xxx_rd_shdw_rsp_q_in,
1579 	.get_sys_info           = qla4_8xxx_get_sys_info,
1580 };
1581 
qla4xxx_rd_shdw_req_q_out(struct scsi_qla_host * ha)1582 uint16_t qla4xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha)
1583 {
1584 	return (uint16_t)le32_to_cpu(ha->shadow_regs->req_q_out);
1585 }
1586 
qla4_8xxx_rd_shdw_req_q_out(struct scsi_qla_host * ha)1587 uint16_t qla4_8xxx_rd_shdw_req_q_out(struct scsi_qla_host *ha)
1588 {
1589 	return (uint16_t)le32_to_cpu(readl(&ha->qla4_8xxx_reg->req_q_out));
1590 }
1591 
qla4xxx_rd_shdw_rsp_q_in(struct scsi_qla_host * ha)1592 uint16_t qla4xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha)
1593 {
1594 	return (uint16_t)le32_to_cpu(ha->shadow_regs->rsp_q_in);
1595 }
1596 
qla4_8xxx_rd_shdw_rsp_q_in(struct scsi_qla_host * ha)1597 uint16_t qla4_8xxx_rd_shdw_rsp_q_in(struct scsi_qla_host *ha)
1598 {
1599 	return (uint16_t)le32_to_cpu(readl(&ha->qla4_8xxx_reg->rsp_q_in));
1600 }
1601 
1602 /**
1603  * qla4xxx_probe_adapter - callback function to probe HBA
1604  * @pdev: pointer to pci_dev structure
1605  * @pci_device_id: pointer to pci_device entry
1606  *
1607  * This routine will probe for Qlogic 4xxx iSCSI host adapters.
1608  * It returns zero if successful. It also initializes all data necessary for
1609  * the driver.
1610  **/
qla4xxx_probe_adapter(struct pci_dev * pdev,const struct pci_device_id * ent)1611 static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev,
1612 					   const struct pci_device_id *ent)
1613 {
1614 	int ret = -ENODEV, status;
1615 	struct Scsi_Host *host;
1616 	struct scsi_qla_host *ha;
1617 	uint8_t init_retry_count = 0;
1618 	char buf[34];
1619 	struct qla4_8xxx_legacy_intr_set *nx_legacy_intr;
1620 	uint32_t dev_state;
1621 
1622 	if (pci_enable_device(pdev))
1623 		return -1;
1624 
1625 	host = scsi_host_alloc(&qla4xxx_driver_template, sizeof(*ha));
1626 	if (host == NULL) {
1627 		printk(KERN_WARNING
1628 		       "qla4xxx: Couldn't allocate host from scsi layer!\n");
1629 		goto probe_disable_device;
1630 	}
1631 
1632 	/* Clear our data area */
1633 	ha = (struct scsi_qla_host *) host->hostdata;
1634 	memset(ha, 0, sizeof(*ha));
1635 
1636 	/* Save the information from PCI BIOS.	*/
1637 	ha->pdev = pdev;
1638 	ha->host = host;
1639 	ha->host_no = host->host_no;
1640 
1641 	pci_enable_pcie_error_reporting(pdev);
1642 
1643 	/* Setup Runtime configurable options */
1644 	if (is_qla8022(ha)) {
1645 		ha->isp_ops = &qla4_8xxx_isp_ops;
1646 		rwlock_init(&ha->hw_lock);
1647 		ha->qdr_sn_window = -1;
1648 		ha->ddr_mn_window = -1;
1649 		ha->curr_window = 255;
1650 		ha->func_num = PCI_FUNC(ha->pdev->devfn);
1651 		nx_legacy_intr = &legacy_intr[ha->func_num];
1652 		ha->nx_legacy_intr.int_vec_bit = nx_legacy_intr->int_vec_bit;
1653 		ha->nx_legacy_intr.tgt_status_reg =
1654 			nx_legacy_intr->tgt_status_reg;
1655 		ha->nx_legacy_intr.tgt_mask_reg = nx_legacy_intr->tgt_mask_reg;
1656 		ha->nx_legacy_intr.pci_int_reg = nx_legacy_intr->pci_int_reg;
1657 	} else {
1658 		ha->isp_ops = &qla4xxx_isp_ops;
1659 	}
1660 
1661 	/* Set EEH reset type to fundamental if required by hba */
1662 	if (is_qla8022(ha))
1663 		pdev->needs_freset = 1;
1664 
1665 	/* Configure PCI I/O space. */
1666 	ret = ha->isp_ops->iospace_config(ha);
1667 	if (ret)
1668 		goto probe_failed_ioconfig;
1669 
1670 	ql4_printk(KERN_INFO, ha, "Found an ISP%04x, irq %d, iobase 0x%p\n",
1671 		   pdev->device, pdev->irq, ha->reg);
1672 
1673 	qla4xxx_config_dma_addressing(ha);
1674 
1675 	/* Initialize lists and spinlocks. */
1676 	INIT_LIST_HEAD(&ha->ddb_list);
1677 	INIT_LIST_HEAD(&ha->free_srb_q);
1678 
1679 	mutex_init(&ha->mbox_sem);
1680 	init_completion(&ha->mbx_intr_comp);
1681 
1682 	spin_lock_init(&ha->hardware_lock);
1683 
1684 	/* Allocate dma buffers */
1685 	if (qla4xxx_mem_alloc(ha)) {
1686 		ql4_printk(KERN_WARNING, ha,
1687 		    "[ERROR] Failed to allocate memory for adapter\n");
1688 
1689 		ret = -ENOMEM;
1690 		goto probe_failed;
1691 	}
1692 
1693 	if (is_qla8022(ha))
1694 		(void) qla4_8xxx_get_flash_info(ha);
1695 
1696 	/*
1697 	 * Initialize the Host adapter request/response queues and
1698 	 * firmware
1699 	 * NOTE: interrupts enabled upon successful completion
1700 	 */
1701 	status = qla4xxx_initialize_adapter(ha, REBUILD_DDB_LIST);
1702 	while ((!test_bit(AF_ONLINE, &ha->flags)) &&
1703 	    init_retry_count++ < MAX_INIT_RETRIES) {
1704 
1705 		if (is_qla8022(ha)) {
1706 			qla4_8xxx_idc_lock(ha);
1707 			dev_state = qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE);
1708 			qla4_8xxx_idc_unlock(ha);
1709 			if (dev_state == QLA82XX_DEV_FAILED) {
1710 				ql4_printk(KERN_WARNING, ha, "%s: don't retry "
1711 				    "initialize adapter. H/W is in failed state\n",
1712 				    __func__);
1713 				break;
1714 			}
1715 		}
1716 		DEBUG2(printk("scsi: %s: retrying adapter initialization "
1717 			      "(%d)\n", __func__, init_retry_count));
1718 
1719 		if (ha->isp_ops->reset_chip(ha) == QLA_ERROR)
1720 			continue;
1721 
1722 		status = qla4xxx_initialize_adapter(ha, REBUILD_DDB_LIST);
1723 	}
1724 
1725 	if (!test_bit(AF_ONLINE, &ha->flags)) {
1726 		ql4_printk(KERN_WARNING, ha, "Failed to initialize adapter\n");
1727 
1728 		if (is_qla8022(ha) && ql4xdontresethba) {
1729 			/* Put the device in failed state. */
1730 			DEBUG2(printk(KERN_ERR "HW STATE: FAILED\n"));
1731 			qla4_8xxx_idc_lock(ha);
1732 			qla4_8xxx_wr_32(ha, QLA82XX_CRB_DEV_STATE,
1733 			    QLA82XX_DEV_FAILED);
1734 			qla4_8xxx_idc_unlock(ha);
1735 		}
1736 		ret = -ENODEV;
1737 		goto probe_failed;
1738 	}
1739 
1740 	host->cmd_per_lun = 3;
1741 	host->max_channel = 0;
1742 	host->max_lun = MAX_LUNS - 1;
1743 	host->max_id = MAX_TARGETS;
1744 	host->max_cmd_len = IOCB_MAX_CDB_LEN;
1745 	host->can_queue = MAX_SRBS ;
1746 	host->transportt = qla4xxx_scsi_transport;
1747 
1748         ret = scsi_init_shared_tag_map(host, MAX_SRBS);
1749         if (ret) {
1750 		ql4_printk(KERN_WARNING, ha,
1751 		    "scsi_init_shared_tag_map failed\n");
1752 		goto probe_failed;
1753         }
1754 
1755 	/* Startup the kernel thread for this host adapter. */
1756 	DEBUG2(printk("scsi: %s: Starting kernel thread for "
1757 		      "qla4xxx_dpc\n", __func__));
1758 	sprintf(buf, "qla4xxx_%lu_dpc", ha->host_no);
1759 	ha->dpc_thread = create_singlethread_workqueue(buf);
1760 	if (!ha->dpc_thread) {
1761 		ql4_printk(KERN_WARNING, ha, "Unable to start DPC thread!\n");
1762 		ret = -ENODEV;
1763 		goto probe_failed;
1764 	}
1765 	INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc);
1766 
1767 	/* For ISP-82XX, request_irqs is called in qla4_8xxx_load_risc
1768 	 * (which is called indirectly by qla4xxx_initialize_adapter),
1769 	 * so that irqs will be registered after crbinit but before
1770 	 * mbx_intr_enable.
1771 	 */
1772 	if (!is_qla8022(ha)) {
1773 		ret = qla4xxx_request_irqs(ha);
1774 		if (ret) {
1775 			ql4_printk(KERN_WARNING, ha, "Failed to reserve "
1776 			    "interrupt %d already in use.\n", pdev->irq);
1777 			goto probe_failed;
1778 		}
1779 	}
1780 
1781 	pci_save_state(ha->pdev);
1782 	ha->isp_ops->enable_intrs(ha);
1783 
1784 	/* Start timer thread. */
1785 	qla4xxx_start_timer(ha, qla4xxx_timer, 1);
1786 
1787 	set_bit(AF_INIT_DONE, &ha->flags);
1788 
1789 	pci_set_drvdata(pdev, ha);
1790 
1791 	ret = scsi_add_host(host, &pdev->dev);
1792 	if (ret)
1793 		goto probe_failed;
1794 
1795 	printk(KERN_INFO
1796 	       " QLogic iSCSI HBA Driver version: %s\n"
1797 	       "  QLogic ISP%04x @ %s, host#=%ld, fw=%02d.%02d.%02d.%02d\n",
1798 	       qla4xxx_version_str, ha->pdev->device, pci_name(ha->pdev),
1799 	       ha->host_no, ha->firmware_version[0], ha->firmware_version[1],
1800 	       ha->patch_number, ha->build_number);
1801 	scsi_scan_host(host);
1802 	return 0;
1803 
1804 probe_failed:
1805 	qla4xxx_free_adapter(ha);
1806 
1807 probe_failed_ioconfig:
1808 	pci_disable_pcie_error_reporting(pdev);
1809 	scsi_host_put(ha->host);
1810 
1811 probe_disable_device:
1812 	pci_disable_device(pdev);
1813 
1814 	return ret;
1815 }
1816 
1817 /**
1818  * qla4xxx_prevent_other_port_reinit - prevent other port from re-initialize
1819  * @ha: pointer to adapter structure
1820  *
1821  * Mark the other ISP-4xxx port to indicate that the driver is being removed,
1822  * so that the other port will not re-initialize while in the process of
1823  * removing the ha due to driver unload or hba hotplug.
1824  **/
qla4xxx_prevent_other_port_reinit(struct scsi_qla_host * ha)1825 static void qla4xxx_prevent_other_port_reinit(struct scsi_qla_host *ha)
1826 {
1827 	struct scsi_qla_host *other_ha = NULL;
1828 	struct pci_dev *other_pdev = NULL;
1829 	int fn = ISP4XXX_PCI_FN_2;
1830 
1831 	/*iscsi function numbers for ISP4xxx is 1 and 3*/
1832 	if (PCI_FUNC(ha->pdev->devfn) & BIT_1)
1833 		fn = ISP4XXX_PCI_FN_1;
1834 
1835 	other_pdev =
1836 		pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus),
1837 		ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn),
1838 		fn));
1839 
1840 	/* Get other_ha if other_pdev is valid and state is enable*/
1841 	if (other_pdev) {
1842 		if (atomic_read(&other_pdev->enable_cnt)) {
1843 			other_ha = pci_get_drvdata(other_pdev);
1844 			if (other_ha) {
1845 				set_bit(AF_HA_REMOVAL, &other_ha->flags);
1846 				DEBUG2(ql4_printk(KERN_INFO, ha, "%s: "
1847 				    "Prevent %s reinit\n", __func__,
1848 				    dev_name(&other_ha->pdev->dev)));
1849 			}
1850 		}
1851 		pci_dev_put(other_pdev);
1852 	}
1853 }
1854 
1855 /**
1856  * qla4xxx_remove_adapter - calback function to remove adapter.
1857  * @pci_dev: PCI device pointer
1858  **/
qla4xxx_remove_adapter(struct pci_dev * pdev)1859 static void __devexit qla4xxx_remove_adapter(struct pci_dev *pdev)
1860 {
1861 	struct scsi_qla_host *ha;
1862 
1863 	ha = pci_get_drvdata(pdev);
1864 
1865 	if (!is_qla8022(ha))
1866 		qla4xxx_prevent_other_port_reinit(ha);
1867 
1868 	/* remove devs from iscsi_sessions to scsi_devices */
1869 	qla4xxx_free_ddb_list(ha);
1870 
1871 	scsi_remove_host(ha->host);
1872 
1873 	qla4xxx_free_adapter(ha);
1874 
1875 	scsi_host_put(ha->host);
1876 
1877 	pci_disable_pcie_error_reporting(pdev);
1878 	pci_disable_device(pdev);
1879 	pci_set_drvdata(pdev, NULL);
1880 }
1881 
1882 /**
1883  * qla4xxx_config_dma_addressing() - Configure OS DMA addressing method.
1884  * @ha: HA context
1885  *
1886  * At exit, the @ha's flags.enable_64bit_addressing set to indicated
1887  * supported addressing method.
1888  */
qla4xxx_config_dma_addressing(struct scsi_qla_host * ha)1889 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha)
1890 {
1891 	int retval;
1892 
1893 	/* Update our PCI device dma_mask for full 64 bit mask */
1894 	if (pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(64)) == 0) {
1895 		if (pci_set_consistent_dma_mask(ha->pdev, DMA_BIT_MASK(64))) {
1896 			dev_dbg(&ha->pdev->dev,
1897 				  "Failed to set 64 bit PCI consistent mask; "
1898 				   "using 32 bit.\n");
1899 			retval = pci_set_consistent_dma_mask(ha->pdev,
1900 							     DMA_BIT_MASK(32));
1901 		}
1902 	} else
1903 		retval = pci_set_dma_mask(ha->pdev, DMA_BIT_MASK(32));
1904 }
1905 
qla4xxx_slave_alloc(struct scsi_device * sdev)1906 static int qla4xxx_slave_alloc(struct scsi_device *sdev)
1907 {
1908 	struct iscsi_cls_session *sess = starget_to_session(sdev->sdev_target);
1909 	struct ddb_entry *ddb = sess->dd_data;
1910 	int queue_depth = QL4_DEF_QDEPTH;
1911 
1912 	sdev->hostdata = ddb;
1913 	sdev->tagged_supported = 1;
1914 
1915 	if (ql4xmaxqdepth != 0 && ql4xmaxqdepth <= 0xffffU)
1916 		queue_depth = ql4xmaxqdepth;
1917 
1918 	scsi_activate_tcq(sdev, queue_depth);
1919 	return 0;
1920 }
1921 
qla4xxx_slave_configure(struct scsi_device * sdev)1922 static int qla4xxx_slave_configure(struct scsi_device *sdev)
1923 {
1924 	sdev->tagged_supported = 1;
1925 	return 0;
1926 }
1927 
qla4xxx_slave_destroy(struct scsi_device * sdev)1928 static void qla4xxx_slave_destroy(struct scsi_device *sdev)
1929 {
1930 	scsi_deactivate_tcq(sdev, 1);
1931 }
1932 
1933 /**
1934  * qla4xxx_del_from_active_array - returns an active srb
1935  * @ha: Pointer to host adapter structure.
1936  * @index: index into the active_array
1937  *
1938  * This routine removes and returns the srb at the specified index
1939  **/
qla4xxx_del_from_active_array(struct scsi_qla_host * ha,uint32_t index)1940 struct srb *qla4xxx_del_from_active_array(struct scsi_qla_host *ha,
1941     uint32_t index)
1942 {
1943 	struct srb *srb = NULL;
1944 	struct scsi_cmnd *cmd = NULL;
1945 
1946 	cmd = scsi_host_find_tag(ha->host, index);
1947 	if (!cmd)
1948 		return srb;
1949 
1950 	srb = (struct srb *)CMD_SP(cmd);
1951 	if (!srb)
1952 		return srb;
1953 
1954 	/* update counters */
1955 	if (srb->flags & SRB_DMA_VALID) {
1956 		ha->req_q_count += srb->iocb_cnt;
1957 		ha->iocb_cnt -= srb->iocb_cnt;
1958 		if (srb->cmd)
1959 			srb->cmd->host_scribble =
1960 				(unsigned char *)(unsigned long) MAX_SRBS;
1961 	}
1962 	return srb;
1963 }
1964 
1965 /**
1966  * qla4xxx_eh_wait_on_command - waits for command to be returned by firmware
1967  * @ha: Pointer to host adapter structure.
1968  * @cmd: Scsi Command to wait on.
1969  *
1970  * This routine waits for the command to be returned by the Firmware
1971  * for some max time.
1972  **/
qla4xxx_eh_wait_on_command(struct scsi_qla_host * ha,struct scsi_cmnd * cmd)1973 static int qla4xxx_eh_wait_on_command(struct scsi_qla_host *ha,
1974 				      struct scsi_cmnd *cmd)
1975 {
1976 	int done = 0;
1977 	struct srb *rp;
1978 	uint32_t max_wait_time = EH_WAIT_CMD_TOV;
1979 	int ret = SUCCESS;
1980 
1981 	/* Dont wait on command if PCI error is being handled
1982 	 * by PCI AER driver
1983 	 */
1984 	if (unlikely(pci_channel_offline(ha->pdev)) ||
1985 	    (test_bit(AF_EEH_BUSY, &ha->flags))) {
1986 		ql4_printk(KERN_WARNING, ha, "scsi%ld: Return from %s\n",
1987 		    ha->host_no, __func__);
1988 		return ret;
1989 	}
1990 
1991 	do {
1992 		/* Checking to see if its returned to OS */
1993 		rp = (struct srb *) CMD_SP(cmd);
1994 		if (rp == NULL) {
1995 			done++;
1996 			break;
1997 		}
1998 
1999 		msleep(2000);
2000 	} while (max_wait_time--);
2001 
2002 	return done;
2003 }
2004 
2005 /**
2006  * qla4xxx_wait_for_hba_online - waits for HBA to come online
2007  * @ha: Pointer to host adapter structure
2008  **/
qla4xxx_wait_for_hba_online(struct scsi_qla_host * ha)2009 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha)
2010 {
2011 	unsigned long wait_online;
2012 
2013 	wait_online = jiffies + (HBA_ONLINE_TOV * HZ);
2014 	while (time_before(jiffies, wait_online)) {
2015 
2016 		if (adapter_up(ha))
2017 			return QLA_SUCCESS;
2018 
2019 		msleep(2000);
2020 	}
2021 
2022 	return QLA_ERROR;
2023 }
2024 
2025 /**
2026  * qla4xxx_eh_wait_for_commands - wait for active cmds to finish.
2027  * @ha: pointer to HBA
2028  * @t: target id
2029  * @l: lun id
2030  *
2031  * This function waits for all outstanding commands to a lun to complete. It
2032  * returns 0 if all pending commands are returned and 1 otherwise.
2033  **/
qla4xxx_eh_wait_for_commands(struct scsi_qla_host * ha,struct scsi_target * stgt,struct scsi_device * sdev)2034 static int qla4xxx_eh_wait_for_commands(struct scsi_qla_host *ha,
2035 					struct scsi_target *stgt,
2036 					struct scsi_device *sdev)
2037 {
2038 	int cnt;
2039 	int status = 0;
2040 	struct scsi_cmnd *cmd;
2041 
2042 	/*
2043 	 * Waiting for all commands for the designated target or dev
2044 	 * in the active array
2045 	 */
2046 	for (cnt = 0; cnt < ha->host->can_queue; cnt++) {
2047 		cmd = scsi_host_find_tag(ha->host, cnt);
2048 		if (cmd && stgt == scsi_target(cmd->device) &&
2049 		    (!sdev || sdev == cmd->device)) {
2050 			if (!qla4xxx_eh_wait_on_command(ha, cmd)) {
2051 				status++;
2052 				break;
2053 			}
2054 		}
2055 	}
2056 	return status;
2057 }
2058 
2059 /**
2060  * qla4xxx_eh_abort - callback for abort task.
2061  * @cmd: Pointer to Linux's SCSI command structure
2062  *
2063  * This routine is called by the Linux OS to abort the specified
2064  * command.
2065  **/
qla4xxx_eh_abort(struct scsi_cmnd * cmd)2066 static int qla4xxx_eh_abort(struct scsi_cmnd *cmd)
2067 {
2068 	struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
2069 	unsigned int id = cmd->device->id;
2070 	unsigned int lun = cmd->device->lun;
2071 	unsigned long serial = cmd->serial_number;
2072 	unsigned long flags;
2073 	struct srb *srb = NULL;
2074 	int ret = SUCCESS;
2075 	int wait = 0;
2076 
2077 	ql4_printk(KERN_INFO, ha,
2078 	    "scsi%ld:%d:%d: Abort command issued cmd=%p, pid=%ld\n",
2079 	    ha->host_no, id, lun, cmd, serial);
2080 
2081 	spin_lock_irqsave(&ha->hardware_lock, flags);
2082 	srb = (struct srb *) CMD_SP(cmd);
2083 	if (!srb) {
2084 		spin_unlock_irqrestore(&ha->hardware_lock, flags);
2085 		return SUCCESS;
2086 	}
2087 	kref_get(&srb->srb_ref);
2088 	spin_unlock_irqrestore(&ha->hardware_lock, flags);
2089 
2090 	if (qla4xxx_abort_task(ha, srb) != QLA_SUCCESS) {
2091 		DEBUG3(printk("scsi%ld:%d:%d: Abort_task mbx failed.\n",
2092 		    ha->host_no, id, lun));
2093 		ret = FAILED;
2094 	} else {
2095 		DEBUG3(printk("scsi%ld:%d:%d: Abort_task mbx success.\n",
2096 		    ha->host_no, id, lun));
2097 		wait = 1;
2098 	}
2099 
2100 	kref_put(&srb->srb_ref, qla4xxx_srb_compl);
2101 
2102 	/* Wait for command to complete */
2103 	if (wait) {
2104 		if (!qla4xxx_eh_wait_on_command(ha, cmd)) {
2105 			DEBUG2(printk("scsi%ld:%d:%d: Abort handler timed out\n",
2106 			    ha->host_no, id, lun));
2107 			ret = FAILED;
2108 		}
2109 	}
2110 
2111 	ql4_printk(KERN_INFO, ha,
2112 	    "scsi%ld:%d:%d: Abort command - %s\n",
2113 	    ha->host_no, id, lun, (ret == SUCCESS) ? "succeeded" : "failed");
2114 
2115 	return ret;
2116 }
2117 
2118 /**
2119  * qla4xxx_eh_device_reset - callback for target reset.
2120  * @cmd: Pointer to Linux's SCSI command structure
2121  *
2122  * This routine is called by the Linux OS to reset all luns on the
2123  * specified target.
2124  **/
qla4xxx_eh_device_reset(struct scsi_cmnd * cmd)2125 static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
2126 {
2127 	struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
2128 	struct ddb_entry *ddb_entry = cmd->device->hostdata;
2129 	int ret = FAILED, stat;
2130 
2131 	if (!ddb_entry)
2132 		return ret;
2133 
2134 	ret = iscsi_block_scsi_eh(cmd);
2135 	if (ret)
2136 		return ret;
2137 	ret = FAILED;
2138 
2139 	ql4_printk(KERN_INFO, ha,
2140 		   "scsi%ld:%d:%d:%d: DEVICE RESET ISSUED.\n", ha->host_no,
2141 		   cmd->device->channel, cmd->device->id, cmd->device->lun);
2142 
2143 	DEBUG2(printk(KERN_INFO
2144 		      "scsi%ld: DEVICE_RESET cmd=%p jiffies = 0x%lx, to=%x,"
2145 		      "dpc_flags=%lx, status=%x allowed=%d\n", ha->host_no,
2146 		      cmd, jiffies, cmd->request->timeout / HZ,
2147 		      ha->dpc_flags, cmd->result, cmd->allowed));
2148 
2149 	/* FIXME: wait for hba to go online */
2150 	stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun);
2151 	if (stat != QLA_SUCCESS) {
2152 		ql4_printk(KERN_INFO, ha, "DEVICE RESET FAILED. %d\n", stat);
2153 		goto eh_dev_reset_done;
2154 	}
2155 
2156 	if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device),
2157 					 cmd->device)) {
2158 		ql4_printk(KERN_INFO, ha,
2159 			   "DEVICE RESET FAILED - waiting for "
2160 			   "commands.\n");
2161 		goto eh_dev_reset_done;
2162 	}
2163 
2164 	/* Send marker. */
2165 	if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun,
2166 		MM_LUN_RESET) != QLA_SUCCESS)
2167 		goto eh_dev_reset_done;
2168 
2169 	ql4_printk(KERN_INFO, ha,
2170 		   "scsi(%ld:%d:%d:%d): DEVICE RESET SUCCEEDED.\n",
2171 		   ha->host_no, cmd->device->channel, cmd->device->id,
2172 		   cmd->device->lun);
2173 
2174 	ret = SUCCESS;
2175 
2176 eh_dev_reset_done:
2177 
2178 	return ret;
2179 }
2180 
2181 /**
2182  * qla4xxx_eh_target_reset - callback for target reset.
2183  * @cmd: Pointer to Linux's SCSI command structure
2184  *
2185  * This routine is called by the Linux OS to reset the target.
2186  **/
qla4xxx_eh_target_reset(struct scsi_cmnd * cmd)2187 static int qla4xxx_eh_target_reset(struct scsi_cmnd *cmd)
2188 {
2189 	struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
2190 	struct ddb_entry *ddb_entry = cmd->device->hostdata;
2191 	int stat, ret;
2192 
2193 	if (!ddb_entry)
2194 		return FAILED;
2195 
2196 	ret = iscsi_block_scsi_eh(cmd);
2197 	if (ret)
2198 		return ret;
2199 
2200 	starget_printk(KERN_INFO, scsi_target(cmd->device),
2201 		       "WARM TARGET RESET ISSUED.\n");
2202 
2203 	DEBUG2(printk(KERN_INFO
2204 		      "scsi%ld: TARGET_DEVICE_RESET cmd=%p jiffies = 0x%lx, "
2205 		      "to=%x,dpc_flags=%lx, status=%x allowed=%d\n",
2206 		      ha->host_no, cmd, jiffies, cmd->request->timeout / HZ,
2207 		      ha->dpc_flags, cmd->result, cmd->allowed));
2208 
2209 	stat = qla4xxx_reset_target(ha, ddb_entry);
2210 	if (stat != QLA_SUCCESS) {
2211 		starget_printk(KERN_INFO, scsi_target(cmd->device),
2212 			       "WARM TARGET RESET FAILED.\n");
2213 		return FAILED;
2214 	}
2215 
2216 	if (qla4xxx_eh_wait_for_commands(ha, scsi_target(cmd->device),
2217 					 NULL)) {
2218 		starget_printk(KERN_INFO, scsi_target(cmd->device),
2219 			       "WARM TARGET DEVICE RESET FAILED - "
2220 			       "waiting for commands.\n");
2221 		return FAILED;
2222 	}
2223 
2224 	/* Send marker. */
2225 	if (qla4xxx_send_marker_iocb(ha, ddb_entry, cmd->device->lun,
2226 		MM_TGT_WARM_RESET) != QLA_SUCCESS) {
2227 		starget_printk(KERN_INFO, scsi_target(cmd->device),
2228 			       "WARM TARGET DEVICE RESET FAILED - "
2229 			       "marker iocb failed.\n");
2230 		return FAILED;
2231 	}
2232 
2233 	starget_printk(KERN_INFO, scsi_target(cmd->device),
2234 		       "WARM TARGET RESET SUCCEEDED.\n");
2235 	return SUCCESS;
2236 }
2237 
2238 /**
2239  * qla4xxx_eh_host_reset - kernel callback
2240  * @cmd: Pointer to Linux's SCSI command structure
2241  *
2242  * This routine is invoked by the Linux kernel to perform fatal error
2243  * recovery on the specified adapter.
2244  **/
qla4xxx_eh_host_reset(struct scsi_cmnd * cmd)2245 static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd)
2246 {
2247 	int return_status = FAILED;
2248 	struct scsi_qla_host *ha;
2249 
2250 	ha = (struct scsi_qla_host *) cmd->device->host->hostdata;
2251 
2252 	if (ql4xdontresethba) {
2253 		DEBUG2(printk("scsi%ld: %s: Don't Reset HBA\n",
2254 		     ha->host_no, __func__));
2255 		return FAILED;
2256 	}
2257 
2258 	ql4_printk(KERN_INFO, ha,
2259 		   "scsi(%ld:%d:%d:%d): HOST RESET ISSUED.\n", ha->host_no,
2260 		   cmd->device->channel, cmd->device->id, cmd->device->lun);
2261 
2262 	if (qla4xxx_wait_for_hba_online(ha) != QLA_SUCCESS) {
2263 		DEBUG2(printk("scsi%ld:%d: %s: Unable to reset host.  Adapter "
2264 			      "DEAD.\n", ha->host_no, cmd->device->channel,
2265 			      __func__));
2266 
2267 		return FAILED;
2268 	}
2269 
2270 	if (!test_bit(DPC_RESET_HA, &ha->dpc_flags)) {
2271 		if (is_qla8022(ha))
2272 			set_bit(DPC_RESET_HA_FW_CONTEXT, &ha->dpc_flags);
2273 		else
2274 			set_bit(DPC_RESET_HA, &ha->dpc_flags);
2275 	}
2276 
2277 	if (qla4xxx_recover_adapter(ha) == QLA_SUCCESS)
2278 		return_status = SUCCESS;
2279 
2280 	ql4_printk(KERN_INFO, ha, "HOST RESET %s.\n",
2281 		   return_status == FAILED ? "FAILED" : "SUCCEEDED");
2282 
2283 	return return_status;
2284 }
2285 
2286 /* PCI AER driver recovers from all correctable errors w/o
2287  * driver intervention. For uncorrectable errors PCI AER
2288  * driver calls the following device driver's callbacks
2289  *
2290  * - Fatal Errors - link_reset
2291  * - Non-Fatal Errors - driver's pci_error_detected() which
2292  * returns CAN_RECOVER, NEED_RESET or DISCONNECT.
2293  *
2294  * PCI AER driver calls
2295  * CAN_RECOVER - driver's pci_mmio_enabled(), mmio_enabled
2296  *               returns RECOVERED or NEED_RESET if fw_hung
2297  * NEED_RESET - driver's slot_reset()
2298  * DISCONNECT - device is dead & cannot recover
2299  * RECOVERED - driver's pci_resume()
2300  */
2301 static pci_ers_result_t
qla4xxx_pci_error_detected(struct pci_dev * pdev,pci_channel_state_t state)2302 qla4xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
2303 {
2304 	struct scsi_qla_host *ha = pci_get_drvdata(pdev);
2305 
2306 	ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: error detected:state %x\n",
2307 	    ha->host_no, __func__, state);
2308 
2309 	if (!is_aer_supported(ha))
2310 		return PCI_ERS_RESULT_NONE;
2311 
2312 	switch (state) {
2313 	case pci_channel_io_normal:
2314 		clear_bit(AF_EEH_BUSY, &ha->flags);
2315 		return PCI_ERS_RESULT_CAN_RECOVER;
2316 	case pci_channel_io_frozen:
2317 		set_bit(AF_EEH_BUSY, &ha->flags);
2318 		qla4xxx_mailbox_premature_completion(ha);
2319 		qla4xxx_free_irqs(ha);
2320 		pci_disable_device(pdev);
2321 		/* Return back all IOs */
2322 		qla4xxx_abort_active_cmds(ha, DID_RESET << 16);
2323 		return PCI_ERS_RESULT_NEED_RESET;
2324 	case pci_channel_io_perm_failure:
2325 		set_bit(AF_EEH_BUSY, &ha->flags);
2326 		set_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags);
2327 		qla4xxx_abort_active_cmds(ha, DID_NO_CONNECT << 16);
2328 		return PCI_ERS_RESULT_DISCONNECT;
2329 	}
2330 	return PCI_ERS_RESULT_NEED_RESET;
2331 }
2332 
2333 /**
2334  * qla4xxx_pci_mmio_enabled() gets called if
2335  * qla4xxx_pci_error_detected() returns PCI_ERS_RESULT_CAN_RECOVER
2336  * and read/write to the device still works.
2337  **/
2338 static pci_ers_result_t
qla4xxx_pci_mmio_enabled(struct pci_dev * pdev)2339 qla4xxx_pci_mmio_enabled(struct pci_dev *pdev)
2340 {
2341 	struct scsi_qla_host *ha = pci_get_drvdata(pdev);
2342 
2343 	if (!is_aer_supported(ha))
2344 		return PCI_ERS_RESULT_NONE;
2345 
2346 	return PCI_ERS_RESULT_RECOVERED;
2347 }
2348 
qla4_8xxx_error_recovery(struct scsi_qla_host * ha)2349 static uint32_t qla4_8xxx_error_recovery(struct scsi_qla_host *ha)
2350 {
2351 	uint32_t rval = QLA_ERROR;
2352 	uint32_t ret = 0;
2353 	int fn;
2354 	struct pci_dev *other_pdev = NULL;
2355 
2356 	ql4_printk(KERN_WARNING, ha, "scsi%ld: In %s\n", ha->host_no, __func__);
2357 
2358 	set_bit(DPC_RESET_ACTIVE, &ha->dpc_flags);
2359 
2360 	if (test_bit(AF_ONLINE, &ha->flags)) {
2361 		clear_bit(AF_ONLINE, &ha->flags);
2362 		qla4xxx_mark_all_devices_missing(ha);
2363 		qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
2364 	}
2365 
2366 	fn = PCI_FUNC(ha->pdev->devfn);
2367 	while (fn > 0) {
2368 		fn--;
2369 		ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Finding PCI device at "
2370 		    "func %x\n", ha->host_no, __func__, fn);
2371 		/* Get the pci device given the domain, bus,
2372 		 * slot/function number */
2373 		other_pdev =
2374 		    pci_get_domain_bus_and_slot(pci_domain_nr(ha->pdev->bus),
2375 		    ha->pdev->bus->number, PCI_DEVFN(PCI_SLOT(ha->pdev->devfn),
2376 		    fn));
2377 
2378 		if (!other_pdev)
2379 			continue;
2380 
2381 		if (atomic_read(&other_pdev->enable_cnt)) {
2382 			ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Found PCI "
2383 			    "func in enabled state%x\n", ha->host_no,
2384 			    __func__, fn);
2385 			pci_dev_put(other_pdev);
2386 			break;
2387 		}
2388 		pci_dev_put(other_pdev);
2389 	}
2390 
2391 	/* The first function on the card, the reset owner will
2392 	 * start & initialize the firmware. The other functions
2393 	 * on the card will reset the firmware context
2394 	 */
2395 	if (!fn) {
2396 		ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn being reset "
2397 		    "0x%x is the owner\n", ha->host_no, __func__,
2398 		    ha->pdev->devfn);
2399 
2400 		qla4_8xxx_idc_lock(ha);
2401 		qla4_8xxx_wr_32(ha, QLA82XX_CRB_DEV_STATE,
2402 		    QLA82XX_DEV_COLD);
2403 
2404 		qla4_8xxx_wr_32(ha, QLA82XX_CRB_DRV_IDC_VERSION,
2405 		    QLA82XX_IDC_VERSION);
2406 
2407 		qla4_8xxx_idc_unlock(ha);
2408 		clear_bit(AF_FW_RECOVERY, &ha->flags);
2409 		rval = qla4xxx_initialize_adapter(ha, PRESERVE_DDB_LIST);
2410 		qla4_8xxx_idc_lock(ha);
2411 
2412 		if (rval != QLA_SUCCESS) {
2413 			ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: "
2414 			    "FAILED\n", ha->host_no, __func__);
2415 			qla4_8xxx_clear_drv_active(ha);
2416 			qla4_8xxx_wr_32(ha, QLA82XX_CRB_DEV_STATE,
2417 			    QLA82XX_DEV_FAILED);
2418 		} else {
2419 			ql4_printk(KERN_INFO, ha, "scsi%ld: %s: HW State: "
2420 			    "READY\n", ha->host_no, __func__);
2421 			qla4_8xxx_wr_32(ha, QLA82XX_CRB_DEV_STATE,
2422 			    QLA82XX_DEV_READY);
2423 			/* Clear driver state register */
2424 			qla4_8xxx_wr_32(ha, QLA82XX_CRB_DRV_STATE, 0);
2425 			qla4_8xxx_set_drv_active(ha);
2426 			ret = qla4xxx_request_irqs(ha);
2427 			if (ret) {
2428 				ql4_printk(KERN_WARNING, ha, "Failed to "
2429 				    "reserve interrupt %d already in use.\n",
2430 				    ha->pdev->irq);
2431 				rval = QLA_ERROR;
2432 			} else {
2433 				ha->isp_ops->enable_intrs(ha);
2434 				rval = QLA_SUCCESS;
2435 			}
2436 		}
2437 		qla4_8xxx_idc_unlock(ha);
2438 	} else {
2439 		ql4_printk(KERN_INFO, ha, "scsi%ld: %s: devfn 0x%x is not "
2440 		    "the reset owner\n", ha->host_no, __func__,
2441 		    ha->pdev->devfn);
2442 		if ((qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE) ==
2443 		    QLA82XX_DEV_READY)) {
2444 			clear_bit(AF_FW_RECOVERY, &ha->flags);
2445 			rval = qla4xxx_initialize_adapter(ha,
2446 			    PRESERVE_DDB_LIST);
2447 			if (rval == QLA_SUCCESS) {
2448 				ret = qla4xxx_request_irqs(ha);
2449 				if (ret) {
2450 					ql4_printk(KERN_WARNING, ha, "Failed to"
2451 					    " reserve interrupt %d already in"
2452 					    " use.\n", ha->pdev->irq);
2453 					rval = QLA_ERROR;
2454 				} else {
2455 					ha->isp_ops->enable_intrs(ha);
2456 					rval = QLA_SUCCESS;
2457 				}
2458 			}
2459 			qla4_8xxx_idc_lock(ha);
2460 			qla4_8xxx_set_drv_active(ha);
2461 			qla4_8xxx_idc_unlock(ha);
2462 		}
2463 	}
2464 	clear_bit(DPC_RESET_ACTIVE, &ha->dpc_flags);
2465 	return rval;
2466 }
2467 
2468 static pci_ers_result_t
qla4xxx_pci_slot_reset(struct pci_dev * pdev)2469 qla4xxx_pci_slot_reset(struct pci_dev *pdev)
2470 {
2471 	pci_ers_result_t ret = PCI_ERS_RESULT_DISCONNECT;
2472 	struct scsi_qla_host *ha = pci_get_drvdata(pdev);
2473 	int rc;
2474 
2475 	ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: slot_reset\n",
2476 	    ha->host_no, __func__);
2477 
2478 	if (!is_aer_supported(ha))
2479 		return PCI_ERS_RESULT_NONE;
2480 
2481 	/* Restore the saved state of PCIe device -
2482 	 * BAR registers, PCI Config space, PCIX, MSI,
2483 	 * IOV states
2484 	 */
2485 	pci_restore_state(pdev);
2486 
2487 	/* pci_restore_state() clears the saved_state flag of the device
2488 	 * save restored state which resets saved_state flag
2489 	 */
2490 	pci_save_state(pdev);
2491 
2492 	/* Initialize device or resume if in suspended state */
2493 	rc = pci_enable_device(pdev);
2494 	if (rc) {
2495 		ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Can't re-enable "
2496 		    "device after reset\n", ha->host_no, __func__);
2497 		goto exit_slot_reset;
2498 	}
2499 
2500 	ha->isp_ops->disable_intrs(ha);
2501 
2502 	if (is_qla8022(ha)) {
2503 		if (qla4_8xxx_error_recovery(ha) == QLA_SUCCESS) {
2504 			ret = PCI_ERS_RESULT_RECOVERED;
2505 			goto exit_slot_reset;
2506 		} else
2507 			goto exit_slot_reset;
2508 	}
2509 
2510 exit_slot_reset:
2511 	ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: Return=%x\n"
2512 	    "device after reset\n", ha->host_no, __func__, ret);
2513 	return ret;
2514 }
2515 
2516 static void
qla4xxx_pci_resume(struct pci_dev * pdev)2517 qla4xxx_pci_resume(struct pci_dev *pdev)
2518 {
2519 	struct scsi_qla_host *ha = pci_get_drvdata(pdev);
2520 	int ret;
2521 
2522 	ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: pci_resume\n",
2523 	    ha->host_no, __func__);
2524 
2525 	ret = qla4xxx_wait_for_hba_online(ha);
2526 	if (ret != QLA_SUCCESS) {
2527 		ql4_printk(KERN_ERR, ha, "scsi%ld: %s: the device failed to "
2528 		    "resume I/O from slot/link_reset\n", ha->host_no,
2529 		     __func__);
2530 	}
2531 
2532 	pci_cleanup_aer_uncorrect_error_status(pdev);
2533 	clear_bit(AF_EEH_BUSY, &ha->flags);
2534 }
2535 
2536 static struct pci_error_handlers qla4xxx_err_handler = {
2537 	.error_detected = qla4xxx_pci_error_detected,
2538 	.mmio_enabled = qla4xxx_pci_mmio_enabled,
2539 	.slot_reset = qla4xxx_pci_slot_reset,
2540 	.resume = qla4xxx_pci_resume,
2541 };
2542 
2543 static struct pci_device_id qla4xxx_pci_tbl[] = {
2544 	{
2545 		.vendor		= PCI_VENDOR_ID_QLOGIC,
2546 		.device		= PCI_DEVICE_ID_QLOGIC_ISP4010,
2547 		.subvendor	= PCI_ANY_ID,
2548 		.subdevice	= PCI_ANY_ID,
2549 	},
2550 	{
2551 		.vendor		= PCI_VENDOR_ID_QLOGIC,
2552 		.device		= PCI_DEVICE_ID_QLOGIC_ISP4022,
2553 		.subvendor	= PCI_ANY_ID,
2554 		.subdevice	= PCI_ANY_ID,
2555 	},
2556 	{
2557 		.vendor		= PCI_VENDOR_ID_QLOGIC,
2558 		.device		= PCI_DEVICE_ID_QLOGIC_ISP4032,
2559 		.subvendor	= PCI_ANY_ID,
2560 		.subdevice	= PCI_ANY_ID,
2561 	},
2562 	{
2563 		.vendor         = PCI_VENDOR_ID_QLOGIC,
2564 		.device         = PCI_DEVICE_ID_QLOGIC_ISP8022,
2565 		.subvendor      = PCI_ANY_ID,
2566 		.subdevice      = PCI_ANY_ID,
2567 	},
2568 	{0, 0},
2569 };
2570 MODULE_DEVICE_TABLE(pci, qla4xxx_pci_tbl);
2571 
2572 static struct pci_driver qla4xxx_pci_driver = {
2573 	.name		= DRIVER_NAME,
2574 	.id_table	= qla4xxx_pci_tbl,
2575 	.probe		= qla4xxx_probe_adapter,
2576 	.remove		= qla4xxx_remove_adapter,
2577 	.err_handler = &qla4xxx_err_handler,
2578 };
2579 
qla4xxx_module_init(void)2580 static int __init qla4xxx_module_init(void)
2581 {
2582 	int ret;
2583 
2584 	/* Allocate cache for SRBs. */
2585 	srb_cachep = kmem_cache_create("qla4xxx_srbs", sizeof(struct srb), 0,
2586 				       SLAB_HWCACHE_ALIGN, NULL);
2587 	if (srb_cachep == NULL) {
2588 		printk(KERN_ERR
2589 		       "%s: Unable to allocate SRB cache..."
2590 		       "Failing load!\n", DRIVER_NAME);
2591 		ret = -ENOMEM;
2592 		goto no_srp_cache;
2593 	}
2594 
2595 	/* Derive version string. */
2596 	strcpy(qla4xxx_version_str, QLA4XXX_DRIVER_VERSION);
2597 	if (ql4xextended_error_logging)
2598 		strcat(qla4xxx_version_str, "-debug");
2599 
2600 	qla4xxx_scsi_transport =
2601 		iscsi_register_transport(&qla4xxx_iscsi_transport);
2602 	if (!qla4xxx_scsi_transport){
2603 		ret = -ENODEV;
2604 		goto release_srb_cache;
2605 	}
2606 
2607 	ret = pci_register_driver(&qla4xxx_pci_driver);
2608 	if (ret)
2609 		goto unregister_transport;
2610 
2611 	printk(KERN_INFO "QLogic iSCSI HBA Driver\n");
2612 	return 0;
2613 
2614 unregister_transport:
2615 	iscsi_unregister_transport(&qla4xxx_iscsi_transport);
2616 release_srb_cache:
2617 	kmem_cache_destroy(srb_cachep);
2618 no_srp_cache:
2619 	return ret;
2620 }
2621 
qla4xxx_module_exit(void)2622 static void __exit qla4xxx_module_exit(void)
2623 {
2624 	pci_unregister_driver(&qla4xxx_pci_driver);
2625 	iscsi_unregister_transport(&qla4xxx_iscsi_transport);
2626 	kmem_cache_destroy(srb_cachep);
2627 }
2628 
2629 module_init(qla4xxx_module_init);
2630 module_exit(qla4xxx_module_exit);
2631 
2632 MODULE_AUTHOR("QLogic Corporation");
2633 MODULE_DESCRIPTION("QLogic iSCSI HBA Driver");
2634 MODULE_LICENSE("GPL");
2635 MODULE_VERSION(QLA4XXX_DRIVER_VERSION);
2636