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