cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

qedi_main.c (73803B)


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