X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=drivers%2Fata%2Fahci.c;h=606347faac049d6e07c65e98cacc65ddef90cc67;hb=19d1f1a2f3ccfbf85125150f7876ce22714b38bd;hp=c3b5f2af340917c6b17c5599c5bdb7041fc1a427;hpb=4682c8a19b4eb69f7ad51df3f543375583ce878a;p=platform%2Fkernel%2Fu-boot.git diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c index c3b5f2a..606347f 100644 --- a/drivers/ata/ahci.c +++ b/drivers/ata/ahci.c @@ -19,10 +19,13 @@ #include #include #include +#include #include #include #include #include +#include +#include static int ata_io_flush(struct ahci_uc_priv *uc_priv, u8 port); @@ -928,7 +931,7 @@ static int ata_scsiop_test_unit_ready(struct ahci_uc_priv *uc_priv, } -int scsi_exec(struct udevice *dev, struct scsi_cmd *pccb) +static int ahci_scsi_exec(struct udevice *dev, struct scsi_cmd *pccb) { struct ahci_uc_priv *uc_priv; #ifdef CONFIG_DM_SCSI @@ -960,14 +963,14 @@ int scsi_exec(struct udevice *dev, struct scsi_cmd *pccb) break; default: printf("Unsupport SCSI command 0x%02x\n", pccb->cmd[0]); - return false; + return -ENOTSUPP; } if (ret) { debug("SCSI command 0x%02x ret errno %d\n", pccb->cmd[0], ret); - return false; + return ret; } - return true; + return 0; } @@ -1134,10 +1137,77 @@ static int ata_io_flush(struct ahci_uc_priv *uc_priv, u8 port) return 0; } +static int ahci_scsi_bus_reset(struct udevice *dev) +{ + /* Not implemented */ + + return 0; +} + +#ifdef CONFIG_DM_SCSI +int ahci_bind_scsi(struct udevice *ahci_dev, struct udevice **devp) +{ + struct udevice *dev; + int ret; + + ret = device_bind_driver(ahci_dev, "ahci_scsi", "ahci_scsi", &dev); + if (ret) + return ret; + *devp = dev; + + return 0; +} + +int ahci_probe_scsi(struct udevice *ahci_dev) +{ +#ifdef CONFIG_SCSI_AHCI_PLAT + return -ENOSYS; /* TODO(sjg@chromium.org): Support non-PCI AHCI */ +#else + struct ahci_uc_priv *uc_priv; + struct scsi_platdata *uc_plat; + struct udevice *dev; + int ret; + + device_find_first_child(ahci_dev, &dev); + if (!dev) + return -ENODEV; + uc_plat = dev_get_uclass_platdata(dev); + uc_plat->base = (ulong)dm_pci_map_bar(ahci_dev, PCI_BASE_ADDRESS_5, + PCI_REGION_MEM); + uc_plat->max_lun = 1; + uc_plat->max_id = 2; + uc_priv = dev_get_uclass_priv(dev); + ret = ahci_init_one(uc_priv, dev); + if (ret) + return ret; + ret = ahci_start_ports(uc_priv); + if (ret) + return ret; +#endif + + return 0; +} + +struct scsi_ops scsi_ops = { + .exec = ahci_scsi_exec, + .bus_reset = ahci_scsi_bus_reset, +}; + +U_BOOT_DRIVER(ahci_scsi) = { + .name = "ahci_scsi", + .id = UCLASS_SCSI, + .ops = &scsi_ops, +}; +#else +int scsi_exec(struct udevice *dev, struct scsi_cmd *pccb) +{ + return ahci_scsi_exec(dev, pccb); +} __weak int scsi_bus_reset(struct udevice *dev) { - /*Not implement*/ + return ahci_scsi_bus_reset(dev); return 0; } +#endif