linux/drivers/scsi/qedi/qedi_main.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0-only
   2/*
   3 * QLogic iSCSI Offload Driver
   4 * Copyright (c) 2016 Cavium Inc.
   5 */
   6
   7#include <linux/module.h>
   8#include <linux/pci.h>
   9#include <linux/kernel.h>
  10#include <linux/if_arp.h>
  11#include <scsi/iscsi_if.h>
  12#include <linux/inet.h>
  13#include <net/arp.h>
  14#include <linux/list.h>
  15#include <linux/kthread.h>
  16#include <linux/mm.h>
  17#include <linux/if_vlan.h>
  18#include <linux/cpu.h>
  19#include <linux/iscsi_boot_sysfs.h>
  20
  21#include <scsi/scsi_cmnd.h>
  22#include <scsi/scsi_device.h>
  23#include <scsi/scsi_eh.h>
  24#include <scsi/scsi_host.h>
  25#include <scsi/scsi.h>
  26
  27#include "qedi.h"
  28#include "qedi_gbl.h"
  29#include "qedi_iscsi.h"
  30
  31static uint qedi_fw_debug;
  32module_param(qedi_fw_debug, uint, 0644);
  33MODULE_PARM_DESC(qedi_fw_debug, " Firmware debug level 0(default) to 3");
  34
  35uint qedi_dbg_log = QEDI_LOG_WARN | QEDI_LOG_SCSI_TM;
  36module_param(qedi_dbg_log, uint, 0644);
  37MODULE_PARM_DESC(qedi_dbg_log, " Default debug level");
  38
  39uint qedi_io_tracing;
  40module_param(qedi_io_tracing, uint, 0644);
  41MODULE_PARM_DESC(qedi_io_tracing,
  42                 " Enable logging of SCSI requests/completions into trace buffer. (default off).");
  43
  44uint qedi_ll2_buf_size = 0x400;
  45module_param(qedi_ll2_buf_size, uint, 0644);
  46MODULE_PARM_DESC(qedi_ll2_buf_size,
  47                 "parameter to set ping packet size, default - 0x400, Jumbo packets - 0x2400.");
  48
  49const struct qed_iscsi_ops *qedi_ops;
  50static struct scsi_transport_template *qedi_scsi_transport;
  51static struct pci_driver qedi_pci_driver;
  52static DEFINE_PER_CPU(struct qedi_percpu_s, qedi_percpu);
  53static LIST_HEAD(qedi_udev_list);
  54/* Static function declaration */
  55static int qedi_alloc_global_queues(struct qedi_ctx *qedi);
  56static void qedi_free_global_queues(struct qedi_ctx *qedi);
  57static struct qedi_cmd *qedi_get_cmd_from_tid(struct qedi_ctx *qedi, u32 tid);
  58static void qedi_reset_uio_rings(struct qedi_uio_dev *udev);
  59static void qedi_ll2_free_skbs(struct qedi_ctx *qedi);
  60static struct nvm_iscsi_block *qedi_get_nvram_block(struct qedi_ctx *qedi);
  61
  62static int qedi_iscsi_event_cb(void *context, u8 fw_event_code, void *fw_handle)
  63{
  64        struct qedi_ctx *qedi;
  65        struct qedi_endpoint *qedi_ep;
  66        struct iscsi_eqe_data *data;
  67        int rval = 0;
  68
  69        if (!context || !fw_handle) {
  70                QEDI_ERR(NULL, "Recv event with ctx NULL\n");
  71                return -EINVAL;
  72        }
  73
  74        qedi = (struct qedi_ctx *)context;
  75        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
  76                  "Recv Event %d fw_handle %p\n", fw_event_code, fw_handle);
  77
  78        data = (struct iscsi_eqe_data *)fw_handle;
  79        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
  80                  "icid=0x%x conn_id=0x%x err-code=0x%x error-pdu-opcode-reserved=0x%x\n",
  81                   data->icid, data->conn_id, data->error_code,
  82                   data->error_pdu_opcode_reserved);
  83
  84        qedi_ep = qedi->ep_tbl[data->icid];
  85
  86        if (!qedi_ep) {
  87                QEDI_WARN(&qedi->dbg_ctx,
  88                          "Cannot process event, ep already disconnected, cid=0x%x\n",
  89                           data->icid);
  90                WARN_ON(1);
  91                return -ENODEV;
  92        }
  93
  94        switch (fw_event_code) {
  95        case ISCSI_EVENT_TYPE_ASYN_CONNECT_COMPLETE:
  96                if (qedi_ep->state == EP_STATE_OFLDCONN_START)
  97                        qedi_ep->state = EP_STATE_OFLDCONN_COMPL;
  98
  99                wake_up_interruptible(&qedi_ep->tcp_ofld_wait);
 100                break;
 101        case ISCSI_EVENT_TYPE_ASYN_TERMINATE_DONE:
 102                qedi_ep->state = EP_STATE_DISCONN_COMPL;
 103                wake_up_interruptible(&qedi_ep->tcp_ofld_wait);
 104                break;
 105        case ISCSI_EVENT_TYPE_ISCSI_CONN_ERROR:
 106                qedi_process_iscsi_error(qedi_ep, data);
 107                break;
 108        case ISCSI_EVENT_TYPE_ASYN_ABORT_RCVD:
 109        case ISCSI_EVENT_TYPE_ASYN_SYN_RCVD:
 110        case ISCSI_EVENT_TYPE_ASYN_MAX_RT_TIME:
 111        case ISCSI_EVENT_TYPE_ASYN_MAX_RT_CNT:
 112        case ISCSI_EVENT_TYPE_ASYN_MAX_KA_PROBES_CNT:
 113        case ISCSI_EVENT_TYPE_ASYN_FIN_WAIT2:
 114        case ISCSI_EVENT_TYPE_TCP_CONN_ERROR:
 115                qedi_process_tcp_error(qedi_ep, data);
 116                break;
 117        default:
 118                QEDI_ERR(&qedi->dbg_ctx, "Recv Unknown Event %u\n",
 119                         fw_event_code);
 120        }
 121
 122        return rval;
 123}
 124
 125static int qedi_uio_open(struct uio_info *uinfo, struct inode *inode)
 126{
 127        struct qedi_uio_dev *udev = uinfo->priv;
 128        struct qedi_ctx *qedi = udev->qedi;
 129
 130        if (!capable(CAP_NET_ADMIN))
 131                return -EPERM;
 132
 133        if (udev->uio_dev != -1)
 134                return -EBUSY;
 135
 136        rtnl_lock();
 137        udev->uio_dev = iminor(inode);
 138        qedi_reset_uio_rings(udev);
 139        set_bit(UIO_DEV_OPENED, &qedi->flags);
 140        rtnl_unlock();
 141
 142        return 0;
 143}
 144
 145static int qedi_uio_close(struct uio_info *uinfo, struct inode *inode)
 146{
 147        struct qedi_uio_dev *udev = uinfo->priv;
 148        struct qedi_ctx *qedi = udev->qedi;
 149
 150        udev->uio_dev = -1;
 151        clear_bit(UIO_DEV_OPENED, &qedi->flags);
 152        qedi_ll2_free_skbs(qedi);
 153        return 0;
 154}
 155
 156static void __qedi_free_uio_rings(struct qedi_uio_dev *udev)
 157{
 158        if (udev->uctrl) {
 159                free_page((unsigned long)udev->uctrl);
 160                udev->uctrl = NULL;
 161        }
 162
 163        if (udev->ll2_ring) {
 164                free_page((unsigned long)udev->ll2_ring);
 165                udev->ll2_ring = NULL;
 166        }
 167
 168        if (udev->ll2_buf) {
 169                free_pages((unsigned long)udev->ll2_buf, 2);
 170                udev->ll2_buf = NULL;
 171        }
 172}
 173
 174static void __qedi_free_uio(struct qedi_uio_dev *udev)
 175{
 176        uio_unregister_device(&udev->qedi_uinfo);
 177
 178        __qedi_free_uio_rings(udev);
 179
 180        pci_dev_put(udev->pdev);
 181        kfree(udev);
 182}
 183
 184static void qedi_free_uio(struct qedi_uio_dev *udev)
 185{
 186        if (!udev)
 187                return;
 188
 189        list_del_init(&udev->list);
 190        __qedi_free_uio(udev);
 191}
 192
 193static void qedi_reset_uio_rings(struct qedi_uio_dev *udev)
 194{
 195        struct qedi_ctx *qedi = NULL;
 196        struct qedi_uio_ctrl *uctrl = NULL;
 197
 198        qedi = udev->qedi;
 199        uctrl = udev->uctrl;
 200
 201        spin_lock_bh(&qedi->ll2_lock);
 202        uctrl->host_rx_cons = 0;
 203        uctrl->hw_rx_prod = 0;
 204        uctrl->hw_rx_bd_prod = 0;
 205        uctrl->host_rx_bd_cons = 0;
 206
 207        memset(udev->ll2_ring, 0, udev->ll2_ring_size);
 208        memset(udev->ll2_buf, 0, udev->ll2_buf_size);
 209        spin_unlock_bh(&qedi->ll2_lock);
 210}
 211
 212static int __qedi_alloc_uio_rings(struct qedi_uio_dev *udev)
 213{
 214        int rc = 0;
 215
 216        if (udev->ll2_ring || udev->ll2_buf)
 217                return rc;
 218
 219        /* Memory for control area.  */
 220        udev->uctrl = (void *)get_zeroed_page(GFP_KERNEL);
 221        if (!udev->uctrl)
 222                return -ENOMEM;
 223
 224        /* Allocating memory for LL2 ring  */
 225        udev->ll2_ring_size = QEDI_PAGE_SIZE;
 226        udev->ll2_ring = (void *)get_zeroed_page(GFP_KERNEL | __GFP_COMP);
 227        if (!udev->ll2_ring) {
 228                rc = -ENOMEM;
 229                goto exit_alloc_ring;
 230        }
 231
 232        /* Allocating memory for Tx/Rx pkt buffer */
 233        udev->ll2_buf_size = TX_RX_RING * qedi_ll2_buf_size;
 234        udev->ll2_buf_size = QEDI_PAGE_ALIGN(udev->ll2_buf_size);
 235        udev->ll2_buf = (void *)__get_free_pages(GFP_KERNEL | __GFP_COMP |
 236                                                 __GFP_ZERO, 2);
 237        if (!udev->ll2_buf) {
 238                rc = -ENOMEM;
 239                goto exit_alloc_buf;
 240        }
 241        return rc;
 242
 243exit_alloc_buf:
 244        free_page((unsigned long)udev->ll2_ring);
 245        udev->ll2_ring = NULL;
 246exit_alloc_ring:
 247        return rc;
 248}
 249
 250static int qedi_alloc_uio_rings(struct qedi_ctx *qedi)
 251{
 252        struct qedi_uio_dev *udev = NULL;
 253        int rc = 0;
 254
 255        list_for_each_entry(udev, &qedi_udev_list, list) {
 256                if (udev->pdev == qedi->pdev) {
 257                        udev->qedi = qedi;
 258                        if (__qedi_alloc_uio_rings(udev)) {
 259                                udev->qedi = NULL;
 260                                return -ENOMEM;
 261                        }
 262                        qedi->udev = udev;
 263                        return 0;
 264                }
 265        }
 266
 267        udev = kzalloc(sizeof(*udev), GFP_KERNEL);
 268        if (!udev) {
 269                rc = -ENOMEM;
 270                goto err_udev;
 271        }
 272
 273        udev->uio_dev = -1;
 274
 275        udev->qedi = qedi;
 276        udev->pdev = qedi->pdev;
 277
 278        rc = __qedi_alloc_uio_rings(udev);
 279        if (rc)
 280                goto err_uctrl;
 281
 282        list_add(&udev->list, &qedi_udev_list);
 283
 284        pci_dev_get(udev->pdev);
 285        qedi->udev = udev;
 286
 287        udev->tx_pkt = udev->ll2_buf;
 288        udev->rx_pkt = udev->ll2_buf + qedi_ll2_buf_size;
 289        return 0;
 290
 291 err_uctrl:
 292        kfree(udev);
 293 err_udev:
 294        return -ENOMEM;
 295}
 296
 297static int qedi_init_uio(struct qedi_ctx *qedi)
 298{
 299        struct qedi_uio_dev *udev = qedi->udev;
 300        struct uio_info *uinfo;
 301        int ret = 0;
 302
 303        if (!udev)
 304                return -ENOMEM;
 305
 306        uinfo = &udev->qedi_uinfo;
 307
 308        uinfo->mem[0].addr = (unsigned long)udev->uctrl;
 309        uinfo->mem[0].size = sizeof(struct qedi_uio_ctrl);
 310        uinfo->mem[0].memtype = UIO_MEM_LOGICAL;
 311
 312        uinfo->mem[1].addr = (unsigned long)udev->ll2_ring;
 313        uinfo->mem[1].size = udev->ll2_ring_size;
 314        uinfo->mem[1].memtype = UIO_MEM_LOGICAL;
 315
 316        uinfo->mem[2].addr = (unsigned long)udev->ll2_buf;
 317        uinfo->mem[2].size = udev->ll2_buf_size;
 318        uinfo->mem[2].memtype = UIO_MEM_LOGICAL;
 319
 320        uinfo->name = "qedi_uio";
 321        uinfo->version = QEDI_MODULE_VERSION;
 322        uinfo->irq = UIO_IRQ_CUSTOM;
 323
 324        uinfo->open = qedi_uio_open;
 325        uinfo->release = qedi_uio_close;
 326
 327        if (udev->uio_dev == -1) {
 328                if (!uinfo->priv) {
 329                        uinfo->priv = udev;
 330
 331                        ret = uio_register_device(&udev->pdev->dev, uinfo);
 332                        if (ret) {
 333                                QEDI_ERR(&qedi->dbg_ctx,
 334                                         "UIO registration failed\n");
 335                        }
 336                }
 337        }
 338
 339        return ret;
 340}
 341
 342static int qedi_alloc_and_init_sb(struct qedi_ctx *qedi,
 343                                  struct qed_sb_info *sb_info, u16 sb_id)
 344{
 345        struct status_block_e4 *sb_virt;
 346        dma_addr_t sb_phys;
 347        int ret;
 348
 349        sb_virt = dma_alloc_coherent(&qedi->pdev->dev,
 350                                     sizeof(struct status_block_e4), &sb_phys,
 351                                     GFP_KERNEL);
 352        if (!sb_virt) {
 353                QEDI_ERR(&qedi->dbg_ctx,
 354                         "Status block allocation failed for id = %d.\n",
 355                          sb_id);
 356                return -ENOMEM;
 357        }
 358
 359        ret = qedi_ops->common->sb_init(qedi->cdev, sb_info, sb_virt, sb_phys,
 360                                       sb_id, QED_SB_TYPE_STORAGE);
 361        if (ret) {
 362                QEDI_ERR(&qedi->dbg_ctx,
 363                         "Status block initialization failed for id = %d.\n",
 364                          sb_id);
 365                return ret;
 366        }
 367
 368        return 0;
 369}
 370
 371static void qedi_free_sb(struct qedi_ctx *qedi)
 372{
 373        struct qed_sb_info *sb_info;
 374        int id;
 375
 376        for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) {
 377                sb_info = &qedi->sb_array[id];
 378                if (sb_info->sb_virt)
 379                        dma_free_coherent(&qedi->pdev->dev,
 380                                          sizeof(*sb_info->sb_virt),
 381                                          (void *)sb_info->sb_virt,
 382                                          sb_info->sb_phys);
 383        }
 384}
 385
 386static void qedi_free_fp(struct qedi_ctx *qedi)
 387{
 388        kfree(qedi->fp_array);
 389        kfree(qedi->sb_array);
 390}
 391
 392static void qedi_destroy_fp(struct qedi_ctx *qedi)
 393{
 394        qedi_free_sb(qedi);
 395        qedi_free_fp(qedi);
 396}
 397
 398static int qedi_alloc_fp(struct qedi_ctx *qedi)
 399{
 400        int ret = 0;
 401
 402        qedi->fp_array = kcalloc(MIN_NUM_CPUS_MSIX(qedi),
 403                                 sizeof(struct qedi_fastpath), GFP_KERNEL);
 404        if (!qedi->fp_array) {
 405                QEDI_ERR(&qedi->dbg_ctx,
 406                         "fastpath fp array allocation failed.\n");
 407                return -ENOMEM;
 408        }
 409
 410        qedi->sb_array = kcalloc(MIN_NUM_CPUS_MSIX(qedi),
 411                                 sizeof(struct qed_sb_info), GFP_KERNEL);
 412        if (!qedi->sb_array) {
 413                QEDI_ERR(&qedi->dbg_ctx,
 414                         "fastpath sb array allocation failed.\n");
 415                ret = -ENOMEM;
 416                goto free_fp;
 417        }
 418
 419        return ret;
 420
 421free_fp:
 422        qedi_free_fp(qedi);
 423        return ret;
 424}
 425
 426static void qedi_int_fp(struct qedi_ctx *qedi)
 427{
 428        struct qedi_fastpath *fp;
 429        int id;
 430
 431        memset(qedi->fp_array, 0, MIN_NUM_CPUS_MSIX(qedi) *
 432               sizeof(*qedi->fp_array));
 433        memset(qedi->sb_array, 0, MIN_NUM_CPUS_MSIX(qedi) *
 434               sizeof(*qedi->sb_array));
 435
 436        for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) {
 437                fp = &qedi->fp_array[id];
 438                fp->sb_info = &qedi->sb_array[id];
 439                fp->sb_id = id;
 440                fp->qedi = qedi;
 441                snprintf(fp->name, sizeof(fp->name), "%s-fp-%d",
 442                         "qedi", id);
 443
 444                /* fp_array[i] ---- irq cookie
 445                 * So init data which is needed in int ctx
 446                 */
 447        }
 448}
 449
 450static int qedi_prepare_fp(struct qedi_ctx *qedi)
 451{
 452        struct qedi_fastpath *fp;
 453        int id, ret = 0;
 454
 455        ret = qedi_alloc_fp(qedi);
 456        if (ret)
 457                goto err;
 458
 459        qedi_int_fp(qedi);
 460
 461        for (id = 0; id < MIN_NUM_CPUS_MSIX(qedi); id++) {
 462                fp = &qedi->fp_array[id];
 463                ret = qedi_alloc_and_init_sb(qedi, fp->sb_info, fp->sb_id);
 464                if (ret) {
 465                        QEDI_ERR(&qedi->dbg_ctx,
 466                                 "SB allocation and initialization failed.\n");
 467                        ret = -EIO;
 468                        goto err_init;
 469                }
 470        }
 471
 472        return 0;
 473
 474err_init:
 475        qedi_free_sb(qedi);
 476        qedi_free_fp(qedi);
 477err:
 478        return ret;
 479}
 480
 481static int qedi_setup_cid_que(struct qedi_ctx *qedi)
 482{
 483        int i;
 484
 485        qedi->cid_que.cid_que_base = kmalloc_array(qedi->max_active_conns,
 486                                                   sizeof(u32), GFP_KERNEL);
 487        if (!qedi->cid_que.cid_que_base)
 488                return -ENOMEM;
 489
 490        qedi->cid_que.conn_cid_tbl = kmalloc_array(qedi->max_active_conns,
 491                                                   sizeof(struct qedi_conn *),
 492                                                   GFP_KERNEL);
 493        if (!qedi->cid_que.conn_cid_tbl) {
 494                kfree(qedi->cid_que.cid_que_base);
 495                qedi->cid_que.cid_que_base = NULL;
 496                return -ENOMEM;
 497        }
 498
 499        qedi->cid_que.cid_que = (u32 *)qedi->cid_que.cid_que_base;
 500        qedi->cid_que.cid_q_prod_idx = 0;
 501        qedi->cid_que.cid_q_cons_idx = 0;
 502        qedi->cid_que.cid_q_max_idx = qedi->max_active_conns;
 503        qedi->cid_que.cid_free_cnt = qedi->max_active_conns;
 504
 505        for (i = 0; i < qedi->max_active_conns; i++) {
 506                qedi->cid_que.cid_que[i] = i;
 507                qedi->cid_que.conn_cid_tbl[i] = NULL;
 508        }
 509
 510        return 0;
 511}
 512
 513static void qedi_release_cid_que(struct qedi_ctx *qedi)
 514{
 515        kfree(qedi->cid_que.cid_que_base);
 516        qedi->cid_que.cid_que_base = NULL;
 517
 518        kfree(qedi->cid_que.conn_cid_tbl);
 519        qedi->cid_que.conn_cid_tbl = NULL;
 520}
 521
 522static int qedi_init_id_tbl(struct qedi_portid_tbl *id_tbl, u16 size,
 523                            u16 start_id, u16 next)
 524{
 525        id_tbl->start = start_id;
 526        id_tbl->max = size;
 527        id_tbl->next = next;
 528        spin_lock_init(&id_tbl->lock);
 529        id_tbl->table = kcalloc(BITS_TO_LONGS(size), sizeof(long), GFP_KERNEL);
 530        if (!id_tbl->table)
 531                return -ENOMEM;
 532
 533        return 0;
 534}
 535
 536static void qedi_free_id_tbl(struct qedi_portid_tbl *id_tbl)
 537{
 538        kfree(id_tbl->table);
 539        id_tbl->table = NULL;
 540}
 541
 542int qedi_alloc_id(struct qedi_portid_tbl *id_tbl, u16 id)
 543{
 544        int ret = -1;
 545
 546        id -= id_tbl->start;
 547        if (id >= id_tbl->max)
 548                return ret;
 549
 550        spin_lock(&id_tbl->lock);
 551        if (!test_bit(id, id_tbl->table)) {
 552                set_bit(id, id_tbl->table);
 553                ret = 0;
 554        }
 555        spin_unlock(&id_tbl->lock);
 556        return ret;
 557}
 558
 559u16 qedi_alloc_new_id(struct qedi_portid_tbl *id_tbl)
 560{
 561        u16 id;
 562
 563        spin_lock(&id_tbl->lock);
 564        id = find_next_zero_bit(id_tbl->table, id_tbl->max, id_tbl->next);
 565        if (id >= id_tbl->max) {
 566                id = QEDI_LOCAL_PORT_INVALID;
 567                if (id_tbl->next != 0) {
 568                        id = find_first_zero_bit(id_tbl->table, id_tbl->next);
 569                        if (id >= id_tbl->next)
 570                                id = QEDI_LOCAL_PORT_INVALID;
 571                }
 572        }
 573
 574        if (id < id_tbl->max) {
 575                set_bit(id, id_tbl->table);
 576                id_tbl->next = (id + 1) & (id_tbl->max - 1);
 577                id += id_tbl->start;
 578        }
 579
 580        spin_unlock(&id_tbl->lock);
 581
 582        return id;
 583}
 584
 585void qedi_free_id(struct qedi_portid_tbl *id_tbl, u16 id)
 586{
 587        if (id == QEDI_LOCAL_PORT_INVALID)
 588                return;
 589
 590        id -= id_tbl->start;
 591        if (id >= id_tbl->max)
 592                return;
 593
 594        clear_bit(id, id_tbl->table);
 595}
 596
 597static void qedi_cm_free_mem(struct qedi_ctx *qedi)
 598{
 599        kfree(qedi->ep_tbl);
 600        qedi->ep_tbl = NULL;
 601        qedi_free_id_tbl(&qedi->lcl_port_tbl);
 602}
 603
 604static int qedi_cm_alloc_mem(struct qedi_ctx *qedi)
 605{
 606        u16 port_id;
 607
 608        qedi->ep_tbl = kzalloc((qedi->max_active_conns *
 609                                sizeof(struct qedi_endpoint *)), GFP_KERNEL);
 610        if (!qedi->ep_tbl)
 611                return -ENOMEM;
 612        port_id = prandom_u32() % QEDI_LOCAL_PORT_RANGE;
 613        if (qedi_init_id_tbl(&qedi->lcl_port_tbl, QEDI_LOCAL_PORT_RANGE,
 614                             QEDI_LOCAL_PORT_MIN, port_id)) {
 615                qedi_cm_free_mem(qedi);
 616                return -ENOMEM;
 617        }
 618
 619        return 0;
 620}
 621
 622static struct qedi_ctx *qedi_host_alloc(struct pci_dev *pdev)
 623{
 624        struct Scsi_Host *shost;
 625        struct qedi_ctx *qedi = NULL;
 626
 627        shost = iscsi_host_alloc(&qedi_host_template,
 628                                 sizeof(struct qedi_ctx), 0);
 629        if (!shost) {
 630                QEDI_ERR(NULL, "Could not allocate shost\n");
 631                goto exit_setup_shost;
 632        }
 633
 634        shost->max_id = QEDI_MAX_ISCSI_CONNS_PER_HBA;
 635        shost->max_channel = 0;
 636        shost->max_lun = ~0;
 637        shost->max_cmd_len = 16;
 638        shost->transportt = qedi_scsi_transport;
 639
 640        qedi = iscsi_host_priv(shost);
 641        memset(qedi, 0, sizeof(*qedi));
 642        qedi->shost = shost;
 643        qedi->dbg_ctx.host_no = shost->host_no;
 644        qedi->pdev = pdev;
 645        qedi->dbg_ctx.pdev = pdev;
 646        qedi->max_active_conns = ISCSI_MAX_SESS_PER_HBA;
 647        qedi->max_sqes = QEDI_SQ_SIZE;
 648
 649        shost->nr_hw_queues = MIN_NUM_CPUS_MSIX(qedi);
 650
 651        pci_set_drvdata(pdev, qedi);
 652
 653exit_setup_shost:
 654        return qedi;
 655}
 656
 657static int qedi_ll2_rx(void *cookie, struct sk_buff *skb, u32 arg1, u32 arg2)
 658{
 659        struct qedi_ctx *qedi = (struct qedi_ctx *)cookie;
 660        struct qedi_uio_dev *udev;
 661        struct qedi_uio_ctrl *uctrl;
 662        struct skb_work_list *work;
 663        struct ethhdr *eh;
 664
 665        if (!qedi) {
 666                QEDI_ERR(NULL, "qedi is NULL\n");
 667                return -1;
 668        }
 669
 670        if (!test_bit(UIO_DEV_OPENED, &qedi->flags)) {
 671                QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_UIO,
 672                          "UIO DEV is not opened\n");
 673                kfree_skb(skb);
 674                return 0;
 675        }
 676
 677        eh = (struct ethhdr *)skb->data;
 678        /* Undo VLAN encapsulation */
 679        if (eh->h_proto == htons(ETH_P_8021Q)) {
 680                memmove((u8 *)eh + VLAN_HLEN, eh, ETH_ALEN * 2);
 681                eh = (struct ethhdr *)skb_pull(skb, VLAN_HLEN);
 682                skb_reset_mac_header(skb);
 683        }
 684
 685        /* Filter out non FIP/FCoE frames here to free them faster */
 686        if (eh->h_proto != htons(ETH_P_ARP) &&
 687            eh->h_proto != htons(ETH_P_IP) &&
 688            eh->h_proto != htons(ETH_P_IPV6)) {
 689                QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
 690                          "Dropping frame ethertype [0x%x] len [0x%x].\n",
 691                          eh->h_proto, skb->len);
 692                kfree_skb(skb);
 693                return 0;
 694        }
 695
 696        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
 697                  "Allowed frame ethertype [0x%x] len [0x%x].\n",
 698                  eh->h_proto, skb->len);
 699
 700        udev = qedi->udev;
 701        uctrl = udev->uctrl;
 702
 703        work = kzalloc(sizeof(*work), GFP_ATOMIC);
 704        if (!work) {
 705                QEDI_WARN(&qedi->dbg_ctx,
 706                          "Could not allocate work so dropping frame.\n");
 707                kfree_skb(skb);
 708                return 0;
 709        }
 710
 711        INIT_LIST_HEAD(&work->list);
 712        work->skb = skb;
 713
 714        if (skb_vlan_tag_present(skb))
 715                work->vlan_id = skb_vlan_tag_get(skb);
 716
 717        if (work->vlan_id)
 718                __vlan_insert_tag(work->skb, htons(ETH_P_8021Q), work->vlan_id);
 719
 720        spin_lock_bh(&qedi->ll2_lock);
 721        list_add_tail(&work->list, &qedi->ll2_skb_list);
 722        spin_unlock_bh(&qedi->ll2_lock);
 723
 724        wake_up_process(qedi->ll2_recv_thread);
 725
 726        return 0;
 727}
 728
 729/* map this skb to iscsiuio mmaped region */
 730static int qedi_ll2_process_skb(struct qedi_ctx *qedi, struct sk_buff *skb,
 731                                u16 vlan_id)
 732{
 733        struct qedi_uio_dev *udev = NULL;
 734        struct qedi_uio_ctrl *uctrl = NULL;
 735        struct qedi_rx_bd rxbd;
 736        struct qedi_rx_bd *p_rxbd;
 737        u32 rx_bd_prod;
 738        void *pkt;
 739        int len = 0;
 740        u32 prod;
 741
 742        if (!qedi) {
 743                QEDI_ERR(NULL, "qedi is NULL\n");
 744                return -1;
 745        }
 746
 747        udev = qedi->udev;
 748        uctrl = udev->uctrl;
 749
 750        ++uctrl->hw_rx_prod_cnt;
 751        prod = (uctrl->hw_rx_prod + 1) % RX_RING;
 752
 753        pkt = udev->rx_pkt + (prod * qedi_ll2_buf_size);
 754        len = min_t(u32, skb->len, (u32)qedi_ll2_buf_size);
 755        memcpy(pkt, skb->data, len);
 756
 757        memset(&rxbd, 0, sizeof(rxbd));
 758        rxbd.rx_pkt_index = prod;
 759        rxbd.rx_pkt_len = len;
 760        rxbd.vlan_id = vlan_id;
 761
 762        uctrl->hw_rx_bd_prod = (uctrl->hw_rx_bd_prod + 1) % QEDI_NUM_RX_BD;
 763        rx_bd_prod = uctrl->hw_rx_bd_prod;
 764        p_rxbd = (struct qedi_rx_bd *)udev->ll2_ring;
 765        p_rxbd += rx_bd_prod;
 766
 767        memcpy(p_rxbd, &rxbd, sizeof(rxbd));
 768
 769        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
 770                  "hw_rx_prod [%d] prod [%d] hw_rx_bd_prod [%d] rx_pkt_idx [%d] rx_len [%d].\n",
 771                  uctrl->hw_rx_prod, prod, uctrl->hw_rx_bd_prod,
 772                  rxbd.rx_pkt_index, rxbd.rx_pkt_len);
 773        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_LL2,
 774                  "host_rx_cons [%d] hw_rx_bd_cons [%d].\n",
 775                  uctrl->host_rx_cons, uctrl->host_rx_bd_cons);
 776
 777        uctrl->hw_rx_prod = prod;
 778
 779        /* notify the iscsiuio about new packet */
 780        uio_event_notify(&udev->qedi_uinfo);
 781
 782        return 0;
 783}
 784
 785static void qedi_ll2_free_skbs(struct qedi_ctx *qedi)
 786{
 787        struct skb_work_list *work, *work_tmp;
 788
 789        spin_lock_bh(&qedi->ll2_lock);
 790        list_for_each_entry_safe(work, work_tmp, &qedi->ll2_skb_list, list) {
 791                list_del(&work->list);
 792                if (work->skb)
 793                        kfree_skb(work->skb);
 794                kfree(work);
 795        }
 796        spin_unlock_bh(&qedi->ll2_lock);
 797}
 798
 799static int qedi_ll2_recv_thread(void *arg)
 800{
 801        struct qedi_ctx *qedi = (struct qedi_ctx *)arg;
 802        struct skb_work_list *work, *work_tmp;
 803
 804        set_user_nice(current, -20);
 805
 806        while (!kthread_should_stop()) {
 807                spin_lock_bh(&qedi->ll2_lock);
 808                list_for_each_entry_safe(work, work_tmp, &qedi->ll2_skb_list,
 809                                         list) {
 810                        list_del(&work->list);
 811                        qedi_ll2_process_skb(qedi, work->skb, work->vlan_id);
 812                        kfree_skb(work->skb);
 813                        kfree(work);
 814                }
 815                set_current_state(TASK_INTERRUPTIBLE);
 816                spin_unlock_bh(&qedi->ll2_lock);
 817                schedule();
 818        }
 819
 820        __set_current_state(TASK_RUNNING);
 821        return 0;
 822}
 823
 824static int qedi_set_iscsi_pf_param(struct qedi_ctx *qedi)
 825{
 826        u8 num_sq_pages;
 827        u32 log_page_size;
 828        int rval = 0;
 829
 830
 831        num_sq_pages = (MAX_OUTSTANDING_TASKS_PER_CON * 8) / QEDI_PAGE_SIZE;
 832
 833        qedi->num_queues = MIN_NUM_CPUS_MSIX(qedi);
 834
 835        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
 836                  "Number of CQ count is %d\n", qedi->num_queues);
 837
 838        memset(&qedi->pf_params.iscsi_pf_params, 0,
 839               sizeof(qedi->pf_params.iscsi_pf_params));
 840
 841        qedi->p_cpuq = dma_alloc_coherent(&qedi->pdev->dev,
 842                        qedi->num_queues * sizeof(struct qedi_glbl_q_params),
 843                        &qedi->hw_p_cpuq, GFP_KERNEL);
 844        if (!qedi->p_cpuq) {
 845                QEDI_ERR(&qedi->dbg_ctx, "dma_alloc_coherent fail\n");
 846                rval = -1;
 847                goto err_alloc_mem;
 848        }
 849
 850        rval = qedi_alloc_global_queues(qedi);
 851        if (rval) {
 852                QEDI_ERR(&qedi->dbg_ctx, "Global queue allocation failed.\n");
 853                rval = -1;
 854                goto err_alloc_mem;
 855        }
 856
 857        qedi->pf_params.iscsi_pf_params.num_cons = QEDI_MAX_ISCSI_CONNS_PER_HBA;
 858        qedi->pf_params.iscsi_pf_params.num_tasks = QEDI_MAX_ISCSI_TASK;
 859        qedi->pf_params.iscsi_pf_params.half_way_close_timeout = 10;
 860        qedi->pf_params.iscsi_pf_params.num_sq_pages_in_ring = num_sq_pages;
 861        qedi->pf_params.iscsi_pf_params.num_r2tq_pages_in_ring = num_sq_pages;
 862        qedi->pf_params.iscsi_pf_params.num_uhq_pages_in_ring = num_sq_pages;
 863        qedi->pf_params.iscsi_pf_params.num_queues = qedi->num_queues;
 864        qedi->pf_params.iscsi_pf_params.debug_mode = qedi_fw_debug;
 865        qedi->pf_params.iscsi_pf_params.two_msl_timer = 4000;
 866        qedi->pf_params.iscsi_pf_params.max_fin_rt = 2;
 867
 868        for (log_page_size = 0 ; log_page_size < 32 ; log_page_size++) {
 869                if ((1 << log_page_size) == QEDI_PAGE_SIZE)
 870                        break;
 871        }
 872        qedi->pf_params.iscsi_pf_params.log_page_size = log_page_size;
 873
 874        qedi->pf_params.iscsi_pf_params.glbl_q_params_addr =
 875                                                           (u64)qedi->hw_p_cpuq;
 876
 877        /* RQ BDQ initializations.
 878         * rq_num_entries: suggested value for Initiator is 16 (4KB RQ)
 879         * rqe_log_size: 8 for 256B RQE
 880         */
 881        qedi->pf_params.iscsi_pf_params.rqe_log_size = 8;
 882        /* BDQ address and size */
 883        qedi->pf_params.iscsi_pf_params.bdq_pbl_base_addr[BDQ_ID_RQ] =
 884                                                        qedi->bdq_pbl_list_dma;
 885        qedi->pf_params.iscsi_pf_params.bdq_pbl_num_entries[BDQ_ID_RQ] =
 886                                                qedi->bdq_pbl_list_num_entries;
 887        qedi->pf_params.iscsi_pf_params.rq_buffer_size = QEDI_BDQ_BUF_SIZE;
 888
 889        /* cq_num_entries: num_tasks + rq_num_entries */
 890        qedi->pf_params.iscsi_pf_params.cq_num_entries = 2048;
 891
 892        qedi->pf_params.iscsi_pf_params.gl_rq_pi = QEDI_PROTO_CQ_PROD_IDX;
 893        qedi->pf_params.iscsi_pf_params.gl_cmd_pi = 1;
 894
 895err_alloc_mem:
 896        return rval;
 897}
 898
 899/* Free DMA coherent memory for array of queue pointers we pass to qed */
 900static void qedi_free_iscsi_pf_param(struct qedi_ctx *qedi)
 901{
 902        size_t size = 0;
 903
 904        if (qedi->p_cpuq) {
 905                size = qedi->num_queues * sizeof(struct qedi_glbl_q_params);
 906                dma_free_coherent(&qedi->pdev->dev, size, qedi->p_cpuq,
 907                                    qedi->hw_p_cpuq);
 908        }
 909
 910        qedi_free_global_queues(qedi);
 911
 912        kfree(qedi->global_queues);
 913}
 914
 915static void qedi_get_boot_tgt_info(struct nvm_iscsi_block *block,
 916                                   struct qedi_boot_target *tgt, u8 index)
 917{
 918        u32 ipv6_en;
 919
 920        ipv6_en = !!(block->generic.ctrl_flags &
 921                     NVM_ISCSI_CFG_GEN_IPV6_ENABLED);
 922
 923        snprintf(tgt->iscsi_name, sizeof(tgt->iscsi_name), "%s\n",
 924                 block->target[index].target_name.byte);
 925
 926        tgt->ipv6_en = ipv6_en;
 927
 928        if (ipv6_en)
 929                snprintf(tgt->ip_addr, IPV6_LEN, "%pI6\n",
 930                         block->target[index].ipv6_addr.byte);
 931        else
 932                snprintf(tgt->ip_addr, IPV4_LEN, "%pI4\n",
 933                         block->target[index].ipv4_addr.byte);
 934}
 935
 936static int qedi_find_boot_info(struct qedi_ctx *qedi,
 937                               struct qed_mfw_tlv_iscsi *iscsi,
 938                               struct nvm_iscsi_block *block)
 939{
 940        struct qedi_boot_target *pri_tgt = NULL, *sec_tgt = NULL;
 941        u32 pri_ctrl_flags = 0, sec_ctrl_flags = 0, found = 0;
 942        struct iscsi_cls_session *cls_sess;
 943        struct iscsi_cls_conn *cls_conn;
 944        struct qedi_conn *qedi_conn;
 945        struct iscsi_session *sess;
 946        struct iscsi_conn *conn;
 947        char ep_ip_addr[64];
 948        int i, ret = 0;
 949
 950        pri_ctrl_flags = !!(block->target[0].ctrl_flags &
 951                                        NVM_ISCSI_CFG_TARGET_ENABLED);
 952        if (pri_ctrl_flags) {
 953                pri_tgt = kzalloc(sizeof(*pri_tgt), GFP_KERNEL);
 954                if (!pri_tgt)
 955                        return -1;
 956                qedi_get_boot_tgt_info(block, pri_tgt, 0);
 957        }
 958
 959        sec_ctrl_flags = !!(block->target[1].ctrl_flags &
 960                                        NVM_ISCSI_CFG_TARGET_ENABLED);
 961        if (sec_ctrl_flags) {
 962                sec_tgt = kzalloc(sizeof(*sec_tgt), GFP_KERNEL);
 963                if (!sec_tgt) {
 964                        ret = -1;
 965                        goto free_tgt;
 966                }
 967                qedi_get_boot_tgt_info(block, sec_tgt, 1);
 968        }
 969
 970        for (i = 0; i < qedi->max_active_conns; i++) {
 971                qedi_conn = qedi_get_conn_from_id(qedi, i);
 972                if (!qedi_conn)
 973                        continue;
 974
 975                if (qedi_conn->ep->ip_type == TCP_IPV4)
 976                        snprintf(ep_ip_addr, IPV4_LEN, "%pI4\n",
 977                                 qedi_conn->ep->dst_addr);
 978                else
 979                        snprintf(ep_ip_addr, IPV6_LEN, "%pI6\n",
 980                                 qedi_conn->ep->dst_addr);
 981
 982                cls_conn = qedi_conn->cls_conn;
 983                conn = cls_conn->dd_data;
 984                cls_sess = iscsi_conn_to_session(cls_conn);
 985                sess = cls_sess->dd_data;
 986
 987                if (!iscsi_is_session_online(cls_sess))
 988                        continue;
 989
 990                if (!sess->targetname)
 991                        continue;
 992
 993                if (pri_ctrl_flags) {
 994                        if (!strcmp(pri_tgt->iscsi_name, sess->targetname) &&
 995                            !strcmp(pri_tgt->ip_addr, ep_ip_addr)) {
 996                                found = 1;
 997                                break;
 998                        }
 999                }
1000
1001                if (sec_ctrl_flags) {
1002                        if (!strcmp(sec_tgt->iscsi_name, sess->targetname) &&
1003                            !strcmp(sec_tgt->ip_addr, ep_ip_addr)) {
1004                                found = 1;
1005                                break;
1006                        }
1007                }
1008        }
1009
1010        if (found) {
1011                if (conn->hdrdgst_en) {
1012                        iscsi->header_digest_set = true;
1013                        iscsi->header_digest = 1;
1014                }
1015
1016                if (conn->datadgst_en) {
1017                        iscsi->data_digest_set = true;
1018                        iscsi->data_digest = 1;
1019                }
1020                iscsi->boot_taget_portal_set = true;
1021                iscsi->boot_taget_portal = sess->tpgt;
1022
1023        } else {
1024                ret = -1;
1025        }
1026
1027        if (sec_ctrl_flags)
1028                kfree(sec_tgt);
1029free_tgt:
1030        if (pri_ctrl_flags)
1031                kfree(pri_tgt);
1032
1033        return ret;
1034}
1035
1036static void qedi_get_generic_tlv_data(void *dev, struct qed_generic_tlvs *data)
1037{
1038        struct qedi_ctx *qedi;
1039
1040        if (!dev) {
1041                QEDI_INFO(NULL, QEDI_LOG_EVT,
1042                          "dev is NULL so ignoring get_generic_tlv_data request.\n");
1043                return;
1044        }
1045        qedi = (struct qedi_ctx *)dev;
1046
1047        memset(data, 0, sizeof(struct qed_generic_tlvs));
1048        ether_addr_copy(data->mac[0], qedi->mac);
1049}
1050
1051/*
1052 * Protocol TLV handler
1053 */
1054static void qedi_get_protocol_tlv_data(void *dev, void *data)
1055{
1056        struct qed_mfw_tlv_iscsi *iscsi = data;
1057        struct qed_iscsi_stats *fw_iscsi_stats;
1058        struct nvm_iscsi_block *block = NULL;
1059        u32 chap_en = 0, mchap_en = 0;
1060        struct qedi_ctx *qedi = dev;
1061        int rval = 0;
1062
1063        fw_iscsi_stats = kmalloc(sizeof(*fw_iscsi_stats), GFP_KERNEL);
1064        if (!fw_iscsi_stats) {
1065                QEDI_ERR(&qedi->dbg_ctx,
1066                         "Could not allocate memory for fw_iscsi_stats.\n");
1067                goto exit_get_data;
1068        }
1069
1070        mutex_lock(&qedi->stats_lock);
1071        /* Query firmware for offload stats */
1072        qedi_ops->get_stats(qedi->cdev, fw_iscsi_stats);
1073        mutex_unlock(&qedi->stats_lock);
1074
1075        iscsi->rx_frames_set = true;
1076        iscsi->rx_frames = fw_iscsi_stats->iscsi_rx_packet_cnt;
1077        iscsi->rx_bytes_set = true;
1078        iscsi->rx_bytes = fw_iscsi_stats->iscsi_rx_bytes_cnt;
1079        iscsi->tx_frames_set = true;
1080        iscsi->tx_frames = fw_iscsi_stats->iscsi_tx_packet_cnt;
1081        iscsi->tx_bytes_set = true;
1082        iscsi->tx_bytes = fw_iscsi_stats->iscsi_tx_bytes_cnt;
1083        iscsi->frame_size_set = true;
1084        iscsi->frame_size = qedi->ll2_mtu;
1085        block = qedi_get_nvram_block(qedi);
1086        if (block) {
1087                chap_en = !!(block->generic.ctrl_flags &
1088                             NVM_ISCSI_CFG_GEN_CHAP_ENABLED);
1089                mchap_en = !!(block->generic.ctrl_flags &
1090                              NVM_ISCSI_CFG_GEN_CHAP_MUTUAL_ENABLED);
1091
1092                iscsi->auth_method_set = (chap_en || mchap_en) ? true : false;
1093                iscsi->auth_method = 1;
1094                if (chap_en)
1095                        iscsi->auth_method = 2;
1096                if (mchap_en)
1097                        iscsi->auth_method = 3;
1098
1099                iscsi->tx_desc_size_set = true;
1100                iscsi->tx_desc_size = QEDI_SQ_SIZE;
1101                iscsi->rx_desc_size_set = true;
1102                iscsi->rx_desc_size = QEDI_CQ_SIZE;
1103
1104                /* tpgt, hdr digest, data digest */
1105                rval = qedi_find_boot_info(qedi, iscsi, block);
1106                if (rval)
1107                        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1108                                  "Boot target not set");
1109        }
1110
1111        kfree(fw_iscsi_stats);
1112exit_get_data:
1113        return;
1114}
1115
1116static void qedi_link_update(void *dev, struct qed_link_output *link)
1117{
1118        struct qedi_ctx *qedi = (struct qedi_ctx *)dev;
1119
1120        if (link->link_up) {
1121                QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, "Link Up event.\n");
1122                atomic_set(&qedi->link_state, QEDI_LINK_UP);
1123        } else {
1124                QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1125                          "Link Down event.\n");
1126                atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
1127        }
1128}
1129
1130static struct qed_iscsi_cb_ops qedi_cb_ops = {
1131        {
1132                .link_update =          qedi_link_update,
1133                .get_protocol_tlv_data = qedi_get_protocol_tlv_data,
1134                .get_generic_tlv_data = qedi_get_generic_tlv_data,
1135        }
1136};
1137
1138static int qedi_queue_cqe(struct qedi_ctx *qedi, union iscsi_cqe *cqe,
1139                          u16 que_idx, struct qedi_percpu_s *p)
1140{
1141        struct qedi_work *qedi_work;
1142        struct qedi_conn *q_conn;
1143        struct iscsi_conn *conn;
1144        struct qedi_cmd *qedi_cmd;
1145        u32 iscsi_cid;
1146        int rc = 0;
1147
1148        iscsi_cid  = cqe->cqe_common.conn_id;
1149        q_conn = qedi->cid_que.conn_cid_tbl[iscsi_cid];
1150        if (!q_conn) {
1151                QEDI_WARN(&qedi->dbg_ctx,
1152                          "Session no longer exists for cid=0x%x!!\n",
1153                          iscsi_cid);
1154                return -1;
1155        }
1156        conn = q_conn->cls_conn->dd_data;
1157
1158        switch (cqe->cqe_common.cqe_type) {
1159        case ISCSI_CQE_TYPE_SOLICITED:
1160        case ISCSI_CQE_TYPE_SOLICITED_WITH_SENSE:
1161                qedi_cmd = qedi_get_cmd_from_tid(qedi, cqe->cqe_solicited.itid);
1162                if (!qedi_cmd) {
1163                        rc = -1;
1164                        break;
1165                }
1166                INIT_LIST_HEAD(&qedi_cmd->cqe_work.list);
1167                qedi_cmd->cqe_work.qedi = qedi;
1168                memcpy(&qedi_cmd->cqe_work.cqe, cqe, sizeof(union iscsi_cqe));
1169                qedi_cmd->cqe_work.que_idx = que_idx;
1170                qedi_cmd->cqe_work.is_solicited = true;
1171                list_add_tail(&qedi_cmd->cqe_work.list, &p->work_list);
1172                break;
1173        case ISCSI_CQE_TYPE_UNSOLICITED:
1174        case ISCSI_CQE_TYPE_DUMMY:
1175        case ISCSI_CQE_TYPE_TASK_CLEANUP:
1176                qedi_work = kzalloc(sizeof(*qedi_work), GFP_ATOMIC);
1177                if (!qedi_work) {
1178                        rc = -1;
1179                        break;
1180                }
1181                INIT_LIST_HEAD(&qedi_work->list);
1182                qedi_work->qedi = qedi;
1183                memcpy(&qedi_work->cqe, cqe, sizeof(union iscsi_cqe));
1184                qedi_work->que_idx = que_idx;
1185                qedi_work->is_solicited = false;
1186                list_add_tail(&qedi_work->list, &p->work_list);
1187                break;
1188        default:
1189                rc = -1;
1190                QEDI_ERR(&qedi->dbg_ctx, "FW Error cqe.\n");
1191        }
1192        return rc;
1193}
1194
1195static bool qedi_process_completions(struct qedi_fastpath *fp)
1196{
1197        struct qedi_ctx *qedi = fp->qedi;
1198        struct qed_sb_info *sb_info = fp->sb_info;
1199        struct status_block_e4 *sb = sb_info->sb_virt;
1200        struct qedi_percpu_s *p = NULL;
1201        struct global_queue *que;
1202        u16 prod_idx;
1203        unsigned long flags;
1204        union iscsi_cqe *cqe;
1205        int cpu;
1206        int ret;
1207
1208        /* Get the current firmware producer index */
1209        prod_idx = sb->pi_array[QEDI_PROTO_CQ_PROD_IDX];
1210
1211        if (prod_idx >= QEDI_CQ_SIZE)
1212                prod_idx = prod_idx % QEDI_CQ_SIZE;
1213
1214        que = qedi->global_queues[fp->sb_id];
1215        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_IO,
1216                  "Before: global queue=%p prod_idx=%d cons_idx=%d, sb_id=%d\n",
1217                  que, prod_idx, que->cq_cons_idx, fp->sb_id);
1218
1219        qedi->intr_cpu = fp->sb_id;
1220        cpu = smp_processor_id();
1221        p = &per_cpu(qedi_percpu, cpu);
1222
1223        if (unlikely(!p->iothread))
1224                WARN_ON(1);
1225
1226        spin_lock_irqsave(&p->p_work_lock, flags);
1227        while (que->cq_cons_idx != prod_idx) {
1228                cqe = &que->cq[que->cq_cons_idx];
1229
1230                QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_IO,
1231                          "cqe=%p prod_idx=%d cons_idx=%d.\n",
1232                          cqe, prod_idx, que->cq_cons_idx);
1233
1234                ret = qedi_queue_cqe(qedi, cqe, fp->sb_id, p);
1235                if (ret)
1236                        QEDI_WARN(&qedi->dbg_ctx,
1237                                  "Dropping CQE 0x%x for cid=0x%x.\n",
1238                                  que->cq_cons_idx, cqe->cqe_common.conn_id);
1239
1240                que->cq_cons_idx++;
1241                if (que->cq_cons_idx == QEDI_CQ_SIZE)
1242                        que->cq_cons_idx = 0;
1243        }
1244        wake_up_process(p->iothread);
1245        spin_unlock_irqrestore(&p->p_work_lock, flags);
1246
1247        return true;
1248}
1249
1250static bool qedi_fp_has_work(struct qedi_fastpath *fp)
1251{
1252        struct qedi_ctx *qedi = fp->qedi;
1253        struct global_queue *que;
1254        struct qed_sb_info *sb_info = fp->sb_info;
1255        struct status_block_e4 *sb = sb_info->sb_virt;
1256        u16 prod_idx;
1257
1258        barrier();
1259
1260        /* Get the current firmware producer index */
1261        prod_idx = sb->pi_array[QEDI_PROTO_CQ_PROD_IDX];
1262
1263        /* Get the pointer to the global CQ this completion is on */
1264        que = qedi->global_queues[fp->sb_id];
1265
1266        /* prod idx wrap around uint16 */
1267        if (prod_idx >= QEDI_CQ_SIZE)
1268                prod_idx = prod_idx % QEDI_CQ_SIZE;
1269
1270        return (que->cq_cons_idx != prod_idx);
1271}
1272
1273/* MSI-X fastpath handler code */
1274static irqreturn_t qedi_msix_handler(int irq, void *dev_id)
1275{
1276        struct qedi_fastpath *fp = dev_id;
1277        struct qedi_ctx *qedi = fp->qedi;
1278        bool wake_io_thread = true;
1279
1280        qed_sb_ack(fp->sb_info, IGU_INT_DISABLE, 0);
1281
1282process_again:
1283        wake_io_thread = qedi_process_completions(fp);
1284        if (wake_io_thread) {
1285                QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
1286                          "process already running\n");
1287        }
1288
1289        if (qedi_fp_has_work(fp) == 0)
1290                qed_sb_update_sb_idx(fp->sb_info);
1291
1292        /* Check for more work */
1293        rmb();
1294
1295        if (qedi_fp_has_work(fp) == 0)
1296                qed_sb_ack(fp->sb_info, IGU_INT_ENABLE, 1);
1297        else
1298                goto process_again;
1299
1300        return IRQ_HANDLED;
1301}
1302
1303/* simd handler for MSI/INTa */
1304static void qedi_simd_int_handler(void *cookie)
1305{
1306        /* Cookie is qedi_ctx struct */
1307        struct qedi_ctx *qedi = (struct qedi_ctx *)cookie;
1308
1309        QEDI_WARN(&qedi->dbg_ctx, "qedi=%p.\n", qedi);
1310}
1311
1312#define QEDI_SIMD_HANDLER_NUM           0
1313static void qedi_sync_free_irqs(struct qedi_ctx *qedi)
1314{
1315        int i;
1316        u16 idx;
1317
1318        if (qedi->int_info.msix_cnt) {
1319                for (i = 0; i < qedi->int_info.used_cnt; i++) {
1320                        idx = i * qedi->dev_info.common.num_hwfns +
1321                        qedi_ops->common->get_affin_hwfn_idx(qedi->cdev);
1322
1323                        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1324                                  "Freeing IRQ #%d vector_idx=%d.\n", i, idx);
1325
1326                        synchronize_irq(qedi->int_info.msix[idx].vector);
1327                        irq_set_affinity_hint(qedi->int_info.msix[idx].vector,
1328                                              NULL);
1329                        free_irq(qedi->int_info.msix[idx].vector,
1330                                 &qedi->fp_array[i]);
1331                }
1332        } else {
1333                qedi_ops->common->simd_handler_clean(qedi->cdev,
1334                                                     QEDI_SIMD_HANDLER_NUM);
1335        }
1336
1337        qedi->int_info.used_cnt = 0;
1338        qedi_ops->common->set_fp_int(qedi->cdev, 0);
1339}
1340
1341static int qedi_request_msix_irq(struct qedi_ctx *qedi)
1342{
1343        int i, rc, cpu;
1344        u16 idx;
1345
1346        cpu = cpumask_first(cpu_online_mask);
1347        for (i = 0; i < MIN_NUM_CPUS_MSIX(qedi); i++) {
1348                idx = i * qedi->dev_info.common.num_hwfns +
1349                          qedi_ops->common->get_affin_hwfn_idx(qedi->cdev);
1350
1351                QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1352                          "dev_info: num_hwfns=%d affin_hwfn_idx=%d.\n",
1353                          qedi->dev_info.common.num_hwfns,
1354                          qedi_ops->common->get_affin_hwfn_idx(qedi->cdev));
1355
1356                rc = request_irq(qedi->int_info.msix[idx].vector,
1357                                 qedi_msix_handler, 0, "qedi",
1358                                 &qedi->fp_array[i]);
1359                if (rc) {
1360                        QEDI_WARN(&qedi->dbg_ctx, "request_irq failed.\n");
1361                        qedi_sync_free_irqs(qedi);
1362                        return rc;
1363                }
1364                qedi->int_info.used_cnt++;
1365                rc = irq_set_affinity_hint(qedi->int_info.msix[idx].vector,
1366                                           get_cpu_mask(cpu));
1367                cpu = cpumask_next(cpu, cpu_online_mask);
1368        }
1369
1370        return 0;
1371}
1372
1373static int qedi_setup_int(struct qedi_ctx *qedi)
1374{
1375        int rc = 0;
1376
1377        rc = qedi_ops->common->set_fp_int(qedi->cdev, num_online_cpus());
1378        rc = qedi_ops->common->get_fp_int(qedi->cdev, &qedi->int_info);
1379        if (rc)
1380                goto exit_setup_int;
1381
1382        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
1383                  "Number of msix_cnt = 0x%x num of cpus = 0x%x\n",
1384                   qedi->int_info.msix_cnt, num_online_cpus());
1385
1386        if (qedi->int_info.msix_cnt) {
1387                rc = qedi_request_msix_irq(qedi);
1388                goto exit_setup_int;
1389        } else {
1390                qedi_ops->common->simd_handler_config(qedi->cdev, &qedi,
1391                                                      QEDI_SIMD_HANDLER_NUM,
1392                                                      qedi_simd_int_handler);
1393                qedi->int_info.used_cnt = 1;
1394        }
1395
1396exit_setup_int:
1397        return rc;
1398}
1399
1400static void qedi_free_nvm_iscsi_cfg(struct qedi_ctx *qedi)
1401{
1402        if (qedi->iscsi_image)
1403                dma_free_coherent(&qedi->pdev->dev,
1404                                  sizeof(struct qedi_nvm_iscsi_image),
1405                                  qedi->iscsi_image, qedi->nvm_buf_dma);
1406}
1407
1408static int qedi_alloc_nvm_iscsi_cfg(struct qedi_ctx *qedi)
1409{
1410        qedi->iscsi_image = dma_alloc_coherent(&qedi->pdev->dev,
1411                                               sizeof(struct qedi_nvm_iscsi_image),
1412                                               &qedi->nvm_buf_dma, GFP_KERNEL);
1413        if (!qedi->iscsi_image) {
1414                QEDI_ERR(&qedi->dbg_ctx, "Could not allocate NVM BUF.\n");
1415                return -ENOMEM;
1416        }
1417        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
1418                  "NVM BUF addr=0x%p dma=0x%llx.\n", qedi->iscsi_image,
1419                  qedi->nvm_buf_dma);
1420
1421        return 0;
1422}
1423
1424static void qedi_free_bdq(struct qedi_ctx *qedi)
1425{
1426        int i;
1427
1428        if (qedi->bdq_pbl_list)
1429                dma_free_coherent(&qedi->pdev->dev, QEDI_PAGE_SIZE,
1430                                  qedi->bdq_pbl_list, qedi->bdq_pbl_list_dma);
1431
1432        if (qedi->bdq_pbl)
1433                dma_free_coherent(&qedi->pdev->dev, qedi->bdq_pbl_mem_size,
1434                                  qedi->bdq_pbl, qedi->bdq_pbl_dma);
1435
1436        for (i = 0; i < QEDI_BDQ_NUM; i++) {
1437                if (qedi->bdq[i].buf_addr) {
1438                        dma_free_coherent(&qedi->pdev->dev, QEDI_BDQ_BUF_SIZE,
1439                                          qedi->bdq[i].buf_addr,
1440                                          qedi->bdq[i].buf_dma);
1441                }
1442        }
1443}
1444
1445static void qedi_free_global_queues(struct qedi_ctx *qedi)
1446{
1447        int i;
1448        struct global_queue **gl = qedi->global_queues;
1449
1450        for (i = 0; i < qedi->num_queues; i++) {
1451                if (!gl[i])
1452                        continue;
1453
1454                if (gl[i]->cq)
1455                        dma_free_coherent(&qedi->pdev->dev, gl[i]->cq_mem_size,
1456                                          gl[i]->cq, gl[i]->cq_dma);
1457                if (gl[i]->cq_pbl)
1458                        dma_free_coherent(&qedi->pdev->dev, gl[i]->cq_pbl_size,
1459                                          gl[i]->cq_pbl, gl[i]->cq_pbl_dma);
1460
1461                kfree(gl[i]);
1462        }
1463        qedi_free_bdq(qedi);
1464        qedi_free_nvm_iscsi_cfg(qedi);
1465}
1466
1467static int qedi_alloc_bdq(struct qedi_ctx *qedi)
1468{
1469        int i;
1470        struct scsi_bd *pbl;
1471        u64 *list;
1472        dma_addr_t page;
1473
1474        /* Alloc dma memory for BDQ buffers */
1475        for (i = 0; i < QEDI_BDQ_NUM; i++) {
1476                qedi->bdq[i].buf_addr =
1477                                dma_alloc_coherent(&qedi->pdev->dev,
1478                                                   QEDI_BDQ_BUF_SIZE,
1479                                                   &qedi->bdq[i].buf_dma,
1480                                                   GFP_KERNEL);
1481                if (!qedi->bdq[i].buf_addr) {
1482                        QEDI_ERR(&qedi->dbg_ctx,
1483                                 "Could not allocate BDQ buffer %d.\n", i);
1484                        return -ENOMEM;
1485                }
1486        }
1487
1488        /* Alloc dma memory for BDQ page buffer list */
1489        qedi->bdq_pbl_mem_size = QEDI_BDQ_NUM * sizeof(struct scsi_bd);
1490        qedi->bdq_pbl_mem_size = ALIGN(qedi->bdq_pbl_mem_size, QEDI_PAGE_SIZE);
1491        qedi->rq_num_entries = qedi->bdq_pbl_mem_size / sizeof(struct scsi_bd);
1492
1493        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN, "rq_num_entries = %d.\n",
1494                  qedi->rq_num_entries);
1495
1496        qedi->bdq_pbl = dma_alloc_coherent(&qedi->pdev->dev,
1497                                           qedi->bdq_pbl_mem_size,
1498                                           &qedi->bdq_pbl_dma, GFP_KERNEL);
1499        if (!qedi->bdq_pbl) {
1500                QEDI_ERR(&qedi->dbg_ctx, "Could not allocate BDQ PBL.\n");
1501                return -ENOMEM;
1502        }
1503
1504        /*
1505         * Populate BDQ PBL with physical and virtual address of individual
1506         * BDQ buffers
1507         */
1508        pbl = (struct scsi_bd  *)qedi->bdq_pbl;
1509        for (i = 0; i < QEDI_BDQ_NUM; i++) {
1510                pbl->address.hi =
1511                                cpu_to_le32(QEDI_U64_HI(qedi->bdq[i].buf_dma));
1512                pbl->address.lo =
1513                                cpu_to_le32(QEDI_U64_LO(qedi->bdq[i].buf_dma));
1514                QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1515                          "pbl [0x%p] pbl->address hi [0x%llx] lo [0x%llx], idx [%d]\n",
1516                          pbl, pbl->address.hi, pbl->address.lo, i);
1517                pbl->opaque.iscsi_opaque.reserved_zero[0] = 0;
1518                pbl->opaque.iscsi_opaque.reserved_zero[1] = 0;
1519                pbl->opaque.iscsi_opaque.reserved_zero[2] = 0;
1520                pbl->opaque.iscsi_opaque.opaque = cpu_to_le16(i);
1521                pbl++;
1522        }
1523
1524        /* Allocate list of PBL pages */
1525        qedi->bdq_pbl_list = dma_alloc_coherent(&qedi->pdev->dev,
1526                                                QEDI_PAGE_SIZE,
1527                                                &qedi->bdq_pbl_list_dma,
1528                                                GFP_KERNEL);
1529        if (!qedi->bdq_pbl_list) {
1530                QEDI_ERR(&qedi->dbg_ctx,
1531                         "Could not allocate list of PBL pages.\n");
1532                return -ENOMEM;
1533        }
1534
1535        /*
1536         * Now populate PBL list with pages that contain pointers to the
1537         * individual buffers.
1538         */
1539        qedi->bdq_pbl_list_num_entries = qedi->bdq_pbl_mem_size /
1540                                         QEDI_PAGE_SIZE;
1541        list = (u64 *)qedi->bdq_pbl_list;
1542        page = qedi->bdq_pbl_list_dma;
1543        for (i = 0; i < qedi->bdq_pbl_list_num_entries; i++) {
1544                *list = qedi->bdq_pbl_dma;
1545                list++;
1546                page += QEDI_PAGE_SIZE;
1547        }
1548
1549        return 0;
1550}
1551
1552static int qedi_alloc_global_queues(struct qedi_ctx *qedi)
1553{
1554        u32 *list;
1555        int i;
1556        int status = 0, rc;
1557        u32 *pbl;
1558        dma_addr_t page;
1559        int num_pages;
1560
1561        /*
1562         * Number of global queues (CQ / RQ). This should
1563         * be <= number of available MSIX vectors for the PF
1564         */
1565        if (!qedi->num_queues) {
1566                QEDI_ERR(&qedi->dbg_ctx, "No MSI-X vectors available!\n");
1567                return 1;
1568        }
1569
1570        /* Make sure we allocated the PBL that will contain the physical
1571         * addresses of our queues
1572         */
1573        if (!qedi->p_cpuq) {
1574                status = 1;
1575                goto mem_alloc_failure;
1576        }
1577
1578        qedi->global_queues = kzalloc((sizeof(struct global_queue *) *
1579                                       qedi->num_queues), GFP_KERNEL);
1580        if (!qedi->global_queues) {
1581                QEDI_ERR(&qedi->dbg_ctx,
1582                         "Unable to allocate global queues array ptr memory\n");
1583                return -ENOMEM;
1584        }
1585        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
1586                  "qedi->global_queues=%p.\n", qedi->global_queues);
1587
1588        /* Allocate DMA coherent buffers for BDQ */
1589        rc = qedi_alloc_bdq(qedi);
1590        if (rc)
1591                goto mem_alloc_failure;
1592
1593        /* Allocate DMA coherent buffers for NVM_ISCSI_CFG */
1594        rc = qedi_alloc_nvm_iscsi_cfg(qedi);
1595        if (rc)
1596                goto mem_alloc_failure;
1597
1598        /* Allocate a CQ and an associated PBL for each MSI-X
1599         * vector.
1600         */
1601        for (i = 0; i < qedi->num_queues; i++) {
1602                qedi->global_queues[i] =
1603                                        kzalloc(sizeof(*qedi->global_queues[0]),
1604                                                GFP_KERNEL);
1605                if (!qedi->global_queues[i]) {
1606                        QEDI_ERR(&qedi->dbg_ctx,
1607                                 "Unable to allocation global queue %d.\n", i);
1608                        goto mem_alloc_failure;
1609                }
1610
1611                qedi->global_queues[i]->cq_mem_size =
1612                    (QEDI_CQ_SIZE + 8) * sizeof(union iscsi_cqe);
1613                qedi->global_queues[i]->cq_mem_size =
1614                    (qedi->global_queues[i]->cq_mem_size +
1615                    (QEDI_PAGE_SIZE - 1));
1616
1617                qedi->global_queues[i]->cq_pbl_size =
1618                    (qedi->global_queues[i]->cq_mem_size /
1619                    QEDI_PAGE_SIZE) * sizeof(void *);
1620                qedi->global_queues[i]->cq_pbl_size =
1621                    (qedi->global_queues[i]->cq_pbl_size +
1622                    (QEDI_PAGE_SIZE - 1));
1623
1624                qedi->global_queues[i]->cq = dma_alloc_coherent(&qedi->pdev->dev,
1625                                                                qedi->global_queues[i]->cq_mem_size,
1626                                                                &qedi->global_queues[i]->cq_dma,
1627                                                                GFP_KERNEL);
1628
1629                if (!qedi->global_queues[i]->cq) {
1630                        QEDI_WARN(&qedi->dbg_ctx,
1631                                  "Could not allocate cq.\n");
1632                        status = -ENOMEM;
1633                        goto mem_alloc_failure;
1634                }
1635                qedi->global_queues[i]->cq_pbl = dma_alloc_coherent(&qedi->pdev->dev,
1636                                                                    qedi->global_queues[i]->cq_pbl_size,
1637                                                                    &qedi->global_queues[i]->cq_pbl_dma,
1638                                                                    GFP_KERNEL);
1639
1640                if (!qedi->global_queues[i]->cq_pbl) {
1641                        QEDI_WARN(&qedi->dbg_ctx,
1642                                  "Could not allocate cq PBL.\n");
1643                        status = -ENOMEM;
1644                        goto mem_alloc_failure;
1645                }
1646
1647                /* Create PBL */
1648                num_pages = qedi->global_queues[i]->cq_mem_size /
1649                    QEDI_PAGE_SIZE;
1650                page = qedi->global_queues[i]->cq_dma;
1651                pbl = (u32 *)qedi->global_queues[i]->cq_pbl;
1652
1653                while (num_pages--) {
1654                        *pbl = (u32)page;
1655                        pbl++;
1656                        *pbl = (u32)((u64)page >> 32);
1657                        pbl++;
1658                        page += QEDI_PAGE_SIZE;
1659                }
1660        }
1661
1662        list = (u32 *)qedi->p_cpuq;
1663
1664        /*
1665         * The list is built as follows: CQ#0 PBL pointer, RQ#0 PBL pointer,
1666         * CQ#1 PBL pointer, RQ#1 PBL pointer, etc.  Each PBL pointer points
1667         * to the physical address which contains an array of pointers to the
1668         * physical addresses of the specific queue pages.
1669         */
1670        for (i = 0; i < qedi->num_queues; i++) {
1671                *list = (u32)qedi->global_queues[i]->cq_pbl_dma;
1672                list++;
1673                *list = (u32)((u64)qedi->global_queues[i]->cq_pbl_dma >> 32);
1674                list++;
1675
1676                *list = (u32)0;
1677                list++;
1678                *list = (u32)((u64)0 >> 32);
1679                list++;
1680        }
1681
1682        return 0;
1683
1684mem_alloc_failure:
1685        qedi_free_global_queues(qedi);
1686        return status;
1687}
1688
1689int qedi_alloc_sq(struct qedi_ctx *qedi, struct qedi_endpoint *ep)
1690{
1691        int rval = 0;
1692        u32 *pbl;
1693        dma_addr_t page;
1694        int num_pages;
1695
1696        if (!ep)
1697                return -EIO;
1698
1699        /* Calculate appropriate queue and PBL sizes */
1700        ep->sq_mem_size = QEDI_SQ_SIZE * sizeof(struct iscsi_wqe);
1701        ep->sq_mem_size += QEDI_PAGE_SIZE - 1;
1702
1703        ep->sq_pbl_size = (ep->sq_mem_size / QEDI_PAGE_SIZE) * sizeof(void *);
1704        ep->sq_pbl_size = ep->sq_pbl_size + QEDI_PAGE_SIZE;
1705
1706        ep->sq = dma_alloc_coherent(&qedi->pdev->dev, ep->sq_mem_size,
1707                                    &ep->sq_dma, GFP_KERNEL);
1708        if (!ep->sq) {
1709                QEDI_WARN(&qedi->dbg_ctx,
1710                          "Could not allocate send queue.\n");
1711                rval = -ENOMEM;
1712                goto out;
1713        }
1714        ep->sq_pbl = dma_alloc_coherent(&qedi->pdev->dev, ep->sq_pbl_size,
1715                                        &ep->sq_pbl_dma, GFP_KERNEL);
1716        if (!ep->sq_pbl) {
1717                QEDI_WARN(&qedi->dbg_ctx,
1718                          "Could not allocate send queue PBL.\n");
1719                rval = -ENOMEM;
1720                goto out_free_sq;
1721        }
1722
1723        /* Create PBL */
1724        num_pages = ep->sq_mem_size / QEDI_PAGE_SIZE;
1725        page = ep->sq_dma;
1726        pbl = (u32 *)ep->sq_pbl;
1727
1728        while (num_pages--) {
1729                *pbl = (u32)page;
1730                pbl++;
1731                *pbl = (u32)((u64)page >> 32);
1732                pbl++;
1733                page += QEDI_PAGE_SIZE;
1734        }
1735
1736        return rval;
1737
1738out_free_sq:
1739        dma_free_coherent(&qedi->pdev->dev, ep->sq_mem_size, ep->sq,
1740                          ep->sq_dma);
1741out:
1742        return rval;
1743}
1744
1745void qedi_free_sq(struct qedi_ctx *qedi, struct qedi_endpoint *ep)
1746{
1747        if (ep->sq_pbl)
1748                dma_free_coherent(&qedi->pdev->dev, ep->sq_pbl_size, ep->sq_pbl,
1749                                  ep->sq_pbl_dma);
1750        if (ep->sq)
1751                dma_free_coherent(&qedi->pdev->dev, ep->sq_mem_size, ep->sq,
1752                                  ep->sq_dma);
1753}
1754
1755int qedi_get_task_idx(struct qedi_ctx *qedi)
1756{
1757        s16 tmp_idx;
1758
1759again:
1760        tmp_idx = find_first_zero_bit(qedi->task_idx_map,
1761                                      MAX_ISCSI_TASK_ENTRIES);
1762
1763        if (tmp_idx >= MAX_ISCSI_TASK_ENTRIES) {
1764                QEDI_ERR(&qedi->dbg_ctx, "FW task context pool is full.\n");
1765                tmp_idx = -1;
1766                goto err_idx;
1767        }
1768
1769        if (test_and_set_bit(tmp_idx, qedi->task_idx_map))
1770                goto again;
1771
1772err_idx:
1773        return tmp_idx;
1774}
1775
1776void qedi_clear_task_idx(struct qedi_ctx *qedi, int idx)
1777{
1778        if (!test_and_clear_bit(idx, qedi->task_idx_map))
1779                QEDI_ERR(&qedi->dbg_ctx,
1780                         "FW task context, already cleared, tid=0x%x\n", idx);
1781}
1782
1783void qedi_update_itt_map(struct qedi_ctx *qedi, u32 tid, u32 proto_itt,
1784                         struct qedi_cmd *cmd)
1785{
1786        qedi->itt_map[tid].itt = proto_itt;
1787        qedi->itt_map[tid].p_cmd = cmd;
1788
1789        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1790                  "update itt map tid=0x%x, with proto itt=0x%x\n", tid,
1791                  qedi->itt_map[tid].itt);
1792}
1793
1794void qedi_get_task_tid(struct qedi_ctx *qedi, u32 itt, s16 *tid)
1795{
1796        u16 i;
1797
1798        for (i = 0; i < MAX_ISCSI_TASK_ENTRIES; i++) {
1799                if (qedi->itt_map[i].itt == itt) {
1800                        *tid = i;
1801                        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1802                                  "Ref itt=0x%x, found at tid=0x%x\n",
1803                                  itt, *tid);
1804                        return;
1805                }
1806        }
1807
1808        WARN_ON(1);
1809}
1810
1811void qedi_get_proto_itt(struct qedi_ctx *qedi, u32 tid, u32 *proto_itt)
1812{
1813        *proto_itt = qedi->itt_map[tid].itt;
1814        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_CONN,
1815                  "Get itt map tid [0x%x with proto itt[0x%x]",
1816                  tid, *proto_itt);
1817}
1818
1819struct qedi_cmd *qedi_get_cmd_from_tid(struct qedi_ctx *qedi, u32 tid)
1820{
1821        struct qedi_cmd *cmd = NULL;
1822
1823        if (tid >= MAX_ISCSI_TASK_ENTRIES)
1824                return NULL;
1825
1826        cmd = qedi->itt_map[tid].p_cmd;
1827        if (cmd->task_id != tid)
1828                return NULL;
1829
1830        qedi->itt_map[tid].p_cmd = NULL;
1831
1832        return cmd;
1833}
1834
1835static int qedi_alloc_itt(struct qedi_ctx *qedi)
1836{
1837        qedi->itt_map = kcalloc(MAX_ISCSI_TASK_ENTRIES,
1838                                sizeof(struct qedi_itt_map), GFP_KERNEL);
1839        if (!qedi->itt_map) {
1840                QEDI_ERR(&qedi->dbg_ctx,
1841                         "Unable to allocate itt map array memory\n");
1842                return -ENOMEM;
1843        }
1844        return 0;
1845}
1846
1847static void qedi_free_itt(struct qedi_ctx *qedi)
1848{
1849        kfree(qedi->itt_map);
1850}
1851
1852static struct qed_ll2_cb_ops qedi_ll2_cb_ops = {
1853        .rx_cb = qedi_ll2_rx,
1854        .tx_cb = NULL,
1855};
1856
1857static int qedi_percpu_io_thread(void *arg)
1858{
1859        struct qedi_percpu_s *p = arg;
1860        struct qedi_work *work, *tmp;
1861        unsigned long flags;
1862        LIST_HEAD(work_list);
1863
1864        set_user_nice(current, -20);
1865
1866        while (!kthread_should_stop()) {
1867                spin_lock_irqsave(&p->p_work_lock, flags);
1868                while (!list_empty(&p->work_list)) {
1869                        list_splice_init(&p->work_list, &work_list);
1870                        spin_unlock_irqrestore(&p->p_work_lock, flags);
1871
1872                        list_for_each_entry_safe(work, tmp, &work_list, list) {
1873                                list_del_init(&work->list);
1874                                qedi_fp_process_cqes(work);
1875                                if (!work->is_solicited)
1876                                        kfree(work);
1877                        }
1878                        cond_resched();
1879                        spin_lock_irqsave(&p->p_work_lock, flags);
1880                }
1881                set_current_state(TASK_INTERRUPTIBLE);
1882                spin_unlock_irqrestore(&p->p_work_lock, flags);
1883                schedule();
1884        }
1885        __set_current_state(TASK_RUNNING);
1886
1887        return 0;
1888}
1889
1890static int qedi_cpu_online(unsigned int cpu)
1891{
1892        struct qedi_percpu_s *p = this_cpu_ptr(&qedi_percpu);
1893        struct task_struct *thread;
1894
1895        thread = kthread_create_on_node(qedi_percpu_io_thread, (void *)p,
1896                                        cpu_to_node(cpu),
1897                                        "qedi_thread/%d", cpu);
1898        if (IS_ERR(thread))
1899                return PTR_ERR(thread);
1900
1901        kthread_bind(thread, cpu);
1902        p->iothread = thread;
1903        wake_up_process(thread);
1904        return 0;
1905}
1906
1907static int qedi_cpu_offline(unsigned int cpu)
1908{
1909        struct qedi_percpu_s *p = this_cpu_ptr(&qedi_percpu);
1910        struct qedi_work *work, *tmp;
1911        struct task_struct *thread;
1912
1913        spin_lock_bh(&p->p_work_lock);
1914        thread = p->iothread;
1915        p->iothread = NULL;
1916
1917        list_for_each_entry_safe(work, tmp, &p->work_list, list) {
1918                list_del_init(&work->list);
1919                qedi_fp_process_cqes(work);
1920                if (!work->is_solicited)
1921                        kfree(work);
1922        }
1923
1924        spin_unlock_bh(&p->p_work_lock);
1925        if (thread)
1926                kthread_stop(thread);
1927        return 0;
1928}
1929
1930void qedi_reset_host_mtu(struct qedi_ctx *qedi, u16 mtu)
1931{
1932        struct qed_ll2_params params;
1933
1934        qedi_recover_all_conns(qedi);
1935
1936        qedi_ops->ll2->stop(qedi->cdev);
1937        qedi_ll2_free_skbs(qedi);
1938
1939        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO, "old MTU %u, new MTU %u\n",
1940                  qedi->ll2_mtu, mtu);
1941        memset(&params, 0, sizeof(params));
1942        qedi->ll2_mtu = mtu;
1943        params.mtu = qedi->ll2_mtu + IPV6_HDR_LEN + TCP_HDR_LEN;
1944        params.drop_ttl0_packets = 0;
1945        params.rx_vlan_stripping = 1;
1946        ether_addr_copy(params.ll2_mac_address, qedi->dev_info.common.hw_mac);
1947        qedi_ops->ll2->start(qedi->cdev, &params);
1948}
1949
1950/**
1951 * qedi_get_nvram_block: - Scan through the iSCSI NVRAM block (while accounting
1952 * for gaps) for the matching absolute-pf-id of the QEDI device.
1953 */
1954static struct nvm_iscsi_block *
1955qedi_get_nvram_block(struct qedi_ctx *qedi)
1956{
1957        int i;
1958        u8 pf;
1959        u32 flags;
1960        struct nvm_iscsi_block *block;
1961
1962        pf = qedi->dev_info.common.abs_pf_id;
1963        block = &qedi->iscsi_image->iscsi_cfg.block[0];
1964        for (i = 0; i < NUM_OF_ISCSI_PF_SUPPORTED; i++, block++) {
1965                flags = ((block->id) & NVM_ISCSI_CFG_BLK_CTRL_FLAG_MASK) >>
1966                        NVM_ISCSI_CFG_BLK_CTRL_FLAG_OFFSET;
1967                if (flags & (NVM_ISCSI_CFG_BLK_CTRL_FLAG_IS_NOT_EMPTY |
1968                                NVM_ISCSI_CFG_BLK_CTRL_FLAG_PF_MAPPED) &&
1969                        (pf == (block->id & NVM_ISCSI_CFG_BLK_MAPPED_PF_ID_MASK)
1970                                >> NVM_ISCSI_CFG_BLK_MAPPED_PF_ID_OFFSET))
1971                        return block;
1972        }
1973        return NULL;
1974}
1975
1976static ssize_t qedi_show_boot_eth_info(void *data, int type, char *buf)
1977{
1978        struct qedi_ctx *qedi = data;
1979        struct nvm_iscsi_initiator *initiator;
1980        int rc = 1;
1981        u32 ipv6_en, dhcp_en, ip_len;
1982        struct nvm_iscsi_block *block;
1983        char *fmt, *ip, *sub, *gw;
1984
1985        block = qedi_get_nvram_block(qedi);
1986        if (!block)
1987                return 0;
1988
1989        initiator = &block->initiator;
1990        ipv6_en = block->generic.ctrl_flags &
1991                  NVM_ISCSI_CFG_GEN_IPV6_ENABLED;
1992        dhcp_en = block->generic.ctrl_flags &
1993                  NVM_ISCSI_CFG_GEN_DHCP_TCPIP_CONFIG_ENABLED;
1994        /* Static IP assignments. */
1995        fmt = ipv6_en ? "%pI6\n" : "%pI4\n";
1996        ip = ipv6_en ? initiator->ipv6.addr.byte : initiator->ipv4.addr.byte;
1997        ip_len = ipv6_en ? IPV6_LEN : IPV4_LEN;
1998        sub = ipv6_en ? initiator->ipv6.subnet_mask.byte :
1999              initiator->ipv4.subnet_mask.byte;
2000        gw = ipv6_en ? initiator->ipv6.gateway.byte :
2001             initiator->ipv4.gateway.byte;
2002        /* DHCP IP adjustments. */
2003        fmt = dhcp_en ? "%s\n" : fmt;
2004        if (dhcp_en) {
2005                ip = ipv6_en ? "0::0" : "0.0.0.0";
2006                sub = ip;
2007                gw = ip;
2008                ip_len = ipv6_en ? 5 : 8;
2009        }
2010
2011        switch (type) {
2012        case ISCSI_BOOT_ETH_IP_ADDR:
2013                rc = snprintf(buf, ip_len, fmt, ip);
2014                break;
2015        case ISCSI_BOOT_ETH_SUBNET_MASK:
2016                rc = snprintf(buf, ip_len, fmt, sub);
2017                break;
2018        case ISCSI_BOOT_ETH_GATEWAY:
2019                rc = snprintf(buf, ip_len, fmt, gw);
2020                break;
2021        case ISCSI_BOOT_ETH_FLAGS:
2022                rc = snprintf(buf, 3, "%hhd\n",
2023                              SYSFS_FLAG_FW_SEL_BOOT);
2024                break;
2025        case ISCSI_BOOT_ETH_INDEX:
2026                rc = snprintf(buf, 3, "0\n");
2027                break;
2028        case ISCSI_BOOT_ETH_MAC:
2029                rc = sysfs_format_mac(buf, qedi->mac, ETH_ALEN);
2030                break;
2031        case ISCSI_BOOT_ETH_VLAN:
2032                rc = snprintf(buf, 12, "%d\n",
2033                              GET_FIELD2(initiator->generic_cont0,
2034                                         NVM_ISCSI_CFG_INITIATOR_VLAN));
2035                break;
2036        case ISCSI_BOOT_ETH_ORIGIN:
2037                if (dhcp_en)
2038                        rc = snprintf(buf, 3, "3\n");
2039                break;
2040        default:
2041                rc = 0;
2042                break;
2043        }
2044
2045        return rc;
2046}
2047
2048static umode_t qedi_eth_get_attr_visibility(void *data, int type)
2049{
2050        int rc = 1;
2051
2052        switch (type) {
2053        case ISCSI_BOOT_ETH_FLAGS:
2054        case ISCSI_BOOT_ETH_MAC:
2055        case ISCSI_BOOT_ETH_INDEX:
2056        case ISCSI_BOOT_ETH_IP_ADDR:
2057        case ISCSI_BOOT_ETH_SUBNET_MASK:
2058        case ISCSI_BOOT_ETH_GATEWAY:
2059        case ISCSI_BOOT_ETH_ORIGIN:
2060        case ISCSI_BOOT_ETH_VLAN:
2061                rc = 0444;
2062                break;
2063        default:
2064                rc = 0;
2065                break;
2066        }
2067        return rc;
2068}
2069
2070static ssize_t qedi_show_boot_ini_info(void *data, int type, char *buf)
2071{
2072        struct qedi_ctx *qedi = data;
2073        struct nvm_iscsi_initiator *initiator;
2074        int rc;
2075        struct nvm_iscsi_block *block;
2076
2077        block = qedi_get_nvram_block(qedi);
2078        if (!block)
2079                return 0;
2080
2081        initiator = &block->initiator;
2082
2083        switch (type) {
2084        case ISCSI_BOOT_INI_INITIATOR_NAME:
2085                rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
2086                             initiator->initiator_name.byte);
2087                break;
2088        default:
2089                rc = 0;
2090                break;
2091        }
2092        return rc;
2093}
2094
2095static umode_t qedi_ini_get_attr_visibility(void *data, int type)
2096{
2097        int rc;
2098
2099        switch (type) {
2100        case ISCSI_BOOT_INI_INITIATOR_NAME:
2101                rc = 0444;
2102                break;
2103        default:
2104                rc = 0;
2105                break;
2106        }
2107        return rc;
2108}
2109
2110static ssize_t
2111qedi_show_boot_tgt_info(struct qedi_ctx *qedi, int type,
2112                        char *buf, enum qedi_nvm_tgts idx)
2113{
2114        int rc = 1;
2115        u32 ctrl_flags, ipv6_en, chap_en, mchap_en, ip_len;
2116        struct nvm_iscsi_block *block;
2117        char *chap_name, *chap_secret;
2118        char *mchap_name, *mchap_secret;
2119
2120        block = qedi_get_nvram_block(qedi);
2121        if (!block)
2122                goto exit_show_tgt_info;
2123
2124        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_EVT,
2125                  "Port:%d, tgt_idx:%d\n",
2126                  GET_FIELD2(block->id, NVM_ISCSI_CFG_BLK_MAPPED_PF_ID), idx);
2127
2128        ctrl_flags = block->target[idx].ctrl_flags &
2129                     NVM_ISCSI_CFG_TARGET_ENABLED;
2130
2131        if (!ctrl_flags) {
2132                QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_EVT,
2133                          "Target disabled\n");
2134                goto exit_show_tgt_info;
2135        }
2136
2137        ipv6_en = block->generic.ctrl_flags &
2138                  NVM_ISCSI_CFG_GEN_IPV6_ENABLED;
2139        ip_len = ipv6_en ? IPV6_LEN : IPV4_LEN;
2140        chap_en = block->generic.ctrl_flags &
2141                  NVM_ISCSI_CFG_GEN_CHAP_ENABLED;
2142        chap_name = chap_en ? block->initiator.chap_name.byte : NULL;
2143        chap_secret = chap_en ? block->initiator.chap_password.byte : NULL;
2144
2145        mchap_en = block->generic.ctrl_flags &
2146                  NVM_ISCSI_CFG_GEN_CHAP_MUTUAL_ENABLED;
2147        mchap_name = mchap_en ? block->target[idx].chap_name.byte : NULL;
2148        mchap_secret = mchap_en ? block->target[idx].chap_password.byte : NULL;
2149
2150        switch (type) {
2151        case ISCSI_BOOT_TGT_NAME:
2152                rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_ISCSI_NAME_MAX_LEN,
2153                             block->target[idx].target_name.byte);
2154                break;
2155        case ISCSI_BOOT_TGT_IP_ADDR:
2156                if (ipv6_en)
2157                        rc = snprintf(buf, ip_len, "%pI6\n",
2158                                      block->target[idx].ipv6_addr.byte);
2159                else
2160                        rc = snprintf(buf, ip_len, "%pI4\n",
2161                                      block->target[idx].ipv4_addr.byte);
2162                break;
2163        case ISCSI_BOOT_TGT_PORT:
2164                rc = snprintf(buf, 12, "%d\n",
2165                              GET_FIELD2(block->target[idx].generic_cont0,
2166                                         NVM_ISCSI_CFG_TARGET_TCP_PORT));
2167                break;
2168        case ISCSI_BOOT_TGT_LUN:
2169                rc = snprintf(buf, 22, "%.*d\n",
2170                              block->target[idx].lun.value[1],
2171                              block->target[idx].lun.value[0]);
2172                break;
2173        case ISCSI_BOOT_TGT_CHAP_NAME:
2174                rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
2175                             chap_name);
2176                break;
2177        case ISCSI_BOOT_TGT_CHAP_SECRET:
2178                rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
2179                             chap_secret);
2180                break;
2181        case ISCSI_BOOT_TGT_REV_CHAP_NAME:
2182                rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
2183                             mchap_name);
2184                break;
2185        case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
2186                rc = sprintf(buf, "%.*s\n", NVM_ISCSI_CFG_CHAP_NAME_MAX_LEN,
2187                             mchap_secret);
2188                break;
2189        case ISCSI_BOOT_TGT_FLAGS:
2190                rc = snprintf(buf, 3, "%hhd\n", SYSFS_FLAG_FW_SEL_BOOT);
2191                break;
2192        case ISCSI_BOOT_TGT_NIC_ASSOC:
2193                rc = snprintf(buf, 3, "0\n");
2194                break;
2195        default:
2196                rc = 0;
2197                break;
2198        }
2199
2200exit_show_tgt_info:
2201        return rc;
2202}
2203
2204static ssize_t qedi_show_boot_tgt_pri_info(void *data, int type, char *buf)
2205{
2206        struct qedi_ctx *qedi = data;
2207
2208        return qedi_show_boot_tgt_info(qedi, type, buf, QEDI_NVM_TGT_PRI);
2209}
2210
2211static ssize_t qedi_show_boot_tgt_sec_info(void *data, int type, char *buf)
2212{
2213        struct qedi_ctx *qedi = data;
2214
2215        return qedi_show_boot_tgt_info(qedi, type, buf, QEDI_NVM_TGT_SEC);
2216}
2217
2218static umode_t qedi_tgt_get_attr_visibility(void *data, int type)
2219{
2220        int rc;
2221
2222        switch (type) {
2223        case ISCSI_BOOT_TGT_NAME:
2224        case ISCSI_BOOT_TGT_IP_ADDR:
2225        case ISCSI_BOOT_TGT_PORT:
2226        case ISCSI_BOOT_TGT_LUN:
2227        case ISCSI_BOOT_TGT_CHAP_NAME:
2228        case ISCSI_BOOT_TGT_CHAP_SECRET:
2229        case ISCSI_BOOT_TGT_REV_CHAP_NAME:
2230        case ISCSI_BOOT_TGT_REV_CHAP_SECRET:
2231        case ISCSI_BOOT_TGT_NIC_ASSOC:
2232        case ISCSI_BOOT_TGT_FLAGS:
2233                rc = 0444;
2234                break;
2235        default:
2236                rc = 0;
2237                break;
2238        }
2239        return rc;
2240}
2241
2242static void qedi_boot_release(void *data)
2243{
2244        struct qedi_ctx *qedi = data;
2245
2246        scsi_host_put(qedi->shost);
2247}
2248
2249static int qedi_get_boot_info(struct qedi_ctx *qedi)
2250{
2251        int ret = 1;
2252
2253        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2254                  "Get NVM iSCSI CFG image\n");
2255        ret = qedi_ops->common->nvm_get_image(qedi->cdev,
2256                                              QED_NVM_IMAGE_ISCSI_CFG,
2257                                              (char *)qedi->iscsi_image,
2258                                              sizeof(struct qedi_nvm_iscsi_image));
2259        if (ret)
2260                QEDI_ERR(&qedi->dbg_ctx,
2261                         "Could not get NVM image. ret = %d\n", ret);
2262
2263        return ret;
2264}
2265
2266static int qedi_setup_boot_info(struct qedi_ctx *qedi)
2267{
2268        struct iscsi_boot_kobj *boot_kobj;
2269
2270        if (qedi_get_boot_info(qedi))
2271                return -EPERM;
2272
2273        qedi->boot_kset = iscsi_boot_create_host_kset(qedi->shost->host_no);
2274        if (!qedi->boot_kset)
2275                goto kset_free;
2276
2277        if (!scsi_host_get(qedi->shost))
2278                goto kset_free;
2279
2280        boot_kobj = iscsi_boot_create_target(qedi->boot_kset, 0, qedi,
2281                                             qedi_show_boot_tgt_pri_info,
2282                                             qedi_tgt_get_attr_visibility,
2283                                             qedi_boot_release);
2284        if (!boot_kobj)
2285                goto put_host;
2286
2287        if (!scsi_host_get(qedi->shost))
2288                goto kset_free;
2289
2290        boot_kobj = iscsi_boot_create_target(qedi->boot_kset, 1, qedi,
2291                                             qedi_show_boot_tgt_sec_info,
2292                                             qedi_tgt_get_attr_visibility,
2293                                             qedi_boot_release);
2294        if (!boot_kobj)
2295                goto put_host;
2296
2297        if (!scsi_host_get(qedi->shost))
2298                goto kset_free;
2299
2300        boot_kobj = iscsi_boot_create_initiator(qedi->boot_kset, 0, qedi,
2301                                                qedi_show_boot_ini_info,
2302                                                qedi_ini_get_attr_visibility,
2303                                                qedi_boot_release);
2304        if (!boot_kobj)
2305                goto put_host;
2306
2307        if (!scsi_host_get(qedi->shost))
2308                goto kset_free;
2309
2310        boot_kobj = iscsi_boot_create_ethernet(qedi->boot_kset, 0, qedi,
2311                                               qedi_show_boot_eth_info,
2312                                               qedi_eth_get_attr_visibility,
2313                                               qedi_boot_release);
2314        if (!boot_kobj)
2315                goto put_host;
2316
2317        return 0;
2318
2319put_host:
2320        scsi_host_put(qedi->shost);
2321kset_free:
2322        iscsi_boot_destroy_kset(qedi->boot_kset);
2323        return -ENOMEM;
2324}
2325
2326static void __qedi_remove(struct pci_dev *pdev, int mode)
2327{
2328        struct qedi_ctx *qedi = pci_get_drvdata(pdev);
2329        int rval;
2330
2331        if (qedi->tmf_thread) {
2332                flush_workqueue(qedi->tmf_thread);
2333                destroy_workqueue(qedi->tmf_thread);
2334                qedi->tmf_thread = NULL;
2335        }
2336
2337        if (qedi->offload_thread) {
2338                flush_workqueue(qedi->offload_thread);
2339                destroy_workqueue(qedi->offload_thread);
2340                qedi->offload_thread = NULL;
2341        }
2342
2343#ifdef CONFIG_DEBUG_FS
2344        qedi_dbg_host_exit(&qedi->dbg_ctx);
2345#endif
2346        if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags))
2347                qedi_ops->common->set_power_state(qedi->cdev, PCI_D0);
2348
2349        qedi_sync_free_irqs(qedi);
2350
2351        if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags)) {
2352                qedi_ops->stop(qedi->cdev);
2353                qedi_ops->ll2->stop(qedi->cdev);
2354        }
2355
2356        if (mode == QEDI_MODE_NORMAL)
2357                qedi_free_iscsi_pf_param(qedi);
2358
2359        rval = qedi_ops->common->update_drv_state(qedi->cdev, false);
2360        if (rval)
2361                QEDI_ERR(&qedi->dbg_ctx, "Failed to send drv state to MFW\n");
2362
2363        if (!test_bit(QEDI_IN_OFFLINE, &qedi->flags)) {
2364                qedi_ops->common->slowpath_stop(qedi->cdev);
2365                qedi_ops->common->remove(qedi->cdev);
2366        }
2367
2368        qedi_destroy_fp(qedi);
2369
2370        if (mode == QEDI_MODE_NORMAL) {
2371                qedi_release_cid_que(qedi);
2372                qedi_cm_free_mem(qedi);
2373                qedi_free_uio(qedi->udev);
2374                qedi_free_itt(qedi);
2375
2376                iscsi_host_remove(qedi->shost);
2377                iscsi_host_free(qedi->shost);
2378
2379                if (qedi->ll2_recv_thread) {
2380                        kthread_stop(qedi->ll2_recv_thread);
2381                        qedi->ll2_recv_thread = NULL;
2382                }
2383                qedi_ll2_free_skbs(qedi);
2384
2385                if (qedi->boot_kset)
2386                        iscsi_boot_destroy_kset(qedi->boot_kset);
2387        }
2388}
2389
2390static int __qedi_probe(struct pci_dev *pdev, int mode)
2391{
2392        struct qedi_ctx *qedi;
2393        struct qed_ll2_params params;
2394        u32 dp_module = 0;
2395        u8 dp_level = 0;
2396        bool is_vf = false;
2397        char host_buf[16];
2398        struct qed_link_params link_params;
2399        struct qed_slowpath_params sp_params;
2400        struct qed_probe_params qed_params;
2401        void *task_start, *task_end;
2402        int rc;
2403        u16 tmp;
2404
2405        if (mode != QEDI_MODE_RECOVERY) {
2406                qedi = qedi_host_alloc(pdev);
2407                if (!qedi) {
2408                        rc = -ENOMEM;
2409                        goto exit_probe;
2410                }
2411        } else {
2412                qedi = pci_get_drvdata(pdev);
2413        }
2414
2415        memset(&qed_params, 0, sizeof(qed_params));
2416        qed_params.protocol = QED_PROTOCOL_ISCSI;
2417        qed_params.dp_module = dp_module;
2418        qed_params.dp_level = dp_level;
2419        qed_params.is_vf = is_vf;
2420        qedi->cdev = qedi_ops->common->probe(pdev, &qed_params);
2421        if (!qedi->cdev) {
2422                rc = -ENODEV;
2423                QEDI_ERR(&qedi->dbg_ctx, "Cannot initialize hardware\n");
2424                goto free_host;
2425        }
2426
2427        atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
2428
2429        rc = qedi_ops->fill_dev_info(qedi->cdev, &qedi->dev_info);
2430        if (rc)
2431                goto free_host;
2432
2433        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2434                  "dev_info: num_hwfns=%d affin_hwfn_idx=%d.\n",
2435                  qedi->dev_info.common.num_hwfns,
2436                  qedi_ops->common->get_affin_hwfn_idx(qedi->cdev));
2437
2438        if (mode != QEDI_MODE_RECOVERY) {
2439                rc = qedi_set_iscsi_pf_param(qedi);
2440                if (rc) {
2441                        rc = -ENOMEM;
2442                        QEDI_ERR(&qedi->dbg_ctx,
2443                                 "Set iSCSI pf param fail\n");
2444                        goto free_host;
2445                }
2446        }
2447
2448        qedi_ops->common->update_pf_params(qedi->cdev, &qedi->pf_params);
2449
2450        rc = qedi_prepare_fp(qedi);
2451        if (rc) {
2452                QEDI_ERR(&qedi->dbg_ctx, "Cannot start slowpath.\n");
2453                goto free_pf_params;
2454        }
2455
2456        /* Start the Slowpath-process */
2457        memset(&sp_params, 0, sizeof(struct qed_slowpath_params));
2458        sp_params.int_mode = QED_INT_MODE_MSIX;
2459        sp_params.drv_major = QEDI_DRIVER_MAJOR_VER;
2460        sp_params.drv_minor = QEDI_DRIVER_MINOR_VER;
2461        sp_params.drv_rev = QEDI_DRIVER_REV_VER;
2462        sp_params.drv_eng = QEDI_DRIVER_ENG_VER;
2463        strlcpy(sp_params.name, "qedi iSCSI", QED_DRV_VER_STR_SIZE);
2464        rc = qedi_ops->common->slowpath_start(qedi->cdev, &sp_params);
2465        if (rc) {
2466                QEDI_ERR(&qedi->dbg_ctx, "Cannot start slowpath\n");
2467                goto stop_hw;
2468        }
2469
2470        /* update_pf_params needs to be called before and after slowpath
2471         * start
2472         */
2473        qedi_ops->common->update_pf_params(qedi->cdev, &qedi->pf_params);
2474
2475        rc = qedi_setup_int(qedi);
2476        if (rc)
2477                goto stop_iscsi_func;
2478
2479        qedi_ops->common->set_power_state(qedi->cdev, PCI_D0);
2480
2481        /* Learn information crucial for qedi to progress */
2482        rc = qedi_ops->fill_dev_info(qedi->cdev, &qedi->dev_info);
2483        if (rc)
2484                goto stop_iscsi_func;
2485
2486        /* Record BDQ producer doorbell addresses */
2487        qedi->bdq_primary_prod = qedi->dev_info.primary_dbq_rq_addr;
2488        qedi->bdq_secondary_prod = qedi->dev_info.secondary_bdq_rq_addr;
2489        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
2490                  "BDQ primary_prod=%p secondary_prod=%p.\n",
2491                  qedi->bdq_primary_prod,
2492                  qedi->bdq_secondary_prod);
2493
2494        /*
2495         * We need to write the number of BDs in the BDQ we've preallocated so
2496         * the f/w will do a prefetch and we'll get an unsolicited CQE when a
2497         * packet arrives.
2498         */
2499        qedi->bdq_prod_idx = QEDI_BDQ_NUM;
2500        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
2501                  "Writing %d to primary and secondary BDQ doorbell registers.\n",
2502                  qedi->bdq_prod_idx);
2503        writew(qedi->bdq_prod_idx, qedi->bdq_primary_prod);
2504        tmp = readw(qedi->bdq_primary_prod);
2505        writew(qedi->bdq_prod_idx, qedi->bdq_secondary_prod);
2506        tmp = readw(qedi->bdq_secondary_prod);
2507
2508        ether_addr_copy(qedi->mac, qedi->dev_info.common.hw_mac);
2509        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC, "MAC address is %pM.\n",
2510                  qedi->mac);
2511
2512        sprintf(host_buf, "host_%d", qedi->shost->host_no);
2513        qedi_ops->common->set_name(qedi->cdev, host_buf);
2514
2515        qedi_ops->register_ops(qedi->cdev, &qedi_cb_ops, qedi);
2516
2517        memset(&params, 0, sizeof(params));
2518        params.mtu = DEF_PATH_MTU + IPV6_HDR_LEN + TCP_HDR_LEN;
2519        qedi->ll2_mtu = DEF_PATH_MTU;
2520        params.drop_ttl0_packets = 0;
2521        params.rx_vlan_stripping = 1;
2522        ether_addr_copy(params.ll2_mac_address, qedi->dev_info.common.hw_mac);
2523
2524        if (mode != QEDI_MODE_RECOVERY) {
2525                /* set up rx path */
2526                INIT_LIST_HEAD(&qedi->ll2_skb_list);
2527                spin_lock_init(&qedi->ll2_lock);
2528                /* start qedi context */
2529                spin_lock_init(&qedi->hba_lock);
2530                spin_lock_init(&qedi->task_idx_lock);
2531                mutex_init(&qedi->stats_lock);
2532        }
2533        qedi_ops->ll2->register_cb_ops(qedi->cdev, &qedi_ll2_cb_ops, qedi);
2534        qedi_ops->ll2->start(qedi->cdev, &params);
2535
2536        if (mode != QEDI_MODE_RECOVERY) {
2537                qedi->ll2_recv_thread = kthread_run(qedi_ll2_recv_thread,
2538                                                    (void *)qedi,
2539                                                    "qedi_ll2_thread");
2540        }
2541
2542        rc = qedi_ops->start(qedi->cdev, &qedi->tasks,
2543                             qedi, qedi_iscsi_event_cb);
2544        if (rc) {
2545                rc = -ENODEV;
2546                QEDI_ERR(&qedi->dbg_ctx, "Cannot start iSCSI function\n");
2547                goto stop_slowpath;
2548        }
2549
2550        task_start = qedi_get_task_mem(&qedi->tasks, 0);
2551        task_end = qedi_get_task_mem(&qedi->tasks, MAX_TID_BLOCKS_ISCSI - 1);
2552        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_DISC,
2553                  "Task context start=%p, end=%p block_size=%u.\n",
2554                   task_start, task_end, qedi->tasks.size);
2555
2556        memset(&link_params, 0, sizeof(link_params));
2557        link_params.link_up = true;
2558        rc = qedi_ops->common->set_link(qedi->cdev, &link_params);
2559        if (rc) {
2560                QEDI_WARN(&qedi->dbg_ctx, "Link set up failed.\n");
2561                atomic_set(&qedi->link_state, QEDI_LINK_DOWN);
2562        }
2563
2564#ifdef CONFIG_DEBUG_FS
2565        qedi_dbg_host_init(&qedi->dbg_ctx, qedi_debugfs_ops,
2566                           qedi_dbg_fops);
2567#endif
2568        QEDI_INFO(&qedi->dbg_ctx, QEDI_LOG_INFO,
2569                  "QLogic FastLinQ iSCSI Module qedi %s, FW %d.%d.%d.%d\n",
2570                  QEDI_MODULE_VERSION, FW_MAJOR_VERSION, FW_MINOR_VERSION,
2571                  FW_REVISION_VERSION, FW_ENGINEERING_VERSION);
2572
2573        if (mode == QEDI_MODE_NORMAL) {
2574                if (iscsi_host_add(qedi->shost, &pdev->dev)) {
2575                        QEDI_ERR(&qedi->dbg_ctx,
2576                                 "Could not add iscsi host\n");
2577                        rc = -ENOMEM;
2578                        goto remove_host;
2579                }
2580
2581                /* Allocate uio buffers */
2582                rc = qedi_alloc_uio_rings(qedi);
2583                if (rc) {
2584                        QEDI_ERR(&qedi->dbg_ctx,
2585                                 "UIO alloc ring failed err=%d\n", rc);
2586                        goto remove_host;
2587                }
2588
2589                rc = qedi_init_uio(qedi);
2590                if (rc) {
2591                        QEDI_ERR(&qedi->dbg_ctx,
2592                                 "UIO init failed, err=%d\n", rc);
2593                        goto free_uio;
2594                }
2595
2596                /* host the array on iscsi_conn */
2597                rc = qedi_setup_cid_que(qedi);
2598                if (rc) {
2599                        QEDI_ERR(&qedi->dbg_ctx,
2600                                 "Could not setup cid que\n");
2601                        goto free_uio;
2602                }
2603
2604                rc = qedi_cm_alloc_mem(qedi);
2605                if (rc) {
2606                        QEDI_ERR(&qedi->dbg_ctx,
2607                                 "Could not alloc cm memory\n");
2608                        goto free_cid_que;
2609                }
2610
2611                rc = qedi_alloc_itt(qedi);
2612                if (rc) {
2613                        QEDI_ERR(&qedi->dbg_ctx,
2614                                 "Could not alloc itt memory\n");
2615                        goto free_cid_que;
2616                }
2617
2618                sprintf(host_buf, "host_%d", qedi->shost->host_no);
2619                qedi->tmf_thread = create_singlethread_workqueue(host_buf);
2620                if (!qedi->tmf_thread) {
2621                        QEDI_ERR(&qedi->dbg_ctx,
2622                                 "Unable to start tmf thread!\n");
2623                        rc = -ENODEV;
2624                        goto free_cid_que;
2625                }
2626
2627                sprintf(host_buf, "qedi_ofld%d", qedi->shost->host_no);
2628                qedi->offload_thread = create_workqueue(host_buf);
2629                if (!qedi->offload_thread) {
2630                        QEDI_ERR(&qedi->dbg_ctx,
2631                                 "Unable to start offload thread!\n");
2632                        rc = -ENODEV;
2633                        goto free_cid_que;
2634                }
2635
2636                /* F/w needs 1st task context memory entry for performance */
2637                set_bit(QEDI_RESERVE_TASK_ID, qedi->task_idx_map);
2638                atomic_set(&qedi->num_offloads, 0);
2639
2640                if (qedi_setup_boot_info(qedi))
2641                        QEDI_ERR(&qedi->dbg_ctx,
2642                                 "No iSCSI boot target configured\n");
2643
2644                rc = qedi_ops->common->update_drv_state(qedi->cdev, true);
2645                if (rc)
2646                        QEDI_ERR(&qedi->dbg_ctx,
2647                                 "Failed to send drv state to MFW\n");
2648
2649        }
2650
2651        return 0;
2652
2653free_cid_que:
2654        qedi_release_cid_que(qedi);
2655free_uio:
2656        qedi_free_uio(qedi->udev);
2657remove_host:
2658#ifdef CONFIG_DEBUG_FS
2659        qedi_dbg_host_exit(&qedi->dbg_ctx);
2660#endif
2661        iscsi_host_remove(qedi->shost);
2662stop_iscsi_func:
2663        qedi_ops->stop(qedi->cdev);
2664stop_slowpath:
2665        qedi_ops->common->slowpath_stop(qedi->cdev);
2666stop_hw:
2667        qedi_ops->common->remove(qedi->cdev);
2668free_pf_params:
2669        qedi_free_iscsi_pf_param(qedi);
2670free_host:
2671        iscsi_host_free(qedi->shost);
2672exit_probe:
2673        return rc;
2674}
2675
2676static int qedi_probe(struct pci_dev *pdev, const struct pci_device_id *id)
2677{
2678        return __qedi_probe(pdev, QEDI_MODE_NORMAL);
2679}
2680
2681static void qedi_remove(struct pci_dev *pdev)
2682{
2683        __qedi_remove(pdev, QEDI_MODE_NORMAL);
2684}
2685
2686static struct pci_device_id qedi_pci_tbl[] = {
2687        { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, 0x165E) },
2688        { PCI_DEVICE(PCI_VENDOR_ID_QLOGIC, 0x8084) },
2689        { 0 },
2690};
2691MODULE_DEVICE_TABLE(pci, qedi_pci_tbl);
2692
2693static enum cpuhp_state qedi_cpuhp_state;
2694
2695static struct pci_driver qedi_pci_driver = {
2696        .name = QEDI_MODULE_NAME,
2697        .id_table = qedi_pci_tbl,
2698        .probe = qedi_probe,
2699        .remove = qedi_remove,
2700};
2701
2702static int __init qedi_init(void)
2703{
2704        struct qedi_percpu_s *p;
2705        int cpu, rc = 0;
2706
2707        qedi_ops = qed_get_iscsi_ops();
2708        if (!qedi_ops) {
2709                QEDI_ERR(NULL, "Failed to get qed iSCSI operations\n");
2710                return -EINVAL;
2711        }
2712
2713#ifdef CONFIG_DEBUG_FS
2714        qedi_dbg_init("qedi");
2715#endif
2716
2717        qedi_scsi_transport = iscsi_register_transport(&qedi_iscsi_transport);
2718        if (!qedi_scsi_transport) {
2719                QEDI_ERR(NULL, "Could not register qedi transport");
2720                rc = -ENOMEM;
2721                goto exit_qedi_init_1;
2722        }
2723
2724        for_each_possible_cpu(cpu) {
2725                p = &per_cpu(qedi_percpu, cpu);
2726                INIT_LIST_HEAD(&p->work_list);
2727                spin_lock_init(&p->p_work_lock);
2728                p->iothread = NULL;
2729        }
2730
2731        rc = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "scsi/qedi:online",
2732                               qedi_cpu_online, qedi_cpu_offline);
2733        if (rc < 0)
2734                goto exit_qedi_init_2;
2735        qedi_cpuhp_state = rc;
2736
2737        rc = pci_register_driver(&qedi_pci_driver);
2738        if (rc) {
2739                QEDI_ERR(NULL, "Failed to register driver\n");
2740                goto exit_qedi_hp;
2741        }
2742
2743        return 0;
2744
2745exit_qedi_hp:
2746        cpuhp_remove_state(qedi_cpuhp_state);
2747exit_qedi_init_2:
2748        iscsi_unregister_transport(&qedi_iscsi_transport);
2749exit_qedi_init_1:
2750#ifdef CONFIG_DEBUG_FS
2751        qedi_dbg_exit();
2752#endif
2753        qed_put_iscsi_ops();
2754        return rc;
2755}
2756
2757static void __exit qedi_cleanup(void)
2758{
2759        pci_unregister_driver(&qedi_pci_driver);
2760        cpuhp_remove_state(qedi_cpuhp_state);
2761        iscsi_unregister_transport(&qedi_iscsi_transport);
2762
2763#ifdef CONFIG_DEBUG_FS
2764        qedi_dbg_exit();
2765#endif
2766        qed_put_iscsi_ops();
2767}
2768
2769MODULE_DESCRIPTION("QLogic FastLinQ 4xxxx iSCSI Module");
2770MODULE_LICENSE("GPL");
2771MODULE_AUTHOR("QLogic Corporation");
2772MODULE_VERSION(QEDI_MODULE_VERSION);
2773module_init(qedi_init);
2774module_exit(qedi_cleanup);
2775