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