root/include/scsi/libsas.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. dev_is_expander
  2. INIT_SAS_WORK
  3. to_sas_discovery_event
  4. to_asd_sas_event
  5. INIT_SAS_EVENT
  6. starget_to_domain_dev
  7. sdev_to_domain_dev
  8. sas_to_ata_dev
  9. cmd_to_domain_dev
  10. sas_phy_disconnected
  11. to_sas_gpio_od
  12. sas_put_local_phy
  13. try_test_sas_gpio_gp_bit

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

/* [<][>][^][v][top][bottom][index][help] */