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