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