^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) * bnx2i_iscsi.c: QLogic NetXtreme II iSCSI driver.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (c) 2006 - 2013 Broadcom Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Copyright (c) 2007, 2008 Red Hat, Inc. All rights reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * Copyright (c) 2007, 2008 Mike Christie
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Copyright (c) 2014, QLogic Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * the Free Software Foundation.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * Written by: Anil Veerabhadrappa (anilgv@broadcom.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * Previously Maintained by: Eddie Wai (eddie.wai@broadcom.com)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * Maintained by: QLogic-Storage-Upstream@qlogic.com
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <scsi/scsi_tcq.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <scsi/libiscsi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include "bnx2i.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) struct scsi_transport_template *bnx2i_scsi_xport_template;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) struct iscsi_transport bnx2i_iscsi_transport;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) static struct scsi_host_template bnx2i_host_template;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * Global endpoint resource info
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) static DEFINE_SPINLOCK(bnx2i_resc_lock); /* protects global resources */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) DECLARE_PER_CPU(struct bnx2i_percpu_s, bnx2i_percpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) static int bnx2i_adapter_ready(struct bnx2i_hba *hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) if (!hba || !test_bit(ADAPTER_STATE_UP, &hba->adapter_state) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) test_bit(ADAPTER_STATE_GOING_DOWN, &hba->adapter_state) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) test_bit(ADAPTER_STATE_LINK_DOWN, &hba->adapter_state))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) retval = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * bnx2i_get_write_cmd_bd_idx - identifies various BD bookmarks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * @cmd: iscsi cmd struct pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * @buf_off: absolute buffer offset
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * @start_bd_off: u32 pointer to return the offset within the BD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * indicated by 'start_bd_idx' on which 'buf_off' falls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) * @start_bd_idx: index of the BD on which 'buf_off' falls
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) * identifies & marks various bd info for scsi command's imm data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) * unsolicited data and the first solicited data seq.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) static void bnx2i_get_write_cmd_bd_idx(struct bnx2i_cmd *cmd, u32 buf_off,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) u32 *start_bd_off, u32 *start_bd_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) struct iscsi_bd *bd_tbl = cmd->io_tbl.bd_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) u32 cur_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) u32 cur_bd_idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) if (buf_off) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) while (buf_off >= (cur_offset + bd_tbl->buffer_length)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) cur_offset += bd_tbl->buffer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) cur_bd_idx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) bd_tbl++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) *start_bd_off = buf_off - cur_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) *start_bd_idx = cur_bd_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) * bnx2i_setup_write_cmd_bd_info - sets up BD various information
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * @task: transport layer's cmd struct pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) * identifies & marks various bd info for scsi command's immediate data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * unsolicited data and first solicited data seq which includes BD start
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) * index & BD buf off. his function takes into account iscsi parameter such
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * as immediate data and unsolicited data is support on this connection.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) static void bnx2i_setup_write_cmd_bd_info(struct iscsi_task *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct bnx2i_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) u32 start_bd_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) u32 start_bd_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) u32 buffer_offset = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) u32 cmd_len = cmd->req.total_data_transfer_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) /* if ImmediateData is turned off & IntialR2T is turned on,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) * there will be no immediate or unsolicited data, just return.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) if (!iscsi_task_has_unsol_data(task) && !task->imm_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* Immediate data */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) buffer_offset += task->imm_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) if (task->imm_count == cmd_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) if (iscsi_task_has_unsol_data(task)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) bnx2i_get_write_cmd_bd_idx(cmd, buffer_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) &start_bd_offset, &start_bd_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) cmd->req.ud_buffer_offset = start_bd_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) cmd->req.ud_start_bd_index = start_bd_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) buffer_offset += task->unsol_r2t.data_length;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) if (buffer_offset != cmd_len) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) bnx2i_get_write_cmd_bd_idx(cmd, buffer_offset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) &start_bd_offset, &start_bd_idx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) if ((start_bd_offset > task->conn->session->first_burst) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) (start_bd_idx > scsi_sg_count(cmd->scsi_cmd))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) int i = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) iscsi_conn_printk(KERN_ALERT, task->conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) "bnx2i- error, buf offset 0x%x "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) "bd_valid %d use_sg %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) buffer_offset, cmd->io_tbl.bd_valid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) scsi_sg_count(cmd->scsi_cmd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) for (i = 0; i < cmd->io_tbl.bd_valid; i++)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) iscsi_conn_printk(KERN_ALERT, task->conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) "bnx2i err, bd[%d]: len %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) i, cmd->io_tbl.bd_tbl[i].\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) buffer_length);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) cmd->req.sd_buffer_offset = start_bd_offset;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) cmd->req.sd_start_bd_index = start_bd_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * bnx2i_map_scsi_sg - maps IO buffer and prepares the BD table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) * @hba: adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * @cmd: iscsi cmd struct pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) * map SG list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) static int bnx2i_map_scsi_sg(struct bnx2i_hba *hba, struct bnx2i_cmd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) struct scsi_cmnd *sc = cmd->scsi_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) struct iscsi_bd *bd = cmd->io_tbl.bd_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) struct scatterlist *sg;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) int byte_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) int bd_count = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) int sg_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) int sg_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) u64 addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) BUG_ON(scsi_sg_count(sc) > ISCSI_MAX_BDS_PER_CMD);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) sg_count = scsi_dma_map(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) scsi_for_each_sg(sc, sg, sg_count, i) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) sg_len = sg_dma_len(sg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) addr = (u64) sg_dma_address(sg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) bd[bd_count].buffer_addr_lo = addr & 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) bd[bd_count].buffer_addr_hi = addr >> 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) bd[bd_count].buffer_length = sg_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) bd[bd_count].flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) if (bd_count == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) bd[bd_count].flags = ISCSI_BD_FIRST_IN_BD_CHAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) byte_count += sg_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) bd_count++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) if (bd_count)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) bd[bd_count - 1].flags |= ISCSI_BD_LAST_IN_BD_CHAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) BUG_ON(byte_count != scsi_bufflen(sc));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) return bd_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) * bnx2i_iscsi_map_sg_list - maps SG list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) * @cmd: iscsi cmd struct pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) * creates BD list table for the command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) static void bnx2i_iscsi_map_sg_list(struct bnx2i_cmd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) int bd_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) bd_count = bnx2i_map_scsi_sg(cmd->conn->hba, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) if (!bd_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) struct iscsi_bd *bd = cmd->io_tbl.bd_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) bd[0].buffer_addr_lo = bd[0].buffer_addr_hi = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) bd[0].buffer_length = bd[0].flags = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) cmd->io_tbl.bd_valid = bd_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) * bnx2i_iscsi_unmap_sg_list - unmaps SG list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) * @cmd: iscsi cmd struct pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) * unmap IO buffers and invalidate the BD table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) void bnx2i_iscsi_unmap_sg_list(struct bnx2i_cmd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) struct scsi_cmnd *sc = cmd->scsi_cmd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) if (cmd->io_tbl.bd_valid && sc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) scsi_dma_unmap(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) cmd->io_tbl.bd_valid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) static void bnx2i_setup_cmd_wqe_template(struct bnx2i_cmd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) memset(&cmd->req, 0x00, sizeof(cmd->req));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) cmd->req.op_code = 0xFF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) cmd->req.bd_list_addr_lo = (u32) cmd->io_tbl.bd_tbl_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) cmd->req.bd_list_addr_hi =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) (u32) ((u64) cmd->io_tbl.bd_tbl_dma >> 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) * bnx2i_bind_conn_to_iscsi_cid - bind conn structure to 'iscsi_cid'
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) * @bnx2i_conn: pointer to iscsi connection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) * @iscsi_cid: iscsi context ID, range 0 - (MAX_CONN - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) * update iscsi cid table entry with connection pointer. This enables
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) * driver to quickly get hold of connection structure pointer in
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) * completion/interrupt thread using iscsi context ID
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) static int bnx2i_bind_conn_to_iscsi_cid(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) struct bnx2i_conn *bnx2i_conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) u32 iscsi_cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) if (hba && hba->cid_que.conn_cid_tbl[iscsi_cid]) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) iscsi_conn_printk(KERN_ALERT, bnx2i_conn->cls_conn->dd_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) "conn bind - entry #%d not free\n", iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) return -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) hba->cid_que.conn_cid_tbl[iscsi_cid] = bnx2i_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) * bnx2i_get_conn_from_id - maps an iscsi cid to corresponding conn ptr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) * @iscsi_cid: iscsi context ID, range 0 - (MAX_CONN - 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) struct bnx2i_conn *bnx2i_get_conn_from_id(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) u16 iscsi_cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) if (!hba->cid_que.conn_cid_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) printk(KERN_ERR "bnx2i: ERROR - missing conn<->cid table\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) } else if (iscsi_cid >= hba->max_active_conns) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) printk(KERN_ERR "bnx2i: wrong cid #%d\n", iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) return hba->cid_que.conn_cid_tbl[iscsi_cid];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) * bnx2i_alloc_iscsi_cid - allocates a iscsi_cid from free pool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) static u32 bnx2i_alloc_iscsi_cid(struct bnx2i_hba *hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) int idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) if (!hba->cid_que.cid_free_cnt)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) idx = hba->cid_que.cid_q_cons_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) hba->cid_que.cid_q_cons_idx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) if (hba->cid_que.cid_q_cons_idx == hba->cid_que.cid_q_max_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) hba->cid_que.cid_q_cons_idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) hba->cid_que.cid_free_cnt--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) return hba->cid_que.cid_que[idx];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) * bnx2i_free_iscsi_cid - returns tcp port to free list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) * @iscsi_cid: iscsi context ID to free
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) static void bnx2i_free_iscsi_cid(struct bnx2i_hba *hba, u16 iscsi_cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) int idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) if (iscsi_cid == (u16) -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) hba->cid_que.cid_free_cnt++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) idx = hba->cid_que.cid_q_prod_idx;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) hba->cid_que.cid_que[idx] = iscsi_cid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) hba->cid_que.conn_cid_tbl[iscsi_cid] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) hba->cid_que.cid_q_prod_idx++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) if (hba->cid_que.cid_q_prod_idx == hba->cid_que.cid_q_max_idx)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) hba->cid_que.cid_q_prod_idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) * bnx2i_setup_free_cid_que - sets up free iscsi cid queue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) * allocates memory for iscsi cid queue & 'cid - conn ptr' mapping table,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) * and initialize table attributes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) static int bnx2i_setup_free_cid_que(struct bnx2i_hba *hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) int mem_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) mem_size = hba->max_active_conns * sizeof(u32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) mem_size = (mem_size + (PAGE_SIZE - 1)) & PAGE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) hba->cid_que.cid_que_base = kmalloc(mem_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) if (!hba->cid_que.cid_que_base)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) mem_size = hba->max_active_conns * sizeof(struct bnx2i_conn *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) mem_size = (mem_size + (PAGE_SIZE - 1)) & PAGE_MASK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) hba->cid_que.conn_cid_tbl = kmalloc(mem_size, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) if (!hba->cid_que.conn_cid_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) kfree(hba->cid_que.cid_que_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) hba->cid_que.cid_que_base = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) hba->cid_que.cid_que = (u32 *)hba->cid_que.cid_que_base;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) hba->cid_que.cid_q_prod_idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) hba->cid_que.cid_q_cons_idx = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) hba->cid_que.cid_q_max_idx = hba->max_active_conns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) hba->cid_que.cid_free_cnt = hba->max_active_conns;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) for (i = 0; i < hba->max_active_conns; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) hba->cid_que.cid_que[i] = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) hba->cid_que.conn_cid_tbl[i] = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) * bnx2i_release_free_cid_que - releases 'iscsi_cid' queue resources
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) static void bnx2i_release_free_cid_que(struct bnx2i_hba *hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) kfree(hba->cid_que.cid_que_base);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) hba->cid_que.cid_que_base = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) kfree(hba->cid_que.conn_cid_tbl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) hba->cid_que.conn_cid_tbl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * bnx2i_alloc_ep - allocates ep structure from global pool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) * routine allocates a free endpoint structure from global pool and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) * a tcp port to be used for this connection. Global resource lock,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) * 'bnx2i_resc_lock' is held while accessing shared global data structures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) static struct iscsi_endpoint *bnx2i_alloc_ep(struct bnx2i_hba *hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) struct iscsi_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) struct bnx2i_endpoint *bnx2i_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) u32 ec_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) ep = iscsi_create_endpoint(sizeof(*bnx2i_ep));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) if (!ep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) printk(KERN_ERR "bnx2i: Could not allocate ep\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) bnx2i_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) bnx2i_ep->cls_ep = ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) INIT_LIST_HEAD(&bnx2i_ep->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) bnx2i_ep->state = EP_STATE_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) bnx2i_ep->ep_iscsi_cid = (u16) -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) bnx2i_ep->hba = hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) bnx2i_ep->hba_age = hba->age;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) ec_div = event_coal_div;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) while (ec_div >>= 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) bnx2i_ep->ec_shift += 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) hba->ofld_conns_active++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) init_waitqueue_head(&bnx2i_ep->ofld_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) return ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) * bnx2i_free_ep - free endpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) * @ep: pointer to iscsi endpoint structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) static void bnx2i_free_ep(struct iscsi_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) struct bnx2i_endpoint *bnx2i_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) spin_lock_irqsave(&bnx2i_resc_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) bnx2i_ep->state = EP_STATE_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) bnx2i_ep->hba->ofld_conns_active--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) if (bnx2i_ep->ep_iscsi_cid != (u16) -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) bnx2i_free_iscsi_cid(bnx2i_ep->hba, bnx2i_ep->ep_iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) if (bnx2i_ep->conn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) bnx2i_ep->conn->ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) bnx2i_ep->conn = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) bnx2i_ep->hba = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) spin_unlock_irqrestore(&bnx2i_resc_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) iscsi_destroy_endpoint(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) * bnx2i_alloc_bdt - allocates buffer descriptor (BD) table for the command
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) * @hba: adapter instance pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) * @session: iscsi session pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) * @cmd: iscsi command structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) static int bnx2i_alloc_bdt(struct bnx2i_hba *hba, struct iscsi_session *session,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) struct bnx2i_cmd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) struct io_bdt *io = &cmd->io_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) struct iscsi_bd *bd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) io->bd_tbl = dma_alloc_coherent(&hba->pcidev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) ISCSI_MAX_BDS_PER_CMD * sizeof(*bd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) &io->bd_tbl_dma, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) if (!io->bd_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) iscsi_session_printk(KERN_ERR, session, "Could not "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) "allocate bdt.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) io->bd_valid = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) * bnx2i_destroy_cmd_pool - destroys iscsi command pool and release BD table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) * @hba: adapter instance pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) * @session: iscsi session pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) static void bnx2i_destroy_cmd_pool(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) struct iscsi_session *session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) for (i = 0; i < session->cmds_max; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) struct iscsi_task *task = session->cmds[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) struct bnx2i_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) if (cmd->io_tbl.bd_tbl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) dma_free_coherent(&hba->pcidev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) ISCSI_MAX_BDS_PER_CMD *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) sizeof(struct iscsi_bd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) cmd->io_tbl.bd_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) cmd->io_tbl.bd_tbl_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) * bnx2i_setup_cmd_pool - sets up iscsi command pool for the session
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) * @hba: adapter instance pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) * @session: iscsi session pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) static int bnx2i_setup_cmd_pool(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) struct iscsi_session *session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) for (i = 0; i < session->cmds_max; i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) struct iscsi_task *task = session->cmds[i];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) struct bnx2i_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) task->hdr = &cmd->hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) task->hdr_max = sizeof(struct iscsi_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) if (bnx2i_alloc_bdt(hba, session, cmd))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) goto free_bdts;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) free_bdts:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) bnx2i_destroy_cmd_pool(hba, session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) * bnx2i_setup_mp_bdt - allocate BD table resources
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) * @hba: pointer to adapter structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) * Allocate memory for dummy buffer and associated BD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) * table to be used by middle path (MP) requests
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) static int bnx2i_setup_mp_bdt(struct bnx2i_hba *hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) struct iscsi_bd *mp_bdt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) u64 addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) hba->mp_bd_tbl = dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) &hba->mp_bd_dma, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) if (!hba->mp_bd_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) printk(KERN_ERR "unable to allocate Middle Path BDT\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) rc = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) hba->dummy_buffer = dma_alloc_coherent(&hba->pcidev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) CNIC_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) &hba->dummy_buf_dma, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) if (!hba->dummy_buffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) printk(KERN_ERR "unable to alloc Middle Path Dummy Buffer\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) hba->mp_bd_tbl, hba->mp_bd_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) hba->mp_bd_tbl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) rc = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) mp_bdt = (struct iscsi_bd *) hba->mp_bd_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) addr = (unsigned long) hba->dummy_buf_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) mp_bdt->buffer_addr_lo = addr & 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) mp_bdt->buffer_addr_hi = addr >> 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) mp_bdt->buffer_length = CNIC_PAGE_SIZE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) mp_bdt->flags = ISCSI_BD_LAST_IN_BD_CHAIN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) ISCSI_BD_FIRST_IN_BD_CHAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) * bnx2i_free_mp_bdt - releases ITT back to free pool
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) * free MP dummy buffer and associated BD table
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) static void bnx2i_free_mp_bdt(struct bnx2i_hba *hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) if (hba->mp_bd_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) hba->mp_bd_tbl, hba->mp_bd_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) hba->mp_bd_tbl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) if (hba->dummy_buffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) hba->dummy_buffer, hba->dummy_buf_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) hba->dummy_buffer = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) * bnx2i_drop_session - notifies iscsid of connection error.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) * @cls_session: iscsi cls session pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) * This notifies iscsid that there is a error, so it can initiate
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) * recovery.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) * This relies on caller using the iscsi class iterator so the object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) * is refcounted and does not disapper from under us.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) void bnx2i_drop_session(struct iscsi_cls_session *cls_session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) iscsi_session_failure(cls_session->dd_data, ISCSI_ERR_CONN_FAILED);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) * bnx2i_ep_destroy_list_add - add an entry to EP destroy list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) * @ep: pointer to endpoint (transport identifier) structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) * EP destroy queue manager
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) static int bnx2i_ep_destroy_list_add(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) struct bnx2i_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) write_lock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) list_add_tail(&ep->link, &hba->ep_destroy_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) write_unlock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) * bnx2i_ep_destroy_list_del - add an entry to EP destroy list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) * @ep: pointer to endpoint (transport identifier) structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) * EP destroy queue manager
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) static int bnx2i_ep_destroy_list_del(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) struct bnx2i_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) write_lock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) list_del_init(&ep->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) write_unlock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) * bnx2i_ep_ofld_list_add - add an entry to ep offload pending list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) * @ep: pointer to endpoint (transport identifier) structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) * pending conn offload completion queue manager
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) static int bnx2i_ep_ofld_list_add(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) struct bnx2i_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) write_lock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) list_add_tail(&ep->link, &hba->ep_ofld_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) write_unlock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) * bnx2i_ep_ofld_list_del - add an entry to ep offload pending list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) * @ep: pointer to endpoint (transport identifier) structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) * pending conn offload completion queue manager
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) static int bnx2i_ep_ofld_list_del(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) struct bnx2i_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) write_lock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) list_del_init(&ep->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) write_unlock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) * bnx2i_find_ep_in_ofld_list - find iscsi_cid in pending list of endpoints
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) * @iscsi_cid: iscsi context ID to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) struct bnx2i_endpoint *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) bnx2i_find_ep_in_ofld_list(struct bnx2i_hba *hba, u32 iscsi_cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) struct list_head *list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) struct list_head *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) struct bnx2i_endpoint *ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) read_lock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) list_for_each_safe(list, tmp, &hba->ep_ofld_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) ep = (struct bnx2i_endpoint *)list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) if (ep->ep_iscsi_cid == iscsi_cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) read_unlock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) printk(KERN_ERR "l5 cid %d not found\n", iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) return ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) * bnx2i_find_ep_in_destroy_list - find iscsi_cid in destroy list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) * @iscsi_cid: iscsi context ID to find
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) struct bnx2i_endpoint *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) bnx2i_find_ep_in_destroy_list(struct bnx2i_hba *hba, u32 iscsi_cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) struct list_head *list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) struct list_head *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) struct bnx2i_endpoint *ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706) read_lock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) list_for_each_safe(list, tmp, &hba->ep_destroy_list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708) ep = (struct bnx2i_endpoint *)list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) if (ep->ep_iscsi_cid == iscsi_cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714) read_unlock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717) printk(KERN_ERR "l5 cid %d not found\n", iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) return ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) * bnx2i_ep_active_list_add - add an entry to ep active list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) * @ep: pointer to endpoint (transport identifier) structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) * current active conn queue manager
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) static void bnx2i_ep_active_list_add(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) struct bnx2i_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) write_lock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733) list_add_tail(&ep->link, &hba->ep_active_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) write_unlock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) * bnx2i_ep_active_list_del - deletes an entry to ep active list
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) * @ep: pointer to endpoint (transport identifier) structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) * current active conn queue manager
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) static void bnx2i_ep_active_list_del(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) struct bnx2i_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) write_lock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) list_del_init(&ep->link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) write_unlock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) * bnx2i_setup_host_queue_size - assigns shost->can_queue param
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) * @shost: scsi host pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) * Initializes 'can_queue' parameter based on how many outstanding commands
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) * the device can handle. Each device 5708/5709/57710 has different
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761) * capabilities
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) static void bnx2i_setup_host_queue_size(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) struct Scsi_Host *shost)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) if (test_bit(BNX2I_NX2_DEV_5708, &hba->cnic_dev_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) shost->can_queue = ISCSI_MAX_CMDS_PER_HBA_5708;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) else if (test_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) shost->can_queue = ISCSI_MAX_CMDS_PER_HBA_5709;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) else if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) shost->can_queue = ISCSI_MAX_CMDS_PER_HBA_57710;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) shost->can_queue = ISCSI_MAX_CMDS_PER_HBA_5708;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) * bnx2i_alloc_hba - allocate and init adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) * @cnic: cnic device pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) * allocate & initialize adapter structure and call other
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) * support routines to do per adapter initialization
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) struct bnx2i_hba *bnx2i_alloc_hba(struct cnic_dev *cnic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) struct bnx2i_hba *hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) shost = iscsi_host_alloc(&bnx2i_host_template, sizeof(*hba), 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) if (!shost)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) shost->dma_boundary = cnic->pcidev->dma_mask;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) shost->transportt = bnx2i_scsi_xport_template;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) shost->max_id = ISCSI_MAX_CONNS_PER_HBA - 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) shost->max_channel = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) shost->max_lun = 512;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) shost->max_cmd_len = 16;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) hba = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) hba->shost = shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) hba->netdev = cnic->netdev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) /* Get PCI related information and update hba struct members */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) hba->pcidev = cnic->pcidev;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) pci_dev_get(hba->pcidev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) hba->pci_did = hba->pcidev->device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) hba->pci_vid = hba->pcidev->vendor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) hba->pci_sdid = hba->pcidev->subsystem_device;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) hba->pci_svid = hba->pcidev->subsystem_vendor;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) hba->pci_func = PCI_FUNC(hba->pcidev->devfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) hba->pci_devno = PCI_SLOT(hba->pcidev->devfn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) bnx2i_identify_device(hba, cnic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) bnx2i_setup_host_queue_size(hba, shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) hba->reg_base = pci_resource_start(hba->pcidev, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) if (test_bit(BNX2I_NX2_DEV_5709, &hba->cnic_dev_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) hba->regview = pci_iomap(hba->pcidev, 0, BNX2_MQ_CONFIG2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) if (!hba->regview)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) goto ioreg_map_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) } else if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) hba->regview = pci_iomap(hba->pcidev, 0, 4096);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) if (!hba->regview)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) goto ioreg_map_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) if (bnx2i_setup_mp_bdt(hba))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) goto mp_bdt_mem_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) INIT_LIST_HEAD(&hba->ep_ofld_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) INIT_LIST_HEAD(&hba->ep_active_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) INIT_LIST_HEAD(&hba->ep_destroy_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) rwlock_init(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) hba->mtu_supported = BNX2I_MAX_MTU_SUPPORTED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 835)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 836) /* different values for 5708/5709/57710 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 837) hba->max_active_conns = ISCSI_MAX_CONNS_PER_HBA;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 838)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 839) if (bnx2i_setup_free_cid_que(hba))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 840) goto cid_que_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 841)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 842) /* SQ/RQ/CQ size can be changed via sysfx interface */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 843) if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 844) if (sq_size && sq_size <= BNX2I_5770X_SQ_WQES_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 845) hba->max_sqes = sq_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 846) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 847) hba->max_sqes = BNX2I_5770X_SQ_WQES_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 848) } else { /* 5706/5708/5709 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 849) if (sq_size && sq_size <= BNX2I_570X_SQ_WQES_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 850) hba->max_sqes = sq_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 851) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 852) hba->max_sqes = BNX2I_570X_SQ_WQES_DEFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 853) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 855) hba->max_rqes = rq_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 856) hba->max_cqes = hba->max_sqes + rq_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 857) if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 858) if (hba->max_cqes > BNX2I_5770X_CQ_WQES_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 859) hba->max_cqes = BNX2I_5770X_CQ_WQES_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 860) } else if (hba->max_cqes > BNX2I_570X_CQ_WQES_MAX)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 861) hba->max_cqes = BNX2I_570X_CQ_WQES_MAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 862)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 863) hba->num_ccell = hba->max_sqes / 2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 864)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 865) spin_lock_init(&hba->lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 866) mutex_init(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 867) init_waitqueue_head(&hba->eh_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 868) if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 869) hba->hba_shutdown_tmo = 30 * HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 870) hba->conn_teardown_tmo = 20 * HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 871) hba->conn_ctx_destroy_tmo = 6 * HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 872) } else { /* 5706/5708/5709 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 873) hba->hba_shutdown_tmo = 20 * HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 874) hba->conn_teardown_tmo = 10 * HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 875) hba->conn_ctx_destroy_tmo = 2 * HZ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 876) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 877)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 878) #ifdef CONFIG_32BIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 879) spin_lock_init(&hba->stat_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 880) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 881) memset(&hba->stats, 0, sizeof(struct iscsi_stats_info));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 883) if (iscsi_host_add(shost, &hba->pcidev->dev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 884) goto free_dump_mem;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 885) return hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 886)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 887) free_dump_mem:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 888) bnx2i_release_free_cid_que(hba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 889) cid_que_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 890) bnx2i_free_mp_bdt(hba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 891) mp_bdt_mem_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 892) if (hba->regview) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 893) pci_iounmap(hba->pcidev, hba->regview);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 894) hba->regview = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 895) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 896) ioreg_map_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 897) pci_dev_put(hba->pcidev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 898) scsi_host_put(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 899) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 900) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 901)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 902) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 903) * bnx2i_free_hba- releases hba structure and resources held by the adapter
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 904) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 905) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 906) * free adapter structure and call various cleanup routines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 907) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 908) void bnx2i_free_hba(struct bnx2i_hba *hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 909) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 910) struct Scsi_Host *shost = hba->shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 911)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 912) iscsi_host_remove(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 913) INIT_LIST_HEAD(&hba->ep_ofld_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 914) INIT_LIST_HEAD(&hba->ep_active_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 915) INIT_LIST_HEAD(&hba->ep_destroy_list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 916)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 917) if (hba->regview) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 918) pci_iounmap(hba->pcidev, hba->regview);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 919) hba->regview = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 920) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 921) pci_dev_put(hba->pcidev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 922) bnx2i_free_mp_bdt(hba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 923) bnx2i_release_free_cid_que(hba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 924) iscsi_host_free(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 925) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 926)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 927) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 928) * bnx2i_conn_free_login_resources - free DMA resources used for login process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 929) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 930) * @bnx2i_conn: iscsi connection pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 931) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 932) * Login related resources, mostly BDT & payload DMA memory is freed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 933) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 934) static void bnx2i_conn_free_login_resources(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 935) struct bnx2i_conn *bnx2i_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 936) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 937) if (bnx2i_conn->gen_pdu.resp_bd_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 938) dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 939) bnx2i_conn->gen_pdu.resp_bd_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 940) bnx2i_conn->gen_pdu.resp_bd_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 941) bnx2i_conn->gen_pdu.resp_bd_tbl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 942) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 943)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 944) if (bnx2i_conn->gen_pdu.req_bd_tbl) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 945) dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 946) bnx2i_conn->gen_pdu.req_bd_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 947) bnx2i_conn->gen_pdu.req_bd_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 948) bnx2i_conn->gen_pdu.req_bd_tbl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 949) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 951) if (bnx2i_conn->gen_pdu.resp_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 952) dma_free_coherent(&hba->pcidev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 953) ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 954) bnx2i_conn->gen_pdu.resp_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 955) bnx2i_conn->gen_pdu.resp_dma_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 956) bnx2i_conn->gen_pdu.resp_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 957) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 958)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 959) if (bnx2i_conn->gen_pdu.req_buf) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 960) dma_free_coherent(&hba->pcidev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 961) ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 962) bnx2i_conn->gen_pdu.req_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 963) bnx2i_conn->gen_pdu.req_dma_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 964) bnx2i_conn->gen_pdu.req_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 965) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 966) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 967)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 968) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 969) * bnx2i_conn_alloc_login_resources - alloc DMA resources for login/nop.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 970) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 971) * @bnx2i_conn: iscsi connection pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 972) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 973) * Mgmt task DNA resources are allocated in this routine.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 974) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 975) static int bnx2i_conn_alloc_login_resources(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 976) struct bnx2i_conn *bnx2i_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 977) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 978) /* Allocate memory for login request/response buffers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 979) bnx2i_conn->gen_pdu.req_buf =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 980) dma_alloc_coherent(&hba->pcidev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 981) ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 982) &bnx2i_conn->gen_pdu.req_dma_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 983) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 984) if (bnx2i_conn->gen_pdu.req_buf == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 985) goto login_req_buf_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 986)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 987) bnx2i_conn->gen_pdu.req_buf_size = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 988) bnx2i_conn->gen_pdu.req_wr_ptr = bnx2i_conn->gen_pdu.req_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 989)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 990) bnx2i_conn->gen_pdu.resp_buf =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 991) dma_alloc_coherent(&hba->pcidev->dev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 992) ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 993) &bnx2i_conn->gen_pdu.resp_dma_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 994) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 995) if (bnx2i_conn->gen_pdu.resp_buf == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 996) goto login_resp_buf_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 997)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 998) bnx2i_conn->gen_pdu.resp_buf_size = ISCSI_DEF_MAX_RECV_SEG_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 999) bnx2i_conn->gen_pdu.resp_wr_ptr = bnx2i_conn->gen_pdu.resp_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1000)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1001) bnx2i_conn->gen_pdu.req_bd_tbl =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1002) dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1003) &bnx2i_conn->gen_pdu.req_bd_dma, GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1004) if (bnx2i_conn->gen_pdu.req_bd_tbl == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1005) goto login_req_bd_tbl_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1006)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1007) bnx2i_conn->gen_pdu.resp_bd_tbl =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1008) dma_alloc_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1009) &bnx2i_conn->gen_pdu.resp_bd_dma,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1010) GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1011) if (bnx2i_conn->gen_pdu.resp_bd_tbl == NULL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1012) goto login_resp_bd_tbl_failure;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1013)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1014) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1016) login_resp_bd_tbl_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1017) dma_free_coherent(&hba->pcidev->dev, CNIC_PAGE_SIZE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1018) bnx2i_conn->gen_pdu.req_bd_tbl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1019) bnx2i_conn->gen_pdu.req_bd_dma);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1020) bnx2i_conn->gen_pdu.req_bd_tbl = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1021)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1022) login_req_bd_tbl_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1023) dma_free_coherent(&hba->pcidev->dev, ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1024) bnx2i_conn->gen_pdu.resp_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1025) bnx2i_conn->gen_pdu.resp_dma_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1026) bnx2i_conn->gen_pdu.resp_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1027) login_resp_buf_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1028) dma_free_coherent(&hba->pcidev->dev, ISCSI_DEF_MAX_RECV_SEG_LEN,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1029) bnx2i_conn->gen_pdu.req_buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1030) bnx2i_conn->gen_pdu.req_dma_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1031) bnx2i_conn->gen_pdu.req_buf = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1032) login_req_buf_failure:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1033) iscsi_conn_printk(KERN_ERR, bnx2i_conn->cls_conn->dd_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1034) "login resource alloc failed!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1035) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1036)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1037) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1039)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1040) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1041) * bnx2i_iscsi_prep_generic_pdu_bd - prepares BD table.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1042) * @bnx2i_conn: iscsi connection pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1043) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1044) * Allocates buffers and BD tables before shipping requests to cnic
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1045) * for PDUs prepared by 'iscsid' daemon
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1046) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1047) static void bnx2i_iscsi_prep_generic_pdu_bd(struct bnx2i_conn *bnx2i_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1048) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1049) struct iscsi_bd *bd_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1051) bd_tbl = (struct iscsi_bd *) bnx2i_conn->gen_pdu.req_bd_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1052)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1053) bd_tbl->buffer_addr_hi =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1054) (u32) ((u64) bnx2i_conn->gen_pdu.req_dma_addr >> 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1055) bd_tbl->buffer_addr_lo = (u32) bnx2i_conn->gen_pdu.req_dma_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1056) bd_tbl->buffer_length = bnx2i_conn->gen_pdu.req_wr_ptr -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1057) bnx2i_conn->gen_pdu.req_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1058) bd_tbl->reserved0 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1059) bd_tbl->flags = ISCSI_BD_LAST_IN_BD_CHAIN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1060) ISCSI_BD_FIRST_IN_BD_CHAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1061)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1062) bd_tbl = (struct iscsi_bd *) bnx2i_conn->gen_pdu.resp_bd_tbl;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1063) bd_tbl->buffer_addr_hi = (u64) bnx2i_conn->gen_pdu.resp_dma_addr >> 32;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1064) bd_tbl->buffer_addr_lo = (u32) bnx2i_conn->gen_pdu.resp_dma_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1065) bd_tbl->buffer_length = ISCSI_DEF_MAX_RECV_SEG_LEN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1066) bd_tbl->reserved0 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1067) bd_tbl->flags = ISCSI_BD_LAST_IN_BD_CHAIN |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1068) ISCSI_BD_FIRST_IN_BD_CHAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1069) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1070)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1071)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1072) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1073) * bnx2i_iscsi_send_generic_request - called to send mgmt tasks.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1074) * @task: transport layer task pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1075) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1076) * called to transmit PDUs prepared by the 'iscsid' daemon. iSCSI login,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1077) * Nop-out and Logout requests flow through this path.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1078) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1079) static int bnx2i_iscsi_send_generic_request(struct iscsi_task *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1080) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1081) struct bnx2i_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1082) struct bnx2i_conn *bnx2i_conn = cmd->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1083) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1084) char *buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1085) int data_len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1086)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1087) bnx2i_iscsi_prep_generic_pdu_bd(bnx2i_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1088) switch (task->hdr->opcode & ISCSI_OPCODE_MASK) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1089) case ISCSI_OP_LOGIN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1090) bnx2i_send_iscsi_login(bnx2i_conn, task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1091) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1092) case ISCSI_OP_NOOP_OUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1093) data_len = bnx2i_conn->gen_pdu.req_buf_size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1094) buf = bnx2i_conn->gen_pdu.req_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1095) if (data_len)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1096) rc = bnx2i_send_iscsi_nopout(bnx2i_conn, task,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1097) buf, data_len, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1098) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1099) rc = bnx2i_send_iscsi_nopout(bnx2i_conn, task,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1100) NULL, 0, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1101) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1102) case ISCSI_OP_LOGOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1103) rc = bnx2i_send_iscsi_logout(bnx2i_conn, task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1104) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1105) case ISCSI_OP_SCSI_TMFUNC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1106) rc = bnx2i_send_iscsi_tmf(bnx2i_conn, task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1107) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1108) case ISCSI_OP_TEXT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1109) rc = bnx2i_send_iscsi_text(bnx2i_conn, task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1110) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1111) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1112) iscsi_conn_printk(KERN_ALERT, bnx2i_conn->cls_conn->dd_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1113) "send_gen: unsupported op 0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1114) task->hdr->opcode);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1115) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1116) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1117) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1119)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1120) /**********************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1121) * SCSI-ML Interface
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1122) **********************************************************************/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1124) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1125) * bnx2i_cpy_scsi_cdb - copies LUN & CDB fields in required format to sq wqe
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1126) * @sc: SCSI-ML command pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1127) * @cmd: iscsi cmd pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1128) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1129) static void bnx2i_cpy_scsi_cdb(struct scsi_cmnd *sc, struct bnx2i_cmd *cmd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1130) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1131) u32 dword;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1132) int lpcnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1133) u8 *srcp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1134) u32 *dstp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1135) u32 scsi_lun[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1137) int_to_scsilun(sc->device->lun, (struct scsi_lun *) scsi_lun);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1138) cmd->req.lun[0] = be32_to_cpu(scsi_lun[0]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1139) cmd->req.lun[1] = be32_to_cpu(scsi_lun[1]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1140)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1141) lpcnt = cmd->scsi_cmd->cmd_len / sizeof(dword);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1142) srcp = (u8 *) sc->cmnd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1143) dstp = (u32 *) cmd->req.cdb;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1144) while (lpcnt--) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1145) memcpy(&dword, (const void *) srcp, 4);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1146) *dstp = cpu_to_be32(dword);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1147) srcp += 4;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1148) dstp++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1150) if (sc->cmd_len & 0x3) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1151) dword = (u32) srcp[0] | ((u32) srcp[1] << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1152) *dstp = cpu_to_be32(dword);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1154) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1156) static void bnx2i_cleanup_task(struct iscsi_task *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1158) struct iscsi_conn *conn = task->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1159) struct bnx2i_conn *bnx2i_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1160) struct bnx2i_hba *hba = bnx2i_conn->hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1162) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1163) * mgmt task or cmd was never sent to us to transmit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1164) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1165) if (!task->sc || task->state == ISCSI_TASK_PENDING)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1166) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1167) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1168) * need to clean-up task context to claim dma buffers
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1169) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1170) if (task->state == ISCSI_TASK_ABRT_TMF) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1171) bnx2i_send_cmd_cleanup_req(hba, task->dd_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1173) spin_unlock_bh(&conn->session->back_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1174) spin_unlock_bh(&conn->session->frwd_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1175) wait_for_completion_timeout(&bnx2i_conn->cmd_cleanup_cmpl,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1176) msecs_to_jiffies(ISCSI_CMD_CLEANUP_TIMEOUT));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1177) spin_lock_bh(&conn->session->frwd_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1178) spin_lock_bh(&conn->session->back_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1179) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1180) bnx2i_iscsi_unmap_sg_list(task->dd_data);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1181) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1183) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1184) * bnx2i_mtask_xmit - transmit mtask to chip for further processing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1185) * @conn: transport layer conn structure pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1186) * @task: transport layer command structure pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1187) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1188) static int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1189) bnx2i_mtask_xmit(struct iscsi_conn *conn, struct iscsi_task *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1191) struct bnx2i_conn *bnx2i_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1192) struct bnx2i_hba *hba = bnx2i_conn->hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1193) struct bnx2i_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1194)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1195) memset(bnx2i_conn->gen_pdu.req_buf, 0, ISCSI_DEF_MAX_RECV_SEG_LEN);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1197) bnx2i_setup_cmd_wqe_template(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1198) bnx2i_conn->gen_pdu.req_buf_size = task->data_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1200) /* Tx PDU/data length count */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1201) ADD_STATS_64(hba, tx_pdus, 1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1202) ADD_STATS_64(hba, tx_bytes, task->data_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1203)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1204) if (task->data_count) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1205) memcpy(bnx2i_conn->gen_pdu.req_buf, task->data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1206) task->data_count);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1207) bnx2i_conn->gen_pdu.req_wr_ptr =
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1208) bnx2i_conn->gen_pdu.req_buf + task->data_count;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1209) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1210) cmd->conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1211) cmd->scsi_cmd = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1212) return bnx2i_iscsi_send_generic_request(task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1213) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1214)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1215) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1216) * bnx2i_task_xmit - transmit iscsi command to chip for further processing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1217) * @task: transport layer command structure pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1218) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1219) * maps SG buffers and send request to chip/firmware in the form of SQ WQE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1220) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1221) static int bnx2i_task_xmit(struct iscsi_task *task)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1222) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1223) struct iscsi_conn *conn = task->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1224) struct iscsi_session *session = conn->session;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1225) struct Scsi_Host *shost = iscsi_session_to_shost(session->cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1226) struct bnx2i_hba *hba = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1227) struct bnx2i_conn *bnx2i_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1228) struct scsi_cmnd *sc = task->sc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1229) struct bnx2i_cmd *cmd = task->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1230) struct iscsi_scsi_req *hdr = (struct iscsi_scsi_req *)task->hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1231)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1232) if (atomic_read(&bnx2i_conn->ep->num_active_cmds) + 1 >
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1233) hba->max_sqes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1234) return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1235)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1236) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1237) * If there is no scsi_cmnd this must be a mgmt task
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1238) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1239) if (!sc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1240) return bnx2i_mtask_xmit(conn, task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1241)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1242) bnx2i_setup_cmd_wqe_template(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1243) cmd->req.op_code = ISCSI_OP_SCSI_CMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1244) cmd->conn = bnx2i_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1245) cmd->scsi_cmd = sc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1246) cmd->req.total_data_transfer_length = scsi_bufflen(sc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1247) cmd->req.cmd_sn = be32_to_cpu(hdr->cmdsn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1249) bnx2i_iscsi_map_sg_list(cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1250) bnx2i_cpy_scsi_cdb(sc, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1251)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1252) cmd->req.op_attr = ISCSI_ATTR_SIMPLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1253) if (sc->sc_data_direction == DMA_TO_DEVICE) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1254) cmd->req.op_attr |= ISCSI_CMD_REQUEST_WRITE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1255) cmd->req.itt = task->itt |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1256) (ISCSI_TASK_TYPE_WRITE << ISCSI_CMD_REQUEST_TYPE_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1257) bnx2i_setup_write_cmd_bd_info(task);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1258) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1259) if (scsi_bufflen(sc))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1260) cmd->req.op_attr |= ISCSI_CMD_REQUEST_READ;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1261) cmd->req.itt = task->itt |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1262) (ISCSI_TASK_TYPE_READ << ISCSI_CMD_REQUEST_TYPE_SHIFT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1263) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1264)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1265) cmd->req.num_bds = cmd->io_tbl.bd_valid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1266) if (!cmd->io_tbl.bd_valid) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1267) cmd->req.bd_list_addr_lo = (u32) hba->mp_bd_dma;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1268) cmd->req.bd_list_addr_hi = (u32) ((u64) hba->mp_bd_dma >> 32);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1269) cmd->req.num_bds = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1270) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1271)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1272) bnx2i_send_iscsi_scsicmd(bnx2i_conn, cmd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1273) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1276) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1277) * bnx2i_session_create - create a new iscsi session
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1278) * @ep: pointer to iscsi endpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1279) * @cmds_max: user specified maximum commands
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1280) * @qdepth: scsi queue depth to support
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1281) * @initial_cmdsn: initial iscsi CMDSN to be used for this session
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1282) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1283) * Creates a new iSCSI session instance on given device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1284) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1285) static struct iscsi_cls_session *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1286) bnx2i_session_create(struct iscsi_endpoint *ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1287) uint16_t cmds_max, uint16_t qdepth,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1288) uint32_t initial_cmdsn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1290) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1291) struct iscsi_cls_session *cls_session;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1292) struct bnx2i_hba *hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1293) struct bnx2i_endpoint *bnx2i_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1295) if (!ep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1296) printk(KERN_ERR "bnx2i: missing ep.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1297) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1298) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1299)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1300) bnx2i_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1301) shost = bnx2i_ep->hba->shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1302) hba = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1303) if (bnx2i_adapter_ready(hba))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1304) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1305)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1306) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1307) * user can override hw limit as long as it is within
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1308) * the min/max.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1309) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1310) if (cmds_max > hba->max_sqes)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1311) cmds_max = hba->max_sqes;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1312) else if (cmds_max < BNX2I_SQ_WQES_MIN)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1313) cmds_max = BNX2I_SQ_WQES_MIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1314)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1315) cls_session = iscsi_session_setup(&bnx2i_iscsi_transport, shost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1316) cmds_max, 0, sizeof(struct bnx2i_cmd),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1317) initial_cmdsn, ISCSI_MAX_TARGET);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1318) if (!cls_session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1319) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1320)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1321) if (bnx2i_setup_cmd_pool(hba, cls_session->dd_data))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1322) goto session_teardown;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1323) return cls_session;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1324)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1325) session_teardown:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1326) iscsi_session_teardown(cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1327) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1328) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1329)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1330)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1331) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1332) * bnx2i_session_destroy - destroys iscsi session
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1333) * @cls_session: pointer to iscsi cls session
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1334) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1335) * Destroys previously created iSCSI session instance and releases
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1336) * all resources held by it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1337) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1338) static void bnx2i_session_destroy(struct iscsi_cls_session *cls_session)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1339) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1340) struct iscsi_session *session = cls_session->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1341) struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1342) struct bnx2i_hba *hba = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1343)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1344) bnx2i_destroy_cmd_pool(hba, session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1345) iscsi_session_teardown(cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1346) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1347)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1348)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1349) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1350) * bnx2i_conn_create - create iscsi connection instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1351) * @cls_session: pointer to iscsi cls session
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1352) * @cid: iscsi cid as per rfc (not NX2's CID terminology)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1353) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1354) * Creates a new iSCSI connection instance for a given session
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1355) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1356) static struct iscsi_cls_conn *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1357) bnx2i_conn_create(struct iscsi_cls_session *cls_session, uint32_t cid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1358) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1359) struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1360) struct bnx2i_hba *hba = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1361) struct bnx2i_conn *bnx2i_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1362) struct iscsi_cls_conn *cls_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1363) struct iscsi_conn *conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1365) cls_conn = iscsi_conn_setup(cls_session, sizeof(*bnx2i_conn),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1366) cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1367) if (!cls_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1368) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1369) conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1370)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1371) bnx2i_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1372) bnx2i_conn->cls_conn = cls_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1373) bnx2i_conn->hba = hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1374)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1375) atomic_set(&bnx2i_conn->work_cnt, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1376)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1377) /* 'ep' ptr will be assigned in bind() call */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1378) bnx2i_conn->ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1379) init_completion(&bnx2i_conn->cmd_cleanup_cmpl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1380)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1381) if (bnx2i_conn_alloc_login_resources(hba, bnx2i_conn)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1382) iscsi_conn_printk(KERN_ALERT, conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1383) "conn_new: login resc alloc failed!!\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1384) goto free_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1385) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1386)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1387) return cls_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1388)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1389) free_conn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1390) iscsi_conn_teardown(cls_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1391) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1392) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1393)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1394) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1395) * bnx2i_conn_bind - binds iscsi sess, conn and ep objects together
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1396) * @cls_session: pointer to iscsi cls session
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1397) * @cls_conn: pointer to iscsi cls conn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1398) * @transport_fd: 64-bit EP handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1399) * @is_leading: leading connection on this session?
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1400) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1401) * Binds together iSCSI session instance, iSCSI connection instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1402) * and the TCP connection. This routine returns error code if
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1403) * TCP connection does not belong on the device iSCSI sess/conn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1404) * is bound
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1405) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1406) static int bnx2i_conn_bind(struct iscsi_cls_session *cls_session,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1407) struct iscsi_cls_conn *cls_conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1408) uint64_t transport_fd, int is_leading)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1409) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1410) struct iscsi_conn *conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1411) struct bnx2i_conn *bnx2i_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1412) struct Scsi_Host *shost = iscsi_session_to_shost(cls_session);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1413) struct bnx2i_hba *hba = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1414) struct bnx2i_endpoint *bnx2i_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1415) struct iscsi_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1416) int ret_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1418) ep = iscsi_lookup_endpoint(transport_fd);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1419) if (!ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1420) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1421) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1422) * Forcefully terminate all in progress connection recovery at the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1423) * earliest, either in bind(), send_pdu(LOGIN), or conn_start()
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1424) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1425) if (bnx2i_adapter_ready(hba))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1426) return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1427)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1428) bnx2i_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1429) if ((bnx2i_ep->state == EP_STATE_TCP_FIN_RCVD) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1430) (bnx2i_ep->state == EP_STATE_TCP_RST_RCVD))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1431) /* Peer disconnect via' FIN or RST */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1432) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1433)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1434) if (iscsi_conn_bind(cls_session, cls_conn, is_leading))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1435) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1436)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1437) if (bnx2i_ep->hba != hba) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1438) /* Error - TCP connection does not belong to this device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1439) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1440) iscsi_conn_printk(KERN_ALERT, cls_conn->dd_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1441) "conn bind, ep=0x%p (%s) does not",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1442) bnx2i_ep, bnx2i_ep->hba->netdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1443) iscsi_conn_printk(KERN_ALERT, cls_conn->dd_data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1444) "belong to hba (%s)\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1445) hba->netdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1446) return -EEXIST;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1447) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1448) bnx2i_ep->conn = bnx2i_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1449) bnx2i_conn->ep = bnx2i_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1450) bnx2i_conn->iscsi_conn_cid = bnx2i_ep->ep_iscsi_cid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1451) bnx2i_conn->fw_cid = bnx2i_ep->ep_cid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1453) ret_code = bnx2i_bind_conn_to_iscsi_cid(hba, bnx2i_conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1454) bnx2i_ep->ep_iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1455)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1456) /* 5706/5708/5709 FW takes RQ as full when initiated, but for 57710
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1457) * driver needs to explicitly replenish RQ index during setup.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1458) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1459) if (test_bit(BNX2I_NX2_DEV_57710, &bnx2i_ep->hba->cnic_dev_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1460) bnx2i_put_rq_buf(bnx2i_conn, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1461)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1462) bnx2i_arm_cq_event_coalescing(bnx2i_conn->ep, CNIC_ARM_CQE);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1463) return ret_code;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1464) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1465)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1466)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1467) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1468) * bnx2i_conn_destroy - destroy iscsi connection instance & release resources
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1469) * @cls_conn: pointer to iscsi cls conn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1470) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1471) * Destroy an iSCSI connection instance and release memory resources held by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1472) * this connection
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1473) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1474) static void bnx2i_conn_destroy(struct iscsi_cls_conn *cls_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1475) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1476) struct iscsi_conn *conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1477) struct bnx2i_conn *bnx2i_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1478) struct Scsi_Host *shost;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1479) struct bnx2i_hba *hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1480) struct bnx2i_work *work, *tmp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1481) unsigned cpu = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1482) struct bnx2i_percpu_s *p;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1483)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1484) shost = iscsi_session_to_shost(iscsi_conn_to_session(cls_conn));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1485) hba = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1486)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1487) bnx2i_conn_free_login_resources(hba, bnx2i_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1489) if (atomic_read(&bnx2i_conn->work_cnt)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1490) for_each_online_cpu(cpu) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1491) p = &per_cpu(bnx2i_percpu, cpu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1492) spin_lock_bh(&p->p_work_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1493) list_for_each_entry_safe(work, tmp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1494) &p->work_list, list) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1495) if (work->session == conn->session &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1496) work->bnx2i_conn == bnx2i_conn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1497) list_del_init(&work->list);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1498) kfree(work);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1499) if (!atomic_dec_and_test(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1500) &bnx2i_conn->work_cnt))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1501) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1502) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1503) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1504) spin_unlock_bh(&p->p_work_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1505) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1506) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1507)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1508) iscsi_conn_teardown(cls_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1510)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1511)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1512) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1513) * bnx2i_ep_get_param - return iscsi ep parameter to caller
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1514) * @ep: pointer to iscsi endpoint
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1515) * @param: parameter type identifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1516) * @buf: buffer pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1517) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1518) * returns iSCSI ep parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1519) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1520) static int bnx2i_ep_get_param(struct iscsi_endpoint *ep,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1521) enum iscsi_param param, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1522) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1523) struct bnx2i_endpoint *bnx2i_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1524) struct bnx2i_hba *hba = bnx2i_ep->hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1525) int len = -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1526)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1527) if (!hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1528) return -ENOTCONN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1530) switch (param) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1531) case ISCSI_PARAM_CONN_PORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1532) mutex_lock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1533) if (bnx2i_ep->cm_sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1534) len = sprintf(buf, "%hu\n", bnx2i_ep->cm_sk->dst_port);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1535) mutex_unlock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1536) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1537) case ISCSI_PARAM_CONN_ADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1538) mutex_lock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1539) if (bnx2i_ep->cm_sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1540) len = sprintf(buf, "%pI4\n", &bnx2i_ep->cm_sk->dst_ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1541) mutex_unlock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1542) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1543) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1544) return -ENOSYS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1545) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1546)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1547) return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1548) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1549)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1550) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1551) * bnx2i_host_get_param - returns host (adapter) related parameters
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1552) * @shost: scsi host pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1553) * @param: parameter type identifier
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1554) * @buf: buffer pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1555) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1556) static int bnx2i_host_get_param(struct Scsi_Host *shost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1557) enum iscsi_host_param param, char *buf)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1558) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1559) struct bnx2i_hba *hba = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1560) int len = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1561)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1562) switch (param) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1563) case ISCSI_HOST_PARAM_HWADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1564) len = sysfs_format_mac(buf, hba->cnic->mac_addr, 6);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1565) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1566) case ISCSI_HOST_PARAM_NETDEV_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1567) len = sprintf(buf, "%s\n", hba->netdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1568) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1569) case ISCSI_HOST_PARAM_IPADDRESS: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1570) struct list_head *active_list = &hba->ep_active_list;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1571)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1572) read_lock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1573) if (!list_empty(&hba->ep_active_list)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1574) struct bnx2i_endpoint *bnx2i_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1575) struct cnic_sock *csk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1576)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1577) bnx2i_ep = list_first_entry(active_list,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1578) struct bnx2i_endpoint,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1579) link);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1580) csk = bnx2i_ep->cm_sk;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1581) if (test_bit(SK_F_IPV6, &csk->flags))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1582) len = sprintf(buf, "%pI6\n", csk->src_ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1583) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1584) len = sprintf(buf, "%pI4\n", csk->src_ip);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1585) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1586) read_unlock_bh(&hba->ep_rdwr_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1587) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1588) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1589) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1590) return iscsi_host_get_param(shost, param, buf);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1591) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1592) return len;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1593) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1594)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1595) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1596) * bnx2i_conn_start - completes iscsi connection migration to FFP
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1597) * @cls_conn: pointer to iscsi cls conn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1598) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1599) * last call in FFP migration to handover iscsi conn to the driver
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1600) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1601) static int bnx2i_conn_start(struct iscsi_cls_conn *cls_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1602) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1603) struct iscsi_conn *conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1604) struct bnx2i_conn *bnx2i_conn = conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1605)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1606) bnx2i_conn->ep->state = EP_STATE_ULP_UPDATE_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1607) bnx2i_update_iscsi_conn(conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1608)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1609) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1610) * this should normally not sleep for a long time so it should
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1611) * not disrupt the caller.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1612) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1613) timer_setup(&bnx2i_conn->ep->ofld_timer, bnx2i_ep_ofld_timer, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1614) bnx2i_conn->ep->ofld_timer.expires = 1 * HZ + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1615) add_timer(&bnx2i_conn->ep->ofld_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1616) /* update iSCSI context for this conn, wait for CNIC to complete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1617) wait_event_interruptible(bnx2i_conn->ep->ofld_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1618) bnx2i_conn->ep->state != EP_STATE_ULP_UPDATE_START);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1619)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1620) if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1621) flush_signals(current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1622) del_timer_sync(&bnx2i_conn->ep->ofld_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1623)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1624) iscsi_conn_start(cls_conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1625) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1626) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1627)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1628)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1629) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1630) * bnx2i_conn_get_stats - returns iSCSI stats
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1631) * @cls_conn: pointer to iscsi cls conn
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1632) * @stats: pointer to iscsi statistic struct
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1633) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1634) static void bnx2i_conn_get_stats(struct iscsi_cls_conn *cls_conn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1635) struct iscsi_stats *stats)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1636) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1637) struct iscsi_conn *conn = cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1638)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1639) stats->txdata_octets = conn->txdata_octets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1640) stats->rxdata_octets = conn->rxdata_octets;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1641) stats->scsicmd_pdus = conn->scsicmd_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1642) stats->dataout_pdus = conn->dataout_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1643) stats->scsirsp_pdus = conn->scsirsp_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1644) stats->datain_pdus = conn->datain_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1645) stats->r2t_pdus = conn->r2t_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1646) stats->tmfcmd_pdus = conn->tmfcmd_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1647) stats->tmfrsp_pdus = conn->tmfrsp_pdus_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1648) stats->digest_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1649) stats->timeout_err = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1650) strcpy(stats->custom[0].desc, "eh_abort_cnt");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1651) stats->custom[0].value = conn->eh_abort_cnt;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1652) stats->custom_length = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1653) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1654)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1655)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1656) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1657) * bnx2i_check_route - checks if target IP route belongs to one of NX2 devices
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1658) * @dst_addr: target IP address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1659) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1660) * check if route resolves to BNX2 device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1661) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1662) static struct bnx2i_hba *bnx2i_check_route(struct sockaddr *dst_addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1663) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1664) struct sockaddr_in *desti = (struct sockaddr_in *) dst_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1665) struct bnx2i_hba *hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1666) struct cnic_dev *cnic = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1667)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1668) hba = get_adapter_list_head();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1669) if (hba && hba->cnic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1670) cnic = hba->cnic->cm_select_dev(desti, CNIC_ULP_ISCSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1671) if (!cnic) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1672) printk(KERN_ALERT "bnx2i: no route,"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1673) "can't connect using cnic\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1674) goto no_nx2_route;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1675) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1676) hba = bnx2i_find_hba_for_cnic(cnic);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1677) if (!hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1678) goto no_nx2_route;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1679)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1680) if (bnx2i_adapter_ready(hba)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1681) printk(KERN_ALERT "bnx2i: check route, hba not found\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1682) goto no_nx2_route;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1683) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1684) if (hba->netdev->mtu > hba->mtu_supported) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1685) printk(KERN_ALERT "bnx2i: %s network i/f mtu is set to %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1686) hba->netdev->name, hba->netdev->mtu);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1687) printk(KERN_ALERT "bnx2i: iSCSI HBA can support mtu of %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1688) hba->mtu_supported);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1689) goto no_nx2_route;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1690) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1691) return hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1692) no_nx2_route:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1693) return NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1694) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1696)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1697) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1698) * bnx2i_tear_down_conn - tear down iscsi/tcp connection and free resources
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1699) * @hba: pointer to adapter instance
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1700) * @ep: endpoint (transport identifier) structure
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1701) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1702) * destroys cm_sock structure and on chip iscsi context
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1703) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1704) static int bnx2i_tear_down_conn(struct bnx2i_hba *hba,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1705) struct bnx2i_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1706) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1707) if (test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic) && ep->cm_sk)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1708) hba->cnic->cm_destroy(ep->cm_sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1709)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1710) if (test_bit(BNX2I_NX2_DEV_57710, &hba->cnic_dev_type) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1711) ep->state == EP_STATE_DISCONN_TIMEDOUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1712) if (ep->conn && ep->conn->cls_conn &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1713) ep->conn->cls_conn->dd_data) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1714) struct iscsi_conn *conn = ep->conn->cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1715)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1716) /* Must suspend all rx queue activity for this ep */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1717) set_bit(ISCSI_SUSPEND_BIT, &conn->suspend_rx);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1718) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1719) /* CONN_DISCONNECT timeout may or may not be an issue depending
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1720) * on what transcribed in TCP layer, different targets behave
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1721) * differently
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1722) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1723) printk(KERN_ALERT "bnx2i (%s): - WARN - CONN_DISCON timed out, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1724) "please submit GRC Dump, NW/PCIe trace, "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1725) "driver msgs to developers for analysis\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1726) hba->netdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1727) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1729) ep->state = EP_STATE_CLEANUP_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1730) timer_setup(&ep->ofld_timer, bnx2i_ep_ofld_timer, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1731) ep->ofld_timer.expires = hba->conn_ctx_destroy_tmo + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1732) add_timer(&ep->ofld_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1734) bnx2i_ep_destroy_list_add(hba, ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1735)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1736) /* destroy iSCSI context, wait for it to complete */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1737) if (bnx2i_send_conn_destroy(hba, ep))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1738) ep->state = EP_STATE_CLEANUP_CMPL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1739)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1740) wait_event_interruptible(ep->ofld_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1741) (ep->state != EP_STATE_CLEANUP_START));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1742)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1743) if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1744) flush_signals(current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1745) del_timer_sync(&ep->ofld_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1746)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1747) bnx2i_ep_destroy_list_del(hba, ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1748)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1749) if (ep->state != EP_STATE_CLEANUP_CMPL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1750) /* should never happen */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1751) printk(KERN_ALERT "bnx2i - conn destroy failed\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1752)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1753) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1754) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1755)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1756)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1757) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1758) * bnx2i_ep_connect - establish TCP connection to target portal
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1759) * @shost: scsi host
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1760) * @dst_addr: target IP address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1761) * @non_blocking: blocking or non-blocking call
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1762) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1763) * this routine initiates the TCP/IP connection by invoking Option-2 i/f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1764) * with l5_core and the CNIC. This is a multi-step process of resolving
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1765) * route to target, create a iscsi connection context, handshaking with
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1766) * CNIC module to create/initialize the socket struct and finally
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1767) * sending down option-2 request to complete TCP 3-way handshake
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1768) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1769) static struct iscsi_endpoint *bnx2i_ep_connect(struct Scsi_Host *shost,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1770) struct sockaddr *dst_addr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1771) int non_blocking)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1772) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1773) u32 iscsi_cid = BNX2I_CID_RESERVED;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1774) struct sockaddr_in *desti = (struct sockaddr_in *) dst_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1775) struct sockaddr_in6 *desti6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1776) struct bnx2i_endpoint *bnx2i_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1777) struct bnx2i_hba *hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1778) struct cnic_dev *cnic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1779) struct cnic_sockaddr saddr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1780) struct iscsi_endpoint *ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1781) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1782)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1783) if (shost) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1784) /* driver is given scsi host to work with */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1785) hba = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1786) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1787) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1788) * check if the given destination can be reached through
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1789) * a iscsi capable NetXtreme2 device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1790) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1791) hba = bnx2i_check_route(dst_addr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1792)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1793) if (!hba) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1794) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1795) goto nohba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1796) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1797) mutex_lock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1798)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1799) if (bnx2i_adapter_ready(hba) || !hba->cid_que.cid_free_cnt) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1800) rc = -EPERM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1801) goto check_busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1802) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1803) cnic = hba->cnic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1804) ep = bnx2i_alloc_ep(hba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1805) if (!ep) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1806) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1807) goto check_busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1808) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1809) bnx2i_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1810)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1811) atomic_set(&bnx2i_ep->num_active_cmds, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1812) iscsi_cid = bnx2i_alloc_iscsi_cid(hba);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1813) if (iscsi_cid == -1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1814) printk(KERN_ALERT "bnx2i (%s): alloc_ep - unable to allocate "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1815) "iscsi cid\n", hba->netdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1816) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1817) bnx2i_free_ep(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1818) goto check_busy;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1819) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1820) bnx2i_ep->hba_age = hba->age;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1821)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1822) rc = bnx2i_alloc_qp_resc(hba, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1823) if (rc != 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1824) printk(KERN_ALERT "bnx2i (%s): ep_conn - alloc QP resc error"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1825) "\n", hba->netdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1826) rc = -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1827) goto qp_resc_err;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1828) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1829)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1830) bnx2i_ep->ep_iscsi_cid = (u16)iscsi_cid;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1831) bnx2i_ep->state = EP_STATE_OFLD_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1832) bnx2i_ep_ofld_list_add(hba, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1833)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1834) timer_setup(&bnx2i_ep->ofld_timer, bnx2i_ep_ofld_timer, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1835) bnx2i_ep->ofld_timer.expires = 2 * HZ + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1836) add_timer(&bnx2i_ep->ofld_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1837)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1838) if (bnx2i_send_conn_ofld_req(hba, bnx2i_ep)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1839) if (bnx2i_ep->state == EP_STATE_OFLD_FAILED_CID_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1840) printk(KERN_ALERT "bnx2i (%s): iscsi cid %d is busy\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1841) hba->netdev->name, bnx2i_ep->ep_iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1842) rc = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1843) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1844) rc = -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1845) printk(KERN_ALERT "bnx2i (%s): unable to send conn offld kwqe"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1846) "\n", hba->netdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1847) bnx2i_ep_ofld_list_del(hba, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1848) goto conn_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1849) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1850)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1851) /* Wait for CNIC hardware to setup conn context and return 'cid' */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1852) wait_event_interruptible(bnx2i_ep->ofld_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1853) bnx2i_ep->state != EP_STATE_OFLD_START);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1854)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1855) if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1856) flush_signals(current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1857) del_timer_sync(&bnx2i_ep->ofld_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1858)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1859) bnx2i_ep_ofld_list_del(hba, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1860)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1861) if (bnx2i_ep->state != EP_STATE_OFLD_COMPL) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1862) if (bnx2i_ep->state == EP_STATE_OFLD_FAILED_CID_BUSY) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1863) printk(KERN_ALERT "bnx2i (%s): iscsi cid %d is busy\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1864) hba->netdev->name, bnx2i_ep->ep_iscsi_cid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1865) rc = -EBUSY;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1866) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1867) rc = -ENOSPC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1868) goto conn_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1869) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1870)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1871) rc = cnic->cm_create(cnic, CNIC_ULP_ISCSI, bnx2i_ep->ep_cid,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1872) iscsi_cid, &bnx2i_ep->cm_sk, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1873) if (rc) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1874) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1875) /* Need to terminate and cleanup the connection */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1876) goto release_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1877) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1878)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1879) bnx2i_ep->cm_sk->rcv_buf = 256 * 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1880) bnx2i_ep->cm_sk->snd_buf = 256 * 1024;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1881) clear_bit(SK_TCP_TIMESTAMP, &bnx2i_ep->cm_sk->tcp_flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1882)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1883) memset(&saddr, 0, sizeof(saddr));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1884) if (dst_addr->sa_family == AF_INET) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1885) desti = (struct sockaddr_in *) dst_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1886) saddr.remote.v4 = *desti;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1887) saddr.local.v4.sin_family = desti->sin_family;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1888) } else if (dst_addr->sa_family == AF_INET6) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1889) desti6 = (struct sockaddr_in6 *) dst_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1890) saddr.remote.v6 = *desti6;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1891) saddr.local.v6.sin6_family = desti6->sin6_family;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1892) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1893)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1894) bnx2i_ep->timestamp = jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1895) bnx2i_ep->state = EP_STATE_CONNECT_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1896) if (!test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1897) rc = -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1898) goto conn_failed;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1899) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1900) rc = cnic->cm_connect(bnx2i_ep->cm_sk, &saddr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1901) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1902) goto release_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1903)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1904) bnx2i_ep_active_list_add(hba, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1905)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1906) rc = bnx2i_map_ep_dbell_regs(bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1907) if (rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1908) goto del_active_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1909)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1910) mutex_unlock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1911) return ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1912)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1913) del_active_ep:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1914) bnx2i_ep_active_list_del(hba, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1915) release_ep:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1916) if (bnx2i_tear_down_conn(hba, bnx2i_ep)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1917) mutex_unlock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1918) return ERR_PTR(rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1919) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1920) conn_failed:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1921) bnx2i_free_qp_resc(hba, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1922) qp_resc_err:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1923) bnx2i_free_ep(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1924) check_busy:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1925) mutex_unlock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1926) nohba:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1927) return ERR_PTR(rc);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1928) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1929)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1930)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1931) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1932) * bnx2i_ep_poll - polls for TCP connection establishement
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1933) * @ep: TCP connection (endpoint) handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1934) * @timeout_ms: timeout value in milli secs
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1935) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1936) * polls for TCP connect request to complete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1937) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1938) static int bnx2i_ep_poll(struct iscsi_endpoint *ep, int timeout_ms)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1939) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1940) struct bnx2i_endpoint *bnx2i_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1941) int rc = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1942)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1943) bnx2i_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1944) if ((bnx2i_ep->state == EP_STATE_IDLE) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1945) (bnx2i_ep->state == EP_STATE_CONNECT_FAILED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1946) (bnx2i_ep->state == EP_STATE_OFLD_FAILED))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1947) return -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1948) if (bnx2i_ep->state == EP_STATE_CONNECT_COMPL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1949) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1950)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1951) rc = wait_event_interruptible_timeout(bnx2i_ep->ofld_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1952) ((bnx2i_ep->state ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1953) EP_STATE_OFLD_FAILED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1954) (bnx2i_ep->state ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1955) EP_STATE_CONNECT_FAILED) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1956) (bnx2i_ep->state ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1957) EP_STATE_CONNECT_COMPL)),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1958) msecs_to_jiffies(timeout_ms));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1959) if (bnx2i_ep->state == EP_STATE_OFLD_FAILED)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1960) rc = -1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1961)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1962) if (rc > 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1963) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1964) else if (!rc)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1965) return 0; /* timeout */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1966) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1967) return rc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1968) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1969)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1970)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1971) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1972) * bnx2i_ep_tcp_conn_active - check EP state transition
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1973) * @bnx2i_ep: endpoint pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1974) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1975) * check if underlying TCP connection is active
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1976) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1977) static int bnx2i_ep_tcp_conn_active(struct bnx2i_endpoint *bnx2i_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1978) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1979) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1980) int cnic_dev_10g = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1981)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1982) if (test_bit(BNX2I_NX2_DEV_57710, &bnx2i_ep->hba->cnic_dev_type))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1983) cnic_dev_10g = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1984)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1985) switch (bnx2i_ep->state) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1986) case EP_STATE_CLEANUP_FAILED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1987) case EP_STATE_OFLD_FAILED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1988) case EP_STATE_DISCONN_TIMEDOUT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1989) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1990) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1991) case EP_STATE_CONNECT_START:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1992) case EP_STATE_CONNECT_FAILED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1993) case EP_STATE_CONNECT_COMPL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1994) case EP_STATE_ULP_UPDATE_START:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1995) case EP_STATE_ULP_UPDATE_COMPL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1996) case EP_STATE_TCP_FIN_RCVD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1997) case EP_STATE_LOGOUT_SENT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1998) case EP_STATE_LOGOUT_RESP_RCVD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1999) case EP_STATE_ULP_UPDATE_FAILED:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2000) ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2001) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2002) case EP_STATE_TCP_RST_RCVD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2003) if (cnic_dev_10g)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2004) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2005) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2006) ret = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2007) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2008) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2009) ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2010) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2011)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2012) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2013) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2014)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2015)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2016) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2017) * bnx2i_hw_ep_disconnect - executes TCP connection teardown process in the hw
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2018) * @bnx2i_ep: TCP connection (bnx2i endpoint) handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2019) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2020) * executes TCP connection teardown process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2021) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2022) int bnx2i_hw_ep_disconnect(struct bnx2i_endpoint *bnx2i_ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2023) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2024) struct bnx2i_hba *hba = bnx2i_ep->hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2025) struct cnic_dev *cnic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2026) struct iscsi_session *session = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2027) struct iscsi_conn *conn = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2028) int ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2029) int close = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2030) int close_ret = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2031)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2032) if (!hba)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2033) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2034)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2035) cnic = hba->cnic;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2036) if (!cnic)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2037) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2038)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2039) if (bnx2i_ep->state == EP_STATE_IDLE ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2040) bnx2i_ep->state == EP_STATE_DISCONN_TIMEDOUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2041) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2042)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2043) if (!bnx2i_ep_tcp_conn_active(bnx2i_ep))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2044) goto destroy_conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2045)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2046) if (bnx2i_ep->conn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2047) conn = bnx2i_ep->conn->cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2048) session = conn->session;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2049) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2050)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2051) timer_setup(&bnx2i_ep->ofld_timer, bnx2i_ep_ofld_timer, 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2052) bnx2i_ep->ofld_timer.expires = hba->conn_teardown_tmo + jiffies;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2053) add_timer(&bnx2i_ep->ofld_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2054)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2055) if (!test_bit(BNX2I_CNIC_REGISTERED, &hba->reg_with_cnic))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2056) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2057)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2058) if (session) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2059) spin_lock_bh(&session->frwd_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2060) if (bnx2i_ep->state != EP_STATE_TCP_FIN_RCVD) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2061) if (session->state == ISCSI_STATE_LOGGING_OUT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2062) if (bnx2i_ep->state == EP_STATE_LOGOUT_SENT) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2063) /* Logout sent, but no resp */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2064) printk(KERN_ALERT "bnx2i (%s): WARNING"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2065) " logout response was not "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2066) "received!\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2067) bnx2i_ep->hba->netdev->name);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2068) } else if (bnx2i_ep->state ==
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2069) EP_STATE_LOGOUT_RESP_RCVD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2070) close = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2071) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2072) } else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2073) close = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2074)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2075) spin_unlock_bh(&session->frwd_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2076) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2077)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2078) bnx2i_ep->state = EP_STATE_DISCONN_START;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2079)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2080) if (close)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2081) close_ret = cnic->cm_close(bnx2i_ep->cm_sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2082) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2083) close_ret = cnic->cm_abort(bnx2i_ep->cm_sk);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2084)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2085) if (close_ret)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2086) printk(KERN_ALERT "bnx2i (%s): close/abort(%d) returned %d\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2087) bnx2i_ep->hba->netdev->name, close, close_ret);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2088) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2089) /* wait for option-2 conn teardown */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2090) wait_event_interruptible(bnx2i_ep->ofld_wait,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2091) ((bnx2i_ep->state != EP_STATE_DISCONN_START)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2092) && (bnx2i_ep->state != EP_STATE_TCP_FIN_RCVD)));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2093)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2094) if (signal_pending(current))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2095) flush_signals(current);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2096) del_timer_sync(&bnx2i_ep->ofld_timer);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2097)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2098) destroy_conn:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2099) bnx2i_ep_active_list_del(hba, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2100) if (bnx2i_tear_down_conn(hba, bnx2i_ep))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2101) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2102) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2103) bnx2i_ep->state = EP_STATE_IDLE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2104) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2105) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2107)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2108) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2109) * bnx2i_ep_disconnect - executes TCP connection teardown process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2110) * @ep: TCP connection (iscsi endpoint) handle
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2111) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2112) * executes TCP connection teardown process
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2113) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2114) static void bnx2i_ep_disconnect(struct iscsi_endpoint *ep)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2116) struct bnx2i_endpoint *bnx2i_ep;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2117) struct bnx2i_conn *bnx2i_conn = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2118) struct iscsi_conn *conn = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2119) struct bnx2i_hba *hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2120)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2121) bnx2i_ep = ep->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2123) /* driver should not attempt connection cleanup until TCP_CONNECT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2124) * completes either successfully or fails. Timeout is 9-secs, so
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2125) * wait for it to complete
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2126) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2127) while ((bnx2i_ep->state == EP_STATE_CONNECT_START) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2128) !time_after(jiffies, bnx2i_ep->timestamp + (12 * HZ)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2129) msleep(250);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2130)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2131) if (bnx2i_ep->conn) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2132) bnx2i_conn = bnx2i_ep->conn;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2133) conn = bnx2i_conn->cls_conn->dd_data;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2134) iscsi_suspend_queue(conn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2136) hba = bnx2i_ep->hba;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2137)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2138) mutex_lock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2139)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2140) if (bnx2i_ep->state == EP_STATE_DISCONN_TIMEDOUT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2141) goto out;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2142)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2143) if (bnx2i_ep->state == EP_STATE_IDLE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2144) goto free_resc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2146) if (!test_bit(ADAPTER_STATE_UP, &hba->adapter_state) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2147) (bnx2i_ep->hba_age != hba->age)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2148) bnx2i_ep_active_list_del(hba, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2149) goto free_resc;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2150) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2151)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2152) /* Do all chip cleanup here */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2153) if (bnx2i_hw_ep_disconnect(bnx2i_ep)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2154) mutex_unlock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2155) return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2156) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2157) free_resc:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2158) bnx2i_free_qp_resc(hba, bnx2i_ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2160) if (bnx2i_conn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2161) bnx2i_conn->ep = NULL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2163) bnx2i_free_ep(ep);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2164) out:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2165) mutex_unlock(&hba->net_dev_lock);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2166)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2167) wake_up_interruptible(&hba->eh_wait);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2168) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2170)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2171) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2172) * bnx2i_nl_set_path - ISCSI_UEVENT_PATH_UPDATE user message handler
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2173) * @shost: scsi host pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2174) * @params: pointer to buffer containing iscsi path message
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2175) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2176) static int bnx2i_nl_set_path(struct Scsi_Host *shost, struct iscsi_path *params)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2177) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2178) struct bnx2i_hba *hba = iscsi_host_priv(shost);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2179) char *buf = (char *) params;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2180) u16 len = sizeof(*params);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2182) /* handled by cnic driver */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2183) hba->cnic->iscsi_nl_msg_recv(hba->cnic, ISCSI_UEVENT_PATH_UPDATE, buf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2184) len);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2186) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2187) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2188)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2189) static umode_t bnx2i_attr_is_visible(int param_type, int param)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2190) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2191) switch (param_type) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2192) case ISCSI_HOST_PARAM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2193) switch (param) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2194) case ISCSI_HOST_PARAM_NETDEV_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2195) case ISCSI_HOST_PARAM_HWADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2196) case ISCSI_HOST_PARAM_IPADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2197) return S_IRUGO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2198) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2199) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2200) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2201) case ISCSI_PARAM:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2202) switch (param) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2203) case ISCSI_PARAM_MAX_RECV_DLENGTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2204) case ISCSI_PARAM_MAX_XMIT_DLENGTH:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2205) case ISCSI_PARAM_HDRDGST_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2206) case ISCSI_PARAM_DATADGST_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2207) case ISCSI_PARAM_CONN_ADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2208) case ISCSI_PARAM_CONN_PORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2209) case ISCSI_PARAM_EXP_STATSN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2210) case ISCSI_PARAM_PERSISTENT_ADDRESS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2211) case ISCSI_PARAM_PERSISTENT_PORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2212) case ISCSI_PARAM_PING_TMO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2213) case ISCSI_PARAM_RECV_TMO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2214) case ISCSI_PARAM_INITIAL_R2T_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2215) case ISCSI_PARAM_MAX_R2T:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2216) case ISCSI_PARAM_IMM_DATA_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2217) case ISCSI_PARAM_FIRST_BURST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2218) case ISCSI_PARAM_MAX_BURST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2219) case ISCSI_PARAM_PDU_INORDER_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2220) case ISCSI_PARAM_DATASEQ_INORDER_EN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2221) case ISCSI_PARAM_ERL:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2222) case ISCSI_PARAM_TARGET_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2223) case ISCSI_PARAM_TPGT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2224) case ISCSI_PARAM_USERNAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2225) case ISCSI_PARAM_PASSWORD:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2226) case ISCSI_PARAM_USERNAME_IN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2227) case ISCSI_PARAM_PASSWORD_IN:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2228) case ISCSI_PARAM_FAST_ABORT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2229) case ISCSI_PARAM_ABORT_TMO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2230) case ISCSI_PARAM_LU_RESET_TMO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2231) case ISCSI_PARAM_TGT_RESET_TMO:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2232) case ISCSI_PARAM_IFACE_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2233) case ISCSI_PARAM_INITIATOR_NAME:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2234) case ISCSI_PARAM_BOOT_ROOT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2235) case ISCSI_PARAM_BOOT_NIC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2236) case ISCSI_PARAM_BOOT_TARGET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2237) return S_IRUGO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2238) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2239) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2241) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2243) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2244) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2246) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2247) * 'Scsi_Host_Template' structure and 'iscsi_tranport' structure template
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2248) * used while registering with the scsi host and iSCSI transport module.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2249) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2250) static struct scsi_host_template bnx2i_host_template = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2251) .module = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2252) .name = "QLogic Offload iSCSI Initiator",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2253) .proc_name = "bnx2i",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2254) .queuecommand = iscsi_queuecommand,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2255) .eh_timed_out = iscsi_eh_cmd_timed_out,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2256) .eh_abort_handler = iscsi_eh_abort,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2257) .eh_device_reset_handler = iscsi_eh_device_reset,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2258) .eh_target_reset_handler = iscsi_eh_recover_target,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2259) .change_queue_depth = scsi_change_queue_depth,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2260) .target_alloc = iscsi_target_alloc,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2261) .can_queue = 2048,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2262) .max_sectors = 127,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2263) .cmd_per_lun = 128,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2264) .this_id = -1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2265) .sg_tablesize = ISCSI_MAX_BDS_PER_CMD,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2266) .shost_attrs = bnx2i_dev_attributes,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2267) .track_queue_depth = 1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2268) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2269)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2270) struct iscsi_transport bnx2i_iscsi_transport = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2271) .owner = THIS_MODULE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2272) .name = "bnx2i",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2273) .caps = CAP_RECOVERY_L0 | CAP_HDRDGST |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2274) CAP_MULTI_R2T | CAP_DATADGST |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2275) CAP_DATA_PATH_OFFLOAD |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2276) CAP_TEXT_NEGO,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2277) .create_session = bnx2i_session_create,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2278) .destroy_session = bnx2i_session_destroy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2279) .create_conn = bnx2i_conn_create,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2280) .bind_conn = bnx2i_conn_bind,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2281) .destroy_conn = bnx2i_conn_destroy,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2282) .attr_is_visible = bnx2i_attr_is_visible,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2283) .set_param = iscsi_set_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2284) .get_conn_param = iscsi_conn_get_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2285) .get_session_param = iscsi_session_get_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2286) .get_host_param = bnx2i_host_get_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2287) .start_conn = bnx2i_conn_start,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2288) .stop_conn = iscsi_conn_stop,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2289) .send_pdu = iscsi_conn_send_pdu,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2290) .xmit_task = bnx2i_task_xmit,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2291) .get_stats = bnx2i_conn_get_stats,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2292) /* TCP connect - disconnect - option-2 interface calls */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2293) .get_ep_param = bnx2i_ep_get_param,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2294) .ep_connect = bnx2i_ep_connect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2295) .ep_poll = bnx2i_ep_poll,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2296) .ep_disconnect = bnx2i_ep_disconnect,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2297) .set_path = bnx2i_nl_set_path,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2298) /* Error recovery timeout call */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2299) .session_recovery_timedout = iscsi_session_recovery_timedout,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2300) .cleanup_task = bnx2i_cleanup_task,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2301) };