X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;ds=inline;f=common%2Fscsi.c;h=fb5b407f6b1532d5f82234304ce488936a4c9645;hb=dbe7881de0c2bdab972b3cd35b503f69587edbfe;hp=839b30b9bb8ee57e592be8b6f2e6ddcc153ec436;hpb=c002e39ae669403baf21a7e04473447387f6302d;p=oweals%2Fu-boot.git diff --git a/common/scsi.c b/common/scsi.c index 839b30b9bb..fb5b407f6b 100644 --- a/common/scsi.c +++ b/common/scsi.c @@ -10,7 +10,10 @@ #include #include #include +#include +#include +#if !defined(CONFIG_DM_SCSI) #ifdef CONFIG_SCSI_DEV_LIST #define SCSI_DEV_LIST CONFIG_SCSI_DEV_LIST #else @@ -31,6 +34,7 @@ #endif #define SCSI_DEV_LIST {SCSI_VEND_ID, SCSI_DEV_ID} #endif +#endif #if defined(CONFIG_PCI) && !defined(CONFIG_SCSI_AHCI_PLAT) const struct pci_device_id scsi_device_list[] = { SCSI_DEV_LIST }; @@ -39,11 +43,13 @@ static ccb tempccb; /* temporary scsi command buffer */ static unsigned char tempbuff[512]; /* temporary data buffer */ +#if !defined(CONFIG_DM_SCSI) static int scsi_max_devs; /* number of highest available scsi device */ static int scsi_curr_dev; /* current device */ static struct blk_desc scsi_dev_desc[CONFIG_SYS_SCSI_MAX_DEVICE]; +#endif /* almost the maximum amount of the scsi_ext command.. */ #define SCSI_MAX_READ_BLK 0xFFFF @@ -422,12 +428,15 @@ static void scsi_setup_test_unit_ready(ccb *pccb) pccb->msgout[0] = SCSI_IDENTIFY; /* NOT USED */ } -static void scsi_init_dev_desc(struct blk_desc *dev_desc, int devnum) +/** + * scsi_init_dev_desc_priv - initialize only SCSI specific blk_desc properties + * + * @dev_desc: Block device description pointer + */ +static void scsi_init_dev_desc_priv(struct blk_desc *dev_desc) { dev_desc->target = 0xff; dev_desc->lun = 0xff; - dev_desc->lba = 0; - dev_desc->blksz = 0; dev_desc->log2blksz = LOG2_INVALID(typeof(dev_desc->log2blksz)); dev_desc->type = DEV_TYPE_UNKNOWN; @@ -435,15 +444,30 @@ static void scsi_init_dev_desc(struct blk_desc *dev_desc, int devnum) dev_desc->product[0] = 0; dev_desc->revision[0] = 0; dev_desc->removable = false; - dev_desc->if_type = IF_TYPE_SCSI; - dev_desc->devnum = devnum; - dev_desc->part_type = PART_TYPE_UNKNOWN; #ifndef CONFIG_BLK dev_desc->block_read = scsi_read; dev_desc->block_write = scsi_write; #endif } +#if !defined(CONFIG_DM_SCSI) +/** + * scsi_init_dev_desc - initialize all SCSI specific blk_desc properties + * + * @dev_desc: Block device description pointer + * @devnum: Device number + */ +static void scsi_init_dev_desc(struct blk_desc *dev_desc, int devnum) +{ + dev_desc->lba = 0; + dev_desc->blksz = 0; + dev_desc->if_type = IF_TYPE_SCSI; + dev_desc->devnum = devnum; + dev_desc->part_type = PART_TYPE_UNKNOWN; + + scsi_init_dev_desc_priv(dev_desc); +} +#endif /** * scsi_detect_dev - Detect scsi device @@ -524,6 +548,75 @@ removable: * (re)-scan the scsi bus and reports scsi device info * to the user if mode = 1 */ +#if defined(CONFIG_DM_SCSI) +int scsi_scan(int mode) +{ + unsigned char i, lun; + struct uclass *uc; + struct udevice *dev; /* SCSI controller */ + int ret; + + if (mode == 1) + printf("scanning bus for devices...\n"); + + blk_unbind_all(IF_TYPE_SCSI); + + ret = uclass_get(UCLASS_SCSI, &uc); + if (ret) + return ret; + + uclass_foreach_dev(dev, uc) { + struct scsi_platdata *plat; /* scsi controller platdata */ + + /* probe SCSI controller driver */ + ret = device_probe(dev); + if (ret) + return ret; + + /* Get controller platdata */ + plat = dev_get_platdata(dev); + + for (i = 0; i < plat->max_id; i++) { + for (lun = 0; lun < plat->max_lun; lun++) { + struct udevice *bdev; /* block device */ + /* block device description */ + struct blk_desc *bdesc; + char str[10]; + + /* + * Create only one block device and do detection + * to make sure that there won't be a lot of + * block devices created + */ + snprintf(str, sizeof(str), "id%dlun%d", i, lun); + ret = blk_create_devicef(dev, "scsi_blk", + str, IF_TYPE_SCSI, + -1, 0, 0, &bdev); + if (ret) { + debug("Can't create device\n"); + return ret; + } + bdesc = dev_get_uclass_platdata(bdev); + + scsi_init_dev_desc_priv(bdesc); + bdesc->lun = lun; + ret = scsi_detect_dev(i, bdesc); + if (ret) { + device_unbind(bdev); + continue; + } + + if (mode == 1) { + printf(" Device %d: ", 0); + dev_print(bdesc); + } /* if mode */ + } /* next LUN */ + } + } + + return 0; +} +#else int scsi_scan(int mode) { unsigned char i, lun; @@ -560,6 +653,7 @@ int scsi_scan(int mode) #endif return 0; } +#endif #ifdef CONFIG_BLK static const struct blk_ops scsi_blk_ops = {