Path: blob/master/drivers/infiniband/ulp/srp/ib_srp.c
15112 views
/*1* Copyright (c) 2005 Cisco Systems. All rights reserved.2*3* This software is available to you under a choice of one of two4* licenses. You may choose to be licensed under the terms of the GNU5* General Public License (GPL) Version 2, available from the file6* COPYING in the main directory of this source tree, or the7* OpenIB.org BSD license below:8*9* Redistribution and use in source and binary forms, with or10* without modification, are permitted provided that the following11* conditions are met:12*13* - Redistributions of source code must retain the above14* copyright notice, this list of conditions and the following15* disclaimer.16*17* - Redistributions in binary form must reproduce the above18* copyright notice, this list of conditions and the following19* disclaimer in the documentation and/or other materials20* provided with the distribution.21*22* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,23* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF24* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND25* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS26* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN27* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN28* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE29* SOFTWARE.30*/3132#include <linux/module.h>33#include <linux/init.h>34#include <linux/slab.h>35#include <linux/err.h>36#include <linux/string.h>37#include <linux/parser.h>38#include <linux/random.h>39#include <linux/jiffies.h>4041#include <asm/atomic.h>4243#include <scsi/scsi.h>44#include <scsi/scsi_device.h>45#include <scsi/scsi_dbg.h>46#include <scsi/srp.h>47#include <scsi/scsi_transport_srp.h>4849#include "ib_srp.h"5051#define DRV_NAME "ib_srp"52#define PFX DRV_NAME ": "53#define DRV_VERSION "0.2"54#define DRV_RELDATE "November 1, 2005"5556MODULE_AUTHOR("Roland Dreier");57MODULE_DESCRIPTION("InfiniBand SCSI RDMA Protocol initiator "58"v" DRV_VERSION " (" DRV_RELDATE ")");59MODULE_LICENSE("Dual BSD/GPL");6061static unsigned int srp_sg_tablesize;62static unsigned int cmd_sg_entries;63static unsigned int indirect_sg_entries;64static bool allow_ext_sg;65static int topspin_workarounds = 1;6667module_param(srp_sg_tablesize, uint, 0444);68MODULE_PARM_DESC(srp_sg_tablesize, "Deprecated name for cmd_sg_entries");6970module_param(cmd_sg_entries, uint, 0444);71MODULE_PARM_DESC(cmd_sg_entries,72"Default number of gather/scatter entries in the SRP command (default is 12, max 255)");7374module_param(indirect_sg_entries, uint, 0444);75MODULE_PARM_DESC(indirect_sg_entries,76"Default max number of gather/scatter entries (default is 12, max is " __stringify(SCSI_MAX_SG_CHAIN_SEGMENTS) ")");7778module_param(allow_ext_sg, bool, 0444);79MODULE_PARM_DESC(allow_ext_sg,80"Default behavior when there are more than cmd_sg_entries S/G entries after mapping; fails the request when false (default false)");8182module_param(topspin_workarounds, int, 0444);83MODULE_PARM_DESC(topspin_workarounds,84"Enable workarounds for Topspin/Cisco SRP target bugs if != 0");8586static void srp_add_one(struct ib_device *device);87static void srp_remove_one(struct ib_device *device);88static void srp_recv_completion(struct ib_cq *cq, void *target_ptr);89static void srp_send_completion(struct ib_cq *cq, void *target_ptr);90static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event);9192static struct scsi_transport_template *ib_srp_transport_template;9394static struct ib_client srp_client = {95.name = "srp",96.add = srp_add_one,97.remove = srp_remove_one98};99100static struct ib_sa_client srp_sa_client;101102static inline struct srp_target_port *host_to_target(struct Scsi_Host *host)103{104return (struct srp_target_port *) host->hostdata;105}106107static const char *srp_target_info(struct Scsi_Host *host)108{109return host_to_target(host)->target_name;110}111112static int srp_target_is_topspin(struct srp_target_port *target)113{114static const u8 topspin_oui[3] = { 0x00, 0x05, 0xad };115static const u8 cisco_oui[3] = { 0x00, 0x1b, 0x0d };116117return topspin_workarounds &&118(!memcmp(&target->ioc_guid, topspin_oui, sizeof topspin_oui) ||119!memcmp(&target->ioc_guid, cisco_oui, sizeof cisco_oui));120}121122static struct srp_iu *srp_alloc_iu(struct srp_host *host, size_t size,123gfp_t gfp_mask,124enum dma_data_direction direction)125{126struct srp_iu *iu;127128iu = kmalloc(sizeof *iu, gfp_mask);129if (!iu)130goto out;131132iu->buf = kzalloc(size, gfp_mask);133if (!iu->buf)134goto out_free_iu;135136iu->dma = ib_dma_map_single(host->srp_dev->dev, iu->buf, size,137direction);138if (ib_dma_mapping_error(host->srp_dev->dev, iu->dma))139goto out_free_buf;140141iu->size = size;142iu->direction = direction;143144return iu;145146out_free_buf:147kfree(iu->buf);148out_free_iu:149kfree(iu);150out:151return NULL;152}153154static void srp_free_iu(struct srp_host *host, struct srp_iu *iu)155{156if (!iu)157return;158159ib_dma_unmap_single(host->srp_dev->dev, iu->dma, iu->size,160iu->direction);161kfree(iu->buf);162kfree(iu);163}164165static void srp_qp_event(struct ib_event *event, void *context)166{167printk(KERN_ERR PFX "QP event %d\n", event->event);168}169170static int srp_init_qp(struct srp_target_port *target,171struct ib_qp *qp)172{173struct ib_qp_attr *attr;174int ret;175176attr = kmalloc(sizeof *attr, GFP_KERNEL);177if (!attr)178return -ENOMEM;179180ret = ib_find_pkey(target->srp_host->srp_dev->dev,181target->srp_host->port,182be16_to_cpu(target->path.pkey),183&attr->pkey_index);184if (ret)185goto out;186187attr->qp_state = IB_QPS_INIT;188attr->qp_access_flags = (IB_ACCESS_REMOTE_READ |189IB_ACCESS_REMOTE_WRITE);190attr->port_num = target->srp_host->port;191192ret = ib_modify_qp(qp, attr,193IB_QP_STATE |194IB_QP_PKEY_INDEX |195IB_QP_ACCESS_FLAGS |196IB_QP_PORT);197198out:199kfree(attr);200return ret;201}202203static int srp_new_cm_id(struct srp_target_port *target)204{205struct ib_cm_id *new_cm_id;206207new_cm_id = ib_create_cm_id(target->srp_host->srp_dev->dev,208srp_cm_handler, target);209if (IS_ERR(new_cm_id))210return PTR_ERR(new_cm_id);211212if (target->cm_id)213ib_destroy_cm_id(target->cm_id);214target->cm_id = new_cm_id;215216return 0;217}218219static int srp_create_target_ib(struct srp_target_port *target)220{221struct ib_qp_init_attr *init_attr;222int ret;223224init_attr = kzalloc(sizeof *init_attr, GFP_KERNEL);225if (!init_attr)226return -ENOMEM;227228target->recv_cq = ib_create_cq(target->srp_host->srp_dev->dev,229srp_recv_completion, NULL, target, SRP_RQ_SIZE, 0);230if (IS_ERR(target->recv_cq)) {231ret = PTR_ERR(target->recv_cq);232goto err;233}234235target->send_cq = ib_create_cq(target->srp_host->srp_dev->dev,236srp_send_completion, NULL, target, SRP_SQ_SIZE, 0);237if (IS_ERR(target->send_cq)) {238ret = PTR_ERR(target->send_cq);239goto err_recv_cq;240}241242ib_req_notify_cq(target->recv_cq, IB_CQ_NEXT_COMP);243244init_attr->event_handler = srp_qp_event;245init_attr->cap.max_send_wr = SRP_SQ_SIZE;246init_attr->cap.max_recv_wr = SRP_RQ_SIZE;247init_attr->cap.max_recv_sge = 1;248init_attr->cap.max_send_sge = 1;249init_attr->sq_sig_type = IB_SIGNAL_ALL_WR;250init_attr->qp_type = IB_QPT_RC;251init_attr->send_cq = target->send_cq;252init_attr->recv_cq = target->recv_cq;253254target->qp = ib_create_qp(target->srp_host->srp_dev->pd, init_attr);255if (IS_ERR(target->qp)) {256ret = PTR_ERR(target->qp);257goto err_send_cq;258}259260ret = srp_init_qp(target, target->qp);261if (ret)262goto err_qp;263264kfree(init_attr);265return 0;266267err_qp:268ib_destroy_qp(target->qp);269270err_send_cq:271ib_destroy_cq(target->send_cq);272273err_recv_cq:274ib_destroy_cq(target->recv_cq);275276err:277kfree(init_attr);278return ret;279}280281static void srp_free_target_ib(struct srp_target_port *target)282{283int i;284285ib_destroy_qp(target->qp);286ib_destroy_cq(target->send_cq);287ib_destroy_cq(target->recv_cq);288289for (i = 0; i < SRP_RQ_SIZE; ++i)290srp_free_iu(target->srp_host, target->rx_ring[i]);291for (i = 0; i < SRP_SQ_SIZE; ++i)292srp_free_iu(target->srp_host, target->tx_ring[i]);293}294295static void srp_path_rec_completion(int status,296struct ib_sa_path_rec *pathrec,297void *target_ptr)298{299struct srp_target_port *target = target_ptr;300301target->status = status;302if (status)303shost_printk(KERN_ERR, target->scsi_host,304PFX "Got failed path rec status %d\n", status);305else306target->path = *pathrec;307complete(&target->done);308}309310static int srp_lookup_path(struct srp_target_port *target)311{312target->path.numb_path = 1;313314init_completion(&target->done);315316target->path_query_id = ib_sa_path_rec_get(&srp_sa_client,317target->srp_host->srp_dev->dev,318target->srp_host->port,319&target->path,320IB_SA_PATH_REC_SERVICE_ID |321IB_SA_PATH_REC_DGID |322IB_SA_PATH_REC_SGID |323IB_SA_PATH_REC_NUMB_PATH |324IB_SA_PATH_REC_PKEY,325SRP_PATH_REC_TIMEOUT_MS,326GFP_KERNEL,327srp_path_rec_completion,328target, &target->path_query);329if (target->path_query_id < 0)330return target->path_query_id;331332wait_for_completion(&target->done);333334if (target->status < 0)335shost_printk(KERN_WARNING, target->scsi_host,336PFX "Path record query failed\n");337338return target->status;339}340341static int srp_send_req(struct srp_target_port *target)342{343struct {344struct ib_cm_req_param param;345struct srp_login_req priv;346} *req = NULL;347int status;348349req = kzalloc(sizeof *req, GFP_KERNEL);350if (!req)351return -ENOMEM;352353req->param.primary_path = &target->path;354req->param.alternate_path = NULL;355req->param.service_id = target->service_id;356req->param.qp_num = target->qp->qp_num;357req->param.qp_type = target->qp->qp_type;358req->param.private_data = &req->priv;359req->param.private_data_len = sizeof req->priv;360req->param.flow_control = 1;361362get_random_bytes(&req->param.starting_psn, 4);363req->param.starting_psn &= 0xffffff;364365/*366* Pick some arbitrary defaults here; we could make these367* module parameters if anyone cared about setting them.368*/369req->param.responder_resources = 4;370req->param.remote_cm_response_timeout = 20;371req->param.local_cm_response_timeout = 20;372req->param.retry_count = 7;373req->param.rnr_retry_count = 7;374req->param.max_cm_retries = 15;375376req->priv.opcode = SRP_LOGIN_REQ;377req->priv.tag = 0;378req->priv.req_it_iu_len = cpu_to_be32(target->max_iu_len);379req->priv.req_buf_fmt = cpu_to_be16(SRP_BUF_FORMAT_DIRECT |380SRP_BUF_FORMAT_INDIRECT);381/*382* In the published SRP specification (draft rev. 16a), the383* port identifier format is 8 bytes of ID extension followed384* by 8 bytes of GUID. Older drafts put the two halves in the385* opposite order, so that the GUID comes first.386*387* Targets conforming to these obsolete drafts can be388* recognized by the I/O Class they report.389*/390if (target->io_class == SRP_REV10_IB_IO_CLASS) {391memcpy(req->priv.initiator_port_id,392&target->path.sgid.global.interface_id, 8);393memcpy(req->priv.initiator_port_id + 8,394&target->initiator_ext, 8);395memcpy(req->priv.target_port_id, &target->ioc_guid, 8);396memcpy(req->priv.target_port_id + 8, &target->id_ext, 8);397} else {398memcpy(req->priv.initiator_port_id,399&target->initiator_ext, 8);400memcpy(req->priv.initiator_port_id + 8,401&target->path.sgid.global.interface_id, 8);402memcpy(req->priv.target_port_id, &target->id_ext, 8);403memcpy(req->priv.target_port_id + 8, &target->ioc_guid, 8);404}405406/*407* Topspin/Cisco SRP targets will reject our login unless we408* zero out the first 8 bytes of our initiator port ID and set409* the second 8 bytes to the local node GUID.410*/411if (srp_target_is_topspin(target)) {412shost_printk(KERN_DEBUG, target->scsi_host,413PFX "Topspin/Cisco initiator port ID workaround "414"activated for target GUID %016llx\n",415(unsigned long long) be64_to_cpu(target->ioc_guid));416memset(req->priv.initiator_port_id, 0, 8);417memcpy(req->priv.initiator_port_id + 8,418&target->srp_host->srp_dev->dev->node_guid, 8);419}420421status = ib_send_cm_req(target->cm_id, &req->param);422423kfree(req);424425return status;426}427428static void srp_disconnect_target(struct srp_target_port *target)429{430/* XXX should send SRP_I_LOGOUT request */431432init_completion(&target->done);433if (ib_send_cm_dreq(target->cm_id, NULL, 0)) {434shost_printk(KERN_DEBUG, target->scsi_host,435PFX "Sending CM DREQ failed\n");436return;437}438wait_for_completion(&target->done);439}440441static bool srp_change_state(struct srp_target_port *target,442enum srp_target_state old,443enum srp_target_state new)444{445bool changed = false;446447spin_lock_irq(&target->lock);448if (target->state == old) {449target->state = new;450changed = true;451}452spin_unlock_irq(&target->lock);453return changed;454}455456static void srp_free_req_data(struct srp_target_port *target)457{458struct ib_device *ibdev = target->srp_host->srp_dev->dev;459struct srp_request *req;460int i;461462for (i = 0, req = target->req_ring; i < SRP_CMD_SQ_SIZE; ++i, ++req) {463kfree(req->fmr_list);464kfree(req->map_page);465if (req->indirect_dma_addr) {466ib_dma_unmap_single(ibdev, req->indirect_dma_addr,467target->indirect_size,468DMA_TO_DEVICE);469}470kfree(req->indirect_desc);471}472}473474static void srp_remove_work(struct work_struct *work)475{476struct srp_target_port *target =477container_of(work, struct srp_target_port, work);478479if (!srp_change_state(target, SRP_TARGET_DEAD, SRP_TARGET_REMOVED))480return;481482spin_lock(&target->srp_host->target_lock);483list_del(&target->list);484spin_unlock(&target->srp_host->target_lock);485486srp_remove_host(target->scsi_host);487scsi_remove_host(target->scsi_host);488ib_destroy_cm_id(target->cm_id);489srp_free_target_ib(target);490srp_free_req_data(target);491scsi_host_put(target->scsi_host);492}493494static int srp_connect_target(struct srp_target_port *target)495{496int retries = 3;497int ret;498499ret = srp_lookup_path(target);500if (ret)501return ret;502503while (1) {504init_completion(&target->done);505ret = srp_send_req(target);506if (ret)507return ret;508wait_for_completion(&target->done);509510/*511* The CM event handling code will set status to512* SRP_PORT_REDIRECT if we get a port redirect REJ513* back, or SRP_DLID_REDIRECT if we get a lid/qp514* redirect REJ back.515*/516switch (target->status) {517case 0:518return 0;519520case SRP_PORT_REDIRECT:521ret = srp_lookup_path(target);522if (ret)523return ret;524break;525526case SRP_DLID_REDIRECT:527break;528529case SRP_STALE_CONN:530/* Our current CM id was stale, and is now in timewait.531* Try to reconnect with a new one.532*/533if (!retries-- || srp_new_cm_id(target)) {534shost_printk(KERN_ERR, target->scsi_host, PFX535"giving up on stale connection\n");536target->status = -ECONNRESET;537return target->status;538}539540shost_printk(KERN_ERR, target->scsi_host, PFX541"retrying stale connection\n");542break;543544default:545return target->status;546}547}548}549550static void srp_unmap_data(struct scsi_cmnd *scmnd,551struct srp_target_port *target,552struct srp_request *req)553{554struct ib_device *ibdev = target->srp_host->srp_dev->dev;555struct ib_pool_fmr **pfmr;556557if (!scsi_sglist(scmnd) ||558(scmnd->sc_data_direction != DMA_TO_DEVICE &&559scmnd->sc_data_direction != DMA_FROM_DEVICE))560return;561562pfmr = req->fmr_list;563while (req->nfmr--)564ib_fmr_pool_unmap(*pfmr++);565566ib_dma_unmap_sg(ibdev, scsi_sglist(scmnd), scsi_sg_count(scmnd),567scmnd->sc_data_direction);568}569570static void srp_remove_req(struct srp_target_port *target,571struct srp_request *req, s32 req_lim_delta)572{573unsigned long flags;574575srp_unmap_data(req->scmnd, target, req);576spin_lock_irqsave(&target->lock, flags);577target->req_lim += req_lim_delta;578req->scmnd = NULL;579list_add_tail(&req->list, &target->free_reqs);580spin_unlock_irqrestore(&target->lock, flags);581}582583static void srp_reset_req(struct srp_target_port *target, struct srp_request *req)584{585req->scmnd->result = DID_RESET << 16;586req->scmnd->scsi_done(req->scmnd);587srp_remove_req(target, req, 0);588}589590static int srp_reconnect_target(struct srp_target_port *target)591{592struct ib_qp_attr qp_attr;593struct ib_wc wc;594int i, ret;595596if (!srp_change_state(target, SRP_TARGET_LIVE, SRP_TARGET_CONNECTING))597return -EAGAIN;598599srp_disconnect_target(target);600/*601* Now get a new local CM ID so that we avoid confusing the602* target in case things are really fouled up.603*/604ret = srp_new_cm_id(target);605if (ret)606goto err;607608qp_attr.qp_state = IB_QPS_RESET;609ret = ib_modify_qp(target->qp, &qp_attr, IB_QP_STATE);610if (ret)611goto err;612613ret = srp_init_qp(target, target->qp);614if (ret)615goto err;616617while (ib_poll_cq(target->recv_cq, 1, &wc) > 0)618; /* nothing */619while (ib_poll_cq(target->send_cq, 1, &wc) > 0)620; /* nothing */621622for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) {623struct srp_request *req = &target->req_ring[i];624if (req->scmnd)625srp_reset_req(target, req);626}627628INIT_LIST_HEAD(&target->free_tx);629for (i = 0; i < SRP_SQ_SIZE; ++i)630list_add(&target->tx_ring[i]->list, &target->free_tx);631632target->qp_in_error = 0;633ret = srp_connect_target(target);634if (ret)635goto err;636637if (!srp_change_state(target, SRP_TARGET_CONNECTING, SRP_TARGET_LIVE))638ret = -EAGAIN;639640return ret;641642err:643shost_printk(KERN_ERR, target->scsi_host,644PFX "reconnect failed (%d), removing target port.\n", ret);645646/*647* We couldn't reconnect, so kill our target port off.648* However, we have to defer the real removal because we649* are in the context of the SCSI error handler now, which650* will deadlock if we call scsi_remove_host().651*652* Schedule our work inside the lock to avoid a race with653* the flush_scheduled_work() in srp_remove_one().654*/655spin_lock_irq(&target->lock);656if (target->state == SRP_TARGET_CONNECTING) {657target->state = SRP_TARGET_DEAD;658INIT_WORK(&target->work, srp_remove_work);659queue_work(ib_wq, &target->work);660}661spin_unlock_irq(&target->lock);662663return ret;664}665666static void srp_map_desc(struct srp_map_state *state, dma_addr_t dma_addr,667unsigned int dma_len, u32 rkey)668{669struct srp_direct_buf *desc = state->desc;670671desc->va = cpu_to_be64(dma_addr);672desc->key = cpu_to_be32(rkey);673desc->len = cpu_to_be32(dma_len);674675state->total_len += dma_len;676state->desc++;677state->ndesc++;678}679680static int srp_map_finish_fmr(struct srp_map_state *state,681struct srp_target_port *target)682{683struct srp_device *dev = target->srp_host->srp_dev;684struct ib_pool_fmr *fmr;685u64 io_addr = 0;686687if (!state->npages)688return 0;689690if (state->npages == 1) {691srp_map_desc(state, state->base_dma_addr, state->fmr_len,692target->rkey);693state->npages = state->fmr_len = 0;694return 0;695}696697fmr = ib_fmr_pool_map_phys(dev->fmr_pool, state->pages,698state->npages, io_addr);699if (IS_ERR(fmr))700return PTR_ERR(fmr);701702*state->next_fmr++ = fmr;703state->nfmr++;704705srp_map_desc(state, 0, state->fmr_len, fmr->fmr->rkey);706state->npages = state->fmr_len = 0;707return 0;708}709710static void srp_map_update_start(struct srp_map_state *state,711struct scatterlist *sg, int sg_index,712dma_addr_t dma_addr)713{714state->unmapped_sg = sg;715state->unmapped_index = sg_index;716state->unmapped_addr = dma_addr;717}718719static int srp_map_sg_entry(struct srp_map_state *state,720struct srp_target_port *target,721struct scatterlist *sg, int sg_index,722int use_fmr)723{724struct srp_device *dev = target->srp_host->srp_dev;725struct ib_device *ibdev = dev->dev;726dma_addr_t dma_addr = ib_sg_dma_address(ibdev, sg);727unsigned int dma_len = ib_sg_dma_len(ibdev, sg);728unsigned int len;729int ret;730731if (!dma_len)732return 0;733734if (use_fmr == SRP_MAP_NO_FMR) {735/* Once we're in direct map mode for a request, we don't736* go back to FMR mode, so no need to update anything737* other than the descriptor.738*/739srp_map_desc(state, dma_addr, dma_len, target->rkey);740return 0;741}742743/* If we start at an offset into the FMR page, don't merge into744* the current FMR. Finish it out, and use the kernel's MR for this745* sg entry. This is to avoid potential bugs on some SRP targets746* that were never quite defined, but went away when the initiator747* avoided using FMR on such page fragments.748*/749if (dma_addr & ~dev->fmr_page_mask || dma_len > dev->fmr_max_size) {750ret = srp_map_finish_fmr(state, target);751if (ret)752return ret;753754srp_map_desc(state, dma_addr, dma_len, target->rkey);755srp_map_update_start(state, NULL, 0, 0);756return 0;757}758759/* If this is the first sg to go into the FMR, save our position.760* We need to know the first unmapped entry, its index, and the761* first unmapped address within that entry to be able to restart762* mapping after an error.763*/764if (!state->unmapped_sg)765srp_map_update_start(state, sg, sg_index, dma_addr);766767while (dma_len) {768if (state->npages == SRP_FMR_SIZE) {769ret = srp_map_finish_fmr(state, target);770if (ret)771return ret;772773srp_map_update_start(state, sg, sg_index, dma_addr);774}775776len = min_t(unsigned int, dma_len, dev->fmr_page_size);777778if (!state->npages)779state->base_dma_addr = dma_addr;780state->pages[state->npages++] = dma_addr;781state->fmr_len += len;782dma_addr += len;783dma_len -= len;784}785786/* If the last entry of the FMR wasn't a full page, then we need to787* close it out and start a new one -- we can only merge at page788* boundries.789*/790ret = 0;791if (len != dev->fmr_page_size) {792ret = srp_map_finish_fmr(state, target);793if (!ret)794srp_map_update_start(state, NULL, 0, 0);795}796return ret;797}798799static int srp_map_data(struct scsi_cmnd *scmnd, struct srp_target_port *target,800struct srp_request *req)801{802struct scatterlist *scat, *sg;803struct srp_cmd *cmd = req->cmd->buf;804int i, len, nents, count, use_fmr;805struct srp_device *dev;806struct ib_device *ibdev;807struct srp_map_state state;808struct srp_indirect_buf *indirect_hdr;809u32 table_len;810u8 fmt;811812if (!scsi_sglist(scmnd) || scmnd->sc_data_direction == DMA_NONE)813return sizeof (struct srp_cmd);814815if (scmnd->sc_data_direction != DMA_FROM_DEVICE &&816scmnd->sc_data_direction != DMA_TO_DEVICE) {817shost_printk(KERN_WARNING, target->scsi_host,818PFX "Unhandled data direction %d\n",819scmnd->sc_data_direction);820return -EINVAL;821}822823nents = scsi_sg_count(scmnd);824scat = scsi_sglist(scmnd);825826dev = target->srp_host->srp_dev;827ibdev = dev->dev;828829count = ib_dma_map_sg(ibdev, scat, nents, scmnd->sc_data_direction);830if (unlikely(count == 0))831return -EIO;832833fmt = SRP_DATA_DESC_DIRECT;834len = sizeof (struct srp_cmd) + sizeof (struct srp_direct_buf);835836if (count == 1) {837/*838* The midlayer only generated a single gather/scatter839* entry, or DMA mapping coalesced everything to a840* single entry. So a direct descriptor along with841* the DMA MR suffices.842*/843struct srp_direct_buf *buf = (void *) cmd->add_data;844845buf->va = cpu_to_be64(ib_sg_dma_address(ibdev, scat));846buf->key = cpu_to_be32(target->rkey);847buf->len = cpu_to_be32(ib_sg_dma_len(ibdev, scat));848849req->nfmr = 0;850goto map_complete;851}852853/* We have more than one scatter/gather entry, so build our indirect854* descriptor table, trying to merge as many entries with FMR as we855* can.856*/857indirect_hdr = (void *) cmd->add_data;858859ib_dma_sync_single_for_cpu(ibdev, req->indirect_dma_addr,860target->indirect_size, DMA_TO_DEVICE);861862memset(&state, 0, sizeof(state));863state.desc = req->indirect_desc;864state.pages = req->map_page;865state.next_fmr = req->fmr_list;866867use_fmr = dev->fmr_pool ? SRP_MAP_ALLOW_FMR : SRP_MAP_NO_FMR;868869for_each_sg(scat, sg, count, i) {870if (srp_map_sg_entry(&state, target, sg, i, use_fmr)) {871/* FMR mapping failed, so backtrack to the first872* unmapped entry and continue on without using FMR.873*/874dma_addr_t dma_addr;875unsigned int dma_len;876877backtrack:878sg = state.unmapped_sg;879i = state.unmapped_index;880881dma_addr = ib_sg_dma_address(ibdev, sg);882dma_len = ib_sg_dma_len(ibdev, sg);883dma_len -= (state.unmapped_addr - dma_addr);884dma_addr = state.unmapped_addr;885use_fmr = SRP_MAP_NO_FMR;886srp_map_desc(&state, dma_addr, dma_len, target->rkey);887}888}889890if (use_fmr == SRP_MAP_ALLOW_FMR && srp_map_finish_fmr(&state, target))891goto backtrack;892893/* We've mapped the request, now pull as much of the indirect894* descriptor table as we can into the command buffer. If this895* target is not using an external indirect table, we are896* guaranteed to fit into the command, as the SCSI layer won't897* give us more S/G entries than we allow.898*/899req->nfmr = state.nfmr;900if (state.ndesc == 1) {901/* FMR mapping was able to collapse this to one entry,902* so use a direct descriptor.903*/904struct srp_direct_buf *buf = (void *) cmd->add_data;905906*buf = req->indirect_desc[0];907goto map_complete;908}909910if (unlikely(target->cmd_sg_cnt < state.ndesc &&911!target->allow_ext_sg)) {912shost_printk(KERN_ERR, target->scsi_host,913"Could not fit S/G list into SRP_CMD\n");914return -EIO;915}916917count = min(state.ndesc, target->cmd_sg_cnt);918table_len = state.ndesc * sizeof (struct srp_direct_buf);919920fmt = SRP_DATA_DESC_INDIRECT;921len = sizeof(struct srp_cmd) + sizeof (struct srp_indirect_buf);922len += count * sizeof (struct srp_direct_buf);923924memcpy(indirect_hdr->desc_list, req->indirect_desc,925count * sizeof (struct srp_direct_buf));926927indirect_hdr->table_desc.va = cpu_to_be64(req->indirect_dma_addr);928indirect_hdr->table_desc.key = cpu_to_be32(target->rkey);929indirect_hdr->table_desc.len = cpu_to_be32(table_len);930indirect_hdr->len = cpu_to_be32(state.total_len);931932if (scmnd->sc_data_direction == DMA_TO_DEVICE)933cmd->data_out_desc_cnt = count;934else935cmd->data_in_desc_cnt = count;936937ib_dma_sync_single_for_device(ibdev, req->indirect_dma_addr, table_len,938DMA_TO_DEVICE);939940map_complete:941if (scmnd->sc_data_direction == DMA_TO_DEVICE)942cmd->buf_fmt = fmt << 4;943else944cmd->buf_fmt = fmt;945946return len;947}948949/*950* Return an IU and possible credit to the free pool951*/952static void srp_put_tx_iu(struct srp_target_port *target, struct srp_iu *iu,953enum srp_iu_type iu_type)954{955unsigned long flags;956957spin_lock_irqsave(&target->lock, flags);958list_add(&iu->list, &target->free_tx);959if (iu_type != SRP_IU_RSP)960++target->req_lim;961spin_unlock_irqrestore(&target->lock, flags);962}963964/*965* Must be called with target->lock held to protect req_lim and free_tx.966* If IU is not sent, it must be returned using srp_put_tx_iu().967*968* Note:969* An upper limit for the number of allocated information units for each970* request type is:971* - SRP_IU_CMD: SRP_CMD_SQ_SIZE, since the SCSI mid-layer never queues972* more than Scsi_Host.can_queue requests.973* - SRP_IU_TSK_MGMT: SRP_TSK_MGMT_SQ_SIZE.974* - SRP_IU_RSP: 1, since a conforming SRP target never sends more than975* one unanswered SRP request to an initiator.976*/977static struct srp_iu *__srp_get_tx_iu(struct srp_target_port *target,978enum srp_iu_type iu_type)979{980s32 rsv = (iu_type == SRP_IU_TSK_MGMT) ? 0 : SRP_TSK_MGMT_SQ_SIZE;981struct srp_iu *iu;982983srp_send_completion(target->send_cq, target);984985if (list_empty(&target->free_tx))986return NULL;987988/* Initiator responses to target requests do not consume credits */989if (iu_type != SRP_IU_RSP) {990if (target->req_lim <= rsv) {991++target->zero_req_lim;992return NULL;993}994995--target->req_lim;996}997998iu = list_first_entry(&target->free_tx, struct srp_iu, list);999list_del(&iu->list);1000return iu;1001}10021003static int srp_post_send(struct srp_target_port *target,1004struct srp_iu *iu, int len)1005{1006struct ib_sge list;1007struct ib_send_wr wr, *bad_wr;10081009list.addr = iu->dma;1010list.length = len;1011list.lkey = target->lkey;10121013wr.next = NULL;1014wr.wr_id = (uintptr_t) iu;1015wr.sg_list = &list;1016wr.num_sge = 1;1017wr.opcode = IB_WR_SEND;1018wr.send_flags = IB_SEND_SIGNALED;10191020return ib_post_send(target->qp, &wr, &bad_wr);1021}10221023static int srp_post_recv(struct srp_target_port *target, struct srp_iu *iu)1024{1025struct ib_recv_wr wr, *bad_wr;1026struct ib_sge list;10271028list.addr = iu->dma;1029list.length = iu->size;1030list.lkey = target->lkey;10311032wr.next = NULL;1033wr.wr_id = (uintptr_t) iu;1034wr.sg_list = &list;1035wr.num_sge = 1;10361037return ib_post_recv(target->qp, &wr, &bad_wr);1038}10391040static void srp_process_rsp(struct srp_target_port *target, struct srp_rsp *rsp)1041{1042struct srp_request *req;1043struct scsi_cmnd *scmnd;1044unsigned long flags;10451046if (unlikely(rsp->tag & SRP_TAG_TSK_MGMT)) {1047spin_lock_irqsave(&target->lock, flags);1048target->req_lim += be32_to_cpu(rsp->req_lim_delta);1049spin_unlock_irqrestore(&target->lock, flags);10501051target->tsk_mgmt_status = -1;1052if (be32_to_cpu(rsp->resp_data_len) >= 4)1053target->tsk_mgmt_status = rsp->data[3];1054complete(&target->tsk_mgmt_done);1055} else {1056req = &target->req_ring[rsp->tag];1057scmnd = req->scmnd;1058if (!scmnd)1059shost_printk(KERN_ERR, target->scsi_host,1060"Null scmnd for RSP w/tag %016llx\n",1061(unsigned long long) rsp->tag);1062scmnd->result = rsp->status;10631064if (rsp->flags & SRP_RSP_FLAG_SNSVALID) {1065memcpy(scmnd->sense_buffer, rsp->data +1066be32_to_cpu(rsp->resp_data_len),1067min_t(int, be32_to_cpu(rsp->sense_data_len),1068SCSI_SENSE_BUFFERSIZE));1069}10701071if (rsp->flags & (SRP_RSP_FLAG_DOOVER | SRP_RSP_FLAG_DOUNDER))1072scsi_set_resid(scmnd, be32_to_cpu(rsp->data_out_res_cnt));1073else if (rsp->flags & (SRP_RSP_FLAG_DIOVER | SRP_RSP_FLAG_DIUNDER))1074scsi_set_resid(scmnd, be32_to_cpu(rsp->data_in_res_cnt));10751076srp_remove_req(target, req, be32_to_cpu(rsp->req_lim_delta));1077scmnd->host_scribble = NULL;1078scmnd->scsi_done(scmnd);1079}1080}10811082static int srp_response_common(struct srp_target_port *target, s32 req_delta,1083void *rsp, int len)1084{1085struct ib_device *dev = target->srp_host->srp_dev->dev;1086unsigned long flags;1087struct srp_iu *iu;1088int err;10891090spin_lock_irqsave(&target->lock, flags);1091target->req_lim += req_delta;1092iu = __srp_get_tx_iu(target, SRP_IU_RSP);1093spin_unlock_irqrestore(&target->lock, flags);10941095if (!iu) {1096shost_printk(KERN_ERR, target->scsi_host, PFX1097"no IU available to send response\n");1098return 1;1099}11001101ib_dma_sync_single_for_cpu(dev, iu->dma, len, DMA_TO_DEVICE);1102memcpy(iu->buf, rsp, len);1103ib_dma_sync_single_for_device(dev, iu->dma, len, DMA_TO_DEVICE);11041105err = srp_post_send(target, iu, len);1106if (err) {1107shost_printk(KERN_ERR, target->scsi_host, PFX1108"unable to post response: %d\n", err);1109srp_put_tx_iu(target, iu, SRP_IU_RSP);1110}11111112return err;1113}11141115static void srp_process_cred_req(struct srp_target_port *target,1116struct srp_cred_req *req)1117{1118struct srp_cred_rsp rsp = {1119.opcode = SRP_CRED_RSP,1120.tag = req->tag,1121};1122s32 delta = be32_to_cpu(req->req_lim_delta);11231124if (srp_response_common(target, delta, &rsp, sizeof rsp))1125shost_printk(KERN_ERR, target->scsi_host, PFX1126"problems processing SRP_CRED_REQ\n");1127}11281129static void srp_process_aer_req(struct srp_target_port *target,1130struct srp_aer_req *req)1131{1132struct srp_aer_rsp rsp = {1133.opcode = SRP_AER_RSP,1134.tag = req->tag,1135};1136s32 delta = be32_to_cpu(req->req_lim_delta);11371138shost_printk(KERN_ERR, target->scsi_host, PFX1139"ignoring AER for LUN %llu\n", be64_to_cpu(req->lun));11401141if (srp_response_common(target, delta, &rsp, sizeof rsp))1142shost_printk(KERN_ERR, target->scsi_host, PFX1143"problems processing SRP_AER_REQ\n");1144}11451146static void srp_handle_recv(struct srp_target_port *target, struct ib_wc *wc)1147{1148struct ib_device *dev = target->srp_host->srp_dev->dev;1149struct srp_iu *iu = (struct srp_iu *) (uintptr_t) wc->wr_id;1150int res;1151u8 opcode;11521153ib_dma_sync_single_for_cpu(dev, iu->dma, target->max_ti_iu_len,1154DMA_FROM_DEVICE);11551156opcode = *(u8 *) iu->buf;11571158if (0) {1159shost_printk(KERN_ERR, target->scsi_host,1160PFX "recv completion, opcode 0x%02x\n", opcode);1161print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 8, 1,1162iu->buf, wc->byte_len, true);1163}11641165switch (opcode) {1166case SRP_RSP:1167srp_process_rsp(target, iu->buf);1168break;11691170case SRP_CRED_REQ:1171srp_process_cred_req(target, iu->buf);1172break;11731174case SRP_AER_REQ:1175srp_process_aer_req(target, iu->buf);1176break;11771178case SRP_T_LOGOUT:1179/* XXX Handle target logout */1180shost_printk(KERN_WARNING, target->scsi_host,1181PFX "Got target logout request\n");1182break;11831184default:1185shost_printk(KERN_WARNING, target->scsi_host,1186PFX "Unhandled SRP opcode 0x%02x\n", opcode);1187break;1188}11891190ib_dma_sync_single_for_device(dev, iu->dma, target->max_ti_iu_len,1191DMA_FROM_DEVICE);11921193res = srp_post_recv(target, iu);1194if (res != 0)1195shost_printk(KERN_ERR, target->scsi_host,1196PFX "Recv failed with error code %d\n", res);1197}11981199static void srp_recv_completion(struct ib_cq *cq, void *target_ptr)1200{1201struct srp_target_port *target = target_ptr;1202struct ib_wc wc;12031204ib_req_notify_cq(cq, IB_CQ_NEXT_COMP);1205while (ib_poll_cq(cq, 1, &wc) > 0) {1206if (wc.status) {1207shost_printk(KERN_ERR, target->scsi_host,1208PFX "failed receive status %d\n",1209wc.status);1210target->qp_in_error = 1;1211break;1212}12131214srp_handle_recv(target, &wc);1215}1216}12171218static void srp_send_completion(struct ib_cq *cq, void *target_ptr)1219{1220struct srp_target_port *target = target_ptr;1221struct ib_wc wc;1222struct srp_iu *iu;12231224while (ib_poll_cq(cq, 1, &wc) > 0) {1225if (wc.status) {1226shost_printk(KERN_ERR, target->scsi_host,1227PFX "failed send status %d\n",1228wc.status);1229target->qp_in_error = 1;1230break;1231}12321233iu = (struct srp_iu *) (uintptr_t) wc.wr_id;1234list_add(&iu->list, &target->free_tx);1235}1236}12371238static int srp_queuecommand(struct Scsi_Host *shost, struct scsi_cmnd *scmnd)1239{1240struct srp_target_port *target = host_to_target(shost);1241struct srp_request *req;1242struct srp_iu *iu;1243struct srp_cmd *cmd;1244struct ib_device *dev;1245unsigned long flags;1246int len;12471248if (target->state == SRP_TARGET_CONNECTING)1249goto err;12501251if (target->state == SRP_TARGET_DEAD ||1252target->state == SRP_TARGET_REMOVED) {1253scmnd->result = DID_BAD_TARGET << 16;1254scmnd->scsi_done(scmnd);1255return 0;1256}12571258spin_lock_irqsave(&target->lock, flags);1259iu = __srp_get_tx_iu(target, SRP_IU_CMD);1260if (!iu)1261goto err_unlock;12621263req = list_first_entry(&target->free_reqs, struct srp_request, list);1264list_del(&req->list);1265spin_unlock_irqrestore(&target->lock, flags);12661267dev = target->srp_host->srp_dev->dev;1268ib_dma_sync_single_for_cpu(dev, iu->dma, target->max_iu_len,1269DMA_TO_DEVICE);12701271scmnd->result = 0;1272scmnd->host_scribble = (void *) req;12731274cmd = iu->buf;1275memset(cmd, 0, sizeof *cmd);12761277cmd->opcode = SRP_CMD;1278cmd->lun = cpu_to_be64((u64) scmnd->device->lun << 48);1279cmd->tag = req->index;1280memcpy(cmd->cdb, scmnd->cmnd, scmnd->cmd_len);12811282req->scmnd = scmnd;1283req->cmd = iu;12841285len = srp_map_data(scmnd, target, req);1286if (len < 0) {1287shost_printk(KERN_ERR, target->scsi_host,1288PFX "Failed to map data\n");1289goto err_iu;1290}12911292ib_dma_sync_single_for_device(dev, iu->dma, target->max_iu_len,1293DMA_TO_DEVICE);12941295if (srp_post_send(target, iu, len)) {1296shost_printk(KERN_ERR, target->scsi_host, PFX "Send failed\n");1297goto err_unmap;1298}12991300return 0;13011302err_unmap:1303srp_unmap_data(scmnd, target, req);13041305err_iu:1306srp_put_tx_iu(target, iu, SRP_IU_CMD);13071308spin_lock_irqsave(&target->lock, flags);1309list_add(&req->list, &target->free_reqs);13101311err_unlock:1312spin_unlock_irqrestore(&target->lock, flags);13131314err:1315return SCSI_MLQUEUE_HOST_BUSY;1316}13171318static int srp_alloc_iu_bufs(struct srp_target_port *target)1319{1320int i;13211322for (i = 0; i < SRP_RQ_SIZE; ++i) {1323target->rx_ring[i] = srp_alloc_iu(target->srp_host,1324target->max_ti_iu_len,1325GFP_KERNEL, DMA_FROM_DEVICE);1326if (!target->rx_ring[i])1327goto err;1328}13291330for (i = 0; i < SRP_SQ_SIZE; ++i) {1331target->tx_ring[i] = srp_alloc_iu(target->srp_host,1332target->max_iu_len,1333GFP_KERNEL, DMA_TO_DEVICE);1334if (!target->tx_ring[i])1335goto err;13361337list_add(&target->tx_ring[i]->list, &target->free_tx);1338}13391340return 0;13411342err:1343for (i = 0; i < SRP_RQ_SIZE; ++i) {1344srp_free_iu(target->srp_host, target->rx_ring[i]);1345target->rx_ring[i] = NULL;1346}13471348for (i = 0; i < SRP_SQ_SIZE; ++i) {1349srp_free_iu(target->srp_host, target->tx_ring[i]);1350target->tx_ring[i] = NULL;1351}13521353return -ENOMEM;1354}13551356static void srp_cm_rep_handler(struct ib_cm_id *cm_id,1357struct srp_login_rsp *lrsp,1358struct srp_target_port *target)1359{1360struct ib_qp_attr *qp_attr = NULL;1361int attr_mask = 0;1362int ret;1363int i;13641365if (lrsp->opcode == SRP_LOGIN_RSP) {1366target->max_ti_iu_len = be32_to_cpu(lrsp->max_ti_iu_len);1367target->req_lim = be32_to_cpu(lrsp->req_lim_delta);13681369/*1370* Reserve credits for task management so we don't1371* bounce requests back to the SCSI mid-layer.1372*/1373target->scsi_host->can_queue1374= min(target->req_lim - SRP_TSK_MGMT_SQ_SIZE,1375target->scsi_host->can_queue);1376} else {1377shost_printk(KERN_WARNING, target->scsi_host,1378PFX "Unhandled RSP opcode %#x\n", lrsp->opcode);1379ret = -ECONNRESET;1380goto error;1381}13821383if (!target->rx_ring[0]) {1384ret = srp_alloc_iu_bufs(target);1385if (ret)1386goto error;1387}13881389ret = -ENOMEM;1390qp_attr = kmalloc(sizeof *qp_attr, GFP_KERNEL);1391if (!qp_attr)1392goto error;13931394qp_attr->qp_state = IB_QPS_RTR;1395ret = ib_cm_init_qp_attr(cm_id, qp_attr, &attr_mask);1396if (ret)1397goto error_free;13981399ret = ib_modify_qp(target->qp, qp_attr, attr_mask);1400if (ret)1401goto error_free;14021403for (i = 0; i < SRP_RQ_SIZE; i++) {1404struct srp_iu *iu = target->rx_ring[i];1405ret = srp_post_recv(target, iu);1406if (ret)1407goto error_free;1408}14091410qp_attr->qp_state = IB_QPS_RTS;1411ret = ib_cm_init_qp_attr(cm_id, qp_attr, &attr_mask);1412if (ret)1413goto error_free;14141415ret = ib_modify_qp(target->qp, qp_attr, attr_mask);1416if (ret)1417goto error_free;14181419ret = ib_send_cm_rtu(cm_id, NULL, 0);14201421error_free:1422kfree(qp_attr);14231424error:1425target->status = ret;1426}14271428static void srp_cm_rej_handler(struct ib_cm_id *cm_id,1429struct ib_cm_event *event,1430struct srp_target_port *target)1431{1432struct Scsi_Host *shost = target->scsi_host;1433struct ib_class_port_info *cpi;1434int opcode;14351436switch (event->param.rej_rcvd.reason) {1437case IB_CM_REJ_PORT_CM_REDIRECT:1438cpi = event->param.rej_rcvd.ari;1439target->path.dlid = cpi->redirect_lid;1440target->path.pkey = cpi->redirect_pkey;1441cm_id->remote_cm_qpn = be32_to_cpu(cpi->redirect_qp) & 0x00ffffff;1442memcpy(target->path.dgid.raw, cpi->redirect_gid, 16);14431444target->status = target->path.dlid ?1445SRP_DLID_REDIRECT : SRP_PORT_REDIRECT;1446break;14471448case IB_CM_REJ_PORT_REDIRECT:1449if (srp_target_is_topspin(target)) {1450/*1451* Topspin/Cisco SRP gateways incorrectly send1452* reject reason code 25 when they mean 241453* (port redirect).1454*/1455memcpy(target->path.dgid.raw,1456event->param.rej_rcvd.ari, 16);14571458shost_printk(KERN_DEBUG, shost,1459PFX "Topspin/Cisco redirect to target port GID %016llx%016llx\n",1460(unsigned long long) be64_to_cpu(target->path.dgid.global.subnet_prefix),1461(unsigned long long) be64_to_cpu(target->path.dgid.global.interface_id));14621463target->status = SRP_PORT_REDIRECT;1464} else {1465shost_printk(KERN_WARNING, shost,1466" REJ reason: IB_CM_REJ_PORT_REDIRECT\n");1467target->status = -ECONNRESET;1468}1469break;14701471case IB_CM_REJ_DUPLICATE_LOCAL_COMM_ID:1472shost_printk(KERN_WARNING, shost,1473" REJ reason: IB_CM_REJ_DUPLICATE_LOCAL_COMM_ID\n");1474target->status = -ECONNRESET;1475break;14761477case IB_CM_REJ_CONSUMER_DEFINED:1478opcode = *(u8 *) event->private_data;1479if (opcode == SRP_LOGIN_REJ) {1480struct srp_login_rej *rej = event->private_data;1481u32 reason = be32_to_cpu(rej->reason);14821483if (reason == SRP_LOGIN_REJ_REQ_IT_IU_LENGTH_TOO_LARGE)1484shost_printk(KERN_WARNING, shost,1485PFX "SRP_LOGIN_REJ: requested max_it_iu_len too large\n");1486else1487shost_printk(KERN_WARNING, shost,1488PFX "SRP LOGIN REJECTED, reason 0x%08x\n", reason);1489} else1490shost_printk(KERN_WARNING, shost,1491" REJ reason: IB_CM_REJ_CONSUMER_DEFINED,"1492" opcode 0x%02x\n", opcode);1493target->status = -ECONNRESET;1494break;14951496case IB_CM_REJ_STALE_CONN:1497shost_printk(KERN_WARNING, shost, " REJ reason: stale connection\n");1498target->status = SRP_STALE_CONN;1499break;15001501default:1502shost_printk(KERN_WARNING, shost, " REJ reason 0x%x\n",1503event->param.rej_rcvd.reason);1504target->status = -ECONNRESET;1505}1506}15071508static int srp_cm_handler(struct ib_cm_id *cm_id, struct ib_cm_event *event)1509{1510struct srp_target_port *target = cm_id->context;1511int comp = 0;15121513switch (event->event) {1514case IB_CM_REQ_ERROR:1515shost_printk(KERN_DEBUG, target->scsi_host,1516PFX "Sending CM REQ failed\n");1517comp = 1;1518target->status = -ECONNRESET;1519break;15201521case IB_CM_REP_RECEIVED:1522comp = 1;1523srp_cm_rep_handler(cm_id, event->private_data, target);1524break;15251526case IB_CM_REJ_RECEIVED:1527shost_printk(KERN_DEBUG, target->scsi_host, PFX "REJ received\n");1528comp = 1;15291530srp_cm_rej_handler(cm_id, event, target);1531break;15321533case IB_CM_DREQ_RECEIVED:1534shost_printk(KERN_WARNING, target->scsi_host,1535PFX "DREQ received - connection closed\n");1536if (ib_send_cm_drep(cm_id, NULL, 0))1537shost_printk(KERN_ERR, target->scsi_host,1538PFX "Sending CM DREP failed\n");1539break;15401541case IB_CM_TIMEWAIT_EXIT:1542shost_printk(KERN_ERR, target->scsi_host,1543PFX "connection closed\n");15441545comp = 1;1546target->status = 0;1547break;15481549case IB_CM_MRA_RECEIVED:1550case IB_CM_DREQ_ERROR:1551case IB_CM_DREP_RECEIVED:1552break;15531554default:1555shost_printk(KERN_WARNING, target->scsi_host,1556PFX "Unhandled CM event %d\n", event->event);1557break;1558}15591560if (comp)1561complete(&target->done);15621563return 0;1564}15651566static int srp_send_tsk_mgmt(struct srp_target_port *target,1567u64 req_tag, unsigned int lun, u8 func)1568{1569struct ib_device *dev = target->srp_host->srp_dev->dev;1570struct srp_iu *iu;1571struct srp_tsk_mgmt *tsk_mgmt;15721573if (target->state == SRP_TARGET_DEAD ||1574target->state == SRP_TARGET_REMOVED)1575return -1;15761577init_completion(&target->tsk_mgmt_done);15781579spin_lock_irq(&target->lock);1580iu = __srp_get_tx_iu(target, SRP_IU_TSK_MGMT);1581spin_unlock_irq(&target->lock);15821583if (!iu)1584return -1;15851586ib_dma_sync_single_for_cpu(dev, iu->dma, sizeof *tsk_mgmt,1587DMA_TO_DEVICE);1588tsk_mgmt = iu->buf;1589memset(tsk_mgmt, 0, sizeof *tsk_mgmt);15901591tsk_mgmt->opcode = SRP_TSK_MGMT;1592tsk_mgmt->lun = cpu_to_be64((u64) lun << 48);1593tsk_mgmt->tag = req_tag | SRP_TAG_TSK_MGMT;1594tsk_mgmt->tsk_mgmt_func = func;1595tsk_mgmt->task_tag = req_tag;15961597ib_dma_sync_single_for_device(dev, iu->dma, sizeof *tsk_mgmt,1598DMA_TO_DEVICE);1599if (srp_post_send(target, iu, sizeof *tsk_mgmt)) {1600srp_put_tx_iu(target, iu, SRP_IU_TSK_MGMT);1601return -1;1602}16031604if (!wait_for_completion_timeout(&target->tsk_mgmt_done,1605msecs_to_jiffies(SRP_ABORT_TIMEOUT_MS)))1606return -1;16071608return 0;1609}16101611static int srp_abort(struct scsi_cmnd *scmnd)1612{1613struct srp_target_port *target = host_to_target(scmnd->device->host);1614struct srp_request *req = (struct srp_request *) scmnd->host_scribble;1615int ret = SUCCESS;16161617shost_printk(KERN_ERR, target->scsi_host, "SRP abort called\n");16181619if (!req || target->qp_in_error)1620return FAILED;1621if (srp_send_tsk_mgmt(target, req->index, scmnd->device->lun,1622SRP_TSK_ABORT_TASK))1623return FAILED;16241625if (req->scmnd) {1626if (!target->tsk_mgmt_status) {1627srp_remove_req(target, req, 0);1628scmnd->result = DID_ABORT << 16;1629} else1630ret = FAILED;1631}16321633return ret;1634}16351636static int srp_reset_device(struct scsi_cmnd *scmnd)1637{1638struct srp_target_port *target = host_to_target(scmnd->device->host);1639int i;16401641shost_printk(KERN_ERR, target->scsi_host, "SRP reset_device called\n");16421643if (target->qp_in_error)1644return FAILED;1645if (srp_send_tsk_mgmt(target, SRP_TAG_NO_REQ, scmnd->device->lun,1646SRP_TSK_LUN_RESET))1647return FAILED;1648if (target->tsk_mgmt_status)1649return FAILED;16501651for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) {1652struct srp_request *req = &target->req_ring[i];1653if (req->scmnd && req->scmnd->device == scmnd->device)1654srp_reset_req(target, req);1655}16561657return SUCCESS;1658}16591660static int srp_reset_host(struct scsi_cmnd *scmnd)1661{1662struct srp_target_port *target = host_to_target(scmnd->device->host);1663int ret = FAILED;16641665shost_printk(KERN_ERR, target->scsi_host, PFX "SRP reset_host called\n");16661667if (!srp_reconnect_target(target))1668ret = SUCCESS;16691670return ret;1671}16721673static ssize_t show_id_ext(struct device *dev, struct device_attribute *attr,1674char *buf)1675{1676struct srp_target_port *target = host_to_target(class_to_shost(dev));16771678if (target->state == SRP_TARGET_DEAD ||1679target->state == SRP_TARGET_REMOVED)1680return -ENODEV;16811682return sprintf(buf, "0x%016llx\n",1683(unsigned long long) be64_to_cpu(target->id_ext));1684}16851686static ssize_t show_ioc_guid(struct device *dev, struct device_attribute *attr,1687char *buf)1688{1689struct srp_target_port *target = host_to_target(class_to_shost(dev));16901691if (target->state == SRP_TARGET_DEAD ||1692target->state == SRP_TARGET_REMOVED)1693return -ENODEV;16941695return sprintf(buf, "0x%016llx\n",1696(unsigned long long) be64_to_cpu(target->ioc_guid));1697}16981699static ssize_t show_service_id(struct device *dev,1700struct device_attribute *attr, char *buf)1701{1702struct srp_target_port *target = host_to_target(class_to_shost(dev));17031704if (target->state == SRP_TARGET_DEAD ||1705target->state == SRP_TARGET_REMOVED)1706return -ENODEV;17071708return sprintf(buf, "0x%016llx\n",1709(unsigned long long) be64_to_cpu(target->service_id));1710}17111712static ssize_t show_pkey(struct device *dev, struct device_attribute *attr,1713char *buf)1714{1715struct srp_target_port *target = host_to_target(class_to_shost(dev));17161717if (target->state == SRP_TARGET_DEAD ||1718target->state == SRP_TARGET_REMOVED)1719return -ENODEV;17201721return sprintf(buf, "0x%04x\n", be16_to_cpu(target->path.pkey));1722}17231724static ssize_t show_dgid(struct device *dev, struct device_attribute *attr,1725char *buf)1726{1727struct srp_target_port *target = host_to_target(class_to_shost(dev));17281729if (target->state == SRP_TARGET_DEAD ||1730target->state == SRP_TARGET_REMOVED)1731return -ENODEV;17321733return sprintf(buf, "%pI6\n", target->path.dgid.raw);1734}17351736static ssize_t show_orig_dgid(struct device *dev,1737struct device_attribute *attr, char *buf)1738{1739struct srp_target_port *target = host_to_target(class_to_shost(dev));17401741if (target->state == SRP_TARGET_DEAD ||1742target->state == SRP_TARGET_REMOVED)1743return -ENODEV;17441745return sprintf(buf, "%pI6\n", target->orig_dgid);1746}17471748static ssize_t show_req_lim(struct device *dev,1749struct device_attribute *attr, char *buf)1750{1751struct srp_target_port *target = host_to_target(class_to_shost(dev));17521753if (target->state == SRP_TARGET_DEAD ||1754target->state == SRP_TARGET_REMOVED)1755return -ENODEV;17561757return sprintf(buf, "%d\n", target->req_lim);1758}17591760static ssize_t show_zero_req_lim(struct device *dev,1761struct device_attribute *attr, char *buf)1762{1763struct srp_target_port *target = host_to_target(class_to_shost(dev));17641765if (target->state == SRP_TARGET_DEAD ||1766target->state == SRP_TARGET_REMOVED)1767return -ENODEV;17681769return sprintf(buf, "%d\n", target->zero_req_lim);1770}17711772static ssize_t show_local_ib_port(struct device *dev,1773struct device_attribute *attr, char *buf)1774{1775struct srp_target_port *target = host_to_target(class_to_shost(dev));17761777return sprintf(buf, "%d\n", target->srp_host->port);1778}17791780static ssize_t show_local_ib_device(struct device *dev,1781struct device_attribute *attr, char *buf)1782{1783struct srp_target_port *target = host_to_target(class_to_shost(dev));17841785return sprintf(buf, "%s\n", target->srp_host->srp_dev->dev->name);1786}17871788static ssize_t show_cmd_sg_entries(struct device *dev,1789struct device_attribute *attr, char *buf)1790{1791struct srp_target_port *target = host_to_target(class_to_shost(dev));17921793return sprintf(buf, "%u\n", target->cmd_sg_cnt);1794}17951796static ssize_t show_allow_ext_sg(struct device *dev,1797struct device_attribute *attr, char *buf)1798{1799struct srp_target_port *target = host_to_target(class_to_shost(dev));18001801return sprintf(buf, "%s\n", target->allow_ext_sg ? "true" : "false");1802}18031804static DEVICE_ATTR(id_ext, S_IRUGO, show_id_ext, NULL);1805static DEVICE_ATTR(ioc_guid, S_IRUGO, show_ioc_guid, NULL);1806static DEVICE_ATTR(service_id, S_IRUGO, show_service_id, NULL);1807static DEVICE_ATTR(pkey, S_IRUGO, show_pkey, NULL);1808static DEVICE_ATTR(dgid, S_IRUGO, show_dgid, NULL);1809static DEVICE_ATTR(orig_dgid, S_IRUGO, show_orig_dgid, NULL);1810static DEVICE_ATTR(req_lim, S_IRUGO, show_req_lim, NULL);1811static DEVICE_ATTR(zero_req_lim, S_IRUGO, show_zero_req_lim, NULL);1812static DEVICE_ATTR(local_ib_port, S_IRUGO, show_local_ib_port, NULL);1813static DEVICE_ATTR(local_ib_device, S_IRUGO, show_local_ib_device, NULL);1814static DEVICE_ATTR(cmd_sg_entries, S_IRUGO, show_cmd_sg_entries, NULL);1815static DEVICE_ATTR(allow_ext_sg, S_IRUGO, show_allow_ext_sg, NULL);18161817static struct device_attribute *srp_host_attrs[] = {1818&dev_attr_id_ext,1819&dev_attr_ioc_guid,1820&dev_attr_service_id,1821&dev_attr_pkey,1822&dev_attr_dgid,1823&dev_attr_orig_dgid,1824&dev_attr_req_lim,1825&dev_attr_zero_req_lim,1826&dev_attr_local_ib_port,1827&dev_attr_local_ib_device,1828&dev_attr_cmd_sg_entries,1829&dev_attr_allow_ext_sg,1830NULL1831};18321833static struct scsi_host_template srp_template = {1834.module = THIS_MODULE,1835.name = "InfiniBand SRP initiator",1836.proc_name = DRV_NAME,1837.info = srp_target_info,1838.queuecommand = srp_queuecommand,1839.eh_abort_handler = srp_abort,1840.eh_device_reset_handler = srp_reset_device,1841.eh_host_reset_handler = srp_reset_host,1842.sg_tablesize = SRP_DEF_SG_TABLESIZE,1843.can_queue = SRP_CMD_SQ_SIZE,1844.this_id = -1,1845.cmd_per_lun = SRP_CMD_SQ_SIZE,1846.use_clustering = ENABLE_CLUSTERING,1847.shost_attrs = srp_host_attrs1848};18491850static int srp_add_target(struct srp_host *host, struct srp_target_port *target)1851{1852struct srp_rport_identifiers ids;1853struct srp_rport *rport;18541855sprintf(target->target_name, "SRP.T10:%016llX",1856(unsigned long long) be64_to_cpu(target->id_ext));18571858if (scsi_add_host(target->scsi_host, host->srp_dev->dev->dma_device))1859return -ENODEV;18601861memcpy(ids.port_id, &target->id_ext, 8);1862memcpy(ids.port_id + 8, &target->ioc_guid, 8);1863ids.roles = SRP_RPORT_ROLE_TARGET;1864rport = srp_rport_add(target->scsi_host, &ids);1865if (IS_ERR(rport)) {1866scsi_remove_host(target->scsi_host);1867return PTR_ERR(rport);1868}18691870spin_lock(&host->target_lock);1871list_add_tail(&target->list, &host->target_list);1872spin_unlock(&host->target_lock);18731874target->state = SRP_TARGET_LIVE;18751876scsi_scan_target(&target->scsi_host->shost_gendev,18770, target->scsi_id, SCAN_WILD_CARD, 0);18781879return 0;1880}18811882static void srp_release_dev(struct device *dev)1883{1884struct srp_host *host =1885container_of(dev, struct srp_host, dev);18861887complete(&host->released);1888}18891890static struct class srp_class = {1891.name = "infiniband_srp",1892.dev_release = srp_release_dev1893};18941895/*1896* Target ports are added by writing1897*1898* id_ext=<SRP ID ext>,ioc_guid=<SRP IOC GUID>,dgid=<dest GID>,1899* pkey=<P_Key>,service_id=<service ID>1900*1901* to the add_target sysfs attribute.1902*/1903enum {1904SRP_OPT_ERR = 0,1905SRP_OPT_ID_EXT = 1 << 0,1906SRP_OPT_IOC_GUID = 1 << 1,1907SRP_OPT_DGID = 1 << 2,1908SRP_OPT_PKEY = 1 << 3,1909SRP_OPT_SERVICE_ID = 1 << 4,1910SRP_OPT_MAX_SECT = 1 << 5,1911SRP_OPT_MAX_CMD_PER_LUN = 1 << 6,1912SRP_OPT_IO_CLASS = 1 << 7,1913SRP_OPT_INITIATOR_EXT = 1 << 8,1914SRP_OPT_CMD_SG_ENTRIES = 1 << 9,1915SRP_OPT_ALLOW_EXT_SG = 1 << 10,1916SRP_OPT_SG_TABLESIZE = 1 << 11,1917SRP_OPT_ALL = (SRP_OPT_ID_EXT |1918SRP_OPT_IOC_GUID |1919SRP_OPT_DGID |1920SRP_OPT_PKEY |1921SRP_OPT_SERVICE_ID),1922};19231924static const match_table_t srp_opt_tokens = {1925{ SRP_OPT_ID_EXT, "id_ext=%s" },1926{ SRP_OPT_IOC_GUID, "ioc_guid=%s" },1927{ SRP_OPT_DGID, "dgid=%s" },1928{ SRP_OPT_PKEY, "pkey=%x" },1929{ SRP_OPT_SERVICE_ID, "service_id=%s" },1930{ SRP_OPT_MAX_SECT, "max_sect=%d" },1931{ SRP_OPT_MAX_CMD_PER_LUN, "max_cmd_per_lun=%d" },1932{ SRP_OPT_IO_CLASS, "io_class=%x" },1933{ SRP_OPT_INITIATOR_EXT, "initiator_ext=%s" },1934{ SRP_OPT_CMD_SG_ENTRIES, "cmd_sg_entries=%u" },1935{ SRP_OPT_ALLOW_EXT_SG, "allow_ext_sg=%u" },1936{ SRP_OPT_SG_TABLESIZE, "sg_tablesize=%u" },1937{ SRP_OPT_ERR, NULL }1938};19391940static int srp_parse_options(const char *buf, struct srp_target_port *target)1941{1942char *options, *sep_opt;1943char *p;1944char dgid[3];1945substring_t args[MAX_OPT_ARGS];1946int opt_mask = 0;1947int token;1948int ret = -EINVAL;1949int i;19501951options = kstrdup(buf, GFP_KERNEL);1952if (!options)1953return -ENOMEM;19541955sep_opt = options;1956while ((p = strsep(&sep_opt, ",")) != NULL) {1957if (!*p)1958continue;19591960token = match_token(p, srp_opt_tokens, args);1961opt_mask |= token;19621963switch (token) {1964case SRP_OPT_ID_EXT:1965p = match_strdup(args);1966if (!p) {1967ret = -ENOMEM;1968goto out;1969}1970target->id_ext = cpu_to_be64(simple_strtoull(p, NULL, 16));1971kfree(p);1972break;19731974case SRP_OPT_IOC_GUID:1975p = match_strdup(args);1976if (!p) {1977ret = -ENOMEM;1978goto out;1979}1980target->ioc_guid = cpu_to_be64(simple_strtoull(p, NULL, 16));1981kfree(p);1982break;19831984case SRP_OPT_DGID:1985p = match_strdup(args);1986if (!p) {1987ret = -ENOMEM;1988goto out;1989}1990if (strlen(p) != 32) {1991printk(KERN_WARNING PFX "bad dest GID parameter '%s'\n", p);1992kfree(p);1993goto out;1994}19951996for (i = 0; i < 16; ++i) {1997strlcpy(dgid, p + i * 2, 3);1998target->path.dgid.raw[i] = simple_strtoul(dgid, NULL, 16);1999}2000kfree(p);2001memcpy(target->orig_dgid, target->path.dgid.raw, 16);2002break;20032004case SRP_OPT_PKEY:2005if (match_hex(args, &token)) {2006printk(KERN_WARNING PFX "bad P_Key parameter '%s'\n", p);2007goto out;2008}2009target->path.pkey = cpu_to_be16(token);2010break;20112012case SRP_OPT_SERVICE_ID:2013p = match_strdup(args);2014if (!p) {2015ret = -ENOMEM;2016goto out;2017}2018target->service_id = cpu_to_be64(simple_strtoull(p, NULL, 16));2019target->path.service_id = target->service_id;2020kfree(p);2021break;20222023case SRP_OPT_MAX_SECT:2024if (match_int(args, &token)) {2025printk(KERN_WARNING PFX "bad max sect parameter '%s'\n", p);2026goto out;2027}2028target->scsi_host->max_sectors = token;2029break;20302031case SRP_OPT_MAX_CMD_PER_LUN:2032if (match_int(args, &token)) {2033printk(KERN_WARNING PFX "bad max cmd_per_lun parameter '%s'\n", p);2034goto out;2035}2036target->scsi_host->cmd_per_lun = min(token, SRP_CMD_SQ_SIZE);2037break;20382039case SRP_OPT_IO_CLASS:2040if (match_hex(args, &token)) {2041printk(KERN_WARNING PFX "bad IO class parameter '%s' \n", p);2042goto out;2043}2044if (token != SRP_REV10_IB_IO_CLASS &&2045token != SRP_REV16A_IB_IO_CLASS) {2046printk(KERN_WARNING PFX "unknown IO class parameter value"2047" %x specified (use %x or %x).\n",2048token, SRP_REV10_IB_IO_CLASS, SRP_REV16A_IB_IO_CLASS);2049goto out;2050}2051target->io_class = token;2052break;20532054case SRP_OPT_INITIATOR_EXT:2055p = match_strdup(args);2056if (!p) {2057ret = -ENOMEM;2058goto out;2059}2060target->initiator_ext = cpu_to_be64(simple_strtoull(p, NULL, 16));2061kfree(p);2062break;20632064case SRP_OPT_CMD_SG_ENTRIES:2065if (match_int(args, &token) || token < 1 || token > 255) {2066printk(KERN_WARNING PFX "bad max cmd_sg_entries parameter '%s'\n", p);2067goto out;2068}2069target->cmd_sg_cnt = token;2070break;20712072case SRP_OPT_ALLOW_EXT_SG:2073if (match_int(args, &token)) {2074printk(KERN_WARNING PFX "bad allow_ext_sg parameter '%s'\n", p);2075goto out;2076}2077target->allow_ext_sg = !!token;2078break;20792080case SRP_OPT_SG_TABLESIZE:2081if (match_int(args, &token) || token < 1 ||2082token > SCSI_MAX_SG_CHAIN_SEGMENTS) {2083printk(KERN_WARNING PFX "bad max sg_tablesize parameter '%s'\n", p);2084goto out;2085}2086target->sg_tablesize = token;2087break;20882089default:2090printk(KERN_WARNING PFX "unknown parameter or missing value "2091"'%s' in target creation request\n", p);2092goto out;2093}2094}20952096if ((opt_mask & SRP_OPT_ALL) == SRP_OPT_ALL)2097ret = 0;2098else2099for (i = 0; i < ARRAY_SIZE(srp_opt_tokens); ++i)2100if ((srp_opt_tokens[i].token & SRP_OPT_ALL) &&2101!(srp_opt_tokens[i].token & opt_mask))2102printk(KERN_WARNING PFX "target creation request is "2103"missing parameter '%s'\n",2104srp_opt_tokens[i].pattern);21052106out:2107kfree(options);2108return ret;2109}21102111static ssize_t srp_create_target(struct device *dev,2112struct device_attribute *attr,2113const char *buf, size_t count)2114{2115struct srp_host *host =2116container_of(dev, struct srp_host, dev);2117struct Scsi_Host *target_host;2118struct srp_target_port *target;2119struct ib_device *ibdev = host->srp_dev->dev;2120dma_addr_t dma_addr;2121int i, ret;21222123target_host = scsi_host_alloc(&srp_template,2124sizeof (struct srp_target_port));2125if (!target_host)2126return -ENOMEM;21272128target_host->transportt = ib_srp_transport_template;2129target_host->max_lun = SRP_MAX_LUN;2130target_host->max_cmd_len = sizeof ((struct srp_cmd *) (void *) 0L)->cdb;21312132target = host_to_target(target_host);21332134target->io_class = SRP_REV16A_IB_IO_CLASS;2135target->scsi_host = target_host;2136target->srp_host = host;2137target->lkey = host->srp_dev->mr->lkey;2138target->rkey = host->srp_dev->mr->rkey;2139target->cmd_sg_cnt = cmd_sg_entries;2140target->sg_tablesize = indirect_sg_entries ? : cmd_sg_entries;2141target->allow_ext_sg = allow_ext_sg;21422143ret = srp_parse_options(buf, target);2144if (ret)2145goto err;21462147if (!host->srp_dev->fmr_pool && !target->allow_ext_sg &&2148target->cmd_sg_cnt < target->sg_tablesize) {2149printk(KERN_WARNING PFX "No FMR pool and no external indirect descriptors, limiting sg_tablesize to cmd_sg_cnt\n");2150target->sg_tablesize = target->cmd_sg_cnt;2151}21522153target_host->sg_tablesize = target->sg_tablesize;2154target->indirect_size = target->sg_tablesize *2155sizeof (struct srp_direct_buf);2156target->max_iu_len = sizeof (struct srp_cmd) +2157sizeof (struct srp_indirect_buf) +2158target->cmd_sg_cnt * sizeof (struct srp_direct_buf);21592160spin_lock_init(&target->lock);2161INIT_LIST_HEAD(&target->free_tx);2162INIT_LIST_HEAD(&target->free_reqs);2163for (i = 0; i < SRP_CMD_SQ_SIZE; ++i) {2164struct srp_request *req = &target->req_ring[i];21652166req->fmr_list = kmalloc(target->cmd_sg_cnt * sizeof (void *),2167GFP_KERNEL);2168req->map_page = kmalloc(SRP_FMR_SIZE * sizeof (void *),2169GFP_KERNEL);2170req->indirect_desc = kmalloc(target->indirect_size, GFP_KERNEL);2171if (!req->fmr_list || !req->map_page || !req->indirect_desc)2172goto err_free_mem;21732174dma_addr = ib_dma_map_single(ibdev, req->indirect_desc,2175target->indirect_size,2176DMA_TO_DEVICE);2177if (ib_dma_mapping_error(ibdev, dma_addr))2178goto err_free_mem;21792180req->indirect_dma_addr = dma_addr;2181req->index = i;2182list_add_tail(&req->list, &target->free_reqs);2183}21842185ib_query_gid(ibdev, host->port, 0, &target->path.sgid);21862187shost_printk(KERN_DEBUG, target->scsi_host, PFX2188"new target: id_ext %016llx ioc_guid %016llx pkey %04x "2189"service_id %016llx dgid %pI6\n",2190(unsigned long long) be64_to_cpu(target->id_ext),2191(unsigned long long) be64_to_cpu(target->ioc_guid),2192be16_to_cpu(target->path.pkey),2193(unsigned long long) be64_to_cpu(target->service_id),2194target->path.dgid.raw);21952196ret = srp_create_target_ib(target);2197if (ret)2198goto err_free_mem;21992200ret = srp_new_cm_id(target);2201if (ret)2202goto err_free_ib;22032204target->qp_in_error = 0;2205ret = srp_connect_target(target);2206if (ret) {2207shost_printk(KERN_ERR, target->scsi_host,2208PFX "Connection failed\n");2209goto err_cm_id;2210}22112212ret = srp_add_target(host, target);2213if (ret)2214goto err_disconnect;22152216return count;22172218err_disconnect:2219srp_disconnect_target(target);22202221err_cm_id:2222ib_destroy_cm_id(target->cm_id);22232224err_free_ib:2225srp_free_target_ib(target);22262227err_free_mem:2228srp_free_req_data(target);22292230err:2231scsi_host_put(target_host);22322233return ret;2234}22352236static DEVICE_ATTR(add_target, S_IWUSR, NULL, srp_create_target);22372238static ssize_t show_ibdev(struct device *dev, struct device_attribute *attr,2239char *buf)2240{2241struct srp_host *host = container_of(dev, struct srp_host, dev);22422243return sprintf(buf, "%s\n", host->srp_dev->dev->name);2244}22452246static DEVICE_ATTR(ibdev, S_IRUGO, show_ibdev, NULL);22472248static ssize_t show_port(struct device *dev, struct device_attribute *attr,2249char *buf)2250{2251struct srp_host *host = container_of(dev, struct srp_host, dev);22522253return sprintf(buf, "%d\n", host->port);2254}22552256static DEVICE_ATTR(port, S_IRUGO, show_port, NULL);22572258static struct srp_host *srp_add_port(struct srp_device *device, u8 port)2259{2260struct srp_host *host;22612262host = kzalloc(sizeof *host, GFP_KERNEL);2263if (!host)2264return NULL;22652266INIT_LIST_HEAD(&host->target_list);2267spin_lock_init(&host->target_lock);2268init_completion(&host->released);2269host->srp_dev = device;2270host->port = port;22712272host->dev.class = &srp_class;2273host->dev.parent = device->dev->dma_device;2274dev_set_name(&host->dev, "srp-%s-%d", device->dev->name, port);22752276if (device_register(&host->dev))2277goto free_host;2278if (device_create_file(&host->dev, &dev_attr_add_target))2279goto err_class;2280if (device_create_file(&host->dev, &dev_attr_ibdev))2281goto err_class;2282if (device_create_file(&host->dev, &dev_attr_port))2283goto err_class;22842285return host;22862287err_class:2288device_unregister(&host->dev);22892290free_host:2291kfree(host);22922293return NULL;2294}22952296static void srp_add_one(struct ib_device *device)2297{2298struct srp_device *srp_dev;2299struct ib_device_attr *dev_attr;2300struct ib_fmr_pool_param fmr_param;2301struct srp_host *host;2302int max_pages_per_fmr, fmr_page_shift, s, e, p;23032304dev_attr = kmalloc(sizeof *dev_attr, GFP_KERNEL);2305if (!dev_attr)2306return;23072308if (ib_query_device(device, dev_attr)) {2309printk(KERN_WARNING PFX "Query device failed for %s\n",2310device->name);2311goto free_attr;2312}23132314srp_dev = kmalloc(sizeof *srp_dev, GFP_KERNEL);2315if (!srp_dev)2316goto free_attr;23172318/*2319* Use the smallest page size supported by the HCA, down to a2320* minimum of 4096 bytes. We're unlikely to build large sglists2321* out of smaller entries.2322*/2323fmr_page_shift = max(12, ffs(dev_attr->page_size_cap) - 1);2324srp_dev->fmr_page_size = 1 << fmr_page_shift;2325srp_dev->fmr_page_mask = ~((u64) srp_dev->fmr_page_size - 1);2326srp_dev->fmr_max_size = srp_dev->fmr_page_size * SRP_FMR_SIZE;23272328INIT_LIST_HEAD(&srp_dev->dev_list);23292330srp_dev->dev = device;2331srp_dev->pd = ib_alloc_pd(device);2332if (IS_ERR(srp_dev->pd))2333goto free_dev;23342335srp_dev->mr = ib_get_dma_mr(srp_dev->pd,2336IB_ACCESS_LOCAL_WRITE |2337IB_ACCESS_REMOTE_READ |2338IB_ACCESS_REMOTE_WRITE);2339if (IS_ERR(srp_dev->mr))2340goto err_pd;23412342for (max_pages_per_fmr = SRP_FMR_SIZE;2343max_pages_per_fmr >= SRP_FMR_MIN_SIZE;2344max_pages_per_fmr /= 2, srp_dev->fmr_max_size /= 2) {2345memset(&fmr_param, 0, sizeof fmr_param);2346fmr_param.pool_size = SRP_FMR_POOL_SIZE;2347fmr_param.dirty_watermark = SRP_FMR_DIRTY_SIZE;2348fmr_param.cache = 1;2349fmr_param.max_pages_per_fmr = max_pages_per_fmr;2350fmr_param.page_shift = fmr_page_shift;2351fmr_param.access = (IB_ACCESS_LOCAL_WRITE |2352IB_ACCESS_REMOTE_WRITE |2353IB_ACCESS_REMOTE_READ);23542355srp_dev->fmr_pool = ib_create_fmr_pool(srp_dev->pd, &fmr_param);2356if (!IS_ERR(srp_dev->fmr_pool))2357break;2358}23592360if (IS_ERR(srp_dev->fmr_pool))2361srp_dev->fmr_pool = NULL;23622363if (device->node_type == RDMA_NODE_IB_SWITCH) {2364s = 0;2365e = 0;2366} else {2367s = 1;2368e = device->phys_port_cnt;2369}23702371for (p = s; p <= e; ++p) {2372host = srp_add_port(srp_dev, p);2373if (host)2374list_add_tail(&host->list, &srp_dev->dev_list);2375}23762377ib_set_client_data(device, &srp_client, srp_dev);23782379goto free_attr;23802381err_pd:2382ib_dealloc_pd(srp_dev->pd);23832384free_dev:2385kfree(srp_dev);23862387free_attr:2388kfree(dev_attr);2389}23902391static void srp_remove_one(struct ib_device *device)2392{2393struct srp_device *srp_dev;2394struct srp_host *host, *tmp_host;2395LIST_HEAD(target_list);2396struct srp_target_port *target, *tmp_target;23972398srp_dev = ib_get_client_data(device, &srp_client);23992400list_for_each_entry_safe(host, tmp_host, &srp_dev->dev_list, list) {2401device_unregister(&host->dev);2402/*2403* Wait for the sysfs entry to go away, so that no new2404* target ports can be created.2405*/2406wait_for_completion(&host->released);24072408/*2409* Mark all target ports as removed, so we stop queueing2410* commands and don't try to reconnect.2411*/2412spin_lock(&host->target_lock);2413list_for_each_entry(target, &host->target_list, list) {2414spin_lock_irq(&target->lock);2415target->state = SRP_TARGET_REMOVED;2416spin_unlock_irq(&target->lock);2417}2418spin_unlock(&host->target_lock);24192420/*2421* Wait for any reconnection tasks that may have2422* started before we marked our target ports as2423* removed, and any target port removal tasks.2424*/2425flush_workqueue(ib_wq);24262427list_for_each_entry_safe(target, tmp_target,2428&host->target_list, list) {2429srp_remove_host(target->scsi_host);2430scsi_remove_host(target->scsi_host);2431srp_disconnect_target(target);2432ib_destroy_cm_id(target->cm_id);2433srp_free_target_ib(target);2434srp_free_req_data(target);2435scsi_host_put(target->scsi_host);2436}24372438kfree(host);2439}24402441if (srp_dev->fmr_pool)2442ib_destroy_fmr_pool(srp_dev->fmr_pool);2443ib_dereg_mr(srp_dev->mr);2444ib_dealloc_pd(srp_dev->pd);24452446kfree(srp_dev);2447}24482449static struct srp_function_template ib_srp_transport_functions = {2450};24512452static int __init srp_init_module(void)2453{2454int ret;24552456BUILD_BUG_ON(FIELD_SIZEOF(struct ib_wc, wr_id) < sizeof(void *));24572458if (srp_sg_tablesize) {2459printk(KERN_WARNING PFX "srp_sg_tablesize is deprecated, please use cmd_sg_entries\n");2460if (!cmd_sg_entries)2461cmd_sg_entries = srp_sg_tablesize;2462}24632464if (!cmd_sg_entries)2465cmd_sg_entries = SRP_DEF_SG_TABLESIZE;24662467if (cmd_sg_entries > 255) {2468printk(KERN_WARNING PFX "Clamping cmd_sg_entries to 255\n");2469cmd_sg_entries = 255;2470}24712472if (!indirect_sg_entries)2473indirect_sg_entries = cmd_sg_entries;2474else if (indirect_sg_entries < cmd_sg_entries) {2475printk(KERN_WARNING PFX "Bumping up indirect_sg_entries to match cmd_sg_entries (%u)\n", cmd_sg_entries);2476indirect_sg_entries = cmd_sg_entries;2477}24782479ib_srp_transport_template =2480srp_attach_transport(&ib_srp_transport_functions);2481if (!ib_srp_transport_template)2482return -ENOMEM;24832484ret = class_register(&srp_class);2485if (ret) {2486printk(KERN_ERR PFX "couldn't register class infiniband_srp\n");2487srp_release_transport(ib_srp_transport_template);2488return ret;2489}24902491ib_sa_register_client(&srp_sa_client);24922493ret = ib_register_client(&srp_client);2494if (ret) {2495printk(KERN_ERR PFX "couldn't register IB client\n");2496srp_release_transport(ib_srp_transport_template);2497ib_sa_unregister_client(&srp_sa_client);2498class_unregister(&srp_class);2499return ret;2500}25012502return 0;2503}25042505static void __exit srp_cleanup_module(void)2506{2507ib_unregister_client(&srp_client);2508ib_sa_unregister_client(&srp_sa_client);2509class_unregister(&srp_class);2510srp_release_transport(ib_srp_transport_template);2511}25122513module_init(srp_init_module);2514module_exit(srp_cleanup_module);251525162517