Brian King wrote:
+/** + * ata_sas_port_alloc - Allocate port for a SAS attached SATA device + * @pdev: PCI device that the scsi device is attached to + * @port_info: Information from low-level host driver + * + * LOCKING: + * PCI/etc. bus probe sem. + * + * RETURNS: + * ata_port pointer on success / NULL on failure. + */ + +struct ata_port *ata_sas_port_alloc(struct pci_dev *pdev, + struct ata_port_info *port_info) +{ + struct ata_port *ap = kzalloc(sizeof(*ap), GFP_KERNEL); + + if (!ap) + return NULL; + + ap->dev = &pdev->dev; + ap->ops = port_info->port_ops; + ap->flags = port_info->host_flags; + ap->pio_mask = port_info->pio_mask; + ap->mwdma_mask = port_info->mwdma_mask; + ap->udma_mask = port_info->udma_mask; + ap->cbl = ATA_CBL_SATA; + ap->active_tag = ATA_TAG_POISON; + ap->last_ctl = 0xFF; + return ap; +} +EXPORT_SYMBOL_GPL(ata_sas_port_alloc); + +static void ata_sas_port_free(struct ata_port *ap) +{ + kfree(ap); +} + +/** + * 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) + rc = ata_bus_probe(ap); + + return rc; +} +EXPORT_SYMBOL_GPL(ata_sas_port_init); + +/** + * 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) { + ap->ops->port_stop(ap); + ata_sas_port_free(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->device); + if (ata_dev_knobble(ap)) + blk_queue_max_sectors(sdev->request_queue, ATA_MAX_SECTORS); + 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 + * @done: Completion function, called when command is complete + * @ap: ATA port to which the command is being sent + * + * RETURNS: + * Zero. + */ + +int ata_sas_queuecmd(struct scsi_cmnd *cmd, void (*done)(struct scsi_cmnd *), + struct ata_port *ap) +{ + if (unlikely(!ata_dev_present(ap->device))) { + cmd->result = (DID_BAD_TARGET << 16); + done(cmd); + return 0; + } + + if (cmd->cmd_len > ap->cdb_len) { + cmd->result = (DID_ABORT << 16); + done(cmd); + return 0; + } + + __ata_scsi_queuecmd(cmd, done, ap, ap->device); + return 0; +}
I'm still thinking about these functions, so it would be nice to split them up into a third patch. That would allow me to apply the other cleanups in this patch.
Jeff - : send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html