linux/include/scsi/libsas.h
<<
>>
Prefs
   1/*
   2 * SAS host prototypes and structures header file
   3 *
   4 * Copyright (C) 2005 Adaptec, Inc.  All rights reserved.
   5 * Copyright (C) 2005 Luben Tuikov <luben_tuikov@adaptec.com>
   6 *
   7 * This file is licensed under GPLv2.
   8 *
   9 * This program is free software; you can redistribute it and/or
  10 * modify it under the terms of the GNU General Public License as
  11 * published by the Free Software Foundation; either version 2 of the
  12 * License, or (at your option) any later version.
  13 *
  14 * This program is distributed in the hope that it will be useful, but
  15 * WITHOUT ANY WARRANTY; without even the implied warranty of
  16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  17 * General Public License for more details.
  18 *
  19 * You should have received a copy of the GNU General Public License
  20 * along with this program; if not, write to the Free Software
  21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
  22 * USA
  23 *
  24 */
  25
  26#ifndef _LIBSAS_H_
  27#define _LIBSAS_H_
  28
  29
  30#include <linux/timer.h>
  31#include <linux/pci.h>
  32#include <scsi/sas.h>
  33#include <linux/libata.h>
  34#include <linux/list.h>
  35#include <scsi/scsi_device.h>
  36#include <scsi/scsi_cmnd.h>
  37#include <scsi/scsi_transport_sas.h>
  38#include <linux/scatterlist.h>
  39#include <linux/slab.h>
  40
  41struct block_device;
  42
  43enum sas_class {
  44        SAS,
  45        EXPANDER
  46};
  47
  48enum sas_phy_role {
  49        PHY_ROLE_NONE = 0,
  50        PHY_ROLE_TARGET = 0x40,
  51        PHY_ROLE_INITIATOR = 0x80,
  52};
  53
  54enum sas_phy_type {
  55        PHY_TYPE_PHYSICAL,
  56        PHY_TYPE_VIRTUAL
  57};
  58
  59/* The events are mnemonically described in sas_dump.c
  60 * so when updating/adding events here, please also
  61 * update the other file too.
  62 */
  63enum ha_event {
  64        HAE_RESET             = 0U,
  65        HA_NUM_EVENTS         = 1,
  66};
  67
  68enum port_event {
  69        PORTE_BYTES_DMAED     = 0U,
  70        PORTE_BROADCAST_RCVD  = 1,
  71        PORTE_LINK_RESET_ERR  = 2,
  72        PORTE_TIMER_EVENT     = 3,
  73        PORTE_HARD_RESET      = 4,
  74        PORT_NUM_EVENTS       = 5,
  75};
  76
  77enum phy_event {
  78        PHYE_LOSS_OF_SIGNAL   = 0U,
  79        PHYE_OOB_DONE         = 1,
  80        PHYE_OOB_ERROR        = 2,
  81        PHYE_SPINUP_HOLD      = 3, /* hot plug SATA, no COMWAKE sent */
  82        PHY_NUM_EVENTS        = 4,
  83};
  84
  85enum discover_event {
  86        DISCE_DISCOVER_DOMAIN   = 0U,
  87        DISCE_REVALIDATE_DOMAIN = 1,
  88        DISCE_PORT_GONE         = 2,
  89        DISCE_PROBE             = 3,
  90        DISCE_DESTRUCT          = 4,
  91        DISC_NUM_EVENTS         = 5,
  92};
  93
  94/* ---------- Expander Devices ---------- */
  95
  96#define to_dom_device(_obj) container_of(_obj, struct domain_device, dev_obj)
  97#define to_dev_attr(_attr)  container_of(_attr, struct domain_dev_attribute,\
  98                                         attr)
  99
 100enum routing_attribute {
 101        DIRECT_ROUTING,
 102        SUBTRACTIVE_ROUTING,
 103        TABLE_ROUTING,
 104};
 105
 106enum ex_phy_state {
 107        PHY_EMPTY,
 108        PHY_VACANT,
 109        PHY_NOT_PRESENT,
 110        PHY_DEVICE_DISCOVERED
 111};
 112
 113struct ex_phy {
 114        int    phy_id;
 115
 116        enum ex_phy_state phy_state;
 117
 118        enum sas_dev_type attached_dev_type;
 119        enum sas_linkrate linkrate;
 120
 121        u8   attached_sata_host:1;
 122        u8   attached_sata_dev:1;
 123        u8   attached_sata_ps:1;
 124
 125        enum sas_protocol attached_tproto;
 126        enum sas_protocol attached_iproto;
 127
 128        u8   attached_sas_addr[SAS_ADDR_SIZE];
 129        u8   attached_phy_id;
 130
 131        u8   phy_change_count;
 132        enum routing_attribute routing_attr;
 133        u8   virtual:1;
 134
 135        int  last_da_index;
 136
 137        struct sas_phy *phy;
 138        struct sas_port *port;
 139};
 140
 141struct expander_device {
 142        struct list_head children;
 143
 144        u16    ex_change_count;
 145        u16    max_route_indexes;
 146        u8     num_phys;
 147
 148        u8     t2t_supp:1;
 149        u8     configuring:1;
 150        u8     conf_route_table:1;
 151
 152        u8     enclosure_logical_id[8];
 153
 154        struct ex_phy *ex_phy;
 155        struct sas_port *parent_port;
 156
 157        struct mutex cmd_mutex;
 158};
 159
 160/* ---------- SATA device ---------- */
 161enum ata_command_set {
 162        ATA_COMMAND_SET   = 0,
 163        ATAPI_COMMAND_SET = 1,
 164};
 165
 166#define ATA_RESP_FIS_SIZE 24
 167
 168struct sata_device {
 169        enum   ata_command_set command_set;
 170        struct smp_resp        rps_resp; /* report_phy_sata_resp */
 171        u8     port_no;        /* port number, if this is a PM (Port) */
 172
 173        struct ata_port *ap;
 174        struct ata_host ata_host;
 175        u8     fis[ATA_RESP_FIS_SIZE];
 176};
 177
 178struct ssp_device {
 179        struct list_head eh_list_node; /* pending a user requested eh action */
 180        struct scsi_lun reset_lun;
 181};
 182
 183enum {
 184        SAS_DEV_GONE,
 185        SAS_DEV_DESTROY,
 186        SAS_DEV_EH_PENDING,
 187        SAS_DEV_LU_RESET,
 188        SAS_DEV_RESET,
 189};
 190
 191struct domain_device {
 192        spinlock_t done_lock;
 193        enum sas_dev_type dev_type;
 194
 195        enum sas_linkrate linkrate;
 196        enum sas_linkrate min_linkrate;
 197        enum sas_linkrate max_linkrate;
 198
 199        int  pathways;
 200
 201        struct domain_device *parent;
 202        struct list_head siblings; /* devices on the same level */
 203        struct asd_sas_port *port;        /* shortcut to root of the tree */
 204        struct sas_phy *phy;
 205
 206        struct list_head dev_list_node;
 207        struct list_head disco_list_node; /* awaiting probe or destruct */
 208
 209        enum sas_protocol    iproto;
 210        enum sas_protocol    tproto;
 211
 212        struct sas_rphy *rphy;
 213
 214        u8  sas_addr[SAS_ADDR_SIZE];
 215        u8  hashed_sas_addr[HASHED_SAS_ADDR_SIZE];
 216
 217        u8  frame_rcvd[32];
 218
 219        union {
 220                struct expander_device ex_dev;
 221                struct sata_device     sata_dev; /* STP & directly attached */
 222                struct ssp_device      ssp_dev;
 223        };
 224
 225        void *lldd_dev;
 226        unsigned long state;
 227        struct kref kref;
 228};
 229
 230struct sas_work {
 231        struct list_head drain_node;
 232        struct work_struct work;
 233};
 234
 235static inline void INIT_SAS_WORK(struct sas_work *sw, void (*fn)(struct work_struct *))
 236{
 237        INIT_WORK(&sw->work, fn);
 238        INIT_LIST_HEAD(&sw->drain_node);
 239}
 240
 241struct sas_discovery_event {
 242        struct sas_work work;
 243        struct asd_sas_port *port;
 244};
 245
 246static inline struct sas_discovery_event *to_sas_discovery_event(struct work_struct *work)
 247{
 248        struct sas_discovery_event *ev = container_of(work, typeof(*ev), work.work);
 249
 250        return ev;
 251}
 252
 253struct sas_discovery {
 254        struct sas_discovery_event disc_work[DISC_NUM_EVENTS];
 255        unsigned long    pending;
 256        u8     fanout_sas_addr[8];
 257        u8     eeds_a[8];
 258        u8     eeds_b[8];
 259        int    max_level;
 260};
 261
 262/* The port struct is Class:RW, driver:RO */
 263struct asd_sas_port {
 264/* private: */
 265        struct completion port_gone_completion;
 266
 267        struct sas_discovery disc;
 268        struct domain_device *port_dev;
 269        spinlock_t dev_list_lock;
 270        struct list_head dev_list;
 271        struct list_head disco_list;
 272        struct list_head destroy_list;
 273        enum   sas_linkrate linkrate;
 274
 275        struct sas_work work;
 276
 277/* public: */
 278        int id;
 279
 280        enum sas_class   class;
 281        u8               sas_addr[SAS_ADDR_SIZE];
 282        u8               attached_sas_addr[SAS_ADDR_SIZE];
 283        enum sas_protocol   iproto;
 284        enum sas_protocol   tproto;
 285
 286        enum sas_oob_mode oob_mode;
 287
 288        spinlock_t       phy_list_lock;
 289        struct list_head phy_list;
 290        int              num_phys;
 291        u32              phy_mask;
 292
 293        struct sas_ha_struct *ha;
 294
 295        struct sas_port *port;
 296
 297        void *lldd_port;          /* not touched by the sas class code */
 298};
 299
 300struct asd_sas_event {
 301        struct sas_work work;
 302        struct asd_sas_phy *phy;
 303};
 304
 305static inline struct asd_sas_event *to_asd_sas_event(struct work_struct *work)
 306{
 307        struct asd_sas_event *ev = container_of(work, typeof(*ev), work.work);
 308
 309        return ev;
 310}
 311
 312/* The phy pretty much is controlled by the LLDD.
 313 * The class only reads those fields.
 314 */
 315struct asd_sas_phy {
 316/* private: */
 317        struct asd_sas_event   port_events[PORT_NUM_EVENTS];
 318        struct asd_sas_event   phy_events[PHY_NUM_EVENTS];
 319
 320        unsigned long port_events_pending;
 321        unsigned long phy_events_pending;
 322
 323        int error;
 324
 325        struct sas_phy *phy;
 326
 327/* public: */
 328        /* The following are class:RO, driver:R/W */
 329        int            enabled;   /* must be set */
 330
 331        int            id;        /* must be set */
 332        enum sas_class class;
 333        enum sas_protocol iproto;
 334        enum sas_protocol tproto;
 335
 336        enum sas_phy_type  type;
 337        enum sas_phy_role  role;
 338        enum sas_oob_mode  oob_mode;
 339        enum sas_linkrate linkrate;
 340
 341        u8   *sas_addr;           /* must be set */
 342        u8   attached_sas_addr[SAS_ADDR_SIZE]; /* class:RO, driver: R/W */
 343
 344        spinlock_t     frame_rcvd_lock;
 345        u8             *frame_rcvd; /* must be set */
 346        int            frame_rcvd_size;
 347
 348        spinlock_t     sas_prim_lock;
 349        u32            sas_prim;
 350
 351        struct list_head port_phy_el; /* driver:RO */
 352        struct asd_sas_port      *port; /* Class:RW, driver: RO */
 353
 354        struct sas_ha_struct *ha; /* may be set; the class sets it anyway */
 355
 356        void *lldd_phy;           /* not touched by the sas_class_code */
 357};
 358
 359struct scsi_core {
 360        struct Scsi_Host *shost;
 361
 362        struct mutex      task_queue_flush;
 363        spinlock_t        task_queue_lock;
 364        struct list_head  task_queue;
 365        int               task_queue_size;
 366
 367        struct task_struct *queue_thread;
 368};
 369
 370struct sas_ha_event {
 371        struct sas_work work;
 372        struct sas_ha_struct *ha;
 373};
 374
 375static inline struct sas_ha_event *to_sas_ha_event(struct work_struct *work)
 376{
 377        struct sas_ha_event *ev = container_of(work, typeof(*ev), work.work);
 378
 379        return ev;
 380}
 381
 382enum sas_ha_state {
 383        SAS_HA_REGISTERED,
 384        SAS_HA_DRAINING,
 385        SAS_HA_ATA_EH_ACTIVE,
 386        SAS_HA_FROZEN,
 387};
 388
 389struct sas_ha_struct {
 390/* private: */
 391        struct sas_ha_event ha_events[HA_NUM_EVENTS];
 392        unsigned long    pending;
 393
 394        struct list_head  defer_q; /* work queued while draining */
 395        struct mutex      drain_mutex;
 396        unsigned long     state;
 397        spinlock_t        lock;
 398        int               eh_active;
 399        wait_queue_head_t eh_wait_q;
 400        struct list_head  eh_dev_q;
 401
 402        struct mutex disco_mutex;
 403
 404        struct scsi_core core;
 405
 406/* public: */
 407        char *sas_ha_name;
 408        struct device *dev;       /* should be set */
 409        struct module *lldd_module; /* should be set */
 410
 411        u8 *sas_addr;             /* must be set */
 412        u8 hashed_sas_addr[HASHED_SAS_ADDR_SIZE];
 413
 414        spinlock_t      phy_port_lock;
 415        struct asd_sas_phy  **sas_phy; /* array of valid pointers, must be set */
 416        struct asd_sas_port **sas_port; /* array of valid pointers, must be set */
 417        int             num_phys; /* must be set, gt 0, static */
 418
 419        /* The class calls this to send a task for execution. */
 420        int lldd_max_execute_num;
 421        int lldd_queue_size;
 422        int strict_wide_ports; /* both sas_addr and attached_sas_addr must match
 423                                * their siblings when forming wide ports */
 424
 425        /* LLDD calls these to notify the class of an event. */
 426        void (*notify_ha_event)(struct sas_ha_struct *, enum ha_event);
 427        void (*notify_port_event)(struct asd_sas_phy *, enum port_event);
 428        void (*notify_phy_event)(struct asd_sas_phy *, enum phy_event);
 429
 430        void *lldd_ha;            /* not touched by sas class code */
 431
 432        struct list_head eh_done_q;  /* complete via scsi_eh_flush_done_q */
 433        struct list_head eh_ata_q; /* scmds to promote from sas to ata eh */
 434};
 435
 436#define SHOST_TO_SAS_HA(_shost) (*(struct sas_ha_struct **)(_shost)->hostdata)
 437
 438static inline struct domain_device *
 439starget_to_domain_dev(struct scsi_target *starget) {
 440        return starget->hostdata;
 441}
 442
 443static inline struct domain_device *
 444sdev_to_domain_dev(struct scsi_device *sdev) {
 445        return starget_to_domain_dev(sdev->sdev_target);
 446}
 447
 448static inline struct ata_device *sas_to_ata_dev(struct domain_device *dev)
 449{
 450        return &dev->sata_dev.ap->link.device[0];
 451}
 452
 453static inline struct domain_device *
 454cmd_to_domain_dev(struct scsi_cmnd *cmd)
 455{
 456        return sdev_to_domain_dev(cmd->device);
 457}
 458
 459void sas_hash_addr(u8 *hashed, const u8 *sas_addr);
 460
 461/* Before calling a notify event, LLDD should use this function
 462 * when the link is severed (possibly from its tasklet).
 463 * The idea is that the Class only reads those, while the LLDD,
 464 * can R/W these (thus avoiding a race).
 465 */
 466static inline void sas_phy_disconnected(struct asd_sas_phy *phy)
 467{
 468        phy->oob_mode = OOB_NOT_CONNECTED;
 469        phy->linkrate = SAS_LINK_RATE_UNKNOWN;
 470}
 471
 472static inline unsigned int to_sas_gpio_od(int device, int bit)
 473{
 474        return 3 * device + bit;
 475}
 476
 477static inline void sas_put_local_phy(struct sas_phy *phy)
 478{
 479        put_device(&phy->dev);
 480}
 481
 482#ifdef CONFIG_SCSI_SAS_HOST_SMP
 483int try_test_sas_gpio_gp_bit(unsigned int od, u8 *data, u8 index, u8 count);
 484#else
 485static inline int try_test_sas_gpio_gp_bit(unsigned int od, u8 *data, u8 index, u8 count)
 486{
 487        return -1;
 488}
 489#endif
 490
 491/* ---------- Tasks ---------- */
 492/*
 493      service_response |  SAS_TASK_COMPLETE  |  SAS_TASK_UNDELIVERED |
 494  exec_status          |                     |                       |
 495  ---------------------+---------------------+-----------------------+
 496       SAM_...         |         X           |                       |
 497       DEV_NO_RESPONSE |         X           |           X           |
 498       INTERRUPTED     |         X           |                       |
 499       QUEUE_FULL      |                     |           X           |
 500       DEVICE_UNKNOWN  |                     |           X           |
 501       SG_ERR          |                     |           X           |
 502  ---------------------+---------------------+-----------------------+
 503 */
 504
 505enum service_response {
 506        SAS_TASK_COMPLETE,
 507        SAS_TASK_UNDELIVERED = -1,
 508};
 509
 510enum exec_status {
 511        /* The SAM_STAT_.. codes fit in the lower 6 bits, alias some of
 512         * them here to silence 'case value not in enumerated type' warnings
 513         */
 514        __SAM_STAT_CHECK_CONDITION = SAM_STAT_CHECK_CONDITION,
 515
 516        SAS_DEV_NO_RESPONSE = 0x80,
 517        SAS_DATA_UNDERRUN,
 518        SAS_DATA_OVERRUN,
 519        SAS_INTERRUPTED,
 520        SAS_QUEUE_FULL,
 521        SAS_DEVICE_UNKNOWN,
 522        SAS_SG_ERR,
 523        SAS_OPEN_REJECT,
 524        SAS_OPEN_TO,
 525        SAS_PROTO_RESPONSE,
 526        SAS_PHY_DOWN,
 527        SAS_NAK_R_ERR,
 528        SAS_PENDING,
 529        SAS_ABORTED_TASK,
 530};
 531
 532/* When a task finishes with a response, the LLDD examines the
 533 * response:
 534 *      - For an ATA task task_status_struct::stat is set to
 535 * SAS_PROTO_RESPONSE, and the task_status_struct::buf is set to the
 536 * contents of struct ata_task_resp.
 537 *      - For SSP tasks, if no data is present or status/TMF response
 538 * is valid, task_status_struct::stat is set.  If data is present
 539 * (SENSE data), the LLDD copies up to SAS_STATUS_BUF_SIZE, sets
 540 * task_status_struct::buf_valid_size, and task_status_struct::stat is
 541 * set to SAM_CHECK_COND.
 542 *
 543 * "buf" has format SCSI Sense for SSP task, or struct ata_task_resp
 544 * for ATA task.
 545 *
 546 * "frame_len" is the total frame length, which could be more or less
 547 * than actually copied.
 548 *
 549 * Tasks ending with response, always set the residual field.
 550 */
 551struct ata_task_resp {
 552        u16  frame_len;
 553        u8   ending_fis[ATA_RESP_FIS_SIZE];       /* dev to host or data-in */
 554};
 555
 556#define SAS_STATUS_BUF_SIZE 96
 557
 558struct task_status_struct {
 559        enum service_response resp;
 560        enum exec_status      stat;
 561        int  buf_valid_size;
 562
 563        u8   buf[SAS_STATUS_BUF_SIZE];
 564
 565        u32  residual;
 566        enum sas_open_rej_reason open_rej_reason;
 567};
 568
 569/* ATA and ATAPI task queuable to a SAS LLDD.
 570 */
 571struct sas_ata_task {
 572        struct host_to_dev_fis fis;
 573        u8     atapi_packet[16];  /* 0 if not ATAPI task */
 574
 575        u8     retry_count;       /* hardware retry, should be > 0 */
 576
 577        u8     dma_xfer:1;        /* PIO:0 or DMA:1 */
 578        u8     use_ncq:1;
 579        u8     set_affil_pol:1;
 580        u8     stp_affil_pol:1;
 581
 582        u8     device_control_reg_update:1;
 583};
 584
 585struct sas_smp_task {
 586        struct scatterlist smp_req;
 587        struct scatterlist smp_resp;
 588};
 589
 590enum task_attribute {
 591        TASK_ATTR_SIMPLE = 0,
 592        TASK_ATTR_HOQ    = 1,
 593        TASK_ATTR_ORDERED= 2,
 594        TASK_ATTR_ACA    = 4,
 595};
 596
 597struct sas_ssp_task {
 598        u8     retry_count;       /* hardware retry, should be > 0 */
 599
 600        u8     LUN[8];
 601        u8     enable_first_burst:1;
 602        enum   task_attribute task_attr;
 603        u8     task_prio;
 604        u8     cdb[16];
 605};
 606
 607struct sas_task {
 608        struct domain_device *dev;
 609        struct list_head      list;
 610
 611        spinlock_t   task_state_lock;
 612        unsigned     task_state_flags;
 613
 614        enum   sas_protocol      task_proto;
 615
 616        union {
 617                struct sas_ata_task ata_task;
 618                struct sas_smp_task smp_task;
 619                struct sas_ssp_task ssp_task;
 620        };
 621
 622        struct scatterlist *scatter;
 623        int    num_scatter;
 624        u32    total_xfer_len;
 625        u8     data_dir:2;        /* Use PCI_DMA_... */
 626
 627        struct task_status_struct task_status;
 628        void   (*task_done)(struct sas_task *);
 629
 630        void   *lldd_task;        /* for use by LLDDs */
 631        void   *uldd_task;
 632        struct sas_task_slow *slow_task;
 633};
 634
 635struct sas_task_slow {
 636        /* standard/extra infrastructure for slow path commands (SMP and
 637         * internal lldd commands
 638         */
 639        struct timer_list     timer;
 640        struct completion     completion;
 641};
 642
 643#define SAS_TASK_STATE_PENDING      1
 644#define SAS_TASK_STATE_DONE         2
 645#define SAS_TASK_STATE_ABORTED      4
 646#define SAS_TASK_NEED_DEV_RESET     8
 647#define SAS_TASK_AT_INITIATOR       16
 648
 649extern struct sas_task *sas_alloc_task(gfp_t flags);
 650extern struct sas_task *sas_alloc_slow_task(gfp_t flags);
 651extern void sas_free_task(struct sas_task *task);
 652
 653struct sas_domain_function_template {
 654        /* The class calls these to notify the LLDD of an event. */
 655        void (*lldd_port_formed)(struct asd_sas_phy *);
 656        void (*lldd_port_deformed)(struct asd_sas_phy *);
 657
 658        /* The class calls these when a device is found or gone. */
 659        int  (*lldd_dev_found)(struct domain_device *);
 660        void (*lldd_dev_gone)(struct domain_device *);
 661
 662        int (*lldd_execute_task)(struct sas_task *, int num,
 663                                 gfp_t gfp_flags);
 664
 665        /* Task Management Functions. Must be called from process context. */
 666        int (*lldd_abort_task)(struct sas_task *);
 667        int (*lldd_abort_task_set)(struct domain_device *, u8 *lun);
 668        int (*lldd_clear_aca)(struct domain_device *, u8 *lun);
 669        int (*lldd_clear_task_set)(struct domain_device *, u8 *lun);
 670        int (*lldd_I_T_nexus_reset)(struct domain_device *);
 671        int (*lldd_ata_check_ready)(struct domain_device *);
 672        void (*lldd_ata_set_dmamode)(struct domain_device *);
 673        int (*lldd_lu_reset)(struct domain_device *, u8 *lun);
 674        int (*lldd_query_task)(struct sas_task *);
 675
 676        /* Port and Adapter management */
 677        int (*lldd_clear_nexus_port)(struct asd_sas_port *);
 678        int (*lldd_clear_nexus_ha)(struct sas_ha_struct *);
 679
 680        /* Phy management */
 681        int (*lldd_control_phy)(struct asd_sas_phy *, enum phy_func, void *);
 682
 683        /* GPIO support */
 684        int (*lldd_write_gpio)(struct sas_ha_struct *, u8 reg_type,
 685                               u8 reg_index, u8 reg_count, u8 *write_data);
 686};
 687
 688extern int sas_register_ha(struct sas_ha_struct *);
 689extern int sas_unregister_ha(struct sas_ha_struct *);
 690
 691int sas_set_phy_speed(struct sas_phy *phy,
 692                      struct sas_phy_linkrates *rates);
 693int sas_phy_reset(struct sas_phy *phy, int hard_reset);
 694int sas_queue_up(struct sas_task *task);
 695extern int sas_queuecommand(struct Scsi_Host * ,struct scsi_cmnd *);
 696extern int sas_target_alloc(struct scsi_target *);
 697extern int sas_slave_configure(struct scsi_device *);
 698extern int sas_change_queue_depth(struct scsi_device *, int new_depth,
 699                                  int reason);
 700extern int sas_change_queue_type(struct scsi_device *, int qt);
 701extern int sas_bios_param(struct scsi_device *,
 702                          struct block_device *,
 703                          sector_t capacity, int *hsc);
 704extern struct scsi_transport_template *
 705sas_domain_attach_transport(struct sas_domain_function_template *);
 706extern void sas_domain_release_transport(struct scsi_transport_template *);
 707
 708int  sas_discover_root_expander(struct domain_device *);
 709
 710void sas_init_ex_attr(void);
 711
 712int  sas_ex_revalidate_domain(struct domain_device *);
 713
 714void sas_unregister_domain_devices(struct asd_sas_port *port, int gone);
 715void sas_init_disc(struct sas_discovery *disc, struct asd_sas_port *);
 716int  sas_discover_event(struct asd_sas_port *, enum discover_event ev);
 717
 718int  sas_discover_sata(struct domain_device *);
 719int  sas_discover_end_dev(struct domain_device *);
 720
 721void sas_unregister_dev(struct asd_sas_port *port, struct domain_device *);
 722
 723void sas_init_dev(struct domain_device *);
 724
 725void sas_task_abort(struct sas_task *);
 726int sas_eh_abort_handler(struct scsi_cmnd *cmd);
 727int sas_eh_device_reset_handler(struct scsi_cmnd *cmd);
 728int sas_eh_bus_reset_handler(struct scsi_cmnd *cmd);
 729
 730extern void sas_target_destroy(struct scsi_target *);
 731extern int sas_slave_alloc(struct scsi_device *);
 732extern int sas_ioctl(struct scsi_device *sdev, int cmd, void __user *arg);
 733extern int sas_drain_work(struct sas_ha_struct *ha);
 734
 735extern int sas_smp_handler(struct Scsi_Host *shost, struct sas_rphy *rphy,
 736                           struct request *req);
 737
 738extern void sas_ssp_task_response(struct device *dev, struct sas_task *task,
 739                                  struct ssp_response_iu *iu);
 740struct sas_phy *sas_get_local_phy(struct domain_device *dev);
 741
 742int sas_request_addr(struct Scsi_Host *shost, u8 *addr);
 743
 744#endif /* _SASLIB_H_ */
 745