linux/drivers/scsi/hosts.c
<<
>>
Prefs
   1/*
   2 *  hosts.c Copyright (C) 1992 Drew Eckhardt
   3 *          Copyright (C) 1993, 1994, 1995 Eric Youngdale
   4 *          Copyright (C) 2002-2003 Christoph Hellwig
   5 *
   6 *  mid to lowlevel SCSI driver interface
   7 *      Initial versions: Drew Eckhardt
   8 *      Subsequent revisions: Eric Youngdale
   9 *
  10 *  <drew@colorado.edu>
  11 *
  12 *  Jiffies wrap fixes (host->resetting), 3 Dec 1998 Andrea Arcangeli
  13 *  Added QLOGIC QLA1280 SCSI controller kernel host support. 
  14 *     August 4, 1999 Fred Lewis, Intel DuPont
  15 *
  16 *  Updated to reflect the new initialization scheme for the higher 
  17 *  level of scsi drivers (sd/sr/st)
  18 *  September 17, 2000 Torben Mathiasen <tmm@image.dk>
  19 *
  20 *  Restructured scsi_host lists and associated functions.
  21 *  September 04, 2002 Mike Anderson (andmike@us.ibm.com)
  22 */
  23
  24#include <linux/module.h>
  25#include <linux/blkdev.h>
  26#include <linux/kernel.h>
  27#include <linux/slab.h>
  28#include <linux/kthread.h>
  29#include <linux/string.h>
  30#include <linux/mm.h>
  31#include <linux/init.h>
  32#include <linux/completion.h>
  33#include <linux/transport_class.h>
  34#include <linux/platform_device.h>
  35#include <linux/pm_runtime.h>
  36
  37#include <scsi/scsi_device.h>
  38#include <scsi/scsi_host.h>
  39#include <scsi/scsi_transport.h>
  40
  41#include "scsi_priv.h"
  42#include "scsi_logging.h"
  43
  44
  45static atomic_t scsi_host_next_hn;      /* host_no for next new host */
  46
  47
  48static void scsi_host_cls_release(struct device *dev)
  49{
  50        put_device(&class_to_shost(dev)->shost_gendev);
  51}
  52
  53static struct class shost_class = {
  54        .name           = "scsi_host",
  55        .dev_release    = scsi_host_cls_release,
  56};
  57
  58/**
  59 *      scsi_host_set_state - Take the given host through the host state model.
  60 *      @shost: scsi host to change the state of.
  61 *      @state: state to change to.
  62 *
  63 *      Returns zero if unsuccessful or an error if the requested
  64 *      transition is illegal.
  65 **/
  66int scsi_host_set_state(struct Scsi_Host *shost, enum scsi_host_state state)
  67{
  68        enum scsi_host_state oldstate = shost->shost_state;
  69
  70        if (state == oldstate)
  71                return 0;
  72
  73        switch (state) {
  74        case SHOST_CREATED:
  75                /* There are no legal states that come back to
  76                 * created.  This is the manually initialised start
  77                 * state */
  78                goto illegal;
  79
  80        case SHOST_RUNNING:
  81                switch (oldstate) {
  82                case SHOST_CREATED:
  83                case SHOST_RECOVERY:
  84                        break;
  85                default:
  86                        goto illegal;
  87                }
  88                break;
  89
  90        case SHOST_RECOVERY:
  91                switch (oldstate) {
  92                case SHOST_RUNNING:
  93                        break;
  94                default:
  95                        goto illegal;
  96                }
  97                break;
  98
  99        case SHOST_CANCEL:
 100                switch (oldstate) {
 101                case SHOST_CREATED:
 102                case SHOST_RUNNING:
 103                case SHOST_CANCEL_RECOVERY:
 104                        break;
 105                default:
 106                        goto illegal;
 107                }
 108                break;
 109
 110        case SHOST_DEL:
 111                switch (oldstate) {
 112                case SHOST_CANCEL:
 113                case SHOST_DEL_RECOVERY:
 114                        break;
 115                default:
 116                        goto illegal;
 117                }
 118                break;
 119
 120        case SHOST_CANCEL_RECOVERY:
 121                switch (oldstate) {
 122                case SHOST_CANCEL:
 123                case SHOST_RECOVERY:
 124                        break;
 125                default:
 126                        goto illegal;
 127                }
 128                break;
 129
 130        case SHOST_DEL_RECOVERY:
 131                switch (oldstate) {
 132                case SHOST_CANCEL_RECOVERY:
 133                        break;
 134                default:
 135                        goto illegal;
 136                }
 137                break;
 138        }
 139        shost->shost_state = state;
 140        return 0;
 141
 142 illegal:
 143        SCSI_LOG_ERROR_RECOVERY(1,
 144                                shost_printk(KERN_ERR, shost,
 145                                             "Illegal host state transition"
 146                                             "%s->%s\n",
 147                                             scsi_host_state_name(oldstate),
 148                                             scsi_host_state_name(state)));
 149        return -EINVAL;
 150}
 151EXPORT_SYMBOL(scsi_host_set_state);
 152
 153/**
 154 * scsi_remove_host - remove a scsi host
 155 * @shost:      a pointer to a scsi host to remove
 156 **/
 157void scsi_remove_host(struct Scsi_Host *shost)
 158{
 159        unsigned long flags;
 160
 161        mutex_lock(&shost->scan_mutex);
 162        spin_lock_irqsave(shost->host_lock, flags);
 163        if (scsi_host_set_state(shost, SHOST_CANCEL))
 164                if (scsi_host_set_state(shost, SHOST_CANCEL_RECOVERY)) {
 165                        spin_unlock_irqrestore(shost->host_lock, flags);
 166                        mutex_unlock(&shost->scan_mutex);
 167                        return;
 168                }
 169        spin_unlock_irqrestore(shost->host_lock, flags);
 170
 171        scsi_autopm_get_host(shost);
 172        scsi_forget_host(shost);
 173        mutex_unlock(&shost->scan_mutex);
 174        scsi_proc_host_rm(shost);
 175
 176        spin_lock_irqsave(shost->host_lock, flags);
 177        if (scsi_host_set_state(shost, SHOST_DEL))
 178                BUG_ON(scsi_host_set_state(shost, SHOST_DEL_RECOVERY));
 179        spin_unlock_irqrestore(shost->host_lock, flags);
 180
 181        transport_unregister_device(&shost->shost_gendev);
 182        device_unregister(&shost->shost_dev);
 183        device_del(&shost->shost_gendev);
 184}
 185EXPORT_SYMBOL(scsi_remove_host);
 186
 187/**
 188 * scsi_add_host_with_dma - add a scsi host with dma device
 189 * @shost:      scsi host pointer to add
 190 * @dev:        a struct device of type scsi class
 191 * @dma_dev:    dma device for the host
 192 *
 193 * Note: You rarely need to worry about this unless you're in a
 194 * virtualised host environments, so use the simpler scsi_add_host()
 195 * function instead.
 196 *
 197 * Return value: 
 198 *      0 on success / != 0 for error
 199 **/
 200int scsi_add_host_with_dma(struct Scsi_Host *shost, struct device *dev,
 201                           struct device *dma_dev)
 202{
 203        struct scsi_host_template *sht = shost->hostt;
 204        int error = -EINVAL;
 205
 206        printk(KERN_INFO "scsi%d : %s\n", shost->host_no,
 207                        sht->info ? sht->info(shost) : sht->name);
 208
 209        if (!shost->can_queue) {
 210                printk(KERN_ERR "%s: can_queue = 0 no longer supported\n",
 211                                sht->name);
 212                goto fail;
 213        }
 214
 215        error = scsi_setup_command_freelist(shost);
 216        if (error)
 217                goto fail;
 218
 219        if (!shost->shost_gendev.parent)
 220                shost->shost_gendev.parent = dev ? dev : &platform_bus;
 221        shost->dma_dev = dma_dev;
 222
 223        error = device_add(&shost->shost_gendev);
 224        if (error)
 225                goto out;
 226
 227        pm_runtime_set_active(&shost->shost_gendev);
 228        pm_runtime_enable(&shost->shost_gendev);
 229        device_enable_async_suspend(&shost->shost_gendev);
 230
 231        scsi_host_set_state(shost, SHOST_RUNNING);
 232        get_device(shost->shost_gendev.parent);
 233
 234        device_enable_async_suspend(&shost->shost_dev);
 235
 236        error = device_add(&shost->shost_dev);
 237        if (error)
 238                goto out_del_gendev;
 239
 240        get_device(&shost->shost_gendev);
 241
 242        if (shost->transportt->host_size) {
 243                shost->shost_data = kzalloc(shost->transportt->host_size,
 244                                         GFP_KERNEL);
 245                if (shost->shost_data == NULL) {
 246                        error = -ENOMEM;
 247                        goto out_del_dev;
 248                }
 249        }
 250
 251        if (shost->transportt->create_work_queue) {
 252                snprintf(shost->work_q_name, sizeof(shost->work_q_name),
 253                         "scsi_wq_%d", shost->host_no);
 254                shost->work_q = create_singlethread_workqueue(
 255                                        shost->work_q_name);
 256                if (!shost->work_q) {
 257                        error = -EINVAL;
 258                        goto out_free_shost_data;
 259                }
 260        }
 261
 262        error = scsi_sysfs_add_host(shost);
 263        if (error)
 264                goto out_destroy_host;
 265
 266        scsi_proc_host_add(shost);
 267        return error;
 268
 269 out_destroy_host:
 270        if (shost->work_q)
 271                destroy_workqueue(shost->work_q);
 272 out_free_shost_data:
 273        kfree(shost->shost_data);
 274 out_del_dev:
 275        device_del(&shost->shost_dev);
 276 out_del_gendev:
 277        device_del(&shost->shost_gendev);
 278 out:
 279        scsi_destroy_command_freelist(shost);
 280 fail:
 281        return error;
 282}
 283EXPORT_SYMBOL(scsi_add_host_with_dma);
 284
 285static void scsi_host_dev_release(struct device *dev)
 286{
 287        struct Scsi_Host *shost = dev_to_shost(dev);
 288        struct device *parent = dev->parent;
 289
 290        scsi_proc_hostdir_rm(shost->hostt);
 291
 292        if (shost->ehandler)
 293                kthread_stop(shost->ehandler);
 294        if (shost->work_q)
 295                destroy_workqueue(shost->work_q);
 296        if (shost->uspace_req_q) {
 297                kfree(shost->uspace_req_q->queuedata);
 298                scsi_free_queue(shost->uspace_req_q);
 299        }
 300
 301        scsi_destroy_command_freelist(shost);
 302        if (shost->bqt)
 303                blk_free_tags(shost->bqt);
 304
 305        kfree(shost->shost_data);
 306
 307        if (parent)
 308                put_device(parent);
 309        kfree(shost);
 310}
 311
 312static struct device_type scsi_host_type = {
 313        .name =         "scsi_host",
 314        .release =      scsi_host_dev_release,
 315};
 316
 317/**
 318 * scsi_host_alloc - register a scsi host adapter instance.
 319 * @sht:        pointer to scsi host template
 320 * @privsize:   extra bytes to allocate for driver
 321 *
 322 * Note:
 323 *      Allocate a new Scsi_Host and perform basic initialization.
 324 *      The host is not published to the scsi midlayer until scsi_add_host
 325 *      is called.
 326 *
 327 * Return value:
 328 *      Pointer to a new Scsi_Host
 329 **/
 330struct Scsi_Host *scsi_host_alloc(struct scsi_host_template *sht, int privsize)
 331{
 332        struct Scsi_Host *shost;
 333        gfp_t gfp_mask = GFP_KERNEL;
 334
 335        if (sht->unchecked_isa_dma && privsize)
 336                gfp_mask |= __GFP_DMA;
 337
 338        shost = kzalloc(sizeof(struct Scsi_Host) + privsize, gfp_mask);
 339        if (!shost)
 340                return NULL;
 341
 342        shost->host_lock = &shost->default_lock;
 343        spin_lock_init(shost->host_lock);
 344        shost->shost_state = SHOST_CREATED;
 345        INIT_LIST_HEAD(&shost->__devices);
 346        INIT_LIST_HEAD(&shost->__targets);
 347        INIT_LIST_HEAD(&shost->eh_cmd_q);
 348        INIT_LIST_HEAD(&shost->starved_list);
 349        init_waitqueue_head(&shost->host_wait);
 350
 351        mutex_init(&shost->scan_mutex);
 352
 353        /*
 354         * subtract one because we increment first then return, but we need to
 355         * know what the next host number was before increment
 356         */
 357        shost->host_no = atomic_inc_return(&scsi_host_next_hn) - 1;
 358        shost->dma_channel = 0xff;
 359
 360        /* These three are default values which can be overridden */
 361        shost->max_channel = 0;
 362        shost->max_id = 8;
 363        shost->max_lun = 8;
 364
 365        /* Give each shost a default transportt */
 366        shost->transportt = &blank_transport_template;
 367
 368        /*
 369         * All drivers right now should be able to handle 12 byte
 370         * commands.  Every so often there are requests for 16 byte
 371         * commands, but individual low-level drivers need to certify that
 372         * they actually do something sensible with such commands.
 373         */
 374        shost->max_cmd_len = 12;
 375        shost->hostt = sht;
 376        shost->this_id = sht->this_id;
 377        shost->can_queue = sht->can_queue;
 378        shost->sg_tablesize = sht->sg_tablesize;
 379        shost->sg_prot_tablesize = sht->sg_prot_tablesize;
 380        shost->cmd_per_lun = sht->cmd_per_lun;
 381        shost->unchecked_isa_dma = sht->unchecked_isa_dma;
 382        shost->use_clustering = sht->use_clustering;
 383        shost->ordered_tag = sht->ordered_tag;
 384
 385        if (sht->supported_mode == MODE_UNKNOWN)
 386                /* means we didn't set it ... default to INITIATOR */
 387                shost->active_mode = MODE_INITIATOR;
 388        else
 389                shost->active_mode = sht->supported_mode;
 390
 391        if (sht->max_host_blocked)
 392                shost->max_host_blocked = sht->max_host_blocked;
 393        else
 394                shost->max_host_blocked = SCSI_DEFAULT_HOST_BLOCKED;
 395
 396        /*
 397         * If the driver imposes no hard sector transfer limit, start at
 398         * machine infinity initially.
 399         */
 400        if (sht->max_sectors)
 401                shost->max_sectors = sht->max_sectors;
 402        else
 403                shost->max_sectors = SCSI_DEFAULT_MAX_SECTORS;
 404
 405        /*
 406         * assume a 4GB boundary, if not set
 407         */
 408        if (sht->dma_boundary)
 409                shost->dma_boundary = sht->dma_boundary;
 410        else
 411                shost->dma_boundary = 0xffffffff;
 412
 413        device_initialize(&shost->shost_gendev);
 414        dev_set_name(&shost->shost_gendev, "host%d", shost->host_no);
 415        shost->shost_gendev.bus = &scsi_bus_type;
 416        shost->shost_gendev.type = &scsi_host_type;
 417
 418        device_initialize(&shost->shost_dev);
 419        shost->shost_dev.parent = &shost->shost_gendev;
 420        shost->shost_dev.class = &shost_class;
 421        dev_set_name(&shost->shost_dev, "host%d", shost->host_no);
 422        shost->shost_dev.groups = scsi_sysfs_shost_attr_groups;
 423
 424        shost->ehandler = kthread_run(scsi_error_handler, shost,
 425                        "scsi_eh_%d", shost->host_no);
 426        if (IS_ERR(shost->ehandler)) {
 427                printk(KERN_WARNING "scsi%d: error handler thread failed to spawn, error = %ld\n",
 428                        shost->host_no, PTR_ERR(shost->ehandler));
 429                goto fail_kfree;
 430        }
 431
 432        scsi_proc_hostdir_add(shost->hostt);
 433        return shost;
 434
 435 fail_kfree:
 436        kfree(shost);
 437        return NULL;
 438}
 439EXPORT_SYMBOL(scsi_host_alloc);
 440
 441struct Scsi_Host *scsi_register(struct scsi_host_template *sht, int privsize)
 442{
 443        struct Scsi_Host *shost = scsi_host_alloc(sht, privsize);
 444
 445        if (!sht->detect) {
 446                printk(KERN_WARNING "scsi_register() called on new-style "
 447                                    "template for driver %s\n", sht->name);
 448                dump_stack();
 449        }
 450
 451        if (shost)
 452                list_add_tail(&shost->sht_legacy_list, &sht->legacy_hosts);
 453        return shost;
 454}
 455EXPORT_SYMBOL(scsi_register);
 456
 457void scsi_unregister(struct Scsi_Host *shost)
 458{
 459        list_del(&shost->sht_legacy_list);
 460        scsi_host_put(shost);
 461}
 462EXPORT_SYMBOL(scsi_unregister);
 463
 464static int __scsi_host_match(struct device *dev, void *data)
 465{
 466        struct Scsi_Host *p;
 467        unsigned short *hostnum = (unsigned short *)data;
 468
 469        p = class_to_shost(dev);
 470        return p->host_no == *hostnum;
 471}
 472
 473/**
 474 * scsi_host_lookup - get a reference to a Scsi_Host by host no
 475 * @hostnum:    host number to locate
 476 *
 477 * Return value:
 478 *      A pointer to located Scsi_Host or NULL.
 479 *
 480 *      The caller must do a scsi_host_put() to drop the reference
 481 *      that scsi_host_get() took. The put_device() below dropped
 482 *      the reference from class_find_device().
 483 **/
 484struct Scsi_Host *scsi_host_lookup(unsigned short hostnum)
 485{
 486        struct device *cdev;
 487        struct Scsi_Host *shost = NULL;
 488
 489        cdev = class_find_device(&shost_class, NULL, &hostnum,
 490                                 __scsi_host_match);
 491        if (cdev) {
 492                shost = scsi_host_get(class_to_shost(cdev));
 493                put_device(cdev);
 494        }
 495        return shost;
 496}
 497EXPORT_SYMBOL(scsi_host_lookup);
 498
 499/**
 500 * scsi_host_get - inc a Scsi_Host ref count
 501 * @shost:      Pointer to Scsi_Host to inc.
 502 **/
 503struct Scsi_Host *scsi_host_get(struct Scsi_Host *shost)
 504{
 505        if ((shost->shost_state == SHOST_DEL) ||
 506                !get_device(&shost->shost_gendev))
 507                return NULL;
 508        return shost;
 509}
 510EXPORT_SYMBOL(scsi_host_get);
 511
 512/**
 513 * scsi_host_put - dec a Scsi_Host ref count
 514 * @shost:      Pointer to Scsi_Host to dec.
 515 **/
 516void scsi_host_put(struct Scsi_Host *shost)
 517{
 518        put_device(&shost->shost_gendev);
 519}
 520EXPORT_SYMBOL(scsi_host_put);
 521
 522int scsi_init_hosts(void)
 523{
 524        return class_register(&shost_class);
 525}
 526
 527void scsi_exit_hosts(void)
 528{
 529        class_unregister(&shost_class);
 530}
 531
 532int scsi_is_host_device(const struct device *dev)
 533{
 534        return dev->type == &scsi_host_type;
 535}
 536EXPORT_SYMBOL(scsi_is_host_device);
 537
 538/**
 539 * scsi_queue_work - Queue work to the Scsi_Host workqueue.
 540 * @shost:      Pointer to Scsi_Host.
 541 * @work:       Work to queue for execution.
 542 *
 543 * Return value:
 544 *      1 - work queued for execution
 545 *      0 - work is already queued
 546 *      -EINVAL - work queue doesn't exist
 547 **/
 548int scsi_queue_work(struct Scsi_Host *shost, struct work_struct *work)
 549{
 550        if (unlikely(!shost->work_q)) {
 551                printk(KERN_ERR
 552                        "ERROR: Scsi host '%s' attempted to queue scsi-work, "
 553                        "when no workqueue created.\n", shost->hostt->name);
 554                dump_stack();
 555
 556                return -EINVAL;
 557        }
 558
 559        return queue_work(shost->work_q, work);
 560}
 561EXPORT_SYMBOL_GPL(scsi_queue_work);
 562
 563/**
 564 * scsi_flush_work - Flush a Scsi_Host's workqueue.
 565 * @shost:      Pointer to Scsi_Host.
 566 **/
 567void scsi_flush_work(struct Scsi_Host *shost)
 568{
 569        if (!shost->work_q) {
 570                printk(KERN_ERR
 571                        "ERROR: Scsi host '%s' attempted to flush scsi-work, "
 572                        "when no workqueue created.\n", shost->hostt->name);
 573                dump_stack();
 574                return;
 575        }
 576
 577        flush_workqueue(shost->work_q);
 578}
 579EXPORT_SYMBOL_GPL(scsi_flush_work);
 580