linux/drivers/scsi/ibmvscsi/ibmvscsi.c
<<
>>
Prefs
   1/* ------------------------------------------------------------
   2 * ibmvscsi.c
   3 * (C) Copyright IBM Corporation 1994, 2004
   4 * Authors: Colin DeVilbiss (devilbis@us.ibm.com)
   5 *          Santiago Leon (santil@us.ibm.com)
   6 *          Dave Boutcher (sleddog@us.ibm.com)
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 *
  13 * This program is distributed in the hope that it will be useful,
  14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16 * GNU General Public License for more details.
  17 *
  18 * You should have received a copy of the GNU General Public License
  19 * along with this program; if not, write to the Free Software
  20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
  21 * USA
  22 *
  23 * ------------------------------------------------------------
  24 * Emulation of a SCSI host adapter for Virtual I/O devices
  25 *
  26 * This driver supports the SCSI adapter implemented by the IBM
  27 * Power5 firmware.  That SCSI adapter is not a physical adapter,
  28 * but allows Linux SCSI peripheral drivers to directly
  29 * access devices in another logical partition on the physical system.
  30 *
  31 * The virtual adapter(s) are present in the open firmware device
  32 * tree just like real adapters.
  33 *
  34 * One of the capabilities provided on these systems is the ability
  35 * to DMA between partitions.  The architecture states that for VSCSI,
  36 * the server side is allowed to DMA to and from the client.  The client
  37 * is never trusted to DMA to or from the server directly.
  38 *
  39 * Messages are sent between partitions on a "Command/Response Queue" 
  40 * (CRQ), which is just a buffer of 16 byte entries in the receiver's 
  41 * Senders cannot access the buffer directly, but send messages by
  42 * making a hypervisor call and passing in the 16 bytes.  The hypervisor
  43 * puts the message in the next 16 byte space in round-robin fashion,
  44 * turns on the high order bit of the message (the valid bit), and 
  45 * generates an interrupt to the receiver (if interrupts are turned on.) 
  46 * The receiver just turns off the valid bit when they have copied out
  47 * the message.
  48 *
  49 * The VSCSI client builds a SCSI Remote Protocol (SRP) Information Unit
  50 * (IU) (as defined in the T10 standard available at www.t10.org), gets 
  51 * a DMA address for the message, and sends it to the server as the
  52 * payload of a CRQ message.  The server DMAs the SRP IU and processes it,
  53 * including doing any additional data transfers.  When it is done, it
  54 * DMAs the SRP response back to the same address as the request came from,
  55 * and sends a CRQ message back to inform the client that the request has
  56 * completed.
  57 *
  58 * TODO: This is currently pretty tied to the IBM pSeries hypervisor
  59 * interfaces.  It would be really nice to abstract this above an RDMA
  60 * layer.
  61 */
  62
  63#include <linux/module.h>
  64#include <linux/moduleparam.h>
  65#include <linux/dma-mapping.h>
  66#include <linux/delay.h>
  67#include <linux/slab.h>
  68#include <linux/of.h>
  69#include <linux/pm.h>
  70#include <linux/kthread.h>
  71#include <asm/firmware.h>
  72#include <asm/vio.h>
  73#include <scsi/scsi.h>
  74#include <scsi/scsi_cmnd.h>
  75#include <scsi/scsi_host.h>
  76#include <scsi/scsi_device.h>
  77#include <scsi/scsi_transport_srp.h>
  78#include "ibmvscsi.h"
  79
  80/* The values below are somewhat arbitrary default values, but 
  81 * OS/400 will use 3 busses (disks, CDs, tapes, I think.)
  82 * Note that there are 3 bits of channel value, 6 bits of id, and
  83 * 5 bits of LUN.
  84 */
  85static int max_id = 64;
  86static int max_channel = 3;
  87static int init_timeout = 300;
  88static int login_timeout = 60;
  89static int info_timeout = 30;
  90static int abort_timeout = 60;
  91static int reset_timeout = 60;
  92static int max_requests = IBMVSCSI_MAX_REQUESTS_DEFAULT;
  93static int max_events = IBMVSCSI_MAX_REQUESTS_DEFAULT + 2;
  94static int fast_fail = 1;
  95static int client_reserve = 1;
  96static char partition_name[97] = "UNKNOWN";
  97static unsigned int partition_number = -1;
  98static LIST_HEAD(ibmvscsi_head);
  99
 100static struct scsi_transport_template *ibmvscsi_transport_template;
 101
 102#define IBMVSCSI_VERSION "1.5.9"
 103
 104MODULE_DESCRIPTION("IBM Virtual SCSI");
 105MODULE_AUTHOR("Dave Boutcher");
 106MODULE_LICENSE("GPL");
 107MODULE_VERSION(IBMVSCSI_VERSION);
 108
 109module_param_named(max_id, max_id, int, S_IRUGO | S_IWUSR);
 110MODULE_PARM_DESC(max_id, "Largest ID value for each channel [Default=64]");
 111module_param_named(max_channel, max_channel, int, S_IRUGO | S_IWUSR);
 112MODULE_PARM_DESC(max_channel, "Largest channel value [Default=3]");
 113module_param_named(init_timeout, init_timeout, int, S_IRUGO | S_IWUSR);
 114MODULE_PARM_DESC(init_timeout, "Initialization timeout in seconds");
 115module_param_named(max_requests, max_requests, int, S_IRUGO);
 116MODULE_PARM_DESC(max_requests, "Maximum requests for this adapter");
 117module_param_named(fast_fail, fast_fail, int, S_IRUGO | S_IWUSR);
 118MODULE_PARM_DESC(fast_fail, "Enable fast fail. [Default=1]");
 119module_param_named(client_reserve, client_reserve, int, S_IRUGO );
 120MODULE_PARM_DESC(client_reserve, "Attempt client managed reserve/release");
 121
 122static void ibmvscsi_handle_crq(struct viosrp_crq *crq,
 123                                struct ibmvscsi_host_data *hostdata);
 124
 125/* ------------------------------------------------------------
 126 * Routines for managing the command/response queue
 127 */
 128/**
 129 * ibmvscsi_handle_event: - Interrupt handler for crq events
 130 * @irq:        number of irq to handle, not used
 131 * @dev_instance: ibmvscsi_host_data of host that received interrupt
 132 *
 133 * Disables interrupts and schedules srp_task
 134 * Always returns IRQ_HANDLED
 135 */
 136static irqreturn_t ibmvscsi_handle_event(int irq, void *dev_instance)
 137{
 138        struct ibmvscsi_host_data *hostdata =
 139            (struct ibmvscsi_host_data *)dev_instance;
 140        vio_disable_interrupts(to_vio_dev(hostdata->dev));
 141        tasklet_schedule(&hostdata->srp_task);
 142        return IRQ_HANDLED;
 143}
 144
 145/**
 146 * release_crq_queue: - Deallocates data and unregisters CRQ
 147 * @queue:      crq_queue to initialize and register
 148 * @host_data:  ibmvscsi_host_data of host
 149 *
 150 * Frees irq, deallocates a page for messages, unmaps dma, and unregisters
 151 * the crq with the hypervisor.
 152 */
 153static void ibmvscsi_release_crq_queue(struct crq_queue *queue,
 154                                       struct ibmvscsi_host_data *hostdata,
 155                                       int max_requests)
 156{
 157        long rc = 0;
 158        struct vio_dev *vdev = to_vio_dev(hostdata->dev);
 159        free_irq(vdev->irq, (void *)hostdata);
 160        tasklet_kill(&hostdata->srp_task);
 161        do {
 162                if (rc)
 163                        msleep(100);
 164                rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
 165        } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc)));
 166        dma_unmap_single(hostdata->dev,
 167                         queue->msg_token,
 168                         queue->size * sizeof(*queue->msgs), DMA_BIDIRECTIONAL);
 169        free_page((unsigned long)queue->msgs);
 170}
 171
 172/**
 173 * crq_queue_next_crq: - Returns the next entry in message queue
 174 * @queue:      crq_queue to use
 175 *
 176 * Returns pointer to next entry in queue, or NULL if there are no new
 177 * entried in the CRQ.
 178 */
 179static struct viosrp_crq *crq_queue_next_crq(struct crq_queue *queue)
 180{
 181        struct viosrp_crq *crq;
 182        unsigned long flags;
 183
 184        spin_lock_irqsave(&queue->lock, flags);
 185        crq = &queue->msgs[queue->cur];
 186        if (crq->valid != VIOSRP_CRQ_FREE) {
 187                if (++queue->cur == queue->size)
 188                        queue->cur = 0;
 189
 190                /* Ensure the read of the valid bit occurs before reading any
 191                 * other bits of the CRQ entry
 192                 */
 193                rmb();
 194        } else
 195                crq = NULL;
 196        spin_unlock_irqrestore(&queue->lock, flags);
 197
 198        return crq;
 199}
 200
 201/**
 202 * ibmvscsi_send_crq: - Send a CRQ
 203 * @hostdata:   the adapter
 204 * @word1:      the first 64 bits of the data
 205 * @word2:      the second 64 bits of the data
 206 */
 207static int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata,
 208                             u64 word1, u64 word2)
 209{
 210        struct vio_dev *vdev = to_vio_dev(hostdata->dev);
 211
 212        /*
 213         * Ensure the command buffer is flushed to memory before handing it
 214         * over to the VIOS to prevent it from fetching any stale data.
 215         */
 216        mb();
 217        return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address, word1, word2);
 218}
 219
 220/**
 221 * ibmvscsi_task: - Process srps asynchronously
 222 * @data:       ibmvscsi_host_data of host
 223 */
 224static void ibmvscsi_task(void *data)
 225{
 226        struct ibmvscsi_host_data *hostdata = (struct ibmvscsi_host_data *)data;
 227        struct vio_dev *vdev = to_vio_dev(hostdata->dev);
 228        struct viosrp_crq *crq;
 229        int done = 0;
 230
 231        while (!done) {
 232                /* Pull all the valid messages off the CRQ */
 233                while ((crq = crq_queue_next_crq(&hostdata->queue)) != NULL) {
 234                        ibmvscsi_handle_crq(crq, hostdata);
 235                        crq->valid = VIOSRP_CRQ_FREE;
 236                        wmb();
 237                }
 238
 239                vio_enable_interrupts(vdev);
 240                crq = crq_queue_next_crq(&hostdata->queue);
 241                if (crq != NULL) {
 242                        vio_disable_interrupts(vdev);
 243                        ibmvscsi_handle_crq(crq, hostdata);
 244                        crq->valid = VIOSRP_CRQ_FREE;
 245                        wmb();
 246                } else {
 247                        done = 1;
 248                }
 249        }
 250}
 251
 252static void gather_partition_info(void)
 253{
 254        const char *ppartition_name;
 255        const __be32 *p_number_ptr;
 256
 257        /* Retrieve information about this partition */
 258        if (!of_root)
 259                return;
 260
 261        of_node_get(of_root);
 262
 263        ppartition_name = of_get_property(of_root, "ibm,partition-name", NULL);
 264        if (ppartition_name)
 265                strncpy(partition_name, ppartition_name,
 266                                sizeof(partition_name));
 267        p_number_ptr = of_get_property(of_root, "ibm,partition-no", NULL);
 268        if (p_number_ptr)
 269                partition_number = of_read_number(p_number_ptr, 1);
 270        of_node_put(of_root);
 271}
 272
 273static void set_adapter_info(struct ibmvscsi_host_data *hostdata)
 274{
 275        memset(&hostdata->madapter_info, 0x00,
 276                        sizeof(hostdata->madapter_info));
 277
 278        dev_info(hostdata->dev, "SRP_VERSION: %s\n", SRP_VERSION);
 279        strcpy(hostdata->madapter_info.srp_version, SRP_VERSION);
 280
 281        strncpy(hostdata->madapter_info.partition_name, partition_name,
 282                        sizeof(hostdata->madapter_info.partition_name));
 283
 284        hostdata->madapter_info.partition_number =
 285                                        cpu_to_be32(partition_number);
 286
 287        hostdata->madapter_info.mad_version = cpu_to_be32(SRP_MAD_VERSION_1);
 288        hostdata->madapter_info.os_type = cpu_to_be32(SRP_MAD_OS_LINUX);
 289}
 290
 291/**
 292 * reset_crq_queue: - resets a crq after a failure
 293 * @queue:      crq_queue to initialize and register
 294 * @hostdata:   ibmvscsi_host_data of host
 295 *
 296 */
 297static int ibmvscsi_reset_crq_queue(struct crq_queue *queue,
 298                                    struct ibmvscsi_host_data *hostdata)
 299{
 300        int rc = 0;
 301        struct vio_dev *vdev = to_vio_dev(hostdata->dev);
 302
 303        /* Close the CRQ */
 304        do {
 305                if (rc)
 306                        msleep(100);
 307                rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
 308        } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc)));
 309
 310        /* Clean out the queue */
 311        memset(queue->msgs, 0x00, PAGE_SIZE);
 312        queue->cur = 0;
 313
 314        set_adapter_info(hostdata);
 315
 316        /* And re-open it again */
 317        rc = plpar_hcall_norets(H_REG_CRQ,
 318                                vdev->unit_address,
 319                                queue->msg_token, PAGE_SIZE);
 320        if (rc == H_CLOSED) {
 321                /* Adapter is good, but other end is not ready */
 322                dev_warn(hostdata->dev, "Partner adapter not ready\n");
 323        } else if (rc != 0) {
 324                dev_warn(hostdata->dev, "couldn't register crq--rc 0x%x\n", rc);
 325        }
 326        return rc;
 327}
 328
 329/**
 330 * initialize_crq_queue: - Initializes and registers CRQ with hypervisor
 331 * @queue:      crq_queue to initialize and register
 332 * @hostdata:   ibmvscsi_host_data of host
 333 *
 334 * Allocates a page for messages, maps it for dma, and registers
 335 * the crq with the hypervisor.
 336 * Returns zero on success.
 337 */
 338static int ibmvscsi_init_crq_queue(struct crq_queue *queue,
 339                                   struct ibmvscsi_host_data *hostdata,
 340                                   int max_requests)
 341{
 342        int rc;
 343        int retrc;
 344        struct vio_dev *vdev = to_vio_dev(hostdata->dev);
 345
 346        queue->msgs = (struct viosrp_crq *)get_zeroed_page(GFP_KERNEL);
 347
 348        if (!queue->msgs)
 349                goto malloc_failed;
 350        queue->size = PAGE_SIZE / sizeof(*queue->msgs);
 351
 352        queue->msg_token = dma_map_single(hostdata->dev, queue->msgs,
 353                                          queue->size * sizeof(*queue->msgs),
 354                                          DMA_BIDIRECTIONAL);
 355
 356        if (dma_mapping_error(hostdata->dev, queue->msg_token))
 357                goto map_failed;
 358
 359        gather_partition_info();
 360        set_adapter_info(hostdata);
 361
 362        retrc = rc = plpar_hcall_norets(H_REG_CRQ,
 363                                vdev->unit_address,
 364                                queue->msg_token, PAGE_SIZE);
 365        if (rc == H_RESOURCE)
 366                /* maybe kexecing and resource is busy. try a reset */
 367                rc = ibmvscsi_reset_crq_queue(queue,
 368                                              hostdata);
 369
 370        if (rc == H_CLOSED) {
 371                /* Adapter is good, but other end is not ready */
 372                dev_warn(hostdata->dev, "Partner adapter not ready\n");
 373                retrc = 0;
 374        } else if (rc != 0) {
 375                dev_warn(hostdata->dev, "Error %d opening adapter\n", rc);
 376                goto reg_crq_failed;
 377        }
 378
 379        queue->cur = 0;
 380        spin_lock_init(&queue->lock);
 381
 382        tasklet_init(&hostdata->srp_task, (void *)ibmvscsi_task,
 383                     (unsigned long)hostdata);
 384
 385        if (request_irq(vdev->irq,
 386                        ibmvscsi_handle_event,
 387                        0, "ibmvscsi", (void *)hostdata) != 0) {
 388                dev_err(hostdata->dev, "couldn't register irq 0x%x\n",
 389                        vdev->irq);
 390                goto req_irq_failed;
 391        }
 392
 393        rc = vio_enable_interrupts(vdev);
 394        if (rc != 0) {
 395                dev_err(hostdata->dev, "Error %d enabling interrupts!!!\n", rc);
 396                goto req_irq_failed;
 397        }
 398
 399        return retrc;
 400
 401      req_irq_failed:
 402        tasklet_kill(&hostdata->srp_task);
 403        rc = 0;
 404        do {
 405                if (rc)
 406                        msleep(100);
 407                rc = plpar_hcall_norets(H_FREE_CRQ, vdev->unit_address);
 408        } while ((rc == H_BUSY) || (H_IS_LONG_BUSY(rc)));
 409      reg_crq_failed:
 410        dma_unmap_single(hostdata->dev,
 411                         queue->msg_token,
 412                         queue->size * sizeof(*queue->msgs), DMA_BIDIRECTIONAL);
 413      map_failed:
 414        free_page((unsigned long)queue->msgs);
 415      malloc_failed:
 416        return -1;
 417}
 418
 419/**
 420 * reenable_crq_queue: - reenables a crq after
 421 * @queue:      crq_queue to initialize and register
 422 * @hostdata:   ibmvscsi_host_data of host
 423 *
 424 */
 425static int ibmvscsi_reenable_crq_queue(struct crq_queue *queue,
 426                                       struct ibmvscsi_host_data *hostdata)
 427{
 428        int rc = 0;
 429        struct vio_dev *vdev = to_vio_dev(hostdata->dev);
 430
 431        /* Re-enable the CRQ */
 432        do {
 433                if (rc)
 434                        msleep(100);
 435                rc = plpar_hcall_norets(H_ENABLE_CRQ, vdev->unit_address);
 436        } while ((rc == H_IN_PROGRESS) || (rc == H_BUSY) || (H_IS_LONG_BUSY(rc)));
 437
 438        if (rc)
 439                dev_err(hostdata->dev, "Error %d enabling adapter\n", rc);
 440        return rc;
 441}
 442
 443/* ------------------------------------------------------------
 444 * Routines for the event pool and event structs
 445 */
 446/**
 447 * initialize_event_pool: - Allocates and initializes the event pool for a host
 448 * @pool:       event_pool to be initialized
 449 * @size:       Number of events in pool
 450 * @hostdata:   ibmvscsi_host_data who owns the event pool
 451 *
 452 * Returns zero on success.
 453*/
 454static int initialize_event_pool(struct event_pool *pool,
 455                                 int size, struct ibmvscsi_host_data *hostdata)
 456{
 457        int i;
 458
 459        pool->size = size;
 460        pool->next = 0;
 461        pool->events = kcalloc(pool->size, sizeof(*pool->events), GFP_KERNEL);
 462        if (!pool->events)
 463                return -ENOMEM;
 464
 465        pool->iu_storage =
 466            dma_alloc_coherent(hostdata->dev,
 467                               pool->size * sizeof(*pool->iu_storage),
 468                               &pool->iu_token, 0);
 469        if (!pool->iu_storage) {
 470                kfree(pool->events);
 471                return -ENOMEM;
 472        }
 473
 474        for (i = 0; i < pool->size; ++i) {
 475                struct srp_event_struct *evt = &pool->events[i];
 476                memset(&evt->crq, 0x00, sizeof(evt->crq));
 477                atomic_set(&evt->free, 1);
 478                evt->crq.valid = VIOSRP_CRQ_CMD_RSP;
 479                evt->crq.IU_length = cpu_to_be16(sizeof(*evt->xfer_iu));
 480                evt->crq.IU_data_ptr = cpu_to_be64(pool->iu_token +
 481                        sizeof(*evt->xfer_iu) * i);
 482                evt->xfer_iu = pool->iu_storage + i;
 483                evt->hostdata = hostdata;
 484                evt->ext_list = NULL;
 485                evt->ext_list_token = 0;
 486        }
 487
 488        return 0;
 489}
 490
 491/**
 492 * release_event_pool: - Frees memory of an event pool of a host
 493 * @pool:       event_pool to be released
 494 * @hostdata:   ibmvscsi_host_data who owns the even pool
 495 *
 496 * Returns zero on success.
 497*/
 498static void release_event_pool(struct event_pool *pool,
 499                               struct ibmvscsi_host_data *hostdata)
 500{
 501        int i, in_use = 0;
 502        for (i = 0; i < pool->size; ++i) {
 503                if (atomic_read(&pool->events[i].free) != 1)
 504                        ++in_use;
 505                if (pool->events[i].ext_list) {
 506                        dma_free_coherent(hostdata->dev,
 507                                  SG_ALL * sizeof(struct srp_direct_buf),
 508                                  pool->events[i].ext_list,
 509                                  pool->events[i].ext_list_token);
 510                }
 511        }
 512        if (in_use)
 513                dev_warn(hostdata->dev, "releasing event pool with %d "
 514                         "events still in use?\n", in_use);
 515        kfree(pool->events);
 516        dma_free_coherent(hostdata->dev,
 517                          pool->size * sizeof(*pool->iu_storage),
 518                          pool->iu_storage, pool->iu_token);
 519}
 520
 521/**
 522 * valid_event_struct: - Determines if event is valid.
 523 * @pool:       event_pool that contains the event
 524 * @evt:        srp_event_struct to be checked for validity
 525 *
 526 * Returns zero if event is invalid, one otherwise.
 527*/
 528static int valid_event_struct(struct event_pool *pool,
 529                                struct srp_event_struct *evt)
 530{
 531        int index = evt - pool->events;
 532        if (index < 0 || index >= pool->size)   /* outside of bounds */
 533                return 0;
 534        if (evt != pool->events + index)        /* unaligned */
 535                return 0;
 536        return 1;
 537}
 538
 539/**
 540 * ibmvscsi_free-event_struct: - Changes status of event to "free"
 541 * @pool:       event_pool that contains the event
 542 * @evt:        srp_event_struct to be modified
 543 *
 544*/
 545static void free_event_struct(struct event_pool *pool,
 546                                       struct srp_event_struct *evt)
 547{
 548        if (!valid_event_struct(pool, evt)) {
 549                dev_err(evt->hostdata->dev, "Freeing invalid event_struct %p "
 550                        "(not in pool %p)\n", evt, pool->events);
 551                return;
 552        }
 553        if (atomic_inc_return(&evt->free) != 1) {
 554                dev_err(evt->hostdata->dev, "Freeing event_struct %p "
 555                        "which is not in use!\n", evt);
 556                return;
 557        }
 558}
 559
 560/**
 561 * get_evt_struct: - Gets the next free event in pool
 562 * @pool:       event_pool that contains the events to be searched
 563 *
 564 * Returns the next event in "free" state, and NULL if none are free.
 565 * Note that no synchronization is done here, we assume the host_lock
 566 * will syncrhonze things.
 567*/
 568static struct srp_event_struct *get_event_struct(struct event_pool *pool)
 569{
 570        int i;
 571        int poolsize = pool->size;
 572        int offset = pool->next;
 573
 574        for (i = 0; i < poolsize; i++) {
 575                offset = (offset + 1) % poolsize;
 576                if (!atomic_dec_if_positive(&pool->events[offset].free)) {
 577                        pool->next = offset;
 578                        return &pool->events[offset];
 579                }
 580        }
 581
 582        printk(KERN_ERR "ibmvscsi: found no event struct in pool!\n");
 583        return NULL;
 584}
 585
 586/**
 587 * init_event_struct: Initialize fields in an event struct that are always 
 588 *                    required.
 589 * @evt:        The event
 590 * @done:       Routine to call when the event is responded to
 591 * @format:     SRP or MAD format
 592 * @timeout:    timeout value set in the CRQ
 593 */
 594static void init_event_struct(struct srp_event_struct *evt_struct,
 595                              void (*done) (struct srp_event_struct *),
 596                              u8 format,
 597                              int timeout)
 598{
 599        evt_struct->cmnd = NULL;
 600        evt_struct->cmnd_done = NULL;
 601        evt_struct->sync_srp = NULL;
 602        evt_struct->crq.format = format;
 603        evt_struct->crq.timeout = cpu_to_be16(timeout);
 604        evt_struct->done = done;
 605}
 606
 607/* ------------------------------------------------------------
 608 * Routines for receiving SCSI responses from the hosting partition
 609 */
 610
 611/**
 612 * set_srp_direction: Set the fields in the srp related to data
 613 *     direction and number of buffers based on the direction in
 614 *     the scsi_cmnd and the number of buffers
 615 */
 616static void set_srp_direction(struct scsi_cmnd *cmd,
 617                              struct srp_cmd *srp_cmd, 
 618                              int numbuf)
 619{
 620        u8 fmt;
 621
 622        if (numbuf == 0)
 623                return;
 624        
 625        if (numbuf == 1)
 626                fmt = SRP_DATA_DESC_DIRECT;
 627        else {
 628                fmt = SRP_DATA_DESC_INDIRECT;
 629                numbuf = min(numbuf, MAX_INDIRECT_BUFS);
 630
 631                if (cmd->sc_data_direction == DMA_TO_DEVICE)
 632                        srp_cmd->data_out_desc_cnt = numbuf;
 633                else
 634                        srp_cmd->data_in_desc_cnt = numbuf;
 635        }
 636
 637        if (cmd->sc_data_direction == DMA_TO_DEVICE)
 638                srp_cmd->buf_fmt = fmt << 4;
 639        else
 640                srp_cmd->buf_fmt = fmt;
 641}
 642
 643/**
 644 * unmap_cmd_data: - Unmap data pointed in srp_cmd based on the format
 645 * @cmd:        srp_cmd whose additional_data member will be unmapped
 646 * @dev:        device for which the memory is mapped
 647 *
 648*/
 649static void unmap_cmd_data(struct srp_cmd *cmd,
 650                           struct srp_event_struct *evt_struct,
 651                           struct device *dev)
 652{
 653        u8 out_fmt, in_fmt;
 654
 655        out_fmt = cmd->buf_fmt >> 4;
 656        in_fmt = cmd->buf_fmt & ((1U << 4) - 1);
 657
 658        if (out_fmt == SRP_NO_DATA_DESC && in_fmt == SRP_NO_DATA_DESC)
 659                return;
 660
 661        if (evt_struct->cmnd)
 662                scsi_dma_unmap(evt_struct->cmnd);
 663}
 664
 665static int map_sg_list(struct scsi_cmnd *cmd, int nseg,
 666                       struct srp_direct_buf *md)
 667{
 668        int i;
 669        struct scatterlist *sg;
 670        u64 total_length = 0;
 671
 672        scsi_for_each_sg(cmd, sg, nseg, i) {
 673                struct srp_direct_buf *descr = md + i;
 674                descr->va = cpu_to_be64(sg_dma_address(sg));
 675                descr->len = cpu_to_be32(sg_dma_len(sg));
 676                descr->key = 0;
 677                total_length += sg_dma_len(sg);
 678        }
 679        return total_length;
 680}
 681
 682/**
 683 * map_sg_data: - Maps dma for a scatterlist and initializes decriptor fields
 684 * @cmd:        Scsi_Cmnd with the scatterlist
 685 * @srp_cmd:    srp_cmd that contains the memory descriptor
 686 * @dev:        device for which to map dma memory
 687 *
 688 * Called by map_data_for_srp_cmd() when building srp cmd from scsi cmd.
 689 * Returns 1 on success.
 690*/
 691static int map_sg_data(struct scsi_cmnd *cmd,
 692                       struct srp_event_struct *evt_struct,
 693                       struct srp_cmd *srp_cmd, struct device *dev)
 694{
 695
 696        int sg_mapped;
 697        u64 total_length = 0;
 698        struct srp_direct_buf *data =
 699                (struct srp_direct_buf *) srp_cmd->add_data;
 700        struct srp_indirect_buf *indirect =
 701                (struct srp_indirect_buf *) data;
 702
 703        sg_mapped = scsi_dma_map(cmd);
 704        if (!sg_mapped)
 705                return 1;
 706        else if (sg_mapped < 0)
 707                return 0;
 708
 709        set_srp_direction(cmd, srp_cmd, sg_mapped);
 710
 711        /* special case; we can use a single direct descriptor */
 712        if (sg_mapped == 1) {
 713                map_sg_list(cmd, sg_mapped, data);
 714                return 1;
 715        }
 716
 717        indirect->table_desc.va = 0;
 718        indirect->table_desc.len = cpu_to_be32(sg_mapped *
 719                                               sizeof(struct srp_direct_buf));
 720        indirect->table_desc.key = 0;
 721
 722        if (sg_mapped <= MAX_INDIRECT_BUFS) {
 723                total_length = map_sg_list(cmd, sg_mapped,
 724                                           &indirect->desc_list[0]);
 725                indirect->len = cpu_to_be32(total_length);
 726                return 1;
 727        }
 728
 729        /* get indirect table */
 730        if (!evt_struct->ext_list) {
 731                evt_struct->ext_list = (struct srp_direct_buf *)
 732                        dma_alloc_coherent(dev,
 733                                           SG_ALL * sizeof(struct srp_direct_buf),
 734                                           &evt_struct->ext_list_token, 0);
 735                if (!evt_struct->ext_list) {
 736                        if (!firmware_has_feature(FW_FEATURE_CMO))
 737                                sdev_printk(KERN_ERR, cmd->device,
 738                                            "Can't allocate memory "
 739                                            "for indirect table\n");
 740                        scsi_dma_unmap(cmd);
 741                        return 0;
 742                }
 743        }
 744
 745        total_length = map_sg_list(cmd, sg_mapped, evt_struct->ext_list);
 746
 747        indirect->len = cpu_to_be32(total_length);
 748        indirect->table_desc.va = cpu_to_be64(evt_struct->ext_list_token);
 749        indirect->table_desc.len = cpu_to_be32(sg_mapped *
 750                                               sizeof(indirect->desc_list[0]));
 751        memcpy(indirect->desc_list, evt_struct->ext_list,
 752               MAX_INDIRECT_BUFS * sizeof(struct srp_direct_buf));
 753        return 1;
 754}
 755
 756/**
 757 * map_data_for_srp_cmd: - Calls functions to map data for srp cmds
 758 * @cmd:        struct scsi_cmnd with the memory to be mapped
 759 * @srp_cmd:    srp_cmd that contains the memory descriptor
 760 * @dev:        dma device for which to map dma memory
 761 *
 762 * Called by scsi_cmd_to_srp_cmd() when converting scsi cmds to srp cmds 
 763 * Returns 1 on success.
 764*/
 765static int map_data_for_srp_cmd(struct scsi_cmnd *cmd,
 766                                struct srp_event_struct *evt_struct,
 767                                struct srp_cmd *srp_cmd, struct device *dev)
 768{
 769        switch (cmd->sc_data_direction) {
 770        case DMA_FROM_DEVICE:
 771        case DMA_TO_DEVICE:
 772                break;
 773        case DMA_NONE:
 774                return 1;
 775        case DMA_BIDIRECTIONAL:
 776                sdev_printk(KERN_ERR, cmd->device,
 777                            "Can't map DMA_BIDIRECTIONAL to read/write\n");
 778                return 0;
 779        default:
 780                sdev_printk(KERN_ERR, cmd->device,
 781                            "Unknown data direction 0x%02x; can't map!\n",
 782                            cmd->sc_data_direction);
 783                return 0;
 784        }
 785
 786        return map_sg_data(cmd, evt_struct, srp_cmd, dev);
 787}
 788
 789/**
 790 * purge_requests: Our virtual adapter just shut down.  purge any sent requests
 791 * @hostdata:    the adapter
 792 */
 793static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code)
 794{
 795        struct srp_event_struct *evt;
 796        unsigned long flags;
 797
 798        spin_lock_irqsave(hostdata->host->host_lock, flags);
 799        while (!list_empty(&hostdata->sent)) {
 800                evt = list_first_entry(&hostdata->sent, struct srp_event_struct, list);
 801                list_del(&evt->list);
 802                del_timer(&evt->timer);
 803
 804                spin_unlock_irqrestore(hostdata->host->host_lock, flags);
 805                if (evt->cmnd) {
 806                        evt->cmnd->result = (error_code << 16);
 807                        unmap_cmd_data(&evt->iu.srp.cmd, evt,
 808                                       evt->hostdata->dev);
 809                        if (evt->cmnd_done)
 810                                evt->cmnd_done(evt->cmnd);
 811                } else if (evt->done && evt->crq.format != VIOSRP_MAD_FORMAT &&
 812                           evt->iu.srp.login_req.opcode != SRP_LOGIN_REQ)
 813                        evt->done(evt);
 814                free_event_struct(&evt->hostdata->pool, evt);
 815                spin_lock_irqsave(hostdata->host->host_lock, flags);
 816        }
 817        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
 818}
 819
 820/**
 821 * ibmvscsi_reset_host - Reset the connection to the server
 822 * @hostdata:   struct ibmvscsi_host_data to reset
 823*/
 824static void ibmvscsi_reset_host(struct ibmvscsi_host_data *hostdata)
 825{
 826        scsi_block_requests(hostdata->host);
 827        atomic_set(&hostdata->request_limit, 0);
 828
 829        purge_requests(hostdata, DID_ERROR);
 830        hostdata->reset_crq = 1;
 831        wake_up(&hostdata->work_wait_q);
 832}
 833
 834/**
 835 * ibmvscsi_timeout - Internal command timeout handler
 836 * @evt_struct: struct srp_event_struct that timed out
 837 *
 838 * Called when an internally generated command times out
 839*/
 840static void ibmvscsi_timeout(struct srp_event_struct *evt_struct)
 841{
 842        struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
 843
 844        dev_err(hostdata->dev, "Command timed out (%x). Resetting connection\n",
 845                evt_struct->iu.srp.cmd.opcode);
 846
 847        ibmvscsi_reset_host(hostdata);
 848}
 849
 850
 851/* ------------------------------------------------------------
 852 * Routines for sending and receiving SRPs
 853 */
 854/**
 855 * ibmvscsi_send_srp_event: - Transforms event to u64 array and calls send_crq()
 856 * @evt_struct: evt_struct to be sent
 857 * @hostdata:   ibmvscsi_host_data of host
 858 * @timeout:    timeout in seconds - 0 means do not time command
 859 *
 860 * Returns the value returned from ibmvscsi_send_crq(). (Zero for success)
 861 * Note that this routine assumes that host_lock is held for synchronization
 862*/
 863static int ibmvscsi_send_srp_event(struct srp_event_struct *evt_struct,
 864                                   struct ibmvscsi_host_data *hostdata,
 865                                   unsigned long timeout)
 866{
 867        __be64 *crq_as_u64 = (__be64 *)&evt_struct->crq;
 868        int request_status = 0;
 869        int rc;
 870        int srp_req = 0;
 871
 872        /* If we have exhausted our request limit, just fail this request,
 873         * unless it is for a reset or abort.
 874         * Note that there are rare cases involving driver generated requests 
 875         * (such as task management requests) that the mid layer may think we
 876         * can handle more requests (can_queue) when we actually can't
 877         */
 878        if (evt_struct->crq.format == VIOSRP_SRP_FORMAT) {
 879                srp_req = 1;
 880                request_status =
 881                        atomic_dec_if_positive(&hostdata->request_limit);
 882                /* If request limit was -1 when we started, it is now even
 883                 * less than that
 884                 */
 885                if (request_status < -1)
 886                        goto send_error;
 887                /* Otherwise, we may have run out of requests. */
 888                /* If request limit was 0 when we started the adapter is in the
 889                 * process of performing a login with the server adapter, or
 890                 * we may have run out of requests.
 891                 */
 892                else if (request_status == -1 &&
 893                         evt_struct->iu.srp.login_req.opcode != SRP_LOGIN_REQ)
 894                        goto send_busy;
 895                /* Abort and reset calls should make it through.
 896                 * Nothing except abort and reset should use the last two
 897                 * slots unless we had two or less to begin with.
 898                 */
 899                else if (request_status < 2 &&
 900                         evt_struct->iu.srp.cmd.opcode != SRP_TSK_MGMT) {
 901                        /* In the case that we have less than two requests
 902                         * available, check the server limit as a combination
 903                         * of the request limit and the number of requests
 904                         * in-flight (the size of the send list).  If the
 905                         * server limit is greater than 2, return busy so
 906                         * that the last two are reserved for reset and abort.
 907                         */
 908                        int server_limit = request_status;
 909                        struct srp_event_struct *tmp_evt;
 910
 911                        list_for_each_entry(tmp_evt, &hostdata->sent, list) {
 912                                server_limit++;
 913                        }
 914
 915                        if (server_limit > 2)
 916                                goto send_busy;
 917                }
 918        }
 919
 920        /* Copy the IU into the transfer area */
 921        *evt_struct->xfer_iu = evt_struct->iu;
 922        evt_struct->xfer_iu->srp.rsp.tag = (u64)evt_struct;
 923
 924        /* Add this to the sent list.  We need to do this 
 925         * before we actually send 
 926         * in case it comes back REALLY fast
 927         */
 928        list_add_tail(&evt_struct->list, &hostdata->sent);
 929
 930        init_timer(&evt_struct->timer);
 931        if (timeout) {
 932                evt_struct->timer.data = (unsigned long) evt_struct;
 933                evt_struct->timer.expires = jiffies + (timeout * HZ);
 934                evt_struct->timer.function = (void (*)(unsigned long))ibmvscsi_timeout;
 935                add_timer(&evt_struct->timer);
 936        }
 937
 938        rc = ibmvscsi_send_crq(hostdata, be64_to_cpu(crq_as_u64[0]),
 939                               be64_to_cpu(crq_as_u64[1]));
 940        if (rc != 0) {
 941                list_del(&evt_struct->list);
 942                del_timer(&evt_struct->timer);
 943
 944                /* If send_crq returns H_CLOSED, return SCSI_MLQUEUE_HOST_BUSY.
 945                 * Firmware will send a CRQ with a transport event (0xFF) to
 946                 * tell this client what has happened to the transport.  This
 947                 * will be handled in ibmvscsi_handle_crq()
 948                 */
 949                if (rc == H_CLOSED) {
 950                        dev_warn(hostdata->dev, "send warning. "
 951                                 "Receive queue closed, will retry.\n");
 952                        goto send_busy;
 953                }
 954                dev_err(hostdata->dev, "send error %d\n", rc);
 955                if (srp_req)
 956                        atomic_inc(&hostdata->request_limit);
 957                goto send_error;
 958        }
 959
 960        return 0;
 961
 962 send_busy:
 963        unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev);
 964
 965        free_event_struct(&hostdata->pool, evt_struct);
 966        if (srp_req && request_status != -1)
 967                atomic_inc(&hostdata->request_limit);
 968        return SCSI_MLQUEUE_HOST_BUSY;
 969
 970 send_error:
 971        unmap_cmd_data(&evt_struct->iu.srp.cmd, evt_struct, hostdata->dev);
 972
 973        if (evt_struct->cmnd != NULL) {
 974                evt_struct->cmnd->result = DID_ERROR << 16;
 975                evt_struct->cmnd_done(evt_struct->cmnd);
 976        } else if (evt_struct->done)
 977                evt_struct->done(evt_struct);
 978
 979        free_event_struct(&hostdata->pool, evt_struct);
 980        return 0;
 981}
 982
 983/**
 984 * handle_cmd_rsp: -  Handle responses from commands
 985 * @evt_struct: srp_event_struct to be handled
 986 *
 987 * Used as a callback by when sending scsi cmds.
 988 * Gets called by ibmvscsi_handle_crq()
 989*/
 990static void handle_cmd_rsp(struct srp_event_struct *evt_struct)
 991{
 992        struct srp_rsp *rsp = &evt_struct->xfer_iu->srp.rsp;
 993        struct scsi_cmnd *cmnd = evt_struct->cmnd;
 994
 995        if (unlikely(rsp->opcode != SRP_RSP)) {
 996                if (printk_ratelimit())
 997                        dev_warn(evt_struct->hostdata->dev,
 998                                 "bad SRP RSP type %#02x\n", rsp->opcode);
 999        }
1000        
1001        if (cmnd) {
1002                cmnd->result |= rsp->status;
1003                if (((cmnd->result >> 1) & 0x1f) == CHECK_CONDITION)
1004                        memcpy(cmnd->sense_buffer,
1005                               rsp->data,
1006                               be32_to_cpu(rsp->sense_data_len));
1007                unmap_cmd_data(&evt_struct->iu.srp.cmd, 
1008                               evt_struct, 
1009                               evt_struct->hostdata->dev);
1010
1011                if (rsp->flags & SRP_RSP_FLAG_DOOVER)
1012                        scsi_set_resid(cmnd,
1013                                       be32_to_cpu(rsp->data_out_res_cnt));
1014                else if (rsp->flags & SRP_RSP_FLAG_DIOVER)
1015                        scsi_set_resid(cmnd, be32_to_cpu(rsp->data_in_res_cnt));
1016        }
1017
1018        if (evt_struct->cmnd_done)
1019                evt_struct->cmnd_done(cmnd);
1020}
1021
1022/**
1023 * lun_from_dev: - Returns the lun of the scsi device
1024 * @dev:        struct scsi_device
1025 *
1026*/
1027static inline u16 lun_from_dev(struct scsi_device *dev)
1028{
1029        return (0x2 << 14) | (dev->id << 8) | (dev->channel << 5) | dev->lun;
1030}
1031
1032/**
1033 * ibmvscsi_queue: - The queuecommand function of the scsi template 
1034 * @cmd:        struct scsi_cmnd to be executed
1035 * @done:       Callback function to be called when cmd is completed
1036*/
1037static int ibmvscsi_queuecommand_lck(struct scsi_cmnd *cmnd,
1038                                 void (*done) (struct scsi_cmnd *))
1039{
1040        struct srp_cmd *srp_cmd;
1041        struct srp_event_struct *evt_struct;
1042        struct srp_indirect_buf *indirect;
1043        struct ibmvscsi_host_data *hostdata = shost_priv(cmnd->device->host);
1044        u16 lun = lun_from_dev(cmnd->device);
1045        u8 out_fmt, in_fmt;
1046
1047        cmnd->result = (DID_OK << 16);
1048        evt_struct = get_event_struct(&hostdata->pool);
1049        if (!evt_struct)
1050                return SCSI_MLQUEUE_HOST_BUSY;
1051
1052        /* Set up the actual SRP IU */
1053        srp_cmd = &evt_struct->iu.srp.cmd;
1054        memset(srp_cmd, 0x00, SRP_MAX_IU_LEN);
1055        srp_cmd->opcode = SRP_CMD;
1056        memcpy(srp_cmd->cdb, cmnd->cmnd, sizeof(srp_cmd->cdb));
1057        int_to_scsilun(lun, &srp_cmd->lun);
1058
1059        if (!map_data_for_srp_cmd(cmnd, evt_struct, srp_cmd, hostdata->dev)) {
1060                if (!firmware_has_feature(FW_FEATURE_CMO))
1061                        sdev_printk(KERN_ERR, cmnd->device,
1062                                    "couldn't convert cmd to srp_cmd\n");
1063                free_event_struct(&hostdata->pool, evt_struct);
1064                return SCSI_MLQUEUE_HOST_BUSY;
1065        }
1066
1067        init_event_struct(evt_struct,
1068                          handle_cmd_rsp,
1069                          VIOSRP_SRP_FORMAT,
1070                          cmnd->request->timeout/HZ);
1071
1072        evt_struct->cmnd = cmnd;
1073        evt_struct->cmnd_done = done;
1074
1075        /* Fix up dma address of the buffer itself */
1076        indirect = (struct srp_indirect_buf *) srp_cmd->add_data;
1077        out_fmt = srp_cmd->buf_fmt >> 4;
1078        in_fmt = srp_cmd->buf_fmt & ((1U << 4) - 1);
1079        if ((in_fmt == SRP_DATA_DESC_INDIRECT ||
1080             out_fmt == SRP_DATA_DESC_INDIRECT) &&
1081            indirect->table_desc.va == 0) {
1082                indirect->table_desc.va =
1083                        cpu_to_be64(be64_to_cpu(evt_struct->crq.IU_data_ptr) +
1084                        offsetof(struct srp_cmd, add_data) +
1085                        offsetof(struct srp_indirect_buf, desc_list));
1086        }
1087
1088        return ibmvscsi_send_srp_event(evt_struct, hostdata, 0);
1089}
1090
1091static DEF_SCSI_QCMD(ibmvscsi_queuecommand)
1092
1093/* ------------------------------------------------------------
1094 * Routines for driver initialization
1095 */
1096
1097/**
1098 * map_persist_bufs: - Pre-map persistent data for adapter logins
1099 * @hostdata:   ibmvscsi_host_data of host
1100 *
1101 * Map the capabilities and adapter info DMA buffers to avoid runtime failures.
1102 * Return 1 on error, 0 on success.
1103 */
1104static int map_persist_bufs(struct ibmvscsi_host_data *hostdata)
1105{
1106
1107        hostdata->caps_addr = dma_map_single(hostdata->dev, &hostdata->caps,
1108                                             sizeof(hostdata->caps), DMA_BIDIRECTIONAL);
1109
1110        if (dma_mapping_error(hostdata->dev, hostdata->caps_addr)) {
1111                dev_err(hostdata->dev, "Unable to map capabilities buffer!\n");
1112                return 1;
1113        }
1114
1115        hostdata->adapter_info_addr = dma_map_single(hostdata->dev,
1116                                                     &hostdata->madapter_info,
1117                                                     sizeof(hostdata->madapter_info),
1118                                                     DMA_BIDIRECTIONAL);
1119        if (dma_mapping_error(hostdata->dev, hostdata->adapter_info_addr)) {
1120                dev_err(hostdata->dev, "Unable to map adapter info buffer!\n");
1121                dma_unmap_single(hostdata->dev, hostdata->caps_addr,
1122                                 sizeof(hostdata->caps), DMA_BIDIRECTIONAL);
1123                return 1;
1124        }
1125
1126        return 0;
1127}
1128
1129/**
1130 * unmap_persist_bufs: - Unmap persistent data needed for adapter logins
1131 * @hostdata:   ibmvscsi_host_data of host
1132 *
1133 * Unmap the capabilities and adapter info DMA buffers
1134 */
1135static void unmap_persist_bufs(struct ibmvscsi_host_data *hostdata)
1136{
1137        dma_unmap_single(hostdata->dev, hostdata->caps_addr,
1138                         sizeof(hostdata->caps), DMA_BIDIRECTIONAL);
1139
1140        dma_unmap_single(hostdata->dev, hostdata->adapter_info_addr,
1141                         sizeof(hostdata->madapter_info), DMA_BIDIRECTIONAL);
1142}
1143
1144/**
1145 * login_rsp: - Handle response to SRP login request
1146 * @evt_struct: srp_event_struct with the response
1147 *
1148 * Used as a "done" callback by when sending srp_login. Gets called
1149 * by ibmvscsi_handle_crq()
1150*/
1151static void login_rsp(struct srp_event_struct *evt_struct)
1152{
1153        struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
1154        switch (evt_struct->xfer_iu->srp.login_rsp.opcode) {
1155        case SRP_LOGIN_RSP:     /* it worked! */
1156                break;
1157        case SRP_LOGIN_REJ:     /* refused! */
1158                dev_info(hostdata->dev, "SRP_LOGIN_REJ reason %u\n",
1159                         evt_struct->xfer_iu->srp.login_rej.reason);
1160                /* Login failed.  */
1161                atomic_set(&hostdata->request_limit, -1);
1162                return;
1163        default:
1164                dev_err(hostdata->dev, "Invalid login response typecode 0x%02x!\n",
1165                        evt_struct->xfer_iu->srp.login_rsp.opcode);
1166                /* Login failed.  */
1167                atomic_set(&hostdata->request_limit, -1);
1168                return;
1169        }
1170
1171        dev_info(hostdata->dev, "SRP_LOGIN succeeded\n");
1172        hostdata->client_migrated = 0;
1173
1174        /* Now we know what the real request-limit is.
1175         * This value is set rather than added to request_limit because
1176         * request_limit could have been set to -1 by this client.
1177         */
1178        atomic_set(&hostdata->request_limit,
1179                   be32_to_cpu(evt_struct->xfer_iu->srp.login_rsp.req_lim_delta));
1180
1181        /* If we had any pending I/Os, kick them */
1182        scsi_unblock_requests(hostdata->host);
1183}
1184
1185/**
1186 * send_srp_login: - Sends the srp login
1187 * @hostdata:   ibmvscsi_host_data of host
1188 *
1189 * Returns zero if successful.
1190*/
1191static int send_srp_login(struct ibmvscsi_host_data *hostdata)
1192{
1193        int rc;
1194        unsigned long flags;
1195        struct srp_login_req *login;
1196        struct srp_event_struct *evt_struct = get_event_struct(&hostdata->pool);
1197
1198        BUG_ON(!evt_struct);
1199        init_event_struct(evt_struct, login_rsp,
1200                          VIOSRP_SRP_FORMAT, login_timeout);
1201
1202        login = &evt_struct->iu.srp.login_req;
1203        memset(login, 0, sizeof(*login));
1204        login->opcode = SRP_LOGIN_REQ;
1205        login->req_it_iu_len = cpu_to_be32(sizeof(union srp_iu));
1206        login->req_buf_fmt = cpu_to_be16(SRP_BUF_FORMAT_DIRECT |
1207                                         SRP_BUF_FORMAT_INDIRECT);
1208
1209        spin_lock_irqsave(hostdata->host->host_lock, flags);
1210        /* Start out with a request limit of 0, since this is negotiated in
1211         * the login request we are just sending and login requests always
1212         * get sent by the driver regardless of request_limit.
1213         */
1214        atomic_set(&hostdata->request_limit, 0);
1215
1216        rc = ibmvscsi_send_srp_event(evt_struct, hostdata, login_timeout * 2);
1217        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1218        dev_info(hostdata->dev, "sent SRP login\n");
1219        return rc;
1220};
1221
1222/**
1223 * capabilities_rsp: - Handle response to MAD adapter capabilities request
1224 * @evt_struct: srp_event_struct with the response
1225 *
1226 * Used as a "done" callback by when sending adapter_info.
1227 */
1228static void capabilities_rsp(struct srp_event_struct *evt_struct)
1229{
1230        struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
1231
1232        if (evt_struct->xfer_iu->mad.capabilities.common.status) {
1233                dev_err(hostdata->dev, "error 0x%X getting capabilities info\n",
1234                        evt_struct->xfer_iu->mad.capabilities.common.status);
1235        } else {
1236                if (hostdata->caps.migration.common.server_support !=
1237                    cpu_to_be16(SERVER_SUPPORTS_CAP))
1238                        dev_info(hostdata->dev, "Partition migration not supported\n");
1239
1240                if (client_reserve) {
1241                        if (hostdata->caps.reserve.common.server_support ==
1242                            cpu_to_be16(SERVER_SUPPORTS_CAP))
1243                                dev_info(hostdata->dev, "Client reserve enabled\n");
1244                        else
1245                                dev_info(hostdata->dev, "Client reserve not supported\n");
1246                }
1247        }
1248
1249        send_srp_login(hostdata);
1250}
1251
1252/**
1253 * send_mad_capabilities: - Sends the mad capabilities request
1254 *      and stores the result so it can be retrieved with
1255 * @hostdata:   ibmvscsi_host_data of host
1256 */
1257static void send_mad_capabilities(struct ibmvscsi_host_data *hostdata)
1258{
1259        struct viosrp_capabilities *req;
1260        struct srp_event_struct *evt_struct;
1261        unsigned long flags;
1262        struct device_node *of_node = hostdata->dev->of_node;
1263        const char *location;
1264
1265        evt_struct = get_event_struct(&hostdata->pool);
1266        BUG_ON(!evt_struct);
1267
1268        init_event_struct(evt_struct, capabilities_rsp,
1269                          VIOSRP_MAD_FORMAT, info_timeout);
1270
1271        req = &evt_struct->iu.mad.capabilities;
1272        memset(req, 0, sizeof(*req));
1273
1274        hostdata->caps.flags = cpu_to_be32(CAP_LIST_SUPPORTED);
1275        if (hostdata->client_migrated)
1276                hostdata->caps.flags |= cpu_to_be32(CLIENT_MIGRATED);
1277
1278        strncpy(hostdata->caps.name, dev_name(&hostdata->host->shost_gendev),
1279                sizeof(hostdata->caps.name));
1280        hostdata->caps.name[sizeof(hostdata->caps.name) - 1] = '\0';
1281
1282        location = of_get_property(of_node, "ibm,loc-code", NULL);
1283        location = location ? location : dev_name(hostdata->dev);
1284        strncpy(hostdata->caps.loc, location, sizeof(hostdata->caps.loc));
1285        hostdata->caps.loc[sizeof(hostdata->caps.loc) - 1] = '\0';
1286
1287        req->common.type = cpu_to_be32(VIOSRP_CAPABILITIES_TYPE);
1288        req->buffer = cpu_to_be64(hostdata->caps_addr);
1289
1290        hostdata->caps.migration.common.cap_type =
1291                                cpu_to_be32(MIGRATION_CAPABILITIES);
1292        hostdata->caps.migration.common.length =
1293                                cpu_to_be16(sizeof(hostdata->caps.migration));
1294        hostdata->caps.migration.common.server_support =
1295                                cpu_to_be16(SERVER_SUPPORTS_CAP);
1296        hostdata->caps.migration.ecl = cpu_to_be32(1);
1297
1298        if (client_reserve) {
1299                hostdata->caps.reserve.common.cap_type =
1300                                        cpu_to_be32(RESERVATION_CAPABILITIES);
1301                hostdata->caps.reserve.common.length =
1302                                cpu_to_be16(sizeof(hostdata->caps.reserve));
1303                hostdata->caps.reserve.common.server_support =
1304                                cpu_to_be16(SERVER_SUPPORTS_CAP);
1305                hostdata->caps.reserve.type =
1306                                cpu_to_be32(CLIENT_RESERVE_SCSI_2);
1307                req->common.length =
1308                                cpu_to_be16(sizeof(hostdata->caps));
1309        } else
1310                req->common.length = cpu_to_be16(sizeof(hostdata->caps) -
1311                                                sizeof(hostdata->caps.reserve));
1312
1313        spin_lock_irqsave(hostdata->host->host_lock, flags);
1314        if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2))
1315                dev_err(hostdata->dev, "couldn't send CAPABILITIES_REQ!\n");
1316        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1317};
1318
1319/**
1320 * fast_fail_rsp: - Handle response to MAD enable fast fail
1321 * @evt_struct: srp_event_struct with the response
1322 *
1323 * Used as a "done" callback by when sending enable fast fail. Gets called
1324 * by ibmvscsi_handle_crq()
1325 */
1326static void fast_fail_rsp(struct srp_event_struct *evt_struct)
1327{
1328        struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
1329        u16 status = be16_to_cpu(evt_struct->xfer_iu->mad.fast_fail.common.status);
1330
1331        if (status == VIOSRP_MAD_NOT_SUPPORTED)
1332                dev_err(hostdata->dev, "fast_fail not supported in server\n");
1333        else if (status == VIOSRP_MAD_FAILED)
1334                dev_err(hostdata->dev, "fast_fail request failed\n");
1335        else if (status != VIOSRP_MAD_SUCCESS)
1336                dev_err(hostdata->dev, "error 0x%X enabling fast_fail\n", status);
1337
1338        send_mad_capabilities(hostdata);
1339}
1340
1341/**
1342 * init_host - Start host initialization
1343 * @hostdata:   ibmvscsi_host_data of host
1344 *
1345 * Returns zero if successful.
1346 */
1347static int enable_fast_fail(struct ibmvscsi_host_data *hostdata)
1348{
1349        int rc;
1350        unsigned long flags;
1351        struct viosrp_fast_fail *fast_fail_mad;
1352        struct srp_event_struct *evt_struct;
1353
1354        if (!fast_fail) {
1355                send_mad_capabilities(hostdata);
1356                return 0;
1357        }
1358
1359        evt_struct = get_event_struct(&hostdata->pool);
1360        BUG_ON(!evt_struct);
1361
1362        init_event_struct(evt_struct, fast_fail_rsp, VIOSRP_MAD_FORMAT, info_timeout);
1363
1364        fast_fail_mad = &evt_struct->iu.mad.fast_fail;
1365        memset(fast_fail_mad, 0, sizeof(*fast_fail_mad));
1366        fast_fail_mad->common.type = cpu_to_be32(VIOSRP_ENABLE_FAST_FAIL);
1367        fast_fail_mad->common.length = cpu_to_be16(sizeof(*fast_fail_mad));
1368
1369        spin_lock_irqsave(hostdata->host->host_lock, flags);
1370        rc = ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2);
1371        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1372        return rc;
1373}
1374
1375/**
1376 * adapter_info_rsp: - Handle response to MAD adapter info request
1377 * @evt_struct: srp_event_struct with the response
1378 *
1379 * Used as a "done" callback by when sending adapter_info. Gets called
1380 * by ibmvscsi_handle_crq()
1381*/
1382static void adapter_info_rsp(struct srp_event_struct *evt_struct)
1383{
1384        struct ibmvscsi_host_data *hostdata = evt_struct->hostdata;
1385
1386        if (evt_struct->xfer_iu->mad.adapter_info.common.status) {
1387                dev_err(hostdata->dev, "error %d getting adapter info\n",
1388                        evt_struct->xfer_iu->mad.adapter_info.common.status);
1389        } else {
1390                dev_info(hostdata->dev, "host srp version: %s, "
1391                         "host partition %s (%d), OS %d, max io %u\n",
1392                         hostdata->madapter_info.srp_version,
1393                         hostdata->madapter_info.partition_name,
1394                         be32_to_cpu(hostdata->madapter_info.partition_number),
1395                         be32_to_cpu(hostdata->madapter_info.os_type),
1396                         be32_to_cpu(hostdata->madapter_info.port_max_txu[0]));
1397                
1398                if (hostdata->madapter_info.port_max_txu[0]) 
1399                        hostdata->host->max_sectors = 
1400                                be32_to_cpu(hostdata->madapter_info.port_max_txu[0]) >> 9;
1401                
1402                if (be32_to_cpu(hostdata->madapter_info.os_type) == SRP_MAD_OS_AIX &&
1403                    strcmp(hostdata->madapter_info.srp_version, "1.6a") <= 0) {
1404                        dev_err(hostdata->dev, "host (Ver. %s) doesn't support large transfers\n",
1405                                hostdata->madapter_info.srp_version);
1406                        dev_err(hostdata->dev, "limiting scatterlists to %d\n",
1407                                MAX_INDIRECT_BUFS);
1408                        hostdata->host->sg_tablesize = MAX_INDIRECT_BUFS;
1409                }
1410
1411                if (be32_to_cpu(hostdata->madapter_info.os_type) == SRP_MAD_OS_AIX) {
1412                        enable_fast_fail(hostdata);
1413                        return;
1414                }
1415        }
1416
1417        send_srp_login(hostdata);
1418}
1419
1420/**
1421 * send_mad_adapter_info: - Sends the mad adapter info request
1422 *      and stores the result so it can be retrieved with
1423 *      sysfs.  We COULD consider causing a failure if the
1424 *      returned SRP version doesn't match ours.
1425 * @hostdata:   ibmvscsi_host_data of host
1426 * 
1427 * Returns zero if successful.
1428*/
1429static void send_mad_adapter_info(struct ibmvscsi_host_data *hostdata)
1430{
1431        struct viosrp_adapter_info *req;
1432        struct srp_event_struct *evt_struct;
1433        unsigned long flags;
1434
1435        evt_struct = get_event_struct(&hostdata->pool);
1436        BUG_ON(!evt_struct);
1437
1438        init_event_struct(evt_struct,
1439                          adapter_info_rsp,
1440                          VIOSRP_MAD_FORMAT,
1441                          info_timeout);
1442        
1443        req = &evt_struct->iu.mad.adapter_info;
1444        memset(req, 0x00, sizeof(*req));
1445        
1446        req->common.type = cpu_to_be32(VIOSRP_ADAPTER_INFO_TYPE);
1447        req->common.length = cpu_to_be16(sizeof(hostdata->madapter_info));
1448        req->buffer = cpu_to_be64(hostdata->adapter_info_addr);
1449
1450        spin_lock_irqsave(hostdata->host->host_lock, flags);
1451        if (ibmvscsi_send_srp_event(evt_struct, hostdata, info_timeout * 2))
1452                dev_err(hostdata->dev, "couldn't send ADAPTER_INFO_REQ!\n");
1453        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1454};
1455
1456/**
1457 * init_adapter: Start virtual adapter initialization sequence
1458 *
1459 */
1460static void init_adapter(struct ibmvscsi_host_data *hostdata)
1461{
1462        send_mad_adapter_info(hostdata);
1463}
1464
1465/**
1466 * sync_completion: Signal that a synchronous command has completed
1467 * Note that after returning from this call, the evt_struct is freed.
1468 * the caller waiting on this completion shouldn't touch the evt_struct
1469 * again.
1470 */
1471static void sync_completion(struct srp_event_struct *evt_struct)
1472{
1473        /* copy the response back */
1474        if (evt_struct->sync_srp)
1475                *evt_struct->sync_srp = *evt_struct->xfer_iu;
1476        
1477        complete(&evt_struct->comp);
1478}
1479
1480/**
1481 * ibmvscsi_abort: Abort a command...from scsi host template
1482 * send this over to the server and wait synchronously for the response
1483 */
1484static int ibmvscsi_eh_abort_handler(struct scsi_cmnd *cmd)
1485{
1486        struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host);
1487        struct srp_tsk_mgmt *tsk_mgmt;
1488        struct srp_event_struct *evt;
1489        struct srp_event_struct *tmp_evt, *found_evt;
1490        union viosrp_iu srp_rsp;
1491        int rsp_rc;
1492        unsigned long flags;
1493        u16 lun = lun_from_dev(cmd->device);
1494        unsigned long wait_switch = 0;
1495
1496        /* First, find this command in our sent list so we can figure
1497         * out the correct tag
1498         */
1499        spin_lock_irqsave(hostdata->host->host_lock, flags);
1500        wait_switch = jiffies + (init_timeout * HZ);
1501        do {
1502                found_evt = NULL;
1503                list_for_each_entry(tmp_evt, &hostdata->sent, list) {
1504                        if (tmp_evt->cmnd == cmd) {
1505                                found_evt = tmp_evt;
1506                                break;
1507                        }
1508                }
1509
1510                if (!found_evt) {
1511                        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1512                        return SUCCESS;
1513                }
1514
1515                evt = get_event_struct(&hostdata->pool);
1516                if (evt == NULL) {
1517                        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1518                        sdev_printk(KERN_ERR, cmd->device,
1519                                "failed to allocate abort event\n");
1520                        return FAILED;
1521                }
1522        
1523                init_event_struct(evt,
1524                                  sync_completion,
1525                                  VIOSRP_SRP_FORMAT,
1526                                  abort_timeout);
1527
1528                tsk_mgmt = &evt->iu.srp.tsk_mgmt;
1529        
1530                /* Set up an abort SRP command */
1531                memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt));
1532                tsk_mgmt->opcode = SRP_TSK_MGMT;
1533                int_to_scsilun(lun, &tsk_mgmt->lun);
1534                tsk_mgmt->tsk_mgmt_func = SRP_TSK_ABORT_TASK;
1535                tsk_mgmt->task_tag = (u64) found_evt;
1536
1537                evt->sync_srp = &srp_rsp;
1538
1539                init_completion(&evt->comp);
1540                rsp_rc = ibmvscsi_send_srp_event(evt, hostdata, abort_timeout * 2);
1541
1542                if (rsp_rc != SCSI_MLQUEUE_HOST_BUSY)
1543                        break;
1544
1545                spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1546                msleep(10);
1547                spin_lock_irqsave(hostdata->host->host_lock, flags);
1548        } while (time_before(jiffies, wait_switch));
1549
1550        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1551
1552        if (rsp_rc != 0) {
1553                sdev_printk(KERN_ERR, cmd->device,
1554                            "failed to send abort() event. rc=%d\n", rsp_rc);
1555                return FAILED;
1556        }
1557
1558        sdev_printk(KERN_INFO, cmd->device,
1559                    "aborting command. lun 0x%llx, tag 0x%llx\n",
1560                    (((u64) lun) << 48), (u64) found_evt);
1561
1562        wait_for_completion(&evt->comp);
1563
1564        /* make sure we got a good response */
1565        if (unlikely(srp_rsp.srp.rsp.opcode != SRP_RSP)) {
1566                if (printk_ratelimit())
1567                        sdev_printk(KERN_WARNING, cmd->device, "abort bad SRP RSP type %d\n",
1568                                    srp_rsp.srp.rsp.opcode);
1569                return FAILED;
1570        }
1571
1572        if (srp_rsp.srp.rsp.flags & SRP_RSP_FLAG_RSPVALID)
1573                rsp_rc = *((int *)srp_rsp.srp.rsp.data);
1574        else
1575                rsp_rc = srp_rsp.srp.rsp.status;
1576
1577        if (rsp_rc) {
1578                if (printk_ratelimit())
1579                        sdev_printk(KERN_WARNING, cmd->device,
1580                                    "abort code %d for task tag 0x%llx\n",
1581                                    rsp_rc, tsk_mgmt->task_tag);
1582                return FAILED;
1583        }
1584
1585        /* Because we dropped the spinlock above, it's possible
1586         * The event is no longer in our list.  Make sure it didn't
1587         * complete while we were aborting
1588         */
1589        spin_lock_irqsave(hostdata->host->host_lock, flags);
1590        found_evt = NULL;
1591        list_for_each_entry(tmp_evt, &hostdata->sent, list) {
1592                if (tmp_evt->cmnd == cmd) {
1593                        found_evt = tmp_evt;
1594                        break;
1595                }
1596        }
1597
1598        if (found_evt == NULL) {
1599                spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1600                sdev_printk(KERN_INFO, cmd->device, "aborted task tag 0x%llx completed\n",
1601                            tsk_mgmt->task_tag);
1602                return SUCCESS;
1603        }
1604
1605        sdev_printk(KERN_INFO, cmd->device, "successfully aborted task tag 0x%llx\n",
1606                    tsk_mgmt->task_tag);
1607
1608        cmd->result = (DID_ABORT << 16);
1609        list_del(&found_evt->list);
1610        unmap_cmd_data(&found_evt->iu.srp.cmd, found_evt,
1611                       found_evt->hostdata->dev);
1612        free_event_struct(&found_evt->hostdata->pool, found_evt);
1613        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1614        atomic_inc(&hostdata->request_limit);
1615        return SUCCESS;
1616}
1617
1618/**
1619 * ibmvscsi_eh_device_reset_handler: Reset a single LUN...from scsi host 
1620 * template send this over to the server and wait synchronously for the 
1621 * response
1622 */
1623static int ibmvscsi_eh_device_reset_handler(struct scsi_cmnd *cmd)
1624{
1625        struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host);
1626        struct srp_tsk_mgmt *tsk_mgmt;
1627        struct srp_event_struct *evt;
1628        struct srp_event_struct *tmp_evt, *pos;
1629        union viosrp_iu srp_rsp;
1630        int rsp_rc;
1631        unsigned long flags;
1632        u16 lun = lun_from_dev(cmd->device);
1633        unsigned long wait_switch = 0;
1634
1635        spin_lock_irqsave(hostdata->host->host_lock, flags);
1636        wait_switch = jiffies + (init_timeout * HZ);
1637        do {
1638                evt = get_event_struct(&hostdata->pool);
1639                if (evt == NULL) {
1640                        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1641                        sdev_printk(KERN_ERR, cmd->device,
1642                                "failed to allocate reset event\n");
1643                        return FAILED;
1644                }
1645        
1646                init_event_struct(evt,
1647                                  sync_completion,
1648                                  VIOSRP_SRP_FORMAT,
1649                                  reset_timeout);
1650
1651                tsk_mgmt = &evt->iu.srp.tsk_mgmt;
1652
1653                /* Set up a lun reset SRP command */
1654                memset(tsk_mgmt, 0x00, sizeof(*tsk_mgmt));
1655                tsk_mgmt->opcode = SRP_TSK_MGMT;
1656                int_to_scsilun(lun, &tsk_mgmt->lun);
1657                tsk_mgmt->tsk_mgmt_func = SRP_TSK_LUN_RESET;
1658
1659                evt->sync_srp = &srp_rsp;
1660
1661                init_completion(&evt->comp);
1662                rsp_rc = ibmvscsi_send_srp_event(evt, hostdata, reset_timeout * 2);
1663
1664                if (rsp_rc != SCSI_MLQUEUE_HOST_BUSY)
1665                        break;
1666
1667                spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1668                msleep(10);
1669                spin_lock_irqsave(hostdata->host->host_lock, flags);
1670        } while (time_before(jiffies, wait_switch));
1671
1672        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1673
1674        if (rsp_rc != 0) {
1675                sdev_printk(KERN_ERR, cmd->device,
1676                            "failed to send reset event. rc=%d\n", rsp_rc);
1677                return FAILED;
1678        }
1679
1680        sdev_printk(KERN_INFO, cmd->device, "resetting device. lun 0x%llx\n",
1681                    (((u64) lun) << 48));
1682
1683        wait_for_completion(&evt->comp);
1684
1685        /* make sure we got a good response */
1686        if (unlikely(srp_rsp.srp.rsp.opcode != SRP_RSP)) {
1687                if (printk_ratelimit())
1688                        sdev_printk(KERN_WARNING, cmd->device, "reset bad SRP RSP type %d\n",
1689                                    srp_rsp.srp.rsp.opcode);
1690                return FAILED;
1691        }
1692
1693        if (srp_rsp.srp.rsp.flags & SRP_RSP_FLAG_RSPVALID)
1694                rsp_rc = *((int *)srp_rsp.srp.rsp.data);
1695        else
1696                rsp_rc = srp_rsp.srp.rsp.status;
1697
1698        if (rsp_rc) {
1699                if (printk_ratelimit())
1700                        sdev_printk(KERN_WARNING, cmd->device,
1701                                    "reset code %d for task tag 0x%llx\n",
1702                                    rsp_rc, tsk_mgmt->task_tag);
1703                return FAILED;
1704        }
1705
1706        /* We need to find all commands for this LUN that have not yet been
1707         * responded to, and fail them with DID_RESET
1708         */
1709        spin_lock_irqsave(hostdata->host->host_lock, flags);
1710        list_for_each_entry_safe(tmp_evt, pos, &hostdata->sent, list) {
1711                if ((tmp_evt->cmnd) && (tmp_evt->cmnd->device == cmd->device)) {
1712                        if (tmp_evt->cmnd)
1713                                tmp_evt->cmnd->result = (DID_RESET << 16);
1714                        list_del(&tmp_evt->list);
1715                        unmap_cmd_data(&tmp_evt->iu.srp.cmd, tmp_evt,
1716                                       tmp_evt->hostdata->dev);
1717                        free_event_struct(&tmp_evt->hostdata->pool,
1718                                                   tmp_evt);
1719                        atomic_inc(&hostdata->request_limit);
1720                        if (tmp_evt->cmnd_done)
1721                                tmp_evt->cmnd_done(tmp_evt->cmnd);
1722                        else if (tmp_evt->done)
1723                                tmp_evt->done(tmp_evt);
1724                }
1725        }
1726        spin_unlock_irqrestore(hostdata->host->host_lock, flags);
1727        return SUCCESS;
1728}
1729
1730/**
1731 * ibmvscsi_eh_host_reset_handler - Reset the connection to the server
1732 * @cmd:        struct scsi_cmnd having problems
1733*/
1734static int ibmvscsi_eh_host_reset_handler(struct scsi_cmnd *cmd)
1735{
1736        unsigned long wait_switch = 0;
1737        struct ibmvscsi_host_data *hostdata = shost_priv(cmd->device->host);
1738
1739        dev_err(hostdata->dev, "Resetting connection due to error recovery\n");
1740
1741        ibmvscsi_reset_host(hostdata);
1742
1743        for (wait_switch = jiffies + (init_timeout * HZ);
1744             time_before(jiffies, wait_switch) &&
1745                     atomic_read(&hostdata->request_limit) < 2;) {
1746
1747                msleep(10);
1748        }
1749
1750        if (atomic_read(&hostdata->request_limit) <= 0)
1751                return FAILED;
1752
1753        return SUCCESS;
1754}
1755
1756/**
1757 * ibmvscsi_handle_crq: - Handles and frees received events in the CRQ
1758 * @crq:        Command/Response queue
1759 * @hostdata:   ibmvscsi_host_data of host
1760 *
1761*/
1762static void ibmvscsi_handle_crq(struct viosrp_crq *crq,
1763                                struct ibmvscsi_host_data *hostdata)
1764{
1765        long rc;
1766        unsigned long flags;
1767        /* The hypervisor copies our tag value here so no byteswapping */
1768        struct srp_event_struct *evt_struct =
1769                        (__force struct srp_event_struct *)crq->IU_data_ptr;
1770        switch (crq->valid) {
1771        case VIOSRP_CRQ_INIT_RSP:               /* initialization */
1772                switch (crq->format) {
1773                case VIOSRP_CRQ_INIT:   /* Initialization message */
1774                        dev_info(hostdata->dev, "partner initialized\n");
1775                        /* Send back a response */
1776                        rc = ibmvscsi_send_crq(hostdata, 0xC002000000000000LL, 0);
1777                        if (rc == 0) {
1778                                /* Now login */
1779                                init_adapter(hostdata);
1780                        } else {
1781                                dev_err(hostdata->dev, "Unable to send init rsp. rc=%ld\n", rc);
1782                        }
1783
1784                        break;
1785                case VIOSRP_CRQ_INIT_COMPLETE:  /* Initialization response */
1786                        dev_info(hostdata->dev, "partner initialization complete\n");
1787
1788                        /* Now login */
1789                        init_adapter(hostdata);
1790                        break;
1791                default:
1792                        dev_err(hostdata->dev, "unknown crq message type: %d\n", crq->format);
1793                }
1794                return;
1795        case VIOSRP_CRQ_XPORT_EVENT:    /* Hypervisor telling us the connection is closed */
1796                scsi_block_requests(hostdata->host);
1797                atomic_set(&hostdata->request_limit, 0);
1798                if (crq->format == 0x06) {
1799                        /* We need to re-setup the interpartition connection */
1800                        dev_info(hostdata->dev, "Re-enabling adapter!\n");
1801                        hostdata->client_migrated = 1;
1802                        hostdata->reenable_crq = 1;
1803                        purge_requests(hostdata, DID_REQUEUE);
1804                        wake_up(&hostdata->work_wait_q);
1805                } else {
1806                        dev_err(hostdata->dev, "Virtual adapter failed rc %d!\n",
1807                                crq->format);
1808                        ibmvscsi_reset_host(hostdata);
1809                }
1810                return;
1811        case VIOSRP_CRQ_CMD_RSP:                /* real payload */
1812                break;
1813        default:
1814                dev_err(hostdata->dev, "got an invalid message type 0x%02x\n",
1815                        crq->valid);
1816                return;
1817        }
1818
1819        /* The only kind of payload CRQs we should get are responses to
1820         * things we send. Make sure this response is to something we
1821         * actually sent
1822         */
1823        if (!valid_event_struct(&hostdata->pool, evt_struct)) {
1824                dev_err(hostdata->dev, "returned correlation_token 0x%p is invalid!\n",
1825                       evt_struct);
1826                return;
1827        }
1828
1829        if (atomic_read(&evt_struct->free)) {
1830                dev_err(hostdata->dev, "received duplicate correlation_token 0x%p!\n",
1831                        evt_struct);
1832                return;
1833        }
1834
1835        if (crq->format == VIOSRP_SRP_FORMAT)
1836                atomic_add(be32_to_cpu(evt_struct->xfer_iu->srp.rsp.req_lim_delta),
1837                           &hostdata->request_limit);
1838
1839        del_timer(&evt_struct->timer);
1840
1841        if ((crq->status != VIOSRP_OK && crq->status != VIOSRP_OK2) && evt_struct->cmnd)
1842                evt_struct->cmnd->result = DID_ERROR << 16;
1843        if (evt_struct->done)
1844                evt_struct->done(evt_struct);
1845        else
1846                dev_err(hostdata->dev, "returned done() is NULL; not running it!\n");
1847
1848        /*
1849         * Lock the host_lock before messing with these structures, since we
1850         * are running in a task context
1851         */
1852        spin_lock_irqsave(evt_struct->hostdata->host->host_lock, flags);
1853        list_del(&evt_struct->list);
1854        free_event_struct(&evt_struct->hostdata->pool, evt_struct);
1855        spin_unlock_irqrestore(evt_struct->hostdata->host->host_lock, flags);
1856}
1857
1858/**
1859 * ibmvscsi_slave_configure: Set the "allow_restart" flag for each disk.
1860 * @sdev:       struct scsi_device device to configure
1861 *
1862 * Enable allow_restart for a device if it is a disk.  Adjust the
1863 * queue_depth here also as is required by the documentation for
1864 * struct scsi_host_template.
1865 */
1866static int ibmvscsi_slave_configure(struct scsi_device *sdev)
1867{
1868        struct Scsi_Host *shost = sdev->host;
1869        unsigned long lock_flags = 0;
1870
1871        spin_lock_irqsave(shost->host_lock, lock_flags);
1872        if (sdev->type == TYPE_DISK) {
1873                sdev->allow_restart = 1;
1874                blk_queue_rq_timeout(sdev->request_queue, 120 * HZ);
1875        }
1876        spin_unlock_irqrestore(shost->host_lock, lock_flags);
1877        return 0;
1878}
1879
1880/**
1881 * ibmvscsi_change_queue_depth - Change the device's queue depth
1882 * @sdev:       scsi device struct
1883 * @qdepth:     depth to set
1884 * @reason:     calling context
1885 *
1886 * Return value:
1887 *      actual depth set
1888 **/
1889static int ibmvscsi_change_queue_depth(struct scsi_device *sdev, int qdepth)
1890{
1891        if (qdepth > IBMVSCSI_MAX_CMDS_PER_LUN)
1892                qdepth = IBMVSCSI_MAX_CMDS_PER_LUN;
1893        return scsi_change_queue_depth(sdev, qdepth);
1894}
1895
1896/* ------------------------------------------------------------
1897 * sysfs attributes
1898 */
1899static ssize_t show_host_vhost_loc(struct device *dev,
1900                                   struct device_attribute *attr, char *buf)
1901{
1902        struct Scsi_Host *shost = class_to_shost(dev);
1903        struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1904        int len;
1905
1906        len = snprintf(buf, sizeof(hostdata->caps.loc), "%s\n",
1907                       hostdata->caps.loc);
1908        return len;
1909}
1910
1911static struct device_attribute ibmvscsi_host_vhost_loc = {
1912        .attr = {
1913                 .name = "vhost_loc",
1914                 .mode = S_IRUGO,
1915                 },
1916        .show = show_host_vhost_loc,
1917};
1918
1919static ssize_t show_host_vhost_name(struct device *dev,
1920                                    struct device_attribute *attr, char *buf)
1921{
1922        struct Scsi_Host *shost = class_to_shost(dev);
1923        struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1924        int len;
1925
1926        len = snprintf(buf, sizeof(hostdata->caps.name), "%s\n",
1927                       hostdata->caps.name);
1928        return len;
1929}
1930
1931static struct device_attribute ibmvscsi_host_vhost_name = {
1932        .attr = {
1933                 .name = "vhost_name",
1934                 .mode = S_IRUGO,
1935                 },
1936        .show = show_host_vhost_name,
1937};
1938
1939static ssize_t show_host_srp_version(struct device *dev,
1940                                     struct device_attribute *attr, char *buf)
1941{
1942        struct Scsi_Host *shost = class_to_shost(dev);
1943        struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1944        int len;
1945
1946        len = snprintf(buf, PAGE_SIZE, "%s\n",
1947                       hostdata->madapter_info.srp_version);
1948        return len;
1949}
1950
1951static struct device_attribute ibmvscsi_host_srp_version = {
1952        .attr = {
1953                 .name = "srp_version",
1954                 .mode = S_IRUGO,
1955                 },
1956        .show = show_host_srp_version,
1957};
1958
1959static ssize_t show_host_partition_name(struct device *dev,
1960                                        struct device_attribute *attr,
1961                                        char *buf)
1962{
1963        struct Scsi_Host *shost = class_to_shost(dev);
1964        struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1965        int len;
1966
1967        len = snprintf(buf, PAGE_SIZE, "%s\n",
1968                       hostdata->madapter_info.partition_name);
1969        return len;
1970}
1971
1972static struct device_attribute ibmvscsi_host_partition_name = {
1973        .attr = {
1974                 .name = "partition_name",
1975                 .mode = S_IRUGO,
1976                 },
1977        .show = show_host_partition_name,
1978};
1979
1980static ssize_t show_host_partition_number(struct device *dev,
1981                                          struct device_attribute *attr,
1982                                          char *buf)
1983{
1984        struct Scsi_Host *shost = class_to_shost(dev);
1985        struct ibmvscsi_host_data *hostdata = shost_priv(shost);
1986        int len;
1987
1988        len = snprintf(buf, PAGE_SIZE, "%d\n",
1989                       be32_to_cpu(hostdata->madapter_info.partition_number));
1990        return len;
1991}
1992
1993static struct device_attribute ibmvscsi_host_partition_number = {
1994        .attr = {
1995                 .name = "partition_number",
1996                 .mode = S_IRUGO,
1997                 },
1998        .show = show_host_partition_number,
1999};
2000
2001static ssize_t show_host_mad_version(struct device *dev,
2002                                     struct device_attribute *attr, char *buf)
2003{
2004        struct Scsi_Host *shost = class_to_shost(dev);
2005        struct ibmvscsi_host_data *hostdata = shost_priv(shost);
2006        int len;
2007
2008        len = snprintf(buf, PAGE_SIZE, "%d\n",
2009                       be32_to_cpu(hostdata->madapter_info.mad_version));
2010        return len;
2011}
2012
2013static struct device_attribute ibmvscsi_host_mad_version = {
2014        .attr = {
2015                 .name = "mad_version",
2016                 .mode = S_IRUGO,
2017                 },
2018        .show = show_host_mad_version,
2019};
2020
2021static ssize_t show_host_os_type(struct device *dev,
2022                                 struct device_attribute *attr, char *buf)
2023{
2024        struct Scsi_Host *shost = class_to_shost(dev);
2025        struct ibmvscsi_host_data *hostdata = shost_priv(shost);
2026        int len;
2027
2028        len = snprintf(buf, PAGE_SIZE, "%d\n",
2029                       be32_to_cpu(hostdata->madapter_info.os_type));
2030        return len;
2031}
2032
2033static struct device_attribute ibmvscsi_host_os_type = {
2034        .attr = {
2035                 .name = "os_type",
2036                 .mode = S_IRUGO,
2037                 },
2038        .show = show_host_os_type,
2039};
2040
2041static ssize_t show_host_config(struct device *dev,
2042                                struct device_attribute *attr, char *buf)
2043{
2044        return 0;
2045}
2046
2047static struct device_attribute ibmvscsi_host_config = {
2048        .attr = {
2049                .name = "config",
2050                .mode = S_IRUGO,
2051                },
2052        .show = show_host_config,
2053};
2054
2055static struct device_attribute *ibmvscsi_attrs[] = {
2056        &ibmvscsi_host_vhost_loc,
2057        &ibmvscsi_host_vhost_name,
2058        &ibmvscsi_host_srp_version,
2059        &ibmvscsi_host_partition_name,
2060        &ibmvscsi_host_partition_number,
2061        &ibmvscsi_host_mad_version,
2062        &ibmvscsi_host_os_type,
2063        &ibmvscsi_host_config,
2064        NULL
2065};
2066
2067/* ------------------------------------------------------------
2068 * SCSI driver registration
2069 */
2070static struct scsi_host_template driver_template = {
2071        .module = THIS_MODULE,
2072        .name = "IBM POWER Virtual SCSI Adapter " IBMVSCSI_VERSION,
2073        .proc_name = "ibmvscsi",
2074        .queuecommand = ibmvscsi_queuecommand,
2075        .eh_timed_out = srp_timed_out,
2076        .eh_abort_handler = ibmvscsi_eh_abort_handler,
2077        .eh_device_reset_handler = ibmvscsi_eh_device_reset_handler,
2078        .eh_host_reset_handler = ibmvscsi_eh_host_reset_handler,
2079        .slave_configure = ibmvscsi_slave_configure,
2080        .change_queue_depth = ibmvscsi_change_queue_depth,
2081        .cmd_per_lun = IBMVSCSI_CMDS_PER_LUN_DEFAULT,
2082        .can_queue = IBMVSCSI_MAX_REQUESTS_DEFAULT,
2083        .this_id = -1,
2084        .sg_tablesize = SG_ALL,
2085        .use_clustering = ENABLE_CLUSTERING,
2086        .shost_attrs = ibmvscsi_attrs,
2087};
2088
2089/**
2090 * ibmvscsi_get_desired_dma - Calculate IO memory desired by the driver
2091 *
2092 * @vdev: struct vio_dev for the device whose desired IO mem is to be returned
2093 *
2094 * Return value:
2095 *      Number of bytes of IO data the driver will need to perform well.
2096 */
2097static unsigned long ibmvscsi_get_desired_dma(struct vio_dev *vdev)
2098{
2099        /* iu_storage data allocated in initialize_event_pool */
2100        unsigned long desired_io = max_events * sizeof(union viosrp_iu);
2101
2102        /* add io space for sg data */
2103        desired_io += (IBMVSCSI_MAX_SECTORS_DEFAULT * 512 *
2104                             IBMVSCSI_CMDS_PER_LUN_DEFAULT);
2105
2106        return desired_io;
2107}
2108
2109static void ibmvscsi_do_work(struct ibmvscsi_host_data *hostdata)
2110{
2111        int rc;
2112        char *action = "reset";
2113
2114        if (hostdata->reset_crq) {
2115                smp_rmb();
2116                hostdata->reset_crq = 0;
2117
2118                rc = ibmvscsi_reset_crq_queue(&hostdata->queue, hostdata);
2119                if (!rc)
2120                        rc = ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0);
2121                vio_enable_interrupts(to_vio_dev(hostdata->dev));
2122        } else if (hostdata->reenable_crq) {
2123                smp_rmb();
2124                action = "enable";
2125                rc = ibmvscsi_reenable_crq_queue(&hostdata->queue, hostdata);
2126                hostdata->reenable_crq = 0;
2127                if (!rc)
2128                        rc = ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0);
2129        } else
2130                return;
2131
2132        if (rc) {
2133                atomic_set(&hostdata->request_limit, -1);
2134                dev_err(hostdata->dev, "error after %s\n", action);
2135        }
2136
2137        scsi_unblock_requests(hostdata->host);
2138}
2139
2140static int ibmvscsi_work_to_do(struct ibmvscsi_host_data *hostdata)
2141{
2142        if (kthread_should_stop())
2143                return 1;
2144        else if (hostdata->reset_crq) {
2145                smp_rmb();
2146                return 1;
2147        } else if (hostdata->reenable_crq) {
2148                smp_rmb();
2149                return 1;
2150        }
2151
2152        return 0;
2153}
2154
2155static int ibmvscsi_work(void *data)
2156{
2157        struct ibmvscsi_host_data *hostdata = data;
2158        int rc;
2159
2160        set_user_nice(current, MIN_NICE);
2161
2162        while (1) {
2163                rc = wait_event_interruptible(hostdata->work_wait_q,
2164                                              ibmvscsi_work_to_do(hostdata));
2165
2166                BUG_ON(rc);
2167
2168                if (kthread_should_stop())
2169                        break;
2170
2171                ibmvscsi_do_work(hostdata);
2172        }
2173
2174        return 0;
2175}
2176
2177/**
2178 * Called by bus code for each adapter
2179 */
2180static int ibmvscsi_probe(struct vio_dev *vdev, const struct vio_device_id *id)
2181{
2182        struct ibmvscsi_host_data *hostdata;
2183        struct Scsi_Host *host;
2184        struct device *dev = &vdev->dev;
2185        struct srp_rport_identifiers ids;
2186        struct srp_rport *rport;
2187        unsigned long wait_switch = 0;
2188        int rc;
2189
2190        dev_set_drvdata(&vdev->dev, NULL);
2191
2192        host = scsi_host_alloc(&driver_template, sizeof(*hostdata));
2193        if (!host) {
2194                dev_err(&vdev->dev, "couldn't allocate host data\n");
2195                goto scsi_host_alloc_failed;
2196        }
2197
2198        host->transportt = ibmvscsi_transport_template;
2199        hostdata = shost_priv(host);
2200        memset(hostdata, 0x00, sizeof(*hostdata));
2201        INIT_LIST_HEAD(&hostdata->sent);
2202        init_waitqueue_head(&hostdata->work_wait_q);
2203        hostdata->host = host;
2204        hostdata->dev = dev;
2205        atomic_set(&hostdata->request_limit, -1);
2206        hostdata->host->max_sectors = IBMVSCSI_MAX_SECTORS_DEFAULT;
2207
2208        if (map_persist_bufs(hostdata)) {
2209                dev_err(&vdev->dev, "couldn't map persistent buffers\n");
2210                goto persist_bufs_failed;
2211        }
2212
2213        hostdata->work_thread = kthread_run(ibmvscsi_work, hostdata, "%s_%d",
2214                                            "ibmvscsi", host->host_no);
2215
2216        if (IS_ERR(hostdata->work_thread)) {
2217                dev_err(&vdev->dev, "couldn't initialize kthread. rc=%ld\n",
2218                        PTR_ERR(hostdata->work_thread));
2219                goto init_crq_failed;
2220        }
2221
2222        rc = ibmvscsi_init_crq_queue(&hostdata->queue, hostdata, max_events);
2223        if (rc != 0 && rc != H_RESOURCE) {
2224                dev_err(&vdev->dev, "couldn't initialize crq. rc=%d\n", rc);
2225                goto kill_kthread;
2226        }
2227        if (initialize_event_pool(&hostdata->pool, max_events, hostdata) != 0) {
2228                dev_err(&vdev->dev, "couldn't initialize event pool\n");
2229                goto init_pool_failed;
2230        }
2231
2232        host->max_lun = IBMVSCSI_MAX_LUN;
2233        host->max_id = max_id;
2234        host->max_channel = max_channel;
2235        host->max_cmd_len = 16;
2236
2237        dev_info(dev,
2238                 "Maximum ID: %d Maximum LUN: %llu Maximum Channel: %d\n",
2239                 host->max_id, host->max_lun, host->max_channel);
2240
2241        if (scsi_add_host(hostdata->host, hostdata->dev))
2242                goto add_host_failed;
2243
2244        /* we don't have a proper target_port_id so let's use the fake one */
2245        memcpy(ids.port_id, hostdata->madapter_info.partition_name,
2246               sizeof(ids.port_id));
2247        ids.roles = SRP_RPORT_ROLE_TARGET;
2248        rport = srp_rport_add(host, &ids);
2249        if (IS_ERR(rport))
2250                goto add_srp_port_failed;
2251
2252        /* Try to send an initialization message.  Note that this is allowed
2253         * to fail if the other end is not acive.  In that case we don't
2254         * want to scan
2255         */
2256        if (ibmvscsi_send_crq(hostdata, 0xC001000000000000LL, 0) == 0
2257            || rc == H_RESOURCE) {
2258                /*
2259                 * Wait around max init_timeout secs for the adapter to finish
2260                 * initializing. When we are done initializing, we will have a
2261                 * valid request_limit.  We don't want Linux scanning before
2262                 * we are ready.
2263                 */
2264                for (wait_switch = jiffies + (init_timeout * HZ);
2265                     time_before(jiffies, wait_switch) &&
2266                     atomic_read(&hostdata->request_limit) < 2;) {
2267
2268                        msleep(10);
2269                }
2270
2271                /* if we now have a valid request_limit, initiate a scan */
2272                if (atomic_read(&hostdata->request_limit) > 0)
2273                        scsi_scan_host(host);
2274        }
2275
2276        dev_set_drvdata(&vdev->dev, hostdata);
2277        list_add_tail(&hostdata->host_list, &ibmvscsi_head);
2278        return 0;
2279
2280      add_srp_port_failed:
2281        scsi_remove_host(hostdata->host);
2282      add_host_failed:
2283        release_event_pool(&hostdata->pool, hostdata);
2284      init_pool_failed:
2285        ibmvscsi_release_crq_queue(&hostdata->queue, hostdata, max_events);
2286      kill_kthread:
2287      kthread_stop(hostdata->work_thread);
2288      init_crq_failed:
2289        unmap_persist_bufs(hostdata);
2290      persist_bufs_failed:
2291        scsi_host_put(host);
2292      scsi_host_alloc_failed:
2293        return -1;
2294}
2295
2296static int ibmvscsi_remove(struct vio_dev *vdev)
2297{
2298        struct ibmvscsi_host_data *hostdata = dev_get_drvdata(&vdev->dev);
2299        list_del(&hostdata->host_list);
2300        unmap_persist_bufs(hostdata);
2301        release_event_pool(&hostdata->pool, hostdata);
2302        ibmvscsi_release_crq_queue(&hostdata->queue, hostdata,
2303                                        max_events);
2304
2305        kthread_stop(hostdata->work_thread);
2306        srp_remove_host(hostdata->host);
2307        scsi_remove_host(hostdata->host);
2308        scsi_host_put(hostdata->host);
2309
2310        return 0;
2311}
2312
2313/**
2314 * ibmvscsi_resume: Resume from suspend
2315 * @dev:        device struct
2316 *
2317 * We may have lost an interrupt across suspend/resume, so kick the
2318 * interrupt handler
2319 */
2320static int ibmvscsi_resume(struct device *dev)
2321{
2322        struct ibmvscsi_host_data *hostdata = dev_get_drvdata(dev);
2323        vio_disable_interrupts(to_vio_dev(hostdata->dev));
2324        tasklet_schedule(&hostdata->srp_task);
2325
2326        return 0;
2327}
2328
2329/**
2330 * ibmvscsi_device_table: Used by vio.c to match devices in the device tree we 
2331 * support.
2332 */
2333static const struct vio_device_id ibmvscsi_device_table[] = {
2334        {"vscsi", "IBM,v-scsi"},
2335        { "", "" }
2336};
2337MODULE_DEVICE_TABLE(vio, ibmvscsi_device_table);
2338
2339static const struct dev_pm_ops ibmvscsi_pm_ops = {
2340        .resume = ibmvscsi_resume
2341};
2342
2343static struct vio_driver ibmvscsi_driver = {
2344        .id_table = ibmvscsi_device_table,
2345        .probe = ibmvscsi_probe,
2346        .remove = ibmvscsi_remove,
2347        .get_desired_dma = ibmvscsi_get_desired_dma,
2348        .name = "ibmvscsi",
2349        .pm = &ibmvscsi_pm_ops,
2350};
2351
2352static struct srp_function_template ibmvscsi_transport_functions = {
2353};
2354
2355int __init ibmvscsi_module_init(void)
2356{
2357        int ret;
2358
2359        /* Ensure we have two requests to do error recovery */
2360        driver_template.can_queue = max_requests;
2361        max_events = max_requests + 2;
2362
2363        if (!firmware_has_feature(FW_FEATURE_VIO))
2364                return -ENODEV;
2365
2366        ibmvscsi_transport_template =
2367                srp_attach_transport(&ibmvscsi_transport_functions);
2368        if (!ibmvscsi_transport_template)
2369                return -ENOMEM;
2370
2371        ret = vio_register_driver(&ibmvscsi_driver);
2372        if (ret)
2373                srp_release_transport(ibmvscsi_transport_template);
2374        return ret;
2375}
2376
2377void __exit ibmvscsi_module_exit(void)
2378{
2379        vio_unregister_driver(&ibmvscsi_driver);
2380        srp_release_transport(ibmvscsi_transport_template);
2381}
2382
2383module_init(ibmvscsi_module_init);
2384module_exit(ibmvscsi_module_exit);
2385