Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]

Diff markup

Differences between /linux/drivers/scsi/qla4xxx/ql4_os.c (Version 2.6.25) and /linux/drivers/scsi/qla4xxx/ql4_os.c (Version 2.6.25.8)


  1 /*                                                  1 /*
  2  * QLogic iSCSI HBA Driver                          2  * QLogic iSCSI HBA Driver
  3  * Copyright (c)  2003-2006 QLogic Corporation      3  * Copyright (c)  2003-2006 QLogic Corporation
  4  *                                                  4  *
  5  * See LICENSE.qla4xxx for copyright and licen      5  * See LICENSE.qla4xxx for copyright and licensing details.
  6  */                                                 6  */
  7 #include <linux/moduleparam.h>                      7 #include <linux/moduleparam.h>
  8                                                     8 
  9 #include <scsi/scsi_tcq.h>                          9 #include <scsi/scsi_tcq.h>
 10 #include <scsi/scsicam.h>                          10 #include <scsi/scsicam.h>
 11                                                    11 
 12 #include "ql4_def.h"                               12 #include "ql4_def.h"
 13 #include "ql4_version.h"                           13 #include "ql4_version.h"
 14 #include "ql4_glbl.h"                              14 #include "ql4_glbl.h"
 15 #include "ql4_dbg.h"                               15 #include "ql4_dbg.h"
 16 #include "ql4_inline.h"                            16 #include "ql4_inline.h"
 17                                                    17 
 18 /*                                                 18 /*
 19  * Driver version                                  19  * Driver version
 20  */                                                20  */
 21 static char qla4xxx_version_str[40];               21 static char qla4xxx_version_str[40];
 22                                                    22 
 23 /*                                                 23 /*
 24  * SRB allocation cache                            24  * SRB allocation cache
 25  */                                                25  */
 26 static struct kmem_cache *srb_cachep;              26 static struct kmem_cache *srb_cachep;
 27                                                    27 
 28 /*                                                 28 /*
 29  * Module parameter information and variables      29  * Module parameter information and variables
 30  */                                                30  */
 31 int ql4xdiscoverywait = 60;                        31 int ql4xdiscoverywait = 60;
 32 module_param(ql4xdiscoverywait, int, S_IRUGO |     32 module_param(ql4xdiscoverywait, int, S_IRUGO | S_IRUSR);
 33 MODULE_PARM_DESC(ql4xdiscoverywait, "Discovery     33 MODULE_PARM_DESC(ql4xdiscoverywait, "Discovery wait time");
 34 int ql4xdontresethba = 0;                          34 int ql4xdontresethba = 0;
 35 module_param(ql4xdontresethba, int, S_IRUGO |      35 module_param(ql4xdontresethba, int, S_IRUGO | S_IRUSR);
 36 MODULE_PARM_DESC(ql4xdontresethba,                 36 MODULE_PARM_DESC(ql4xdontresethba,
 37                  "Dont reset the HBA when the      37                  "Dont reset the HBA when the driver gets 0x8002 AEN "
 38                  " default it will reset hba :     38                  " default it will reset hba :0"
 39                  " set to 1 to avoid resetting     39                  " set to 1 to avoid resetting HBA");
 40                                                    40 
 41 int ql4xextended_error_logging = 0; /* 0 = off     41 int ql4xextended_error_logging = 0; /* 0 = off, 1 = log errors */
 42 module_param(ql4xextended_error_logging, int,      42 module_param(ql4xextended_error_logging, int, S_IRUGO | S_IRUSR);
 43 MODULE_PARM_DESC(ql4xextended_error_logging,       43 MODULE_PARM_DESC(ql4xextended_error_logging,
 44                  "Option to enable extended er     44                  "Option to enable extended error logging, "
 45                  "Default is 0 - no logging, 1     45                  "Default is 0 - no logging, 1 - debug logging");
 46                                                    46 
 47 int ql4_mod_unload = 0;                            47 int ql4_mod_unload = 0;
 48                                                    48 
 49 /*                                                 49 /*
 50  * SCSI host template entry points                 50  * SCSI host template entry points
 51  */                                                51  */
 52 static void qla4xxx_config_dma_addressing(stru     52 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha);
 53                                                    53 
 54 /*                                                 54 /*
 55  * iSCSI template entry points                     55  * iSCSI template entry points
 56  */                                                56  */
 57 static int qla4xxx_tgt_dscvr(struct Scsi_Host      57 static int qla4xxx_tgt_dscvr(struct Scsi_Host *shost,
 58                              enum iscsi_tgt_ds     58                              enum iscsi_tgt_dscvr type, uint32_t enable,
 59                              struct sockaddr *     59                              struct sockaddr *dst_addr);
 60 static int qla4xxx_conn_get_param(struct iscsi     60 static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn,
 61                                   enum iscsi_p     61                                   enum iscsi_param param, char *buf);
 62 static int qla4xxx_sess_get_param(struct iscsi     62 static int qla4xxx_sess_get_param(struct iscsi_cls_session *sess,
 63                                   enum iscsi_p     63                                   enum iscsi_param param, char *buf);
 64 static int qla4xxx_host_get_param(struct Scsi_     64 static int qla4xxx_host_get_param(struct Scsi_Host *shost,
 65                                   enum iscsi_h     65                                   enum iscsi_host_param param, char *buf);
 66 static void qla4xxx_recovery_timedout(struct i     66 static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session);
 67                                                    67 
 68 /*                                                 68 /*
 69  * SCSI host template entry points                 69  * SCSI host template entry points
 70  */                                                70  */
 71 static int qla4xxx_queuecommand(struct scsi_cm     71 static int qla4xxx_queuecommand(struct scsi_cmnd *cmd,
 72                                 void (*done) (     72                                 void (*done) (struct scsi_cmnd *));
 73 static int qla4xxx_eh_device_reset(struct scsi     73 static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd);
 74 static int qla4xxx_eh_host_reset(struct scsi_c     74 static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd);
 75 static int qla4xxx_slave_alloc(struct scsi_dev     75 static int qla4xxx_slave_alloc(struct scsi_device *device);
 76 static int qla4xxx_slave_configure(struct scsi     76 static int qla4xxx_slave_configure(struct scsi_device *device);
 77 static void qla4xxx_slave_destroy(struct scsi_     77 static void qla4xxx_slave_destroy(struct scsi_device *sdev);
 78 static void qla4xxx_scan_start(struct Scsi_Hos     78 static void qla4xxx_scan_start(struct Scsi_Host *shost);
 79                                                    79 
 80 static struct scsi_host_template qla4xxx_drive     80 static struct scsi_host_template qla4xxx_driver_template = {
 81         .module                 = THIS_MODULE,     81         .module                 = THIS_MODULE,
 82         .name                   = DRIVER_NAME,     82         .name                   = DRIVER_NAME,
 83         .proc_name              = DRIVER_NAME,     83         .proc_name              = DRIVER_NAME,
 84         .queuecommand           = qla4xxx_queu     84         .queuecommand           = qla4xxx_queuecommand,
 85                                                    85 
 86         .eh_device_reset_handler = qla4xxx_eh_     86         .eh_device_reset_handler = qla4xxx_eh_device_reset,
 87         .eh_host_reset_handler  = qla4xxx_eh_h     87         .eh_host_reset_handler  = qla4xxx_eh_host_reset,
 88                                                    88 
 89         .slave_configure        = qla4xxx_slav     89         .slave_configure        = qla4xxx_slave_configure,
 90         .slave_alloc            = qla4xxx_slav     90         .slave_alloc            = qla4xxx_slave_alloc,
 91         .slave_destroy          = qla4xxx_slav     91         .slave_destroy          = qla4xxx_slave_destroy,
 92                                                    92 
 93         .scan_finished          = iscsi_scan_f     93         .scan_finished          = iscsi_scan_finished,
 94         .scan_start             = qla4xxx_scan     94         .scan_start             = qla4xxx_scan_start,
 95                                                    95 
 96         .this_id                = -1,              96         .this_id                = -1,
 97         .cmd_per_lun            = 3,               97         .cmd_per_lun            = 3,
 98         .use_clustering         = ENABLE_CLUST     98         .use_clustering         = ENABLE_CLUSTERING,
 99         .sg_tablesize           = SG_ALL,          99         .sg_tablesize           = SG_ALL,
100                                                   100 
101         .max_sectors            = 0xFFFF,         101         .max_sectors            = 0xFFFF,
102 };                                                102 };
103                                                   103 
104 static struct iscsi_transport qla4xxx_iscsi_tr    104 static struct iscsi_transport qla4xxx_iscsi_transport = {
105         .owner                  = THIS_MODULE,    105         .owner                  = THIS_MODULE,
106         .name                   = DRIVER_NAME,    106         .name                   = DRIVER_NAME,
107         .caps                   = CAP_FW_DB |     107         .caps                   = CAP_FW_DB | CAP_SENDTARGETS_OFFLOAD |
108                                   CAP_DATA_PAT    108                                   CAP_DATA_PATH_OFFLOAD,
109         .param_mask             = ISCSI_CONN_P    109         .param_mask             = ISCSI_CONN_PORT | ISCSI_CONN_ADDRESS |
110                                   ISCSI_TARGET    110                                   ISCSI_TARGET_NAME | ISCSI_TPGT,
111         .host_param_mask        = ISCSI_HOST_H    111         .host_param_mask        = ISCSI_HOST_HWADDRESS |
112                                   ISCSI_HOST_I    112                                   ISCSI_HOST_IPADDRESS |
113                                   ISCSI_HOST_I    113                                   ISCSI_HOST_INITIATOR_NAME,
114         .sessiondata_size       = sizeof(struc    114         .sessiondata_size       = sizeof(struct ddb_entry),
115         .host_template          = &qla4xxx_dri    115         .host_template          = &qla4xxx_driver_template,
116                                                   116 
117         .tgt_dscvr              = qla4xxx_tgt_    117         .tgt_dscvr              = qla4xxx_tgt_dscvr,
118         .get_conn_param         = qla4xxx_conn    118         .get_conn_param         = qla4xxx_conn_get_param,
119         .get_session_param      = qla4xxx_sess    119         .get_session_param      = qla4xxx_sess_get_param,
120         .get_host_param         = qla4xxx_host    120         .get_host_param         = qla4xxx_host_get_param,
121         .session_recovery_timedout = qla4xxx_r    121         .session_recovery_timedout = qla4xxx_recovery_timedout,
122 };                                                122 };
123                                                   123 
124 static struct scsi_transport_template *qla4xxx    124 static struct scsi_transport_template *qla4xxx_scsi_transport;
125                                                   125 
126 static void qla4xxx_recovery_timedout(struct i    126 static void qla4xxx_recovery_timedout(struct iscsi_cls_session *session)
127 {                                                 127 {
128         struct ddb_entry *ddb_entry = session-    128         struct ddb_entry *ddb_entry = session->dd_data;
129         struct scsi_qla_host *ha = ddb_entry->    129         struct scsi_qla_host *ha = ddb_entry->ha;
130                                                   130 
131         if (atomic_read(&ddb_entry->state) !=     131         if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE) {
132                 atomic_set(&ddb_entry->state,     132                 atomic_set(&ddb_entry->state, DDB_STATE_DEAD);
133                                                   133 
134                 DEBUG2(printk("scsi%ld: %s: in    134                 DEBUG2(printk("scsi%ld: %s: index [%d] port down retry count "
135                               "of (%d) secs ex    135                               "of (%d) secs exhausted, marking device DEAD.\n",
136                               ha->host_no, __f    136                               ha->host_no, __func__, ddb_entry->fw_ddb_index,
137                               ha->port_down_re    137                               ha->port_down_retry_count));
138                                                   138 
139                 DEBUG2(printk("scsi%ld: %s: sc    139                 DEBUG2(printk("scsi%ld: %s: scheduling dpc routine - dpc "
140                               "flags = 0x%lx\n    140                               "flags = 0x%lx\n",
141                               ha->host_no, __f    141                               ha->host_no, __func__, ha->dpc_flags));
142                 queue_work(ha->dpc_thread, &ha    142                 queue_work(ha->dpc_thread, &ha->dpc_work);
143         }                                         143         }
144 }                                                 144 }
145                                                   145 
146 static int qla4xxx_host_get_param(struct Scsi_    146 static int qla4xxx_host_get_param(struct Scsi_Host *shost,
147                                   enum iscsi_h    147                                   enum iscsi_host_param param, char *buf)
148 {                                                 148 {
149         struct scsi_qla_host *ha = to_qla_host    149         struct scsi_qla_host *ha = to_qla_host(shost);
150         int len;                                  150         int len;
151                                                   151 
152         switch (param) {                          152         switch (param) {
153         case ISCSI_HOST_PARAM_HWADDRESS:          153         case ISCSI_HOST_PARAM_HWADDRESS:
154                 len = sysfs_format_mac(buf, ha    154                 len = sysfs_format_mac(buf, ha->my_mac, MAC_ADDR_LEN);
155                 break;                            155                 break;
156         case ISCSI_HOST_PARAM_IPADDRESS:          156         case ISCSI_HOST_PARAM_IPADDRESS:
157                 len = sprintf(buf, "%d.%d.%d.%    157                 len = sprintf(buf, "%d.%d.%d.%d\n", ha->ip_address[0],
158                               ha->ip_address[1    158                               ha->ip_address[1], ha->ip_address[2],
159                               ha->ip_address[3    159                               ha->ip_address[3]);
160                 break;                            160                 break;
161         case ISCSI_HOST_PARAM_INITIATOR_NAME:     161         case ISCSI_HOST_PARAM_INITIATOR_NAME:
162                 len = sprintf(buf, "%s\n", ha-    162                 len = sprintf(buf, "%s\n", ha->name_string);
163                 break;                            163                 break;
164         default:                                  164         default:
165                 return -ENOSYS;                   165                 return -ENOSYS;
166         }                                         166         }
167                                                   167 
168         return len;                               168         return len;
169 }                                                 169 }
170                                                   170 
171 static int qla4xxx_sess_get_param(struct iscsi    171 static int qla4xxx_sess_get_param(struct iscsi_cls_session *sess,
172                                   enum iscsi_p    172                                   enum iscsi_param param, char *buf)
173 {                                                 173 {
174         struct ddb_entry *ddb_entry = sess->dd    174         struct ddb_entry *ddb_entry = sess->dd_data;
175         int len;                                  175         int len;
176                                                   176 
177         switch (param) {                          177         switch (param) {
178         case ISCSI_PARAM_TARGET_NAME:             178         case ISCSI_PARAM_TARGET_NAME:
179                 len = snprintf(buf, PAGE_SIZE     179                 len = snprintf(buf, PAGE_SIZE - 1, "%s\n",
180                                ddb_entry->iscs    180                                ddb_entry->iscsi_name);
181                 break;                            181                 break;
182         case ISCSI_PARAM_TPGT:                    182         case ISCSI_PARAM_TPGT:
183                 len = sprintf(buf, "%u\n", ddb    183                 len = sprintf(buf, "%u\n", ddb_entry->tpgt);
184                 break;                            184                 break;
185         default:                                  185         default:
186                 return -ENOSYS;                   186                 return -ENOSYS;
187         }                                         187         }
188                                                   188 
189         return len;                               189         return len;
190 }                                                 190 }
191                                                   191 
192 static int qla4xxx_conn_get_param(struct iscsi    192 static int qla4xxx_conn_get_param(struct iscsi_cls_conn *conn,
193                                   enum iscsi_p    193                                   enum iscsi_param param, char *buf)
194 {                                                 194 {
195         struct iscsi_cls_session *session;        195         struct iscsi_cls_session *session;
196         struct ddb_entry *ddb_entry;              196         struct ddb_entry *ddb_entry;
197         int len;                                  197         int len;
198                                                   198 
199         session = iscsi_dev_to_session(conn->d    199         session = iscsi_dev_to_session(conn->dev.parent);
200         ddb_entry = session->dd_data;             200         ddb_entry = session->dd_data;
201                                                   201 
202         switch (param) {                          202         switch (param) {
203         case ISCSI_PARAM_CONN_PORT:               203         case ISCSI_PARAM_CONN_PORT:
204                 len = sprintf(buf, "%hu\n", dd    204                 len = sprintf(buf, "%hu\n", ddb_entry->port);
205                 break;                            205                 break;
206         case ISCSI_PARAM_CONN_ADDRESS:            206         case ISCSI_PARAM_CONN_ADDRESS:
207                 /* TODO: what are the ipv6 bit    207                 /* TODO: what are the ipv6 bits */
208                 len = sprintf(buf, "%u.%u.%u.%    208                 len = sprintf(buf, "%u.%u.%u.%u\n",
209                               NIPQUAD(ddb_entr    209                               NIPQUAD(ddb_entry->ip_addr));
210                 break;                            210                 break;
211         default:                                  211         default:
212                 return -ENOSYS;                   212                 return -ENOSYS;
213         }                                         213         }
214                                                   214 
215         return len;                               215         return len;
216 }                                                 216 }
217                                                   217 
218 static int qla4xxx_tgt_dscvr(struct Scsi_Host     218 static int qla4xxx_tgt_dscvr(struct Scsi_Host *shost,
219                              enum iscsi_tgt_ds    219                              enum iscsi_tgt_dscvr type, uint32_t enable,
220                              struct sockaddr *    220                              struct sockaddr *dst_addr)
221 {                                                 221 {
222         struct scsi_qla_host *ha;                 222         struct scsi_qla_host *ha;
223         struct sockaddr_in *addr;                 223         struct sockaddr_in *addr;
224         struct sockaddr_in6 *addr6;               224         struct sockaddr_in6 *addr6;
225         int ret = 0;                              225         int ret = 0;
226                                                   226 
227         ha = (struct scsi_qla_host *) shost->h    227         ha = (struct scsi_qla_host *) shost->hostdata;
228                                                   228 
229         switch (type) {                           229         switch (type) {
230         case ISCSI_TGT_DSCVR_SEND_TARGETS:        230         case ISCSI_TGT_DSCVR_SEND_TARGETS:
231                 if (dst_addr->sa_family == AF_    231                 if (dst_addr->sa_family == AF_INET) {
232                         addr = (struct sockadd    232                         addr = (struct sockaddr_in *)dst_addr;
233                         if (qla4xxx_send_tgts(    233                         if (qla4xxx_send_tgts(ha, (char *)&addr->sin_addr,
234                                                   234                                               addr->sin_port) != QLA_SUCCESS)
235                                 ret = -EIO;       235                                 ret = -EIO;
236                 } else if (dst_addr->sa_family    236                 } else if (dst_addr->sa_family == AF_INET6) {
237                         /*                        237                         /*
238                          * TODO: fix qla4xxx_s    238                          * TODO: fix qla4xxx_send_tgts
239                          */                       239                          */
240                         addr6 = (struct sockad    240                         addr6 = (struct sockaddr_in6 *)dst_addr;
241                         if (qla4xxx_send_tgts(    241                         if (qla4xxx_send_tgts(ha, (char *)&addr6->sin6_addr,
242                                                   242                                               addr6->sin6_port) != QLA_SUCCESS)
243                                 ret = -EIO;       243                                 ret = -EIO;
244                 } else                            244                 } else
245                         ret = -ENOSYS;            245                         ret = -ENOSYS;
246                 break;                            246                 break;
247         default:                                  247         default:
248                 ret = -ENOSYS;                    248                 ret = -ENOSYS;
249         }                                         249         }
250         return ret;                               250         return ret;
251 }                                                 251 }
252                                                   252 
253 void qla4xxx_destroy_sess(struct ddb_entry *dd    253 void qla4xxx_destroy_sess(struct ddb_entry *ddb_entry)
254 {                                                 254 {
255         if (!ddb_entry->sess)                     255         if (!ddb_entry->sess)
256                 return;                           256                 return;
257                                                   257 
258         if (ddb_entry->conn) {                    258         if (ddb_entry->conn) {
259                 atomic_set(&ddb_entry->state,     259                 atomic_set(&ddb_entry->state, DDB_STATE_DEAD);
260                 iscsi_remove_session(ddb_entry    260                 iscsi_remove_session(ddb_entry->sess);
261         }                                         261         }
262         iscsi_free_session(ddb_entry->sess);      262         iscsi_free_session(ddb_entry->sess);
263 }                                                 263 }
264                                                   264 
265 int qla4xxx_add_sess(struct ddb_entry *ddb_ent    265 int qla4xxx_add_sess(struct ddb_entry *ddb_entry)
266 {                                                 266 {
267         int err;                                  267         int err;
268                                                   268 
269         ddb_entry->sess->recovery_tmo = ddb_en    269         ddb_entry->sess->recovery_tmo = ddb_entry->ha->port_down_retry_count;
270         err = iscsi_add_session(ddb_entry->ses    270         err = iscsi_add_session(ddb_entry->sess, ddb_entry->fw_ddb_index);
271         if (err) {                                271         if (err) {
272                 DEBUG2(printk(KERN_ERR "Could     272                 DEBUG2(printk(KERN_ERR "Could not add session.\n"));
273                 return err;                       273                 return err;
274         }                                         274         }
275                                                   275 
276         ddb_entry->conn = iscsi_create_conn(dd    276         ddb_entry->conn = iscsi_create_conn(ddb_entry->sess, 0);
277         if (!ddb_entry->conn) {                   277         if (!ddb_entry->conn) {
278                 iscsi_remove_session(ddb_entry    278                 iscsi_remove_session(ddb_entry->sess);
279                 DEBUG2(printk(KERN_ERR "Could     279                 DEBUG2(printk(KERN_ERR "Could not add connection.\n"));
280                 return -ENOMEM;                   280                 return -ENOMEM;
281         }                                         281         }
282                                                   282 
283         /* finally ready to go */                 283         /* finally ready to go */
284         iscsi_unblock_session(ddb_entry->sess)    284         iscsi_unblock_session(ddb_entry->sess);
285         return 0;                                 285         return 0;
286 }                                                 286 }
287                                                   287 
288 struct ddb_entry *qla4xxx_alloc_sess(struct sc    288 struct ddb_entry *qla4xxx_alloc_sess(struct scsi_qla_host *ha)
289 {                                                 289 {
290         struct ddb_entry *ddb_entry;              290         struct ddb_entry *ddb_entry;
291         struct iscsi_cls_session *sess;           291         struct iscsi_cls_session *sess;
292                                                   292 
293         sess = iscsi_alloc_session(ha->host, &    293         sess = iscsi_alloc_session(ha->host, &qla4xxx_iscsi_transport);
294         if (!sess)                                294         if (!sess)
295                 return NULL;                      295                 return NULL;
296                                                   296 
297         ddb_entry = sess->dd_data;                297         ddb_entry = sess->dd_data;
298         memset(ddb_entry, 0, sizeof(*ddb_entry    298         memset(ddb_entry, 0, sizeof(*ddb_entry));
299         ddb_entry->ha = ha;                       299         ddb_entry->ha = ha;
300         ddb_entry->sess = sess;                   300         ddb_entry->sess = sess;
301         return ddb_entry;                         301         return ddb_entry;
302 }                                                 302 }
303                                                   303 
304 static void qla4xxx_scan_start(struct Scsi_Hos    304 static void qla4xxx_scan_start(struct Scsi_Host *shost)
305 {                                                 305 {
306         struct scsi_qla_host *ha = shost_priv(    306         struct scsi_qla_host *ha = shost_priv(shost);
307         struct ddb_entry *ddb_entry, *ddbtemp;    307         struct ddb_entry *ddb_entry, *ddbtemp;
308                                                   308 
309         /* finish setup of sessions that were     309         /* finish setup of sessions that were already setup in firmware */
310         list_for_each_entry_safe(ddb_entry, dd    310         list_for_each_entry_safe(ddb_entry, ddbtemp, &ha->ddb_list, list) {
311                 if (ddb_entry->fw_ddb_device_s    311                 if (ddb_entry->fw_ddb_device_state == DDB_DS_SESSION_ACTIVE)
312                         qla4xxx_add_sess(ddb_e    312                         qla4xxx_add_sess(ddb_entry);
313         }                                         313         }
314 }                                                 314 }
315                                                   315 
316 /*                                                316 /*
317  * Timer routines                                 317  * Timer routines
318  */                                               318  */
319                                                   319 
320 static void qla4xxx_start_timer(struct scsi_ql    320 static void qla4xxx_start_timer(struct scsi_qla_host *ha, void *func,
321                                 unsigned long     321                                 unsigned long interval)
322 {                                                 322 {
323         DEBUG(printk("scsi: %s: Starting timer    323         DEBUG(printk("scsi: %s: Starting timer thread for adapter %d\n",
324                      __func__, ha->host->host_    324                      __func__, ha->host->host_no));
325         init_timer(&ha->timer);                   325         init_timer(&ha->timer);
326         ha->timer.expires = jiffies + interval    326         ha->timer.expires = jiffies + interval * HZ;
327         ha->timer.data = (unsigned long)ha;       327         ha->timer.data = (unsigned long)ha;
328         ha->timer.function = (void (*)(unsigne    328         ha->timer.function = (void (*)(unsigned long))func;
329         add_timer(&ha->timer);                    329         add_timer(&ha->timer);
330         ha->timer_active = 1;                     330         ha->timer_active = 1;
331 }                                                 331 }
332                                                   332 
333 static void qla4xxx_stop_timer(struct scsi_qla    333 static void qla4xxx_stop_timer(struct scsi_qla_host *ha)
334 {                                                 334 {
335         del_timer_sync(&ha->timer);               335         del_timer_sync(&ha->timer);
336         ha->timer_active = 0;                     336         ha->timer_active = 0;
337 }                                                 337 }
338                                                   338 
339 /***                                              339 /***
340  * qla4xxx_mark_device_missing - mark a device    340  * qla4xxx_mark_device_missing - mark a device as missing.
341  * @ha: Pointer to host adapter structure.        341  * @ha: Pointer to host adapter structure.
342  * @ddb_entry: Pointer to device database entr    342  * @ddb_entry: Pointer to device database entry
343  *                                                343  *
344  * This routine marks a device missing and res    344  * This routine marks a device missing and resets the relogin retry count.
345  **/                                              345  **/
346 void qla4xxx_mark_device_missing(struct scsi_q    346 void qla4xxx_mark_device_missing(struct scsi_qla_host *ha,
347                                  struct ddb_en    347                                  struct ddb_entry *ddb_entry)
348 {                                                 348 {
349         atomic_set(&ddb_entry->state, DDB_STAT    349         atomic_set(&ddb_entry->state, DDB_STATE_MISSING);
350         DEBUG3(printk("scsi%d:%d:%d: index [%d    350         DEBUG3(printk("scsi%d:%d:%d: index [%d] marked MISSING\n",
351                       ha->host_no, ddb_entry->    351                       ha->host_no, ddb_entry->bus, ddb_entry->target,
352                       ddb_entry->fw_ddb_index)    352                       ddb_entry->fw_ddb_index));
353         iscsi_block_session(ddb_entry->sess);     353         iscsi_block_session(ddb_entry->sess);
354         iscsi_conn_error(ddb_entry->conn, ISCS    354         iscsi_conn_error(ddb_entry->conn, ISCSI_ERR_CONN_FAILED);
355 }                                                 355 }
356                                                   356 
357 static struct srb* qla4xxx_get_new_srb(struct     357 static struct srb* qla4xxx_get_new_srb(struct scsi_qla_host *ha,
358                                        struct     358                                        struct ddb_entry *ddb_entry,
359                                        struct     359                                        struct scsi_cmnd *cmd,
360                                        void (*    360                                        void (*done)(struct scsi_cmnd *))
361 {                                                 361 {
362         struct srb *srb;                          362         struct srb *srb;
363                                                   363 
364         srb = mempool_alloc(ha->srb_mempool, G    364         srb = mempool_alloc(ha->srb_mempool, GFP_ATOMIC);
365         if (!srb)                                 365         if (!srb)
366                 return srb;                       366                 return srb;
367                                                   367 
368         atomic_set(&srb->ref_count, 1);           368         atomic_set(&srb->ref_count, 1);
369         srb->ha = ha;                             369         srb->ha = ha;
370         srb->ddb = ddb_entry;                     370         srb->ddb = ddb_entry;
371         srb->cmd = cmd;                           371         srb->cmd = cmd;
372         srb->flags = 0;                           372         srb->flags = 0;
373         cmd->SCp.ptr = (void *)srb;               373         cmd->SCp.ptr = (void *)srb;
374         cmd->scsi_done = done;                    374         cmd->scsi_done = done;
375                                                   375 
376         return srb;                               376         return srb;
377 }                                                 377 }
378                                                   378 
379 static void qla4xxx_srb_free_dma(struct scsi_q    379 static void qla4xxx_srb_free_dma(struct scsi_qla_host *ha, struct srb *srb)
380 {                                                 380 {
381         struct scsi_cmnd *cmd = srb->cmd;         381         struct scsi_cmnd *cmd = srb->cmd;
382                                                   382 
383         if (srb->flags & SRB_DMA_VALID) {         383         if (srb->flags & SRB_DMA_VALID) {
384                 scsi_dma_unmap(cmd);              384                 scsi_dma_unmap(cmd);
385                 srb->flags &= ~SRB_DMA_VALID;     385                 srb->flags &= ~SRB_DMA_VALID;
386         }                                         386         }
387         cmd->SCp.ptr = NULL;                      387         cmd->SCp.ptr = NULL;
388 }                                                 388 }
389                                                   389 
390 void qla4xxx_srb_compl(struct scsi_qla_host *h    390 void qla4xxx_srb_compl(struct scsi_qla_host *ha, struct srb *srb)
391 {                                                 391 {
392         struct scsi_cmnd *cmd = srb->cmd;         392         struct scsi_cmnd *cmd = srb->cmd;
393                                                   393 
394         qla4xxx_srb_free_dma(ha, srb);            394         qla4xxx_srb_free_dma(ha, srb);
395                                                   395 
396         mempool_free(srb, ha->srb_mempool);       396         mempool_free(srb, ha->srb_mempool);
397                                                   397 
398         cmd->scsi_done(cmd);                      398         cmd->scsi_done(cmd);
399 }                                                 399 }
400                                                   400 
401 /**                                               401 /**
402  * qla4xxx_queuecommand - scsi layer issues sc    402  * qla4xxx_queuecommand - scsi layer issues scsi command to driver.
403  * @cmd: Pointer to Linux's SCSI command struc    403  * @cmd: Pointer to Linux's SCSI command structure
404  * @done_fn: Function that the driver calls to    404  * @done_fn: Function that the driver calls to notify the SCSI mid-layer
405  *      that the command has been processed.      405  *      that the command has been processed.
406  *                                                406  *
407  * Remarks:                                       407  * Remarks:
408  * This routine is invoked by Linux to send a     408  * This routine is invoked by Linux to send a SCSI command to the driver.
409  * The mid-level driver tries to ensure that q    409  * The mid-level driver tries to ensure that queuecommand never gets
410  * invoked concurrently with itself or the int    410  * invoked concurrently with itself or the interrupt handler (although
411  * the interrupt handler may call this routine    411  * the interrupt handler may call this routine as part of request-
412  * completion handling).   Unfortunely, it som    412  * completion handling).   Unfortunely, it sometimes calls the scheduler
413  * in interrupt context which is a big NO! NO!    413  * in interrupt context which is a big NO! NO!.
414  **/                                              414  **/
415 static int qla4xxx_queuecommand(struct scsi_cm    415 static int qla4xxx_queuecommand(struct scsi_cmnd *cmd,
416                                 void (*done)(s    416                                 void (*done)(struct scsi_cmnd *))
417 {                                                 417 {
418         struct scsi_qla_host *ha = to_qla_host    418         struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
419         struct ddb_entry *ddb_entry = cmd->dev    419         struct ddb_entry *ddb_entry = cmd->device->hostdata;
420         struct iscsi_cls_session *sess = ddb_e    420         struct iscsi_cls_session *sess = ddb_entry->sess;
421         struct srb *srb;                          421         struct srb *srb;
422         int rval;                                 422         int rval;
423                                                   423 
424         if (!sess) {                              424         if (!sess) {
425                 cmd->result = DID_IMM_RETRY <<    425                 cmd->result = DID_IMM_RETRY << 16;
426                 goto qc_fail_command;             426                 goto qc_fail_command;
427         }                                         427         }
428                                                   428 
429         rval = iscsi_session_chkready(sess);      429         rval = iscsi_session_chkready(sess);
430         if (rval) {                               430         if (rval) {
431                 cmd->result = rval;               431                 cmd->result = rval;
432                 goto qc_fail_command;             432                 goto qc_fail_command;
433         }                                         433         }
434                                                   434 
435         if (atomic_read(&ddb_entry->state) !=     435         if (atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE) {
436                 if (atomic_read(&ddb_entry->st    436                 if (atomic_read(&ddb_entry->state) == DDB_STATE_DEAD) {
437                         cmd->result = DID_NO_C    437                         cmd->result = DID_NO_CONNECT << 16;
438                         goto qc_fail_command;     438                         goto qc_fail_command;
439                 }                                 439                 }
440                 goto qc_host_busy;                440                 goto qc_host_busy;
441         }                                         441         }
442                                                   442 
443         if (test_bit(DPC_RESET_HA_INTR, &ha->d    443         if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags))
444                 goto qc_host_busy;                444                 goto qc_host_busy;
445                                                   445 
446         spin_unlock_irq(ha->host->host_lock);     446         spin_unlock_irq(ha->host->host_lock);
447                                                   447 
448         srb = qla4xxx_get_new_srb(ha, ddb_entr    448         srb = qla4xxx_get_new_srb(ha, ddb_entry, cmd, done);
449         if (!srb)                                 449         if (!srb)
450                 goto qc_host_busy_lock;           450                 goto qc_host_busy_lock;
451                                                   451 
452         rval = qla4xxx_send_command_to_isp(ha,    452         rval = qla4xxx_send_command_to_isp(ha, srb);
453         if (rval != QLA_SUCCESS)                  453         if (rval != QLA_SUCCESS)
454                 goto qc_host_busy_free_sp;        454                 goto qc_host_busy_free_sp;
455                                                   455 
456         spin_lock_irq(ha->host->host_lock);       456         spin_lock_irq(ha->host->host_lock);
457         return 0;                                 457         return 0;
458                                                   458 
459 qc_host_busy_free_sp:                             459 qc_host_busy_free_sp:
460         qla4xxx_srb_free_dma(ha, srb);            460         qla4xxx_srb_free_dma(ha, srb);
461         mempool_free(srb, ha->srb_mempool);       461         mempool_free(srb, ha->srb_mempool);
462                                                   462 
463 qc_host_busy_lock:                                463 qc_host_busy_lock:
464         spin_lock_irq(ha->host->host_lock);       464         spin_lock_irq(ha->host->host_lock);
465                                                   465 
466 qc_host_busy:                                     466 qc_host_busy:
467         return SCSI_MLQUEUE_HOST_BUSY;            467         return SCSI_MLQUEUE_HOST_BUSY;
468                                                   468 
469 qc_fail_command:                                  469 qc_fail_command:
470         done(cmd);                                470         done(cmd);
471                                                   471 
472         return 0;                                 472         return 0;
473 }                                                 473 }
474                                                   474 
475 /**                                               475 /**
476  * qla4xxx_mem_free - frees memory allocated t    476  * qla4xxx_mem_free - frees memory allocated to adapter
477  * @ha: Pointer to host adapter structure.        477  * @ha: Pointer to host adapter structure.
478  *                                                478  *
479  * Frees memory previously allocated by qla4xx    479  * Frees memory previously allocated by qla4xxx_mem_alloc
480  **/                                              480  **/
481 static void qla4xxx_mem_free(struct scsi_qla_h    481 static void qla4xxx_mem_free(struct scsi_qla_host *ha)
482 {                                                 482 {
483         if (ha->queues)                           483         if (ha->queues)
484                 dma_free_coherent(&ha->pdev->d    484                 dma_free_coherent(&ha->pdev->dev, ha->queues_len, ha->queues,
485                                   ha->queues_d    485                                   ha->queues_dma);
486                                                   486 
487         ha->queues_len = 0;                       487         ha->queues_len = 0;
488         ha->queues = NULL;                        488         ha->queues = NULL;
489         ha->queues_dma = 0;                       489         ha->queues_dma = 0;
490         ha->request_ring = NULL;                  490         ha->request_ring = NULL;
491         ha->request_dma = 0;                      491         ha->request_dma = 0;
492         ha->response_ring = NULL;                 492         ha->response_ring = NULL;
493         ha->response_dma = 0;                     493         ha->response_dma = 0;
494         ha->shadow_regs = NULL;                   494         ha->shadow_regs = NULL;
495         ha->shadow_regs_dma = 0;                  495         ha->shadow_regs_dma = 0;
496                                                   496 
497         /* Free srb pool. */                      497         /* Free srb pool. */
498         if (ha->srb_mempool)                      498         if (ha->srb_mempool)
499                 mempool_destroy(ha->srb_mempoo    499                 mempool_destroy(ha->srb_mempool);
500                                                   500 
501         ha->srb_mempool = NULL;                   501         ha->srb_mempool = NULL;
502                                                   502 
503         /* release io space registers  */         503         /* release io space registers  */
504         if (ha->reg)                              504         if (ha->reg)
505                 iounmap(ha->reg);                 505                 iounmap(ha->reg);
506         pci_release_regions(ha->pdev);            506         pci_release_regions(ha->pdev);
507 }                                                 507 }
508                                                   508 
509 /**                                               509 /**
510  * qla4xxx_mem_alloc - allocates memory for us    510  * qla4xxx_mem_alloc - allocates memory for use by adapter.
511  * @ha: Pointer to host adapter structure         511  * @ha: Pointer to host adapter structure
512  *                                                512  *
513  * Allocates DMA memory for request and respon    513  * Allocates DMA memory for request and response queues. Also allocates memory
514  * for srbs.                                      514  * for srbs.
515  **/                                              515  **/
516 static int qla4xxx_mem_alloc(struct scsi_qla_h    516 static int qla4xxx_mem_alloc(struct scsi_qla_host *ha)
517 {                                                 517 {
518         unsigned long align;                      518         unsigned long align;
519                                                   519 
520         /* Allocate contiguous block of DMA me    520         /* Allocate contiguous block of DMA memory for queues. */
521         ha->queues_len = ((REQUEST_QUEUE_DEPTH    521         ha->queues_len = ((REQUEST_QUEUE_DEPTH * QUEUE_SIZE) +
522                           (RESPONSE_QUEUE_DEPT    522                           (RESPONSE_QUEUE_DEPTH * QUEUE_SIZE) +
523                           sizeof(struct shadow    523                           sizeof(struct shadow_regs) +
524                           MEM_ALIGN_VALUE +       524                           MEM_ALIGN_VALUE +
525                           (PAGE_SIZE - 1)) & ~    525                           (PAGE_SIZE - 1)) & ~(PAGE_SIZE - 1);
526         ha->queues = dma_alloc_coherent(&ha->p    526         ha->queues = dma_alloc_coherent(&ha->pdev->dev, ha->queues_len,
527                                         &ha->q    527                                         &ha->queues_dma, GFP_KERNEL);
528         if (ha->queues == NULL) {                 528         if (ha->queues == NULL) {
529                 dev_warn(&ha->pdev->dev,          529                 dev_warn(&ha->pdev->dev,
530                         "Memory Allocation fai    530                         "Memory Allocation failed - queues.\n");
531                                                   531 
532                 goto mem_alloc_error_exit;        532                 goto mem_alloc_error_exit;
533         }                                         533         }
534         memset(ha->queues, 0, ha->queues_len);    534         memset(ha->queues, 0, ha->queues_len);
535                                                   535 
536         /*                                        536         /*
537          * As per RISC alignment requirements     537          * As per RISC alignment requirements -- the bus-address must be a
538          * multiple of the request-ring size (    538          * multiple of the request-ring size (in bytes).
539          */                                       539          */
540         align = 0;                                540         align = 0;
541         if ((unsigned long)ha->queues_dma & (M    541         if ((unsigned long)ha->queues_dma & (MEM_ALIGN_VALUE - 1))
542                 align = MEM_ALIGN_VALUE - ((un    542                 align = MEM_ALIGN_VALUE - ((unsigned long)ha->queues_dma &
543                                            (ME    543                                            (MEM_ALIGN_VALUE - 1));
544                                                   544 
545         /* Update request and response queue p    545         /* Update request and response queue pointers. */
546         ha->request_dma = ha->queues_dma + ali    546         ha->request_dma = ha->queues_dma + align;
547         ha->request_ring = (struct queue_entry    547         ha->request_ring = (struct queue_entry *) (ha->queues + align);
548         ha->response_dma = ha->queues_dma + al    548         ha->response_dma = ha->queues_dma + align +
549                 (REQUEST_QUEUE_DEPTH * QUEUE_S    549                 (REQUEST_QUEUE_DEPTH * QUEUE_SIZE);
550         ha->response_ring = (struct queue_entr    550         ha->response_ring = (struct queue_entry *) (ha->queues + align +
551                                                   551                                                     (REQUEST_QUEUE_DEPTH *
552                                                   552                                                      QUEUE_SIZE));
553         ha->shadow_regs_dma = ha->queues_dma +    553         ha->shadow_regs_dma = ha->queues_dma + align +
554                 (REQUEST_QUEUE_DEPTH * QUEUE_S    554                 (REQUEST_QUEUE_DEPTH * QUEUE_SIZE) +
555                 (RESPONSE_QUEUE_DEPTH * QUEUE_    555                 (RESPONSE_QUEUE_DEPTH * QUEUE_SIZE);
556         ha->shadow_regs = (struct shadow_regs     556         ha->shadow_regs = (struct shadow_regs *) (ha->queues + align +
557                                                   557                                                   (REQUEST_QUEUE_DEPTH *
558                                                   558                                                    QUEUE_SIZE) +
559                                                   559                                                   (RESPONSE_QUEUE_DEPTH *
560                                                   560                                                    QUEUE_SIZE));
561                                                   561 
562         /* Allocate memory for srb pool. */       562         /* Allocate memory for srb pool. */
563         ha->srb_mempool = mempool_create(SRB_M    563         ha->srb_mempool = mempool_create(SRB_MIN_REQ, mempool_alloc_slab,
564                                          mempo    564                                          mempool_free_slab, srb_cachep);
565         if (ha->srb_mempool == NULL) {            565         if (ha->srb_mempool == NULL) {
566                 dev_warn(&ha->pdev->dev,          566                 dev_warn(&ha->pdev->dev,
567                         "Memory Allocation fai    567                         "Memory Allocation failed - SRB Pool.\n");
568                                                   568 
569                 goto mem_alloc_error_exit;        569                 goto mem_alloc_error_exit;
570         }                                         570         }
571                                                   571 
572         return QLA_SUCCESS;                       572         return QLA_SUCCESS;
573                                                   573 
574 mem_alloc_error_exit:                             574 mem_alloc_error_exit:
575         qla4xxx_mem_free(ha);                     575         qla4xxx_mem_free(ha);
576         return QLA_ERROR;                         576         return QLA_ERROR;
577 }                                                 577 }
578                                                   578 
579 /**                                               579 /**
580  * qla4xxx_timer - checks every second for wor    580  * qla4xxx_timer - checks every second for work to do.
581  * @ha: Pointer to host adapter structure.        581  * @ha: Pointer to host adapter structure.
582  **/                                              582  **/
583 static void qla4xxx_timer(struct scsi_qla_host    583 static void qla4xxx_timer(struct scsi_qla_host *ha)
584 {                                                 584 {
585         struct ddb_entry *ddb_entry, *dtemp;      585         struct ddb_entry *ddb_entry, *dtemp;
586         int start_dpc = 0;                        586         int start_dpc = 0;
587                                                   587 
588         /* Search for relogin's to time-out an    588         /* Search for relogin's to time-out and port down retry. */
589         list_for_each_entry_safe(ddb_entry, dt    589         list_for_each_entry_safe(ddb_entry, dtemp, &ha->ddb_list, list) {
590                 /* Count down time between sen    590                 /* Count down time between sending relogins */
591                 if (adapter_up(ha) &&             591                 if (adapter_up(ha) &&
592                     !test_bit(DF_RELOGIN, &ddb    592                     !test_bit(DF_RELOGIN, &ddb_entry->flags) &&
593                     atomic_read(&ddb_entry->st    593                     atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE) {
594                         if (atomic_read(&ddb_e    594                         if (atomic_read(&ddb_entry->retry_relogin_timer) !=
595                             INVALID_ENTRY) {      595                             INVALID_ENTRY) {
596                                 if (atomic_rea    596                                 if (atomic_read(&ddb_entry->retry_relogin_timer)
597                                                   597                                                 == 0) {
598                                         atomic    598                                         atomic_set(&ddb_entry->
599                                                   599                                                 retry_relogin_timer,
600                                                   600                                                 INVALID_ENTRY);
601                                         set_bi    601                                         set_bit(DPC_RELOGIN_DEVICE,
602                                                   602                                                 &ha->dpc_flags);
603                                         set_bi    603                                         set_bit(DF_RELOGIN, &ddb_entry->flags);
604                                         DEBUG2    604                                         DEBUG2(printk("scsi%ld: %s: index [%d]"
605                                                   605                                                       " login device\n",
606                                                   606                                                       ha->host_no, __func__,
607                                                   607                                                       ddb_entry->fw_ddb_index));
608                                 } else            608                                 } else
609                                         atomic    609                                         atomic_dec(&ddb_entry->
610                                                   610                                                         retry_relogin_timer);
611                         }                         611                         }
612                 }                                 612                 }
613                                                   613 
614                 /* Wait for relogin to timeout    614                 /* Wait for relogin to timeout */
615                 if (atomic_read(&ddb_entry->re    615                 if (atomic_read(&ddb_entry->relogin_timer) &&
616                     (atomic_dec_and_test(&ddb_    616                     (atomic_dec_and_test(&ddb_entry->relogin_timer) != 0)) {
617                         /*                        617                         /*
618                          * If the relogin time    618                          * If the relogin times out and the device is
619                          * still NOT ONLINE th    619                          * still NOT ONLINE then try and relogin again.
620                          */                       620                          */
621                         if (atomic_read(&ddb_e    621                         if (atomic_read(&ddb_entry->state) !=
622                             DDB_STATE_ONLINE &    622                             DDB_STATE_ONLINE &&
623                             ddb_entry->fw_ddb_    623                             ddb_entry->fw_ddb_device_state ==
624                             DDB_DS_SESSION_FAI    624                             DDB_DS_SESSION_FAILED) {
625                                 /* Reset retry    625                                 /* Reset retry relogin timer */
626                                 atomic_inc(&dd    626                                 atomic_inc(&ddb_entry->relogin_retry_count);
627                                 DEBUG2(printk(    627                                 DEBUG2(printk("scsi%ld: index[%d] relogin"
628                                                   628                                               " timed out-retrying"
629                                                   629                                               " relogin (%d)\n",
630                                                   630                                               ha->host_no,
631                                                   631                                               ddb_entry->fw_ddb_index,
632                                                   632                                               atomic_read(&ddb_entry->
633                                                   633                                                           relogin_retry_count))
634                                         );        634                                         );
635                                 start_dpc++;      635                                 start_dpc++;
636                                 DEBUG(printk("    636                                 DEBUG(printk("scsi%ld:%d:%d: index [%d] "
637                                              "    637                                              "initate relogin after"
638                                              "    638                                              " %d seconds\n",
639                                              h    639                                              ha->host_no, ddb_entry->bus,
640                                              d    640                                              ddb_entry->target,
641                                              d    641                                              ddb_entry->fw_ddb_index,
642                                              d    642                                              ddb_entry->default_time2wait + 4)
643                                         );        643                                         );
644                                                   644 
645                                 atomic_set(&dd    645                                 atomic_set(&ddb_entry->retry_relogin_timer,
646                                            ddb    646                                            ddb_entry->default_time2wait + 4);
647                         }                         647                         }
648                 }                                 648                 }
649         }                                         649         }
650                                                   650 
651         /* Check for heartbeat interval. */       651         /* Check for heartbeat interval. */
652         if (ha->firmware_options & FWOPT_HEART    652         if (ha->firmware_options & FWOPT_HEARTBEAT_ENABLE &&
653             ha->heartbeat_interval != 0) {        653             ha->heartbeat_interval != 0) {
654                 ha->seconds_since_last_heartbe    654                 ha->seconds_since_last_heartbeat++;
655                 if (ha->seconds_since_last_hea    655                 if (ha->seconds_since_last_heartbeat >
656                     ha->heartbeat_interval + 2    656                     ha->heartbeat_interval + 2)
657                         set_bit(DPC_RESET_HA,     657                         set_bit(DPC_RESET_HA, &ha->dpc_flags);
658         }                                         658         }
659                                                   659 
660                                                   660 
661         /* Wakeup the dpc routine for this ada    661         /* Wakeup the dpc routine for this adapter, if needed. */
662         if ((start_dpc ||                         662         if ((start_dpc ||
663              test_bit(DPC_RESET_HA, &ha->dpc_f    663              test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
664              test_bit(DPC_RETRY_RESET_HA, &ha-    664              test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags) ||
665              test_bit(DPC_RELOGIN_DEVICE, &ha-    665              test_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags) ||
666              test_bit(DPC_RESET_HA_DESTROY_DDB    666              test_bit(DPC_RESET_HA_DESTROY_DDB_LIST, &ha->dpc_flags) ||
667              test_bit(DPC_RESET_HA_INTR, &ha->    667              test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) ||
668              test_bit(DPC_GET_DHCP_IP_ADDR, &h    668              test_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags) ||
669              test_bit(DPC_AEN, &ha->dpc_flags)    669              test_bit(DPC_AEN, &ha->dpc_flags)) &&
670              ha->dpc_thread) {                    670              ha->dpc_thread) {
671                 DEBUG2(printk("scsi%ld: %s: sc    671                 DEBUG2(printk("scsi%ld: %s: scheduling dpc routine"
672                               " - dpc flags =     672                               " - dpc flags = 0x%lx\n",
673                               ha->host_no, __f    673                               ha->host_no, __func__, ha->dpc_flags));
674                 queue_work(ha->dpc_thread, &ha    674                 queue_work(ha->dpc_thread, &ha->dpc_work);
675         }                                         675         }
676                                                   676 
677         /* Reschedule timer thread to call us     677         /* Reschedule timer thread to call us back in one second */
678         mod_timer(&ha->timer, jiffies + HZ);      678         mod_timer(&ha->timer, jiffies + HZ);
679                                                   679 
680         DEBUG2(ha->seconds_since_last_intr++);    680         DEBUG2(ha->seconds_since_last_intr++);
681 }                                                 681 }
682                                                   682 
683 /**                                               683 /**
684  * qla4xxx_cmd_wait - waits for all outstandin    684  * qla4xxx_cmd_wait - waits for all outstanding commands to complete
685  * @ha: Pointer to host adapter structure.        685  * @ha: Pointer to host adapter structure.
686  *                                                686  *
687  * This routine stalls the driver until all ou    687  * This routine stalls the driver until all outstanding commands are returned.
688  * Caller must release the Hardware Lock prior    688  * Caller must release the Hardware Lock prior to calling this routine.
689  **/                                              689  **/
690 static int qla4xxx_cmd_wait(struct scsi_qla_ho    690 static int qla4xxx_cmd_wait(struct scsi_qla_host *ha)
691 {                                                 691 {
692         uint32_t index = 0;                       692         uint32_t index = 0;
693         int stat = QLA_SUCCESS;                   693         int stat = QLA_SUCCESS;
694         unsigned long flags;                      694         unsigned long flags;
695         struct scsi_cmnd *cmd;                    695         struct scsi_cmnd *cmd;
696         int wait_cnt = WAIT_CMD_TOV;    /*        696         int wait_cnt = WAIT_CMD_TOV;    /*
697                                          * Ini    697                                          * Initialized for 30 seconds as we
698                                          * exp    698                                          * expect all commands to retuned
699                                          * ASA    699                                          * ASAP.
700                                          */       700                                          */
701                                                   701 
702         while (wait_cnt) {                        702         while (wait_cnt) {
703                 spin_lock_irqsave(&ha->hardwar    703                 spin_lock_irqsave(&ha->hardware_lock, flags);
704                 /* Find a command that hasn't     704                 /* Find a command that hasn't completed. */
705                 for (index = 0; index < ha->ho    705                 for (index = 0; index < ha->host->can_queue; index++) {
706                         cmd = scsi_host_find_t    706                         cmd = scsi_host_find_tag(ha->host, index);
707                         if (cmd != NULL)          707                         if (cmd != NULL)
708                                 break;            708                                 break;
709                 }                                 709                 }
710                 spin_unlock_irqrestore(&ha->ha    710                 spin_unlock_irqrestore(&ha->hardware_lock, flags);
711                                                   711 
712                 /* If No Commands are pending,    712                 /* If No Commands are pending, wait is complete */
713                 if (index == ha->host->can_que    713                 if (index == ha->host->can_queue) {
714                         break;                    714                         break;
715                 }                                 715                 }
716                                                   716 
717                 /* If we timed out on waiting     717                 /* If we timed out on waiting for commands to come back
718                  * return ERROR.                  718                  * return ERROR.
719                  */                               719                  */
720                 wait_cnt--;                       720                 wait_cnt--;
721                 if (wait_cnt == 0)                721                 if (wait_cnt == 0)
722                         stat = QLA_ERROR;         722                         stat = QLA_ERROR;
723                 else {                            723                 else {
724                         msleep(1000);             724                         msleep(1000);
725                 }                                 725                 }
726         }                       /* End of Whil    726         }                       /* End of While (wait_cnt) */
727                                                   727 
728         return stat;                              728         return stat;
729 }                                                 729 }
730                                                   730 
731 void qla4xxx_hw_reset(struct scsi_qla_host *ha    731 void qla4xxx_hw_reset(struct scsi_qla_host *ha)
732 {                                                 732 {
733         uint32_t ctrl_status;                     733         uint32_t ctrl_status;
734         unsigned long flags = 0;                  734         unsigned long flags = 0;
735                                                   735 
736         DEBUG2(printk(KERN_ERR "scsi%ld: %s\n"    736         DEBUG2(printk(KERN_ERR "scsi%ld: %s\n", ha->host_no, __func__));
737                                                   737 
738         spin_lock_irqsave(&ha->hardware_lock,     738         spin_lock_irqsave(&ha->hardware_lock, flags);
739                                                   739 
740         /*                                        740         /*
741          * If the SCSI Reset Interrupt bit is     741          * If the SCSI Reset Interrupt bit is set, clear it.
742          * Otherwise, the Soft Reset won't wor    742          * Otherwise, the Soft Reset won't work.
743          */                                       743          */
744         ctrl_status = readw(&ha->reg->ctrl_sta    744         ctrl_status = readw(&ha->reg->ctrl_status);
745         if ((ctrl_status & CSR_SCSI_RESET_INTR    745         if ((ctrl_status & CSR_SCSI_RESET_INTR) != 0)
746                 writel(set_rmask(CSR_SCSI_RESE    746                 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status);
747                                                   747 
748         /* Issue Soft Reset */                    748         /* Issue Soft Reset */
749         writel(set_rmask(CSR_SOFT_RESET), &ha-    749         writel(set_rmask(CSR_SOFT_RESET), &ha->reg->ctrl_status);
750         readl(&ha->reg->ctrl_status);             750         readl(&ha->reg->ctrl_status);
751                                                   751 
752         spin_unlock_irqrestore(&ha->hardware_l    752         spin_unlock_irqrestore(&ha->hardware_lock, flags);
753 }                                                 753 }
754                                                   754 
755 /**                                               755 /**
756  * qla4xxx_soft_reset - performs soft reset.      756  * qla4xxx_soft_reset - performs soft reset.
757  * @ha: Pointer to host adapter structure.        757  * @ha: Pointer to host adapter structure.
758  **/                                              758  **/
759 int qla4xxx_soft_reset(struct scsi_qla_host *h    759 int qla4xxx_soft_reset(struct scsi_qla_host *ha)
760 {                                                 760 {
761         uint32_t max_wait_time;                   761         uint32_t max_wait_time;
762         unsigned long flags = 0;                  762         unsigned long flags = 0;
763         int status = QLA_ERROR;                   763         int status = QLA_ERROR;
764         uint32_t ctrl_status;                     764         uint32_t ctrl_status;
765                                                   765 
766         qla4xxx_hw_reset(ha);                     766         qla4xxx_hw_reset(ha);
767                                                   767 
768         /* Wait until the Network Reset Intr b    768         /* Wait until the Network Reset Intr bit is cleared */
769         max_wait_time = RESET_INTR_TOV;           769         max_wait_time = RESET_INTR_TOV;
770         do {                                      770         do {
771                 spin_lock_irqsave(&ha->hardwar    771                 spin_lock_irqsave(&ha->hardware_lock, flags);
772                 ctrl_status = readw(&ha->reg->    772                 ctrl_status = readw(&ha->reg->ctrl_status);
773                 spin_unlock_irqrestore(&ha->ha    773                 spin_unlock_irqrestore(&ha->hardware_lock, flags);
774                                                   774 
775                 if ((ctrl_status & CSR_NET_RES    775                 if ((ctrl_status & CSR_NET_RESET_INTR) == 0)
776                         break;                    776                         break;
777                                                   777 
778                 msleep(1000);                     778                 msleep(1000);
779         } while ((--max_wait_time));              779         } while ((--max_wait_time));
780                                                   780 
781         if ((ctrl_status & CSR_NET_RESET_INTR)    781         if ((ctrl_status & CSR_NET_RESET_INTR) != 0) {
782                 DEBUG2(printk(KERN_WARNING        782                 DEBUG2(printk(KERN_WARNING
783                               "scsi%ld: Networ    783                               "scsi%ld: Network Reset Intr not cleared by "
784                               "Network functio    784                               "Network function, clearing it now!\n",
785                               ha->host_no));      785                               ha->host_no));
786                 spin_lock_irqsave(&ha->hardwar    786                 spin_lock_irqsave(&ha->hardware_lock, flags);
787                 writel(set_rmask(CSR_NET_RESET    787                 writel(set_rmask(CSR_NET_RESET_INTR), &ha->reg->ctrl_status);
788                 readl(&ha->reg->ctrl_status);     788                 readl(&ha->reg->ctrl_status);
789                 spin_unlock_irqrestore(&ha->ha    789                 spin_unlock_irqrestore(&ha->hardware_lock, flags);
790         }                                         790         }
791                                                   791 
792         /* Wait until the firmware tells us th    792         /* Wait until the firmware tells us the Soft Reset is done */
793         max_wait_time = SOFT_RESET_TOV;           793         max_wait_time = SOFT_RESET_TOV;
794         do {                                      794         do {
795                 spin_lock_irqsave(&ha->hardwar    795                 spin_lock_irqsave(&ha->hardware_lock, flags);
796                 ctrl_status = readw(&ha->reg->    796                 ctrl_status = readw(&ha->reg->ctrl_status);
797                 spin_unlock_irqrestore(&ha->ha    797                 spin_unlock_irqrestore(&ha->hardware_lock, flags);
798                                                   798 
799                 if ((ctrl_status & CSR_SOFT_RE    799                 if ((ctrl_status & CSR_SOFT_RESET) == 0) {
800                         status = QLA_SUCCESS;     800                         status = QLA_SUCCESS;
801                         break;                    801                         break;
802                 }                                 802                 }
803                                                   803 
804                 msleep(1000);                     804                 msleep(1000);
805         } while ((--max_wait_time));              805         } while ((--max_wait_time));
806                                                   806 
807         /*                                        807         /*
808          * Also, make sure that the SCSI Reset    808          * Also, make sure that the SCSI Reset Interrupt bit has been cleared
809          * after the soft reset has taken plac    809          * after the soft reset has taken place.
810          */                                       810          */
811         spin_lock_irqsave(&ha->hardware_lock,     811         spin_lock_irqsave(&ha->hardware_lock, flags);
812         ctrl_status = readw(&ha->reg->ctrl_sta    812         ctrl_status = readw(&ha->reg->ctrl_status);
813         if ((ctrl_status & CSR_SCSI_RESET_INTR    813         if ((ctrl_status & CSR_SCSI_RESET_INTR) != 0) {
814                 writel(set_rmask(CSR_SCSI_RESE    814                 writel(set_rmask(CSR_SCSI_RESET_INTR), &ha->reg->ctrl_status);
815                 readl(&ha->reg->ctrl_status);     815                 readl(&ha->reg->ctrl_status);
816         }                                         816         }
817         spin_unlock_irqrestore(&ha->hardware_l    817         spin_unlock_irqrestore(&ha->hardware_lock, flags);
818                                                   818 
819         /* If soft reset fails then most proba    819         /* If soft reset fails then most probably the bios on other
820          * function is also enabled.              820          * function is also enabled.
821          * Since the initialization is sequent    821          * Since the initialization is sequential the other fn
822          * wont be able to acknowledge the sof    822          * wont be able to acknowledge the soft reset.
823          * Issue a force soft reset to workaro    823          * Issue a force soft reset to workaround this scenario.
824          */                                       824          */
825         if (max_wait_time == 0) {                 825         if (max_wait_time == 0) {
826                 /* Issue Force Soft Reset */      826                 /* Issue Force Soft Reset */
827                 spin_lock_irqsave(&ha->hardwar    827                 spin_lock_irqsave(&ha->hardware_lock, flags);
828                 writel(set_rmask(CSR_FORCE_SOF    828                 writel(set_rmask(CSR_FORCE_SOFT_RESET), &ha->reg->ctrl_status);
829                 readl(&ha->reg->ctrl_status);     829                 readl(&ha->reg->ctrl_status);
830                 spin_unlock_irqrestore(&ha->ha    830                 spin_unlock_irqrestore(&ha->hardware_lock, flags);
831                 /* Wait until the firmware tel    831                 /* Wait until the firmware tells us the Soft Reset is done */
832                 max_wait_time = SOFT_RESET_TOV    832                 max_wait_time = SOFT_RESET_TOV;
833                 do {                              833                 do {
834                         spin_lock_irqsave(&ha-    834                         spin_lock_irqsave(&ha->hardware_lock, flags);
835                         ctrl_status = readw(&h    835                         ctrl_status = readw(&ha->reg->ctrl_status);
836                         spin_unlock_irqrestore    836                         spin_unlock_irqrestore(&ha->hardware_lock, flags);
837                                                   837 
838                         if ((ctrl_status & CSR    838                         if ((ctrl_status & CSR_FORCE_SOFT_RESET) == 0) {
839                                 status = QLA_S    839                                 status = QLA_SUCCESS;
840                                 break;            840                                 break;
841                         }                         841                         }
842                                                   842 
843                         msleep(1000);             843                         msleep(1000);
844                 } while ((--max_wait_time));      844                 } while ((--max_wait_time));
845         }                                         845         }
846                                                   846 
847         return status;                            847         return status;
848 }                                                 848 }
849                                                   849 
850 /**                                               850 /**
851  * qla4xxx_flush_active_srbs - returns all out    851  * qla4xxx_flush_active_srbs - returns all outstanding i/o requests to O.S.
852  * @ha: Pointer to host adapter structure.        852  * @ha: Pointer to host adapter structure.
853  *                                                853  *
854  * This routine is called just prior to a HARD    854  * This routine is called just prior to a HARD RESET to return all
855  * outstanding commands back to the Operating     855  * outstanding commands back to the Operating System.
856  * Caller should make sure that the following     856  * Caller should make sure that the following locks are released
857  * before this calling routine: Hardware lock,    857  * before this calling routine: Hardware lock, and io_request_lock.
858  **/                                              858  **/
859 static void qla4xxx_flush_active_srbs(struct s    859 static void qla4xxx_flush_active_srbs(struct scsi_qla_host *ha)
860 {                                                 860 {
861         struct srb *srb;                          861         struct srb *srb;
862         int i;                                    862         int i;
863         unsigned long flags;                      863         unsigned long flags;
864                                                   864 
865         spin_lock_irqsave(&ha->hardware_lock,     865         spin_lock_irqsave(&ha->hardware_lock, flags);
866         for (i = 0; i < ha->host->can_queue; i    866         for (i = 0; i < ha->host->can_queue; i++) {
867                 srb = qla4xxx_del_from_active_    867                 srb = qla4xxx_del_from_active_array(ha, i);
868                 if (srb != NULL) {                868                 if (srb != NULL) {
869                         srb->cmd->result = DID    869                         srb->cmd->result = DID_RESET << 16;
870                         qla4xxx_srb_compl(ha,     870                         qla4xxx_srb_compl(ha, srb);
871                 }                                 871                 }
872         }                                         872         }
873         spin_unlock_irqrestore(&ha->hardware_l    873         spin_unlock_irqrestore(&ha->hardware_lock, flags);
874                                                   874 
875 }                                                 875 }
876                                                   876 
877 /**                                               877 /**
878  * qla4xxx_recover_adapter - recovers adapter     878  * qla4xxx_recover_adapter - recovers adapter after a fatal error
879  * @ha: Pointer to host adapter structure.        879  * @ha: Pointer to host adapter structure.
880  * @renew_ddb_list: Indicates what to do with     880  * @renew_ddb_list: Indicates what to do with the adapter's ddb list
881  *                                                881  *
882  * renew_ddb_list value can be 0=preserve ddb     882  * renew_ddb_list value can be 0=preserve ddb list, 1=destroy and rebuild
883  * ddb list.                                      883  * ddb list.
884  **/                                              884  **/
885 static int qla4xxx_recover_adapter(struct scsi    885 static int qla4xxx_recover_adapter(struct scsi_qla_host *ha,
886                                 uint8_t renew_    886                                 uint8_t renew_ddb_list)
887 {                                                 887 {
888         int status;                               888         int status;
889                                                   889 
890         /* Stall incoming I/O until we are don    890         /* Stall incoming I/O until we are done */
891         clear_bit(AF_ONLINE, &ha->flags);         891         clear_bit(AF_ONLINE, &ha->flags);
892                                                   892 
893         DEBUG2(printk("scsi%ld: %s calling qla    893         DEBUG2(printk("scsi%ld: %s calling qla4xxx_cmd_wait\n", ha->host_no,
894                       __func__));                 894                       __func__));
895                                                   895 
896         /* Wait for outstanding commands to co    896         /* Wait for outstanding commands to complete.
897          * Stalls the driver for max 30 secs      897          * Stalls the driver for max 30 secs
898          */                                       898          */
899         status = qla4xxx_cmd_wait(ha);            899         status = qla4xxx_cmd_wait(ha);
900                                                   900 
901         qla4xxx_disable_intrs(ha);                901         qla4xxx_disable_intrs(ha);
902                                                   902 
903         /* Flush any pending ddb changed AENs     903         /* Flush any pending ddb changed AENs */
904         qla4xxx_process_aen(ha, FLUSH_DDB_CHAN    904         qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
905                                                   905 
906         /* Reset the firmware.  If successful,    906         /* Reset the firmware.  If successful, function
907          * returns with ISP interrupts enabled    907          * returns with ISP interrupts enabled.
908          */                                       908          */
909         if (status == QLA_SUCCESS) {              909         if (status == QLA_SUCCESS) {
910                 DEBUG2(printk("scsi%ld: %s - P    910                 DEBUG2(printk("scsi%ld: %s - Performing soft reset..\n",
911                               ha->host_no, __f    911                               ha->host_no, __func__));
912                 qla4xxx_flush_active_srbs(ha);    912                 qla4xxx_flush_active_srbs(ha);
913                 if (ql4xxx_lock_drvr_wait(ha)     913                 if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS)
914                         status = qla4xxx_soft_    914                         status = qla4xxx_soft_reset(ha);
915                 else                              915                 else
916                         status = QLA_ERROR;       916                         status = QLA_ERROR;
917         }                                         917         }
918                                                   918 
919         /* Flush any pending ddb changed AENs     919         /* Flush any pending ddb changed AENs */
920         qla4xxx_process_aen(ha, FLUSH_DDB_CHAN    920         qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
921                                                   921 
922         /* Re-initialize firmware. If successf    922         /* Re-initialize firmware. If successful, function returns
923          * with ISP interrupts enabled */         923          * with ISP interrupts enabled */
924         if (status == QLA_SUCCESS) {              924         if (status == QLA_SUCCESS) {
925                 DEBUG2(printk("scsi%ld: %s - I    925                 DEBUG2(printk("scsi%ld: %s - Initializing adapter..\n",
926                               ha->host_no, __f    926                               ha->host_no, __func__));
927                                                   927 
928                 /* If successful, AF_ONLINE fl    928                 /* If successful, AF_ONLINE flag set in
929                  * qla4xxx_initialize_adapter     929                  * qla4xxx_initialize_adapter */
930                 status = qla4xxx_initialize_ad    930                 status = qla4xxx_initialize_adapter(ha, renew_ddb_list);
931         }                                         931         }
932                                                   932 
933         /* Failed adapter initialization?         933         /* Failed adapter initialization?
934          * Retry reset_ha only if invoked via     934          * Retry reset_ha only if invoked via DPC (DPC_RESET_HA) */
935         if ((test_bit(AF_ONLINE, &ha->flags) =    935         if ((test_bit(AF_ONLINE, &ha->flags) == 0) &&
936             (test_bit(DPC_RESET_HA, &ha->dpc_f    936             (test_bit(DPC_RESET_HA, &ha->dpc_flags))) {
937                 /* Adapter initialization fail    937                 /* Adapter initialization failed, see if we can retry
938                  * resetting the ha */            938                  * resetting the ha */
939                 if (!test_bit(DPC_RETRY_RESET_    939                 if (!test_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags)) {
940                         ha->retry_reset_ha_cnt    940                         ha->retry_reset_ha_cnt = MAX_RESET_HA_RETRIES;
941                         DEBUG2(printk("scsi%ld    941                         DEBUG2(printk("scsi%ld: recover adapter - retrying "
942                                       "(%d) mo    942                                       "(%d) more times\n", ha->host_no,
943                                       ha->retr    943                                       ha->retry_reset_ha_cnt));
944                         set_bit(DPC_RETRY_RESE    944                         set_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags);
945                         status = QLA_ERROR;       945                         status = QLA_ERROR;
946                 } else {                          946                 } else {
947                         if (ha->retry_reset_ha    947                         if (ha->retry_reset_ha_cnt > 0) {
948                                 /* Schedule an    948                                 /* Schedule another Reset HA--DPC will retry */
949                                 ha->retry_rese    949                                 ha->retry_reset_ha_cnt--;
950                                 DEBUG2(printk(    950                                 DEBUG2(printk("scsi%ld: recover adapter - "
951                                                   951                                               "retry remaining %d\n",
952                                                   952                                               ha->host_no,
953                                                   953                                               ha->retry_reset_ha_cnt));
954                                 status = QLA_E    954                                 status = QLA_ERROR;
955                         }                         955                         }
956                                                   956 
957                         if (ha->retry_reset_ha    957                         if (ha->retry_reset_ha_cnt == 0) {
958                                 /* Recover ada    958                                 /* Recover adapter retries have been exhausted.
959                                  * Adapter DEA    959                                  * Adapter DEAD */
960                                 DEBUG2(printk(    960                                 DEBUG2(printk("scsi%ld: recover adapter "
961                                                   961                                               "failed - board disabled\n",
962                                                   962                                               ha->host_no));
963                                 qla4xxx_flush_    963                                 qla4xxx_flush_active_srbs(ha);
964                                 clear_bit(DPC_    964                                 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags);
965                                 clear_bit(DPC_    965                                 clear_bit(DPC_RESET_HA, &ha->dpc_flags);
966                                 clear_bit(DPC_    966                                 clear_bit(DPC_RESET_HA_DESTROY_DDB_LIST,
967                                           &ha-    967                                           &ha->dpc_flags);
968                                 status = QLA_E    968                                 status = QLA_ERROR;
969                         }                         969                         }
970                 }                                 970                 }
971         } else {                                  971         } else {
972                 clear_bit(DPC_RESET_HA, &ha->d    972                 clear_bit(DPC_RESET_HA, &ha->dpc_flags);
973                 clear_bit(DPC_RESET_HA_DESTROY    973                 clear_bit(DPC_RESET_HA_DESTROY_DDB_LIST, &ha->dpc_flags);
974                 clear_bit(DPC_RETRY_RESET_HA,     974                 clear_bit(DPC_RETRY_RESET_HA, &ha->dpc_flags);
975         }                                         975         }
976                                                   976 
977         ha->adapter_error_count++;                977         ha->adapter_error_count++;
978                                                   978 
979         if (status == QLA_SUCCESS)                979         if (status == QLA_SUCCESS)
980                 qla4xxx_enable_intrs(ha);         980                 qla4xxx_enable_intrs(ha);
981                                                   981 
982         DEBUG2(printk("scsi%ld: recover adapte    982         DEBUG2(printk("scsi%ld: recover adapter .. DONE\n", ha->host_no));
983         return status;                            983         return status;
984 }                                                 984 }
985                                                   985 
986 /**                                               986 /**
987  * qla4xxx_do_dpc - dpc routine                   987  * qla4xxx_do_dpc - dpc routine
988  * @data: in our case pointer to adapter struc    988  * @data: in our case pointer to adapter structure
989  *                                                989  *
990  * This routine is a task that is schedule by     990  * This routine is a task that is schedule by the interrupt handler
991  * to perform the background processing for in    991  * to perform the background processing for interrupts.  We put it
992  * on a task queue that is consumed whenever t    992  * on a task queue that is consumed whenever the scheduler runs; that's
993  * so you can do anything (i.e. put the proces    993  * so you can do anything (i.e. put the process to sleep etc).  In fact,
994  * the mid-level tries to sleep when it reache    994  * the mid-level tries to sleep when it reaches the driver threshold
995  * "host->can_queue". This can cause a panic i    995  * "host->can_queue". This can cause a panic if we were in our interrupt code.
996  **/                                              996  **/
997 static void qla4xxx_do_dpc(struct work_struct     997 static void qla4xxx_do_dpc(struct work_struct *work)
998 {                                                 998 {
999         struct scsi_qla_host *ha =                999         struct scsi_qla_host *ha =
1000                 container_of(work, struct scs    1000                 container_of(work, struct scsi_qla_host, dpc_work);
1001         struct ddb_entry *ddb_entry, *dtemp;     1001         struct ddb_entry *ddb_entry, *dtemp;
1002         int status = QLA_ERROR;                  1002         int status = QLA_ERROR;
1003                                                  1003 
1004         DEBUG2(printk("scsi%ld: %s: DPC handl    1004         DEBUG2(printk("scsi%ld: %s: DPC handler waking up."
1005                 "flags = 0x%08lx, dpc_flags =    1005                 "flags = 0x%08lx, dpc_flags = 0x%08lx ctrl_stat = 0x%08x\n",
1006                 ha->host_no, __func__, ha->fl    1006                 ha->host_no, __func__, ha->flags, ha->dpc_flags,
1007                 readw(&ha->reg->ctrl_status))    1007                 readw(&ha->reg->ctrl_status)));
1008                                                  1008 
1009         /* Initialization not yet finished. D    1009         /* Initialization not yet finished. Don't do anything yet. */
1010         if (!test_bit(AF_INIT_DONE, &ha->flag    1010         if (!test_bit(AF_INIT_DONE, &ha->flags))
1011                 return;                          1011                 return;
1012                                                  1012 
1013         if (adapter_up(ha) ||                    1013         if (adapter_up(ha) ||
1014             test_bit(DPC_RESET_HA, &ha->dpc_f    1014             test_bit(DPC_RESET_HA, &ha->dpc_flags) ||
1015             test_bit(DPC_RESET_HA_INTR, &ha->    1015             test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags) ||
1016             test_bit(DPC_RESET_HA_DESTROY_DDB    1016             test_bit(DPC_RESET_HA_DESTROY_DDB_LIST, &ha->dpc_flags)) {
1017                 if (test_bit(DPC_RESET_HA_DES    1017                 if (test_bit(DPC_RESET_HA_DESTROY_DDB_LIST, &ha->dpc_flags) ||
1018                         test_bit(DPC_RESET_HA    1018                         test_bit(DPC_RESET_HA, &ha->dpc_flags))
1019                         qla4xxx_recover_adapt    1019                         qla4xxx_recover_adapter(ha, PRESERVE_DDB_LIST);
1020                                                  1020 
1021                 if (test_bit(DPC_RESET_HA_INT    1021                 if (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags)) {
1022                         uint8_t wait_time = R    1022                         uint8_t wait_time = RESET_INTR_TOV;
1023                                                  1023 
1024                         while ((readw(&ha->re    1024                         while ((readw(&ha->reg->ctrl_status) &
1025                                 (CSR_SOFT_RES    1025                                 (CSR_SOFT_RESET | CSR_FORCE_SOFT_RESET)) != 0) {
1026                                 if (--wait_ti    1026                                 if (--wait_time == 0)
1027                                         break    1027                                         break;
1028                                 msleep(1000);    1028                                 msleep(1000);
1029                         }                        1029                         }
1030                         if (wait_time == 0)      1030                         if (wait_time == 0)
1031                                 DEBUG2(printk    1031                                 DEBUG2(printk("scsi%ld: %s: SR|FSR "
1032                                                  1032                                               "bit not cleared-- resetting\n",
1033                                                  1033                                               ha->host_no, __func__));
1034                         qla4xxx_flush_active_    1034                         qla4xxx_flush_active_srbs(ha);
1035                         if (ql4xxx_lock_drvr_    1035                         if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS) {
1036                                 qla4xxx_proce    1036                                 qla4xxx_process_aen(ha, FLUSH_DDB_CHANGED_AENS);
1037                                 status = qla4    1037                                 status = qla4xxx_initialize_adapter(ha,
1038                                                  1038                                                 PRESERVE_DDB_LIST);
1039                         }                        1039                         }
1040                         clear_bit(DPC_RESET_H    1040                         clear_bit(DPC_RESET_HA_INTR, &ha->dpc_flags);
1041                         if (status == QLA_SUC    1041                         if (status == QLA_SUCCESS)
1042                                 qla4xxx_enabl    1042                                 qla4xxx_enable_intrs(ha);
1043                 }                                1043                 }
1044         }                                        1044         }
1045                                                  1045 
1046         /* ---- process AEN? --- */              1046         /* ---- process AEN? --- */
1047         if (test_and_clear_bit(DPC_AEN, &ha->    1047         if (test_and_clear_bit(DPC_AEN, &ha->dpc_flags))
1048                 qla4xxx_process_aen(ha, PROCE    1048                 qla4xxx_process_aen(ha, PROCESS_ALL_AENS);
1049                                                  1049 
1050         /* ---- Get DHCP IP Address? --- */      1050         /* ---- Get DHCP IP Address? --- */
1051         if (test_and_clear_bit(DPC_GET_DHCP_I    1051         if (test_and_clear_bit(DPC_GET_DHCP_IP_ADDR, &ha->dpc_flags))
1052                 qla4xxx_get_dhcp_ip_address(h    1052                 qla4xxx_get_dhcp_ip_address(ha);
1053                                                  1053 
1054         /* ---- relogin device? --- */           1054         /* ---- relogin device? --- */
1055         if (adapter_up(ha) &&                    1055         if (adapter_up(ha) &&
1056             test_and_clear_bit(DPC_RELOGIN_DE    1056             test_and_clear_bit(DPC_RELOGIN_DEVICE, &ha->dpc_flags)) {
1057                 list_for_each_entry_safe(ddb_    1057                 list_for_each_entry_safe(ddb_entry, dtemp,
1058                                          &ha-    1058                                          &ha->ddb_list, list) {
1059                         if (test_and_clear_bi    1059                         if (test_and_clear_bit(DF_RELOGIN, &ddb_entry->flags) &&
1060                             atomic_read(&ddb_    1060                             atomic_read(&ddb_entry->state) != DDB_STATE_ONLINE)
1061                                 qla4xxx_relog    1061                                 qla4xxx_relogin_device(ha, ddb_entry);
1062                                                  1062 
1063                         /*                       1063                         /*
1064                          * If mbx cmd times o    1064                          * If mbx cmd times out there is no point
1065                          * in continuing furt    1065                          * in continuing further.
1066                          * With large no of t    1066                          * With large no of targets this can hang
1067                          * the system.           1067                          * the system.
1068                          */                      1068                          */
1069                         if (test_bit(DPC_RESE    1069                         if (test_bit(DPC_RESET_HA, &ha->dpc_flags)) {
1070                                 printk(KERN_W    1070                                 printk(KERN_WARNING "scsi%ld: %s: "
1071                                        "need     1071                                        "need to reset hba\n",
1072                                        ha->ho    1072                                        ha->host_no, __func__);
1073                                 break;           1073                                 break;
1074                         }                        1074                         }
1075                 }                                1075                 }
1076         }                                        1076         }
1077 }                                                1077 }
1078                                                  1078 
1079 /**                                              1079 /**
1080  * qla4xxx_free_adapter - release the adapter    1080  * qla4xxx_free_adapter - release the adapter
1081  * @ha: pointer to adapter structure             1081  * @ha: pointer to adapter structure
1082  **/                                             1082  **/
1083 static void qla4xxx_free_adapter(struct scsi_    1083 static void qla4xxx_free_adapter(struct scsi_qla_host *ha)
1084 {                                                1084 {
1085                                                  1085 
1086         if (test_bit(AF_INTERRUPTS_ON, &ha->f    1086         if (test_bit(AF_INTERRUPTS_ON, &ha->flags)) {
1087                 /* Turn-off interrupts on the    1087                 /* Turn-off interrupts on the card. */
1088                 qla4xxx_disable_intrs(ha);       1088                 qla4xxx_disable_intrs(ha);
1089         }                                        1089         }
1090                                                  1090 
1091         /* Kill the kernel thread for this ho    1091         /* Kill the kernel thread for this host */
1092         if (ha->dpc_thread)                      1092         if (ha->dpc_thread)
1093                 destroy_workqueue(ha->dpc_thr    1093                 destroy_workqueue(ha->dpc_thread);
1094                                                  1094 
1095         /* Issue Soft Reset to put firmware i    1095         /* Issue Soft Reset to put firmware in unknown state */
1096         if (ql4xxx_lock_drvr_wait(ha) == QLA_    1096         if (ql4xxx_lock_drvr_wait(ha) == QLA_SUCCESS)
1097                 qla4xxx_hw_reset(ha);            1097                 qla4xxx_hw_reset(ha);
1098                                                  1098 
1099         /* Remove timer thread, if present */    1099         /* Remove timer thread, if present */
1100         if (ha->timer_active)                    1100         if (ha->timer_active)
1101                 qla4xxx_stop_timer(ha);          1101                 qla4xxx_stop_timer(ha);
1102                                                  1102 
1103         /* Detach interrupts */                  1103         /* Detach interrupts */
1104         if (test_and_clear_bit(AF_IRQ_ATTACHE    1104         if (test_and_clear_bit(AF_IRQ_ATTACHED, &ha->flags))
1105                 free_irq(ha->pdev->irq, ha);     1105                 free_irq(ha->pdev->irq, ha);
1106                                                  1106 
1107         /* free extra memory */                  1107         /* free extra memory */
1108         qla4xxx_mem_free(ha);                    1108         qla4xxx_mem_free(ha);
1109                                                  1109 
1110         pci_disable_device(ha->pdev);            1110         pci_disable_device(ha->pdev);
1111                                                  1111 
1112 }                                                1112 }
1113                                                  1113 
1114 /***                                             1114 /***
1115  * qla4xxx_iospace_config - maps registers       1115  * qla4xxx_iospace_config - maps registers
1116  * @ha: pointer to adapter structure             1116  * @ha: pointer to adapter structure
1117  *                                               1117  *
1118  * This routines maps HBA's registers from th    1118  * This routines maps HBA's registers from the pci address space
1119  * into the kernel virtual address space for     1119  * into the kernel virtual address space for memory mapped i/o.
1120  **/                                             1120  **/
1121 static int qla4xxx_iospace_config(struct scsi    1121 static int qla4xxx_iospace_config(struct scsi_qla_host *ha)
1122 {                                                1122 {
1123         unsigned long pio, pio_len, pio_flags    1123         unsigned long pio, pio_len, pio_flags;
1124         unsigned long mmio, mmio_len, mmio_fl    1124         unsigned long mmio, mmio_len, mmio_flags;
1125                                                  1125 
1126         pio = pci_resource_start(ha->pdev, 0)    1126         pio = pci_resource_start(ha->pdev, 0);
1127         pio_len = pci_resource_len(ha->pdev,     1127         pio_len = pci_resource_len(ha->pdev, 0);
1128         pio_flags = pci_resource_flags(ha->pd    1128         pio_flags = pci_resource_flags(ha->pdev, 0);
1129         if (pio_flags & IORESOURCE_IO) {         1129         if (pio_flags & IORESOURCE_IO) {
1130                 if (pio_len < MIN_IOBASE_LEN)    1130                 if (pio_len < MIN_IOBASE_LEN) {
1131                         dev_warn(&ha->pdev->d    1131                         dev_warn(&ha->pdev->dev,
1132                                 "Invalid PCI     1132                                 "Invalid PCI I/O region size\n");
1133                         pio = 0;                 1133                         pio = 0;
1134                 }                                1134                 }
1135         } else {                                 1135         } else {
1136                 dev_warn(&ha->pdev->dev, "reg    1136                 dev_warn(&ha->pdev->dev, "region #0 not a PIO resource\n");
1137                 pio = 0;                         1137                 pio = 0;
1138         }                                        1138         }
1139                                                  1139 
1140         /* Use MMIO operations for all access    1140         /* Use MMIO operations for all accesses. */
1141         mmio = pci_resource_start(ha->pdev, 1    1141         mmio = pci_resource_start(ha->pdev, 1);
1142         mmio_len = pci_resource_len(ha->pdev,    1142         mmio_len = pci_resource_len(ha->pdev, 1);
1143         mmio_flags = pci_resource_flags(ha->p    1143         mmio_flags = pci_resource_flags(ha->pdev, 1);
1144                                                  1144 
1145         if (!(mmio_flags & IORESOURCE_MEM)) {    1145         if (!(mmio_flags & IORESOURCE_MEM)) {
1146                 dev_err(&ha->pdev->dev,          1146                 dev_err(&ha->pdev->dev,
1147                         "region #0 not an MMI    1147                         "region #0 not an MMIO resource, aborting\n");
1148                                                  1148 
1149                 goto iospace_error_exit;         1149                 goto iospace_error_exit;
1150         }                                        1150         }
1151         if (mmio_len < MIN_IOBASE_LEN) {         1151         if (mmio_len < MIN_IOBASE_LEN) {
1152                 dev_err(&ha->pdev->dev,          1152                 dev_err(&ha->pdev->dev,
1153                         "Invalid PCI mem regi    1153                         "Invalid PCI mem region size, aborting\n");
1154                 goto iospace_error_exit;         1154                 goto iospace_error_exit;
1155         }                                        1155         }
1156                                                  1156 
1157         if (pci_request_regions(ha->pdev, DRI    1157         if (pci_request_regions(ha->pdev, DRIVER_NAME)) {
1158                 dev_warn(&ha->pdev->dev,         1158                 dev_warn(&ha->pdev->dev,
1159                         "Failed to reserve PI    1159                         "Failed to reserve PIO/MMIO regions\n");
1160                                                  1160 
1161                 goto iospace_error_exit;         1161                 goto iospace_error_exit;
1162         }                                        1162         }
1163                                                  1163 
1164         ha->pio_address = pio;                   1164         ha->pio_address = pio;
1165         ha->pio_length = pio_len;                1165         ha->pio_length = pio_len;
1166         ha->reg = ioremap(mmio, MIN_IOBASE_LE    1166         ha->reg = ioremap(mmio, MIN_IOBASE_LEN);
1167         if (!ha->reg) {                          1167         if (!ha->reg) {
1168                 dev_err(&ha->pdev->dev,          1168                 dev_err(&ha->pdev->dev,
1169                         "cannot remap MMIO, a    1169                         "cannot remap MMIO, aborting\n");
1170                                                  1170 
1171                 goto iospace_error_exit;         1171                 goto iospace_error_exit;
1172         }                                        1172         }
1173                                                  1173 
1174         return 0;                                1174         return 0;
1175                                                  1175 
1176 iospace_error_exit:                              1176 iospace_error_exit:
1177         return -ENOMEM;                          1177         return -ENOMEM;
1178 }                                                1178 }
1179                                                  1179 
1180 /**                                              1180 /**
1181  * qla4xxx_probe_adapter - callback function     1181  * qla4xxx_probe_adapter - callback function to probe HBA
1182  * @pdev: pointer to pci_dev structure           1182  * @pdev: pointer to pci_dev structure
1183  * @pci_device_id: pointer to pci_device entr    1183  * @pci_device_id: pointer to pci_device entry
1184  *                                               1184  *
1185  * This routine will probe for Qlogic 4xxx iS    1185  * This routine will probe for Qlogic 4xxx iSCSI host adapters.
1186  * It returns zero if successful. It also ini    1186  * It returns zero if successful. It also initializes all data necessary for
1187  * the driver.                                   1187  * the driver.
1188  **/                                             1188  **/
1189 static int __devinit qla4xxx_probe_adapter(st    1189 static int __devinit qla4xxx_probe_adapter(struct pci_dev *pdev,
1190                                            co    1190                                            const struct pci_device_id *ent)
1191 {                                                1191 {
1192         int ret = -ENODEV, status;               1192         int ret = -ENODEV, status;
1193         struct Scsi_Host *host;                  1193         struct Scsi_Host *host;
1194         struct scsi_qla_host *ha;                1194         struct scsi_qla_host *ha;
1195         uint8_t init_retry_count = 0;            1195         uint8_t init_retry_count = 0;
1196         char buf[34];                            1196         char buf[34];
1197                                                  1197 
1198         if (pci_enable_device(pdev))             1198         if (pci_enable_device(pdev))
1199                 return -1;                       1199                 return -1;
1200                                                  1200 
1201         host = scsi_host_alloc(&qla4xxx_drive    1201         host = scsi_host_alloc(&qla4xxx_driver_template, sizeof(*ha));
1202         if (host == NULL) {                      1202         if (host == NULL) {
1203                 printk(KERN_WARNING              1203                 printk(KERN_WARNING
1204                        "qla4xxx: Couldn't all    1204                        "qla4xxx: Couldn't allocate host from scsi layer!\n");
1205                 goto probe_disable_device;       1205                 goto probe_disable_device;
1206         }                                        1206         }
1207                                                  1207 
1208         /* Clear our data area */                1208         /* Clear our data area */
1209         ha = (struct scsi_qla_host *) host->h    1209         ha = (struct scsi_qla_host *) host->hostdata;
1210         memset(ha, 0, sizeof(*ha));              1210         memset(ha, 0, sizeof(*ha));
1211                                                  1211 
1212         /* Save the information from PCI BIOS    1212         /* Save the information from PCI BIOS.  */
1213         ha->pdev = pdev;                         1213         ha->pdev = pdev;
1214         ha->host = host;                         1214         ha->host = host;
1215         ha->host_no = host->host_no;             1215         ha->host_no = host->host_no;
1216                                                  1216 
1217         /* Configure PCI I/O space. */           1217         /* Configure PCI I/O space. */
1218         ret = qla4xxx_iospace_config(ha);        1218         ret = qla4xxx_iospace_config(ha);
1219         if (ret)                                 1219         if (ret)
1220                 goto probe_failed;               1220                 goto probe_failed;
1221                                                  1221 
1222         dev_info(&ha->pdev->dev, "Found an IS    1222         dev_info(&ha->pdev->dev, "Found an ISP%04x, irq %d, iobase 0x%p\n",
1223                    pdev->device, pdev->irq, h    1223                    pdev->device, pdev->irq, ha->reg);
1224                                                  1224 
1225         qla4xxx_config_dma_addressing(ha);       1225         qla4xxx_config_dma_addressing(ha);
1226                                                  1226 
1227         /* Initialize lists and spinlocks. */    1227         /* Initialize lists and spinlocks. */
1228         INIT_LIST_HEAD(&ha->ddb_list);           1228         INIT_LIST_HEAD(&ha->ddb_list);
1229         INIT_LIST_HEAD(&ha->free_srb_q);         1229         INIT_LIST_HEAD(&ha->free_srb_q);
1230                                                  1230 
1231         mutex_init(&ha->mbox_sem);               1231         mutex_init(&ha->mbox_sem);
1232                                                  1232 
1233         spin_lock_init(&ha->hardware_lock);      1233         spin_lock_init(&ha->hardware_lock);
1234                                                  1234 
1235         /* Allocate dma buffers */               1235         /* Allocate dma buffers */
1236         if (qla4xxx_mem_alloc(ha)) {             1236         if (qla4xxx_mem_alloc(ha)) {
1237                 dev_warn(&ha->pdev->dev,         1237                 dev_warn(&ha->pdev->dev,
1238                            "[ERROR] Failed to    1238                            "[ERROR] Failed to allocate memory for adapter\n");
1239                                                  1239 
1240                 ret = -ENOMEM;                   1240                 ret = -ENOMEM;
1241                 goto probe_failed;               1241                 goto probe_failed;
1242         }                                        1242         }
1243                                                  1243 
1244         /*                                       1244         /*
1245          * Initialize the Host adapter reques    1245          * Initialize the Host adapter request/response queues and
1246          * firmware                              1246          * firmware
1247          * NOTE: interrupts enabled upon succ    1247          * NOTE: interrupts enabled upon successful completion
1248          */                                      1248          */
1249         status = qla4xxx_initialize_adapter(h    1249         status = qla4xxx_initialize_adapter(ha, REBUILD_DDB_LIST);
1250         while (status == QLA_ERROR && init_re    1250         while (status == QLA_ERROR && init_retry_count++ < MAX_INIT_RETRIES) {
1251                 DEBUG2(printk("scsi: %s: retr    1251                 DEBUG2(printk("scsi: %s: retrying adapter initialization "
1252                               "(%d)\n", __fun    1252                               "(%d)\n", __func__, init_retry_count));
1253                 qla4xxx_soft_reset(ha);          1253                 qla4xxx_soft_reset(ha);
1254                 status = qla4xxx_initialize_a    1254                 status = qla4xxx_initialize_adapter(ha, REBUILD_DDB_LIST);
1255         }                                        1255         }
1256         if (status == QLA_ERROR) {               1256         if (status == QLA_ERROR) {
1257                 dev_warn(&ha->pdev->dev, "Fai    1257                 dev_warn(&ha->pdev->dev, "Failed to initialize adapter\n");
1258                                                  1258 
1259                 ret = -ENODEV;                   1259                 ret = -ENODEV;
1260                 goto probe_failed;               1260                 goto probe_failed;
1261         }                                        1261         }
1262                                                  1262 
1263         host->cmd_per_lun = 3;                   1263         host->cmd_per_lun = 3;
1264         host->max_channel = 0;                   1264         host->max_channel = 0;
1265         host->max_lun = MAX_LUNS - 1;            1265         host->max_lun = MAX_LUNS - 1;
1266         host->max_id = MAX_TARGETS;              1266         host->max_id = MAX_TARGETS;
1267         host->max_cmd_len = IOCB_MAX_CDB_LEN;    1267         host->max_cmd_len = IOCB_MAX_CDB_LEN;
1268         host->can_queue = MAX_SRBS ;             1268         host->can_queue = MAX_SRBS ;
1269         host->transportt = qla4xxx_scsi_trans    1269         host->transportt = qla4xxx_scsi_transport;
1270                                                  1270 
1271         ret = scsi_init_shared_tag_map(host,     1271         ret = scsi_init_shared_tag_map(host, MAX_SRBS);
1272         if (ret) {                               1272         if (ret) {
1273                 dev_warn(&ha->pdev->dev, "scs    1273                 dev_warn(&ha->pdev->dev, "scsi_init_shared_tag_map failed\n");
1274                 goto probe_failed;               1274                 goto probe_failed;
1275         }                                        1275         }
1276                                                  1276 
1277         /* Startup the kernel thread for this    1277         /* Startup the kernel thread for this host adapter. */
1278         DEBUG2(printk("scsi: %s: Starting ker    1278         DEBUG2(printk("scsi: %s: Starting kernel thread for "
1279                       "qla4xxx_dpc\n", __func    1279                       "qla4xxx_dpc\n", __func__));
1280         sprintf(buf, "qla4xxx_%lu_dpc", ha->h    1280         sprintf(buf, "qla4xxx_%lu_dpc", ha->host_no);
1281         ha->dpc_thread = create_singlethread_    1281         ha->dpc_thread = create_singlethread_workqueue(buf);
1282         if (!ha->dpc_thread) {                   1282         if (!ha->dpc_thread) {
1283                 dev_warn(&ha->pdev->dev, "Una    1283                 dev_warn(&ha->pdev->dev, "Unable to start DPC thread!\n");
1284                 ret = -ENODEV;                   1284                 ret = -ENODEV;
1285                 goto probe_failed;               1285                 goto probe_failed;
1286         }                                        1286         }
1287         INIT_WORK(&ha->dpc_work, qla4xxx_do_d    1287         INIT_WORK(&ha->dpc_work, qla4xxx_do_dpc);
1288                                                  1288 
1289         ret = request_irq(pdev->irq, qla4xxx_    1289         ret = request_irq(pdev->irq, qla4xxx_intr_handler,
1290                           IRQF_DISABLED | IRQ    1290                           IRQF_DISABLED | IRQF_SHARED, "qla4xxx", ha);
1291         if (ret) {                               1291         if (ret) {
1292                 dev_warn(&ha->pdev->dev, "Fai    1292                 dev_warn(&ha->pdev->dev, "Failed to reserve interrupt %d"
1293                         " already in use.\n",    1293                         " already in use.\n", pdev->irq);
1294                 goto probe_failed;               1294                 goto probe_failed;
1295         }                                        1295         }
1296         set_bit(AF_IRQ_ATTACHED, &ha->flags);    1296         set_bit(AF_IRQ_ATTACHED, &ha->flags);
1297         host->irq = pdev->irq;                   1297         host->irq = pdev->irq;
1298         DEBUG(printk("scsi%d: irq %d attached    1298         DEBUG(printk("scsi%d: irq %d attached\n", ha->host_no, ha->pdev->irq));
1299                                                  1299 
1300         qla4xxx_enable_intrs(ha);                1300         qla4xxx_enable_intrs(ha);
1301                                                  1301 
1302         /* Start timer thread. */                1302         /* Start timer thread. */
1303         qla4xxx_start_timer(ha, qla4xxx_timer    1303         qla4xxx_start_timer(ha, qla4xxx_timer, 1);
1304                                                  1304 
1305         set_bit(AF_INIT_DONE, &ha->flags);       1305         set_bit(AF_INIT_DONE, &ha->flags);
1306                                                  1306 
1307         pci_set_drvdata(pdev, ha);               1307         pci_set_drvdata(pdev, ha);
1308                                                  1308 
1309         ret = scsi_add_host(host, &pdev->dev)    1309         ret = scsi_add_host(host, &pdev->dev);
1310         if (ret)                                 1310         if (ret)
1311                 goto probe_failed;               1311                 goto probe_failed;
1312                                                  1312 
1313         printk(KERN_INFO                         1313         printk(KERN_INFO
1314                " QLogic iSCSI HBA Driver vers    1314                " QLogic iSCSI HBA Driver version: %s\n"
1315                "  QLogic ISP%04x @ %s, host#=    1315                "  QLogic ISP%04x @ %s, host#=%ld, fw=%02d.%02d.%02d.%02d\n",
1316                qla4xxx_version_str, ha->pdev-    1316                qla4xxx_version_str, ha->pdev->device, pci_name(ha->pdev),
1317                ha->host_no, ha->firmware_vers    1317                ha->host_no, ha->firmware_version[0], ha->firmware_version[1],
1318                ha->patch_number, ha->build_nu    1318                ha->patch_number, ha->build_number);
1319         scsi_scan_host(host);                    1319         scsi_scan_host(host);
1320         return 0;                                1320         return 0;
1321                                                  1321 
1322 probe_failed:                                    1322 probe_failed:
1323         qla4xxx_free_adapter(ha);                1323         qla4xxx_free_adapter(ha);
1324         scsi_host_put(ha->host);                 1324         scsi_host_put(ha->host);
1325                                                  1325 
1326 probe_disable_device:                            1326 probe_disable_device:
1327         pci_disable_device(pdev);                1327         pci_disable_device(pdev);
1328                                                  1328 
1329         return ret;                              1329         return ret;
1330 }                                                1330 }
1331                                                  1331 
1332 /**                                              1332 /**
1333  * qla4xxx_remove_adapter - calback function     1333  * qla4xxx_remove_adapter - calback function to remove adapter.
1334  * @pci_dev: PCI device pointer                  1334  * @pci_dev: PCI device pointer
1335  **/                                             1335  **/
1336 static void __devexit qla4xxx_remove_adapter(    1336 static void __devexit qla4xxx_remove_adapter(struct pci_dev *pdev)
1337 {                                                1337 {
1338         struct scsi_qla_host *ha;                1338         struct scsi_qla_host *ha;
1339                                                  1339 
1340         ha = pci_get_drvdata(pdev);              1340         ha = pci_get_drvdata(pdev);
1341                                                  1341 
1342         qla4xxx_disable_intrs(ha);               1342         qla4xxx_disable_intrs(ha);
1343                                                  1343 
1344         while (test_bit(DPC_RESET_HA_INTR, &h    1344         while (test_bit(DPC_RESET_HA_INTR, &ha->dpc_flags))
1345                 ssleep(1);                       1345                 ssleep(1);
1346                                                  1346 
1347         /* remove devs from iscsi_sessions to    1347         /* remove devs from iscsi_sessions to scsi_devices */
1348         qla4xxx_free_ddb_list(ha);               1348         qla4xxx_free_ddb_list(ha);
1349                                                  1349 
1350         scsi_remove_host(ha->host);              1350         scsi_remove_host(ha->host);
1351                                                  1351 
1352         qla4xxx_free_adapter(ha);                1352         qla4xxx_free_adapter(ha);
1353                                                  1353 
1354         scsi_host_put(ha->host);                 1354         scsi_host_put(ha->host);
1355                                                  1355 
1356         pci_set_drvdata(pdev, NULL);             1356         pci_set_drvdata(pdev, NULL);
1357 }                                                1357 }
1358                                                  1358 
1359 /**                                              1359 /**
1360  * qla4xxx_config_dma_addressing() - Configur    1360  * qla4xxx_config_dma_addressing() - Configure OS DMA addressing method.
1361  * @ha: HA context                               1361  * @ha: HA context
1362  *                                               1362  *
1363  * At exit, the @ha's flags.enable_64bit_addr    1363  * At exit, the @ha's flags.enable_64bit_addressing set to indicated
1364  * supported addressing method.                  1364  * supported addressing method.
1365  */                                              1365  */
1366 static void qla4xxx_config_dma_addressing(str    1366 static void qla4xxx_config_dma_addressing(struct scsi_qla_host *ha)
1367 {                                                1367 {
1368         int retval;                              1368         int retval;
1369                                                  1369 
1370         /* Update our PCI device dma_mask for    1370         /* Update our PCI device dma_mask for full 64 bit mask */
1371         if (pci_set_dma_mask(ha->pdev, DMA_64    1371         if (pci_set_dma_mask(ha->pdev, DMA_64BIT_MASK) == 0) {
1372                 if (pci_set_consistent_dma_ma    1372                 if (pci_set_consistent_dma_mask(ha->pdev, DMA_64BIT_MASK)) {
1373                         dev_dbg(&ha->pdev->de    1373                         dev_dbg(&ha->pdev->dev,
1374                                   "Failed to     1374                                   "Failed to set 64 bit PCI consistent mask; "
1375                                    "using 32     1375                                    "using 32 bit.\n");
1376                         retval = pci_set_cons    1376                         retval = pci_set_consistent_dma_mask(ha->pdev,
1377                                                  1377                                                              DMA_32BIT_MASK);
1378                 }                                1378                 }
1379         } else                                   1379         } else
1380                 retval = pci_set_dma_mask(ha-    1380                 retval = pci_set_dma_mask(ha->pdev, DMA_32BIT_MASK);
1381 }                                                1381 }
1382                                                  1382 
1383 static int qla4xxx_slave_alloc(struct scsi_de    1383 static int qla4xxx_slave_alloc(struct scsi_device *sdev)
1384 {                                                1384 {
1385         struct iscsi_cls_session *sess = star    1385         struct iscsi_cls_session *sess = starget_to_session(sdev->sdev_target);
1386         struct ddb_entry *ddb = sess->dd_data    1386         struct ddb_entry *ddb = sess->dd_data;
1387                                                  1387 
1388         sdev->hostdata = ddb;                    1388         sdev->hostdata = ddb;
1389         sdev->tagged_supported = 1;              1389         sdev->tagged_supported = 1;
1390         scsi_activate_tcq(sdev, sdev->host->c    1390         scsi_activate_tcq(sdev, sdev->host->can_queue);
1391         return 0;                                1391         return 0;
1392 }                                                1392 }
1393                                                  1393 
1394 static int qla4xxx_slave_configure(struct scs    1394 static int qla4xxx_slave_configure(struct scsi_device *sdev)
1395 {                                                1395 {
1396         sdev->tagged_supported = 1;              1396         sdev->tagged_supported = 1;
1397         return 0;                                1397         return 0;
1398 }                                                1398 }
1399                                                  1399 
1400 static void qla4xxx_slave_destroy(struct scsi    1400 static void qla4xxx_slave_destroy(struct scsi_device *sdev)
1401 {                                                1401 {
1402         scsi_deactivate_tcq(sdev, 1);            1402         scsi_deactivate_tcq(sdev, 1);
1403 }                                                1403 }
1404                                                  1404 
1405 /**                                              1405 /**
1406  * qla4xxx_del_from_active_array - returns an    1406  * qla4xxx_del_from_active_array - returns an active srb
1407  * @ha: Pointer to host adapter structure.       1407  * @ha: Pointer to host adapter structure.
1408  * @index: index into to the active_array        1408  * @index: index into to the active_array
1409  *                                               1409  *
1410  * This routine removes and returns the srb a    1410  * This routine removes and returns the srb at the specified index
1411  **/                                             1411  **/
1412 struct srb * qla4xxx_del_from_active_array(st    1412 struct srb * qla4xxx_del_from_active_array(struct scsi_qla_host *ha, uint32_t index)
1413 {                                                1413 {
1414         struct srb *srb = NULL;                  1414         struct srb *srb = NULL;
1415         struct scsi_cmnd *cmd;                   1415         struct scsi_cmnd *cmd;
1416                                                  1416 
1417         if (!(cmd = scsi_host_find_tag(ha->ho    1417         if (!(cmd = scsi_host_find_tag(ha->host, index)))
1418                 return srb;                      1418                 return srb;
1419                                                  1419 
1420         if (!(srb = (struct srb *)cmd->host_s    1420         if (!(srb = (struct srb *)cmd->host_scribble))
1421                 return srb;                      1421                 return srb;
1422                                                  1422 
1423         /* update counters */                    1423         /* update counters */
1424         if (srb->flags & SRB_DMA_VALID) {        1424         if (srb->flags & SRB_DMA_VALID) {
1425                 ha->req_q_count += srb->iocb_    1425                 ha->req_q_count += srb->iocb_cnt;
1426                 ha->iocb_cnt -= srb->iocb_cnt    1426                 ha->iocb_cnt -= srb->iocb_cnt;
1427                 if (srb->cmd)                    1427                 if (srb->cmd)
1428                         srb->cmd->host_scribb    1428                         srb->cmd->host_scribble = NULL;
1429         }                                        1429         }
1430         return srb;                              1430         return srb;
1431 }                                                1431 }
1432                                                  1432 
1433 /**                                              1433 /**
1434  * qla4xxx_eh_wait_on_command - waits for com    1434  * qla4xxx_eh_wait_on_command - waits for command to be returned by firmware
1435  * @ha: actual ha whose done queue will conta    1435  * @ha: actual ha whose done queue will contain the comd returned by firmware.
1436  * @cmd: Scsi Command to wait on.                1436  * @cmd: Scsi Command to wait on.
1437  *                                               1437  *
1438  * This routine waits for the command to be r    1438  * This routine waits for the command to be returned by the Firmware
1439  * for some max time.                            1439  * for some max time.
1440  **/                                             1440  **/
1441 static int qla4xxx_eh_wait_on_command(struct     1441 static int qla4xxx_eh_wait_on_command(struct scsi_qla_host *ha,
1442                                       struct     1442                                       struct scsi_cmnd *cmd)
1443 {                                                1443 {
1444         int done = 0;                            1444         int done = 0;
1445         struct srb *rp;                          1445         struct srb *rp;
1446         uint32_t max_wait_time = EH_WAIT_CMD_    1446         uint32_t max_wait_time = EH_WAIT_CMD_TOV;
1447                                                  1447 
1448         do {                                     1448         do {
1449                 /* Checking to see if its ret    1449                 /* Checking to see if its returned to OS */
1450                 rp = (struct srb *) cmd->SCp.    1450                 rp = (struct srb *) cmd->SCp.ptr;
1451                 if (rp == NULL) {                1451                 if (rp == NULL) {
1452                         done++;                  1452                         done++;
1453                         break;                   1453                         break;
1454                 }                                1454                 }
1455                                                  1455 
1456                 msleep(2000);                    1456                 msleep(2000);
1457         } while (max_wait_time--);               1457         } while (max_wait_time--);
1458                                                  1458 
1459         return done;                             1459         return done;
1460 }                                                1460 }
1461                                                  1461 
1462 /**                                              1462 /**
1463  * qla4xxx_wait_for_hba_online - waits for HB    1463  * qla4xxx_wait_for_hba_online - waits for HBA to come online
1464  * @ha: Pointer to host adapter structure        1464  * @ha: Pointer to host adapter structure
1465  **/                                             1465  **/
1466 static int qla4xxx_wait_for_hba_online(struct    1466 static int qla4xxx_wait_for_hba_online(struct scsi_qla_host *ha)
1467 {                                                1467 {
1468         unsigned long wait_online;               1468         unsigned long wait_online;
1469                                                  1469 
1470         wait_online = jiffies + (30 * HZ);       1470         wait_online = jiffies + (30 * HZ);
1471         while (time_before(jiffies, wait_onli    1471         while (time_before(jiffies, wait_online)) {
1472                                                  1472 
1473                 if (adapter_up(ha))              1473                 if (adapter_up(ha))
1474                         return QLA_SUCCESS;      1474                         return QLA_SUCCESS;
1475                 else if (ha->retry_reset_ha_c    1475                 else if (ha->retry_reset_ha_cnt == 0)
1476                         return QLA_ERROR;        1476                         return QLA_ERROR;
1477                                                  1477 
1478                 msleep(2000);                    1478                 msleep(2000);
1479         }                                        1479         }
1480                                                  1480 
1481         return QLA_ERROR;                        1481         return QLA_ERROR;
1482 }                                                1482 }
1483                                                  1483 
1484 /**                                              1484 /**
1485  * qla4xxx_eh_wait_for_active_target_commands    1485  * qla4xxx_eh_wait_for_active_target_commands - wait for active cmds to finish.
1486  * @ha: pointer to to HBA                        1486  * @ha: pointer to to HBA
1487  * @t: target id                                 1487  * @t: target id
1488  * @l: lun id                                    1488  * @l: lun id
1489  *                                               1489  *
1490  * This function waits for all outstanding co    1490  * This function waits for all outstanding commands to a lun to complete. It
1491  * returns 0 if all pending commands are retu    1491  * returns 0 if all pending commands are returned and 1 otherwise.
1492  **/                                             1492  **/
1493 static int qla4xxx_eh_wait_for_active_target_    1493 static int qla4xxx_eh_wait_for_active_target_commands(struct scsi_qla_host *ha,
1494                                                  1494                                                  int t, int l)
1495 {                                                1495 {
1496         int cnt;                                 1496         int cnt;
1497         int status = 0;                          1497         int status = 0;
1498         struct scsi_cmnd *cmd;                   1498         struct scsi_cmnd *cmd;
1499                                                  1499 
1500         /*                                       1500         /*
1501          * Waiting for all commands for the d    1501          * Waiting for all commands for the designated target in the active
1502          * array                                 1502          * array
1503          */                                      1503          */
1504         for (cnt = 0; cnt < ha->host->can_que    1504         for (cnt = 0; cnt < ha->host->can_queue; cnt++) {
1505                 cmd = scsi_host_find_tag(ha->    1505                 cmd = scsi_host_find_tag(ha->host, cnt);
1506                 if (cmd && cmd->device->id ==    1506                 if (cmd && cmd->device->id == t && cmd->device->lun == l) {
1507                         if (!qla4xxx_eh_wait_    1507                         if (!qla4xxx_eh_wait_on_command(ha, cmd)) {
1508                                 status++;        1508                                 status++;
1509                                 break;           1509                                 break;
1510                         }                        1510                         }
1511                 }                                1511                 }
1512         }                                        1512         }
1513         return status;                           1513         return status;
1514 }                                                1514 }
1515                                                  1515 
1516 /**                                              1516 /**
1517  * qla4xxx_eh_device_reset - callback for tar    1517  * qla4xxx_eh_device_reset - callback for target reset.
1518  * @cmd: Pointer to Linux's SCSI command stru    1518  * @cmd: Pointer to Linux's SCSI command structure
1519  *                                               1519  *
1520  * This routine is called by the Linux OS to     1520  * This routine is called by the Linux OS to reset all luns on the
1521  * specified target.                             1521  * specified target.
1522  **/                                             1522  **/
1523 static int qla4xxx_eh_device_reset(struct scs    1523 static int qla4xxx_eh_device_reset(struct scsi_cmnd *cmd)
1524 {                                                1524 {
1525         struct scsi_qla_host *ha = to_qla_hos    1525         struct scsi_qla_host *ha = to_qla_host(cmd->device->host);
1526         struct ddb_entry *ddb_entry = cmd->de    1526         struct ddb_entry *ddb_entry = cmd->device->hostdata;
1527         struct srb *sp;                          1527         struct srb *sp;
1528         int ret = FAILED, stat;                  1528         int ret = FAILED, stat;
1529                                                  1529 
1530         sp = (struct srb *) cmd->SCp.ptr;        1530         sp = (struct srb *) cmd->SCp.ptr;
1531         if (!sp || !ddb_entry)                   1531         if (!sp || !ddb_entry)
1532                 return ret;                      1532                 return ret;
1533                                                  1533 
1534         dev_info(&ha->pdev->dev,                 1534         dev_info(&ha->pdev->dev,
1535                    "scsi%ld:%d:%d:%d: DEVICE     1535                    "scsi%ld:%d:%d:%d: DEVICE RESET ISSUED.\n", ha->host_no,
1536                    cmd->device->channel, cmd-    1536                    cmd->device->channel, cmd->device->id, cmd->device->lun);
1537                                                  1537 
1538         DEBUG2(printk(KERN_INFO                  1538         DEBUG2(printk(KERN_INFO
1539                       "scsi%ld: DEVICE_RESET     1539                       "scsi%ld: DEVICE_RESET cmd=%p jiffies = 0x%lx, to=%x,"
1540                       "dpc_flags=%lx, status=    1540                       "dpc_flags=%lx, status=%x allowed=%d\n", ha->host_no,
1541                       cmd, jiffies, cmd->time    1541                       cmd, jiffies, cmd->timeout_per_command / HZ,
1542                       ha->dpc_flags, cmd->res    1542                       ha->dpc_flags, cmd->result, cmd->allowed));
1543                                                  1543 
1544         /* FIXME: wait for hba to go online *    1544         /* FIXME: wait for hba to go online */
1545         stat = qla4xxx_reset_lun(ha, ddb_entr    1545         stat = qla4xxx_reset_lun(ha, ddb_entry, cmd->device->lun);
1546         if (stat != QLA_SUCCESS) {               1546         if (stat != QLA_SUCCESS) {
1547                 dev_info(&ha->pdev->dev, "DEV    1547                 dev_info(&ha->pdev->dev, "DEVICE RESET FAILED. %d\n", stat);
1548                 goto eh_dev_reset_done;          1548                 goto eh_dev_reset_done;
1549         }                                        1549         }
1550                                                  1550 
1551         /* Send marker. */                       1551         /* Send marker. */
1552         ha->marker_needed = 1;                   1552         ha->marker_needed = 1;
1553                                                  1553 
1554         /*                                       1554         /*
1555          * If we are coming down the EH path,    1555          * If we are coming down the EH path, wait for all commands to complete
1556          * for the device.                       1556          * for the device.
1557          */                                      1557          */
1558         if (cmd->device->host->shost_state ==    1558         if (cmd->device->host->shost_state == SHOST_RECOVERY) {
1559                 if (qla4xxx_eh_wait_for_activ    1559                 if (qla4xxx_eh_wait_for_active_target_commands(ha,
1560                                                  1560                                                           cmd->device->id,
1561                                                  1561                                                           cmd->device->lun)){
1562                         dev_info(&ha->pdev->d    1562                         dev_info(&ha->pdev->dev,
1563                                    "DEVICE RE    1563                                    "DEVICE RESET FAILED - waiting for "
1564                                    "commands.    1564                                    "commands.\n");
1565                         goto eh_dev_reset_don    1565                         goto eh_dev_reset_done;
1566                 }                                1566                 }
1567         }                                        1567         }
1568                                                  1568 
1569         dev_info(&ha->pdev->dev,                 1569         dev_info(&ha->pdev->dev,
1570                    "scsi(%ld:%d:%d:%d): DEVIC    1570                    "scsi(%ld:%d:%d:%d): DEVICE RESET SUCCEEDED.\n",
1571                    ha->host_no, cmd->device->    1571                    ha->host_no, cmd->device->channel, cmd->device->id,
1572                    cmd->device->lun);            1572                    cmd->device->lun);
1573                                                  1573 
1574         ret = SUCCESS;                           1574         ret = SUCCESS;
1575                                                  1575 
1576 eh_dev_reset_done:                               1576 eh_dev_reset_done:
1577                                                  1577 
1578         return ret;                              1578         return ret;
1579 }                                                1579 }
1580                                                  1580 
1581 /**                                              1581 /**
1582  * qla4xxx_eh_host_reset - kernel callback       1582  * qla4xxx_eh_host_reset - kernel callback
1583  * @cmd: Pointer to Linux's SCSI command stru    1583  * @cmd: Pointer to Linux's SCSI command structure
1584  *                                               1584  *
1585  * This routine is invoked by the Linux kerne    1585  * This routine is invoked by the Linux kernel to perform fatal error
1586  * recovery on the specified adapter.            1586  * recovery on the specified adapter.
1587  **/                                             1587  **/
1588 static int qla4xxx_eh_host_reset(struct scsi_    1588 static int qla4xxx_eh_host_reset(struct scsi_cmnd *cmd)
1589 {                                                1589 {
1590         int return_status = FAILED;              1590         int return_status = FAILED;
1591         struct scsi_qla_host *ha;                1591         struct scsi_qla_host *ha;
1592                                                  1592 
1593         ha = (struct scsi_qla_host *) cmd->de    1593         ha = (struct scsi_qla_host *) cmd->device->host->hostdata;
1594                                                  1594 
1595         dev_info(&ha->pdev->dev,                 1595         dev_info(&ha->pdev->dev,
1596                    "scsi(%ld:%d:%d:%d): ADAPT    1596                    "scsi(%ld:%d:%d:%d): ADAPTER RESET ISSUED.\n", ha->host_no,
1597                    cmd->device->channel, cmd-    1597                    cmd->device->channel, cmd->device->id, cmd->device->lun);
1598                                                  1598 
1599         if (qla4xxx_wait_for_hba_online(ha) !    1599         if (qla4xxx_wait_for_hba_online(ha) != QLA_SUCCESS) {
1600                 DEBUG2(printk("scsi%ld:%d: %s    1600                 DEBUG2(printk("scsi%ld:%d: %s: Unable to reset host.  Adapter "
1601                               "DEAD.\n", ha->    1601                               "DEAD.\n", ha->host_no, cmd->device->channel,
1602                               __func__));        1602                               __func__));
1603                                                  1603 
1604                 return FAILED;                   1604                 return FAILED;
1605         }                                        1605         }
1606                                                  1606 
1607         /* make sure the dpc thread is stoppe    1607         /* make sure the dpc thread is stopped while we reset the hba */
1608         clear_bit(AF_ONLINE, &ha->flags);        1608         clear_bit(AF_ONLINE, &ha->flags);
1609         flush_workqueue(ha->dpc_thread);         1609         flush_workqueue(ha->dpc_thread);
1610                                                  1610 
1611         if (qla4xxx_recover_adapter(ha, PRESE    1611         if (qla4xxx_recover_adapter(ha, PRESERVE_DDB_LIST) == QLA_SUCCESS)
1612                 return_status = SUCCESS;         1612                 return_status = SUCCESS;
1613                                                  1613 
1614         dev_info(&ha->pdev->dev, "HOST RESET     1614         dev_info(&ha->pdev->dev, "HOST RESET %s.\n",
1615                    return_status == FAILED ?     1615                    return_status == FAILED ? "FAILED" : "SUCCEDED");
1616                                                  1616 
1617         return return_status;                    1617         return return_status;
1618 }                                                1618 }
1619                                                  1619 
1620                                                  1620 
1621 static struct pci_device_id qla4xxx_pci_tbl[]    1621 static struct pci_device_id qla4xxx_pci_tbl[] = {
1622         {                                        1622         {
1623                 .vendor         = PCI_VENDOR_    1623                 .vendor         = PCI_VENDOR_ID_QLOGIC,
1624                 .device         = PCI_DEVICE_    1624                 .device         = PCI_DEVICE_ID_QLOGIC_ISP4010,
1625                 .subvendor      = PCI_ANY_ID,    1625                 .subvendor      = PCI_ANY_ID,
1626                 .subdevice      = PCI_ANY_ID,    1626                 .subdevice      = PCI_ANY_ID,
1627         },                                       1627         },
1628         {                                        1628         {
1629                 .vendor         = PCI_VENDOR_    1629                 .vendor         = PCI_VENDOR_ID_QLOGIC,
1630                 .device         = PCI_DEVICE_    1630                 .device         = PCI_DEVICE_ID_QLOGIC_ISP4022,
1631                 .subvendor      = PCI_ANY_ID,    1631                 .subvendor      = PCI_ANY_ID,
1632                 .subdevice      = PCI_ANY_ID,    1632                 .subdevice      = PCI_ANY_ID,
1633         },                                       1633         },
1634         {                                        1634         {
1635                 .vendor         = PCI_VENDOR_    1635                 .vendor         = PCI_VENDOR_ID_QLOGIC,
1636                 .device         = PCI_DEVICE_    1636                 .device         = PCI_DEVICE_ID_QLOGIC_ISP4032,
1637                 .subvendor      = PCI_ANY_ID,    1637                 .subvendor      = PCI_ANY_ID,
1638                 .subdevice      = PCI_ANY_ID,    1638                 .subdevice      = PCI_ANY_ID,
1639         },                                       1639         },
1640         {0, 0},                                  1640         {0, 0},
1641 };                                               1641 };
1642 MODULE_DEVICE_TABLE(pci, qla4xxx_pci_tbl);       1642 MODULE_DEVICE_TABLE(pci, qla4xxx_pci_tbl);
1643                                                  1643 
1644 static struct pci_driver qla4xxx_pci_driver =    1644 static struct pci_driver qla4xxx_pci_driver = {
1645         .name           = DRIVER_NAME,           1645         .name           = DRIVER_NAME,
1646         .id_table       = qla4xxx_pci_tbl,       1646         .id_table       = qla4xxx_pci_tbl,
1647         .probe          = qla4xxx_probe_adapt    1647         .probe          = qla4xxx_probe_adapter,
1648         .remove         = qla4xxx_remove_adap    1648         .remove         = qla4xxx_remove_adapter,
1649 };                                               1649 };
1650                                                  1650 
1651 static int __init qla4xxx_module_init(void)      1651 static int __init qla4xxx_module_init(void)
1652 {                                                1652 {
1653         int ret;                                 1653         int ret;
1654                                                  1654 
1655         /* Allocate cache for SRBs. */           1655         /* Allocate cache for SRBs. */
1656         srb_cachep = kmem_cache_create("qla4x    1656         srb_cachep = kmem_cache_create("qla4xxx_srbs", sizeof(struct srb), 0,
1657                                        SLAB_H    1657                                        SLAB_HWCACHE_ALIGN, NULL);
1658         if (srb_cachep == NULL) {                1658         if (srb_cachep == NULL) {
1659                 printk(KERN_ERR                  1659                 printk(KERN_ERR
1660                        "%s: Unable to allocat    1660                        "%s: Unable to allocate SRB cache..."
1661                        "Failing load!\n", DRI    1661                        "Failing load!\n", DRIVER_NAME);
1662                 ret = -ENOMEM;                   1662                 ret = -ENOMEM;
1663                 goto no_srp_cache;               1663                 goto no_srp_cache;
1664         }                                        1664         }
1665                                                  1665 
1666         /* Derive version string. */             1666         /* Derive version string. */
1667         strcpy(qla4xxx_version_str, QLA4XXX_D    1667         strcpy(qla4xxx_version_str, QLA4XXX_DRIVER_VERSION);
1668         if (ql4xextended_error_logging)          1668         if (ql4xextended_error_logging)
1669                 strcat(qla4xxx_version_str, "    1669                 strcat(qla4xxx_version_str, "-debug");
1670                                                  1670 
1671         qla4xxx_scsi_transport =                 1671         qla4xxx_scsi_transport =
1672                 iscsi_register_transport(&qla    1672                 iscsi_register_transport(&qla4xxx_iscsi_transport);
1673         if (!qla4xxx_scsi_transport){            1673         if (!qla4xxx_scsi_transport){
1674                 ret = -ENODEV;                   1674                 ret = -ENODEV;
1675                 goto release_srb_cache;          1675                 goto release_srb_cache;
1676         }                                        1676         }
1677                                                  1677 
1678         ret = pci_register_driver(&qla4xxx_pc    1678         ret = pci_register_driver(&qla4xxx_pci_driver);
1679         if (ret)                                 1679         if (ret)
1680                 goto unregister_transport;       1680                 goto unregister_transport;
1681                                                  1681 
1682         printk(KERN_INFO "QLogic iSCSI HBA Dr    1682         printk(KERN_INFO "QLogic iSCSI HBA Driver\n");
1683         return 0;                                1683         return 0;
1684                                                  1684 
1685 unregister_transport:                            1685 unregister_transport:
1686         iscsi_unregister_transport(&qla4xxx_i    1686         iscsi_unregister_transport(&qla4xxx_iscsi_transport);
1687 release_srb_cache:                               1687 release_srb_cache:
1688         kmem_cache_destroy(srb_cachep);          1688         kmem_cache_destroy(srb_cachep);
1689 no_srp_cache:                                    1689 no_srp_cache:
1690         return ret;                              1690         return ret;
1691 }                                                1691 }
1692                                                  1692 
1693 static void __exit qla4xxx_module_exit(void)     1693 static void __exit qla4xxx_module_exit(void)
1694 {                                                1694 {
1695         ql4_mod_unload = 1;                      1695         ql4_mod_unload = 1;
1696         pci_unregister_driver(&qla4xxx_pci_dr    1696         pci_unregister_driver(&qla4xxx_pci_driver);
1697         iscsi_unregister_transport(&qla4xxx_i    1697         iscsi_unregister_transport(&qla4xxx_iscsi_transport);
1698         kmem_cache_destroy(srb_cachep);          1698         kmem_cache_destroy(srb_cachep);
1699 }                                                1699 }
1700                                                  1700 
1701 module_init(qla4xxx_module_init);                1701 module_init(qla4xxx_module_init);
1702 module_exit(qla4xxx_module_exit);                1702 module_exit(qla4xxx_module_exit);
1703                                                  1703 
1704 MODULE_AUTHOR("QLogic Corporation");             1704 MODULE_AUTHOR("QLogic Corporation");
1705 MODULE_DESCRIPTION("QLogic iSCSI HBA Driver")    1705 MODULE_DESCRIPTION("QLogic iSCSI HBA Driver");
1706 MODULE_LICENSE("GPL");                           1706 MODULE_LICENSE("GPL");
1707 MODULE_VERSION(QLA4XXX_DRIVER_VERSION);          1707 MODULE_VERSION(QLA4XXX_DRIVER_VERSION);
1708                                                  1708 
  This page was automatically generated by the LXR engine.