ata: move ata_sas_*() to libata-sata.c
* un-inline: - ata_scsi_dump_cdb() - __ata_scsi_queuecmd() * un-static: - ata_scsi_sdev_config() - ata_scsi_dev_config() - ata_scsi_dump_cdb() - __ata_scsi_queuecmd() * move ata_sas_*() to libata-sata.c: * add static inlines for CONFIG_SATA_HOST=n case for ata_sas_{allocate,free}_tag() Code size savings on m68k arch using (modified) atari_defconfig: text data bss dec hex filename before: 19137 23 576 19736 4d18 drivers/ata/libata-scsi.o after: 18330 23 576 18929 49f1 drivers/ata/libata-scsi.o Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Bartlomiej Zolnierkiewicz <b.zolnierkie@samsung.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
ec811a94c5
Коммит
15964ff728
|
@ -8,10 +8,12 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <scsi/scsi_cmnd.h>
|
||||
#include <scsi/scsi_device.h>
|
||||
#include <linux/libata.h>
|
||||
|
||||
#include "libata.h"
|
||||
#include "libata-transport.h"
|
||||
|
||||
/* debounce timing parameters in msecs { interval, duration, timeout } */
|
||||
const unsigned long sata_deb_timing_normal[] = { 5, 100, 2000 };
|
||||
|
@ -1062,3 +1064,214 @@ int ata_scsi_change_queue_depth(struct scsi_device *sdev, int queue_depth)
|
|||
return __ata_change_queue_depth(ap, sdev, queue_depth);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_scsi_change_queue_depth);
|
||||
|
||||
/**
|
||||
* port_alloc - Allocate port for a SAS attached SATA device
|
||||
* @host: ATA host container for all SAS ports
|
||||
* @port_info: Information from low-level host driver
|
||||
* @shost: SCSI host that the scsi device is attached to
|
||||
*
|
||||
* LOCKING:
|
||||
* PCI/etc. bus probe sem.
|
||||
*
|
||||
* RETURNS:
|
||||
* ata_port pointer on success / NULL on failure.
|
||||
*/
|
||||
|
||||
struct ata_port *ata_sas_port_alloc(struct ata_host *host,
|
||||
struct ata_port_info *port_info,
|
||||
struct Scsi_Host *shost)
|
||||
{
|
||||
struct ata_port *ap;
|
||||
|
||||
ap = ata_port_alloc(host);
|
||||
if (!ap)
|
||||
return NULL;
|
||||
|
||||
ap->port_no = 0;
|
||||
ap->lock = &host->lock;
|
||||
ap->pio_mask = port_info->pio_mask;
|
||||
ap->mwdma_mask = port_info->mwdma_mask;
|
||||
ap->udma_mask = port_info->udma_mask;
|
||||
ap->flags |= port_info->flags;
|
||||
ap->ops = port_info->port_ops;
|
||||
ap->cbl = ATA_CBL_SATA;
|
||||
|
||||
return ap;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
|
||||
|
||||
/**
|
||||
* ata_sas_port_start - Set port up for dma.
|
||||
* @ap: Port to initialize
|
||||
*
|
||||
* Called just after data structures for each port are
|
||||
* initialized.
|
||||
*
|
||||
* May be used as the port_start() entry in ata_port_operations.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*/
|
||||
int ata_sas_port_start(struct ata_port *ap)
|
||||
{
|
||||
/*
|
||||
* the port is marked as frozen at allocation time, but if we don't
|
||||
* have new eh, we won't thaw it
|
||||
*/
|
||||
if (!ap->ops->error_handler)
|
||||
ap->pflags &= ~ATA_PFLAG_FROZEN;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_start);
|
||||
|
||||
/**
|
||||
* ata_port_stop - Undo ata_sas_port_start()
|
||||
* @ap: Port to shut down
|
||||
*
|
||||
* May be used as the port_stop() entry in ata_port_operations.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*/
|
||||
|
||||
void ata_sas_port_stop(struct ata_port *ap)
|
||||
{
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_stop);
|
||||
|
||||
/**
|
||||
* ata_sas_async_probe - simply schedule probing and return
|
||||
* @ap: Port to probe
|
||||
*
|
||||
* For batch scheduling of probe for sas attached ata devices, assumes
|
||||
* the port has already been through ata_sas_port_init()
|
||||
*/
|
||||
void ata_sas_async_probe(struct ata_port *ap)
|
||||
{
|
||||
__ata_port_probe(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_async_probe);
|
||||
|
||||
int ata_sas_sync_probe(struct ata_port *ap)
|
||||
{
|
||||
return ata_port_probe(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_sync_probe);
|
||||
|
||||
|
||||
/**
|
||||
* ata_sas_port_init - Initialize a SATA device
|
||||
* @ap: SATA port to initialize
|
||||
*
|
||||
* LOCKING:
|
||||
* PCI/etc. bus probe sem.
|
||||
*
|
||||
* RETURNS:
|
||||
* Zero on success, non-zero on error.
|
||||
*/
|
||||
|
||||
int ata_sas_port_init(struct ata_port *ap)
|
||||
{
|
||||
int rc = ap->ops->port_start(ap);
|
||||
|
||||
if (rc)
|
||||
return rc;
|
||||
ap->print_id = atomic_inc_return(&ata_print_id);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_init);
|
||||
|
||||
int ata_sas_tport_add(struct device *parent, struct ata_port *ap)
|
||||
{
|
||||
return ata_tport_add(parent, ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_tport_add);
|
||||
|
||||
void ata_sas_tport_delete(struct ata_port *ap)
|
||||
{
|
||||
ata_tport_delete(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_tport_delete);
|
||||
|
||||
/**
|
||||
* ata_sas_port_destroy - Destroy a SATA port allocated by ata_sas_port_alloc
|
||||
* @ap: SATA port to destroy
|
||||
*
|
||||
*/
|
||||
|
||||
void ata_sas_port_destroy(struct ata_port *ap)
|
||||
{
|
||||
if (ap->ops->port_stop)
|
||||
ap->ops->port_stop(ap);
|
||||
kfree(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
|
||||
|
||||
/**
|
||||
* ata_sas_slave_configure - Default slave_config routine for libata devices
|
||||
* @sdev: SCSI device to configure
|
||||
* @ap: ATA port to which SCSI device is attached
|
||||
*
|
||||
* RETURNS:
|
||||
* Zero.
|
||||
*/
|
||||
|
||||
int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
|
||||
{
|
||||
ata_scsi_sdev_config(sdev);
|
||||
ata_scsi_dev_config(sdev, ap->link.device);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
|
||||
|
||||
/**
|
||||
* ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
|
||||
* @cmd: SCSI command to be sent
|
||||
* @ap: ATA port to which the command is being sent
|
||||
*
|
||||
* RETURNS:
|
||||
* Return value from __ata_scsi_queuecmd() if @cmd can be queued,
|
||||
* 0 otherwise.
|
||||
*/
|
||||
|
||||
int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
ata_scsi_dump_cdb(ap, cmd);
|
||||
|
||||
if (likely(ata_dev_enabled(ap->link.device)))
|
||||
rc = __ata_scsi_queuecmd(cmd, ap->link.device);
|
||||
else {
|
||||
cmd->result = (DID_BAD_TARGET << 16);
|
||||
cmd->scsi_done(cmd);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_queuecmd);
|
||||
|
||||
int ata_sas_allocate_tag(struct ata_port *ap)
|
||||
{
|
||||
unsigned int max_queue = ap->host->n_tags;
|
||||
unsigned int i, tag;
|
||||
|
||||
for (i = 0, tag = ap->sas_last_tag + 1; i < max_queue; i++, tag++) {
|
||||
tag = tag < max_queue ? tag : 0;
|
||||
|
||||
/* the last tag is reserved for internal command. */
|
||||
if (ata_tag_internal(tag))
|
||||
continue;
|
||||
|
||||
if (!test_and_set_bit(tag, &ap->sas_tag_allocated)) {
|
||||
ap->sas_last_tag = tag;
|
||||
return tag;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void ata_sas_free_tag(unsigned int tag, struct ata_port *ap)
|
||||
{
|
||||
clear_bit(tag, &ap->sas_tag_allocated);
|
||||
}
|
||||
|
|
|
@ -988,7 +988,7 @@ static void ata_gen_ata_sense(struct ata_queued_cmd *qc)
|
|||
scsi_set_sense_information(sb, SCSI_SENSE_BUFFERSIZE, block);
|
||||
}
|
||||
|
||||
static void ata_scsi_sdev_config(struct scsi_device *sdev)
|
||||
void ata_scsi_sdev_config(struct scsi_device *sdev)
|
||||
{
|
||||
sdev->use_10_for_rw = 1;
|
||||
sdev->use_10_for_ms = 1;
|
||||
|
@ -1028,8 +1028,7 @@ static int atapi_drain_needed(struct request *rq)
|
|||
return atapi_cmd_type(scsi_req(rq)->cmd[0]) == ATAPI_MISC;
|
||||
}
|
||||
|
||||
static int ata_scsi_dev_config(struct scsi_device *sdev,
|
||||
struct ata_device *dev)
|
||||
int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev)
|
||||
{
|
||||
struct request_queue *q = sdev->request_queue;
|
||||
|
||||
|
@ -4005,8 +4004,7 @@ static inline ata_xlat_func_t ata_get_xlat_func(struct ata_device *dev, u8 cmd)
|
|||
* Prints the contents of a SCSI command via printk().
|
||||
*/
|
||||
|
||||
static inline void ata_scsi_dump_cdb(struct ata_port *ap,
|
||||
struct scsi_cmnd *cmd)
|
||||
void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd)
|
||||
{
|
||||
#ifdef ATA_VERBOSE_DEBUG
|
||||
struct scsi_device *scsidev = cmd->device;
|
||||
|
@ -4018,8 +4016,7 @@ static inline void ata_scsi_dump_cdb(struct ata_port *ap,
|
|||
#endif
|
||||
}
|
||||
|
||||
static inline int __ata_scsi_queuecmd(struct scsi_cmnd *scmd,
|
||||
struct ata_device *dev)
|
||||
int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev)
|
||||
{
|
||||
u8 scsi_op = scmd->cmnd[0];
|
||||
ata_xlat_func_t xlat_func;
|
||||
|
@ -4662,214 +4659,3 @@ void ata_scsi_dev_rescan(struct work_struct *work)
|
|||
spin_unlock_irqrestore(ap->lock, flags);
|
||||
mutex_unlock(&ap->scsi_scan_mutex);
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_sas_port_alloc - Allocate port for a SAS attached SATA device
|
||||
* @host: ATA host container for all SAS ports
|
||||
* @port_info: Information from low-level host driver
|
||||
* @shost: SCSI host that the scsi device is attached to
|
||||
*
|
||||
* LOCKING:
|
||||
* PCI/etc. bus probe sem.
|
||||
*
|
||||
* RETURNS:
|
||||
* ata_port pointer on success / NULL on failure.
|
||||
*/
|
||||
|
||||
struct ata_port *ata_sas_port_alloc(struct ata_host *host,
|
||||
struct ata_port_info *port_info,
|
||||
struct Scsi_Host *shost)
|
||||
{
|
||||
struct ata_port *ap;
|
||||
|
||||
ap = ata_port_alloc(host);
|
||||
if (!ap)
|
||||
return NULL;
|
||||
|
||||
ap->port_no = 0;
|
||||
ap->lock = &host->lock;
|
||||
ap->pio_mask = port_info->pio_mask;
|
||||
ap->mwdma_mask = port_info->mwdma_mask;
|
||||
ap->udma_mask = port_info->udma_mask;
|
||||
ap->flags |= port_info->flags;
|
||||
ap->ops = port_info->port_ops;
|
||||
ap->cbl = ATA_CBL_SATA;
|
||||
|
||||
return ap;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_alloc);
|
||||
|
||||
/**
|
||||
* ata_sas_port_start - Set port up for dma.
|
||||
* @ap: Port to initialize
|
||||
*
|
||||
* Called just after data structures for each port are
|
||||
* initialized.
|
||||
*
|
||||
* May be used as the port_start() entry in ata_port_operations.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*/
|
||||
int ata_sas_port_start(struct ata_port *ap)
|
||||
{
|
||||
/*
|
||||
* the port is marked as frozen at allocation time, but if we don't
|
||||
* have new eh, we won't thaw it
|
||||
*/
|
||||
if (!ap->ops->error_handler)
|
||||
ap->pflags &= ~ATA_PFLAG_FROZEN;
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_start);
|
||||
|
||||
/**
|
||||
* ata_port_stop - Undo ata_sas_port_start()
|
||||
* @ap: Port to shut down
|
||||
*
|
||||
* May be used as the port_stop() entry in ata_port_operations.
|
||||
*
|
||||
* LOCKING:
|
||||
* Inherited from caller.
|
||||
*/
|
||||
|
||||
void ata_sas_port_stop(struct ata_port *ap)
|
||||
{
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_stop);
|
||||
|
||||
/**
|
||||
* ata_sas_async_probe - simply schedule probing and return
|
||||
* @ap: Port to probe
|
||||
*
|
||||
* For batch scheduling of probe for sas attached ata devices, assumes
|
||||
* the port has already been through ata_sas_port_init()
|
||||
*/
|
||||
void ata_sas_async_probe(struct ata_port *ap)
|
||||
{
|
||||
__ata_port_probe(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_async_probe);
|
||||
|
||||
int ata_sas_sync_probe(struct ata_port *ap)
|
||||
{
|
||||
return ata_port_probe(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_sync_probe);
|
||||
|
||||
|
||||
/**
|
||||
* ata_sas_port_init - Initialize a SATA device
|
||||
* @ap: SATA port to initialize
|
||||
*
|
||||
* LOCKING:
|
||||
* PCI/etc. bus probe sem.
|
||||
*
|
||||
* RETURNS:
|
||||
* Zero on success, non-zero on error.
|
||||
*/
|
||||
|
||||
int ata_sas_port_init(struct ata_port *ap)
|
||||
{
|
||||
int rc = ap->ops->port_start(ap);
|
||||
|
||||
if (rc)
|
||||
return rc;
|
||||
ap->print_id = atomic_inc_return(&ata_print_id);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_init);
|
||||
|
||||
int ata_sas_tport_add(struct device *parent, struct ata_port *ap)
|
||||
{
|
||||
return ata_tport_add(parent, ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_tport_add);
|
||||
|
||||
void ata_sas_tport_delete(struct ata_port *ap)
|
||||
{
|
||||
ata_tport_delete(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_tport_delete);
|
||||
|
||||
/**
|
||||
* ata_sas_port_destroy - Destroy a SATA port allocated by ata_sas_port_alloc
|
||||
* @ap: SATA port to destroy
|
||||
*
|
||||
*/
|
||||
|
||||
void ata_sas_port_destroy(struct ata_port *ap)
|
||||
{
|
||||
if (ap->ops->port_stop)
|
||||
ap->ops->port_stop(ap);
|
||||
kfree(ap);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_port_destroy);
|
||||
|
||||
/**
|
||||
* ata_sas_slave_configure - Default slave_config routine for libata devices
|
||||
* @sdev: SCSI device to configure
|
||||
* @ap: ATA port to which SCSI device is attached
|
||||
*
|
||||
* RETURNS:
|
||||
* Zero.
|
||||
*/
|
||||
|
||||
int ata_sas_slave_configure(struct scsi_device *sdev, struct ata_port *ap)
|
||||
{
|
||||
ata_scsi_sdev_config(sdev);
|
||||
ata_scsi_dev_config(sdev, ap->link.device);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_slave_configure);
|
||||
|
||||
/**
|
||||
* ata_sas_queuecmd - Issue SCSI cdb to libata-managed device
|
||||
* @cmd: SCSI command to be sent
|
||||
* @ap: ATA port to which the command is being sent
|
||||
*
|
||||
* RETURNS:
|
||||
* Return value from __ata_scsi_queuecmd() if @cmd can be queued,
|
||||
* 0 otherwise.
|
||||
*/
|
||||
|
||||
int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap)
|
||||
{
|
||||
int rc = 0;
|
||||
|
||||
ata_scsi_dump_cdb(ap, cmd);
|
||||
|
||||
if (likely(ata_dev_enabled(ap->link.device)))
|
||||
rc = __ata_scsi_queuecmd(cmd, ap->link.device);
|
||||
else {
|
||||
cmd->result = (DID_BAD_TARGET << 16);
|
||||
cmd->scsi_done(cmd);
|
||||
}
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ata_sas_queuecmd);
|
||||
|
||||
int ata_sas_allocate_tag(struct ata_port *ap)
|
||||
{
|
||||
unsigned int max_queue = ap->host->n_tags;
|
||||
unsigned int i, tag;
|
||||
|
||||
for (i = 0, tag = ap->sas_last_tag + 1; i < max_queue; i++, tag++) {
|
||||
tag = tag < max_queue ? tag : 0;
|
||||
|
||||
/* the last tag is reserved for internal command. */
|
||||
if (ata_tag_internal(tag))
|
||||
continue;
|
||||
|
||||
if (!test_and_set_bit(tag, &ap->sas_tag_allocated)) {
|
||||
ap->sas_last_tag = tag;
|
||||
return tag;
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
void ata_sas_free_tag(unsigned int tag, struct ata_port *ap)
|
||||
{
|
||||
clear_bit(tag, &ap->sas_tag_allocated);
|
||||
}
|
||||
|
|
|
@ -87,6 +87,18 @@ extern unsigned int ata_read_log_page(struct ata_device *dev, u8 log,
|
|||
|
||||
#define to_ata_port(d) container_of(d, struct ata_port, tdev)
|
||||
|
||||
/* libata-sata.c */
|
||||
#ifdef CONFIG_SATA_HOST
|
||||
int ata_sas_allocate_tag(struct ata_port *ap);
|
||||
void ata_sas_free_tag(unsigned int tag, struct ata_port *ap);
|
||||
#else
|
||||
static inline int ata_sas_allocate_tag(struct ata_port *ap)
|
||||
{
|
||||
return -EOPNOTSUPP;
|
||||
}
|
||||
static inline void ata_sas_free_tag(unsigned int tag, struct ata_port *ap) { }
|
||||
#endif
|
||||
|
||||
/* libata-acpi.c */
|
||||
#ifdef CONFIG_ATA_ACPI
|
||||
extern unsigned int ata_acpi_gtf_filter;
|
||||
|
@ -130,9 +142,10 @@ extern void ata_scsi_dev_rescan(struct work_struct *work);
|
|||
extern int ata_bus_probe(struct ata_port *ap);
|
||||
extern int ata_scsi_user_scan(struct Scsi_Host *shost, unsigned int channel,
|
||||
unsigned int id, u64 lun);
|
||||
int ata_sas_allocate_tag(struct ata_port *ap);
|
||||
void ata_sas_free_tag(unsigned int tag, struct ata_port *ap);
|
||||
|
||||
void ata_scsi_sdev_config(struct scsi_device *sdev);
|
||||
int ata_scsi_dev_config(struct scsi_device *sdev, struct ata_device *dev);
|
||||
void ata_scsi_dump_cdb(struct ata_port *ap, struct scsi_cmnd *cmd);
|
||||
int __ata_scsi_queuecmd(struct scsi_cmnd *scmd, struct ata_device *dev);
|
||||
|
||||
/* libata-eh.c */
|
||||
extern unsigned long ata_internal_cmd_timeout(struct ata_device *dev, u8 cmd);
|
||||
|
|
|
@ -1094,18 +1094,6 @@ extern int ata_scsi_ioctl(struct scsi_device *dev, unsigned int cmd,
|
|||
extern int ata_scsi_queuecmd(struct Scsi_Host *h, struct scsi_cmnd *cmd);
|
||||
extern int ata_sas_scsi_ioctl(struct ata_port *ap, struct scsi_device *dev,
|
||||
unsigned int cmd, void __user *arg);
|
||||
extern void ata_sas_port_destroy(struct ata_port *);
|
||||
extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
|
||||
struct ata_port_info *, struct Scsi_Host *);
|
||||
extern void ata_sas_async_probe(struct ata_port *ap);
|
||||
extern int ata_sas_sync_probe(struct ata_port *ap);
|
||||
extern int ata_sas_port_init(struct ata_port *);
|
||||
extern int ata_sas_port_start(struct ata_port *ap);
|
||||
extern int ata_sas_tport_add(struct device *parent, struct ata_port *ap);
|
||||
extern void ata_sas_tport_delete(struct ata_port *ap);
|
||||
extern void ata_sas_port_stop(struct ata_port *ap);
|
||||
extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
|
||||
extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap);
|
||||
extern bool ata_link_online(struct ata_link *link);
|
||||
extern bool ata_link_offline(struct ata_link *link);
|
||||
#ifdef CONFIG_PM
|
||||
|
@ -1235,6 +1223,18 @@ extern int sata_link_debounce(struct ata_link *link,
|
|||
extern int sata_link_scr_lpm(struct ata_link *link, enum ata_lpm_policy policy,
|
||||
bool spm_wakeup);
|
||||
extern int ata_slave_link_init(struct ata_port *ap);
|
||||
extern void ata_sas_port_destroy(struct ata_port *);
|
||||
extern struct ata_port *ata_sas_port_alloc(struct ata_host *,
|
||||
struct ata_port_info *, struct Scsi_Host *);
|
||||
extern void ata_sas_async_probe(struct ata_port *ap);
|
||||
extern int ata_sas_sync_probe(struct ata_port *ap);
|
||||
extern int ata_sas_port_init(struct ata_port *);
|
||||
extern int ata_sas_port_start(struct ata_port *ap);
|
||||
extern int ata_sas_tport_add(struct device *parent, struct ata_port *ap);
|
||||
extern void ata_sas_tport_delete(struct ata_port *ap);
|
||||
extern void ata_sas_port_stop(struct ata_port *ap);
|
||||
extern int ata_sas_slave_configure(struct scsi_device *, struct ata_port *);
|
||||
extern int ata_sas_queuecmd(struct scsi_cmnd *cmd, struct ata_port *ap);
|
||||
extern void ata_tf_to_fis(const struct ata_taskfile *tf,
|
||||
u8 pmp, int is_cmd, u8 *fis);
|
||||
extern void ata_tf_from_fis(const u8 *fis, struct ata_taskfile *tf);
|
||||
|
|
Загрузка…
Ссылка в новой задаче