예제 #1
0
파일: scsi.c 프로젝트: frawang/u-boot
/**
 * 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->log2blksz =
		LOG2_INVALID(typeof(dev_desc->log2blksz));
	dev_desc->type = DEV_TYPE_UNKNOWN;
	dev_desc->vendor[0] = 0;
	dev_desc->product[0] = 0;
	dev_desc->revision[0] = 0;
	dev_desc->removable = false;
#if !CONFIG_IS_ENABLED(BLK)
	dev_desc->block_read = scsi_read;
	dev_desc->block_write = scsi_write;
#endif
}
예제 #2
0
파일: cmd_scsi.c 프로젝트: sonicz921/u-boot
/*********************************************************************************
 * (re)-scan the scsi bus and reports scsi device info
 * to the user if mode = 1
 */
void scsi_scan(int mode)
{
    unsigned char i,perq,modi,lun;
    lbaint_t capacity;
    unsigned long blksz;
    ccb* pccb=(ccb *)&tempccb;

    if(mode==1) {
        printf("scanning bus for devices...\n");
    }
    for(i=0; i<CONFIG_SYS_SCSI_MAX_DEVICE; i++) {
        scsi_dev_desc[i].target=0xff;
        scsi_dev_desc[i].lun=0xff;
        scsi_dev_desc[i].lba=0;
        scsi_dev_desc[i].blksz=0;
        scsi_dev_desc[i].log2blksz =
            LOG2_INVALID(typeof(scsi_dev_desc[i].log2blksz));
        scsi_dev_desc[i].type=DEV_TYPE_UNKNOWN;
        scsi_dev_desc[i].vendor[0]=0;
        scsi_dev_desc[i].product[0]=0;
        scsi_dev_desc[i].revision[0]=0;
        scsi_dev_desc[i].removable = false;
        scsi_dev_desc[i].if_type=IF_TYPE_SCSI;
        scsi_dev_desc[i].dev=i;
        scsi_dev_desc[i].part_type=PART_TYPE_UNKNOWN;
        scsi_dev_desc[i].block_read=scsi_read;
        scsi_dev_desc[i].block_write = scsi_write;
    }
    scsi_max_devs=0;
    for(i=0; i<CONFIG_SYS_SCSI_MAX_SCSI_ID; i++) {
        pccb->target=i;
        for(lun=0; lun<CONFIG_SYS_SCSI_MAX_LUN; lun++) {
            pccb->lun=lun;
            pccb->pdata=(unsigned char *)&tempbuff;
            pccb->datalen=512;
            scsi_setup_inquiry(pccb);
            if (scsi_exec(pccb) != true) {
                if(pccb->contr_stat==SCSI_SEL_TIME_OUT) {
                    debug ("Selection timeout ID %d\n",pccb->target);
                    continue; /* selection timeout => assuming no device present */
                }
                scsi_print_error(pccb);
                continue;
            }
            perq=tempbuff[0];
            modi=tempbuff[1];
            if((perq & 0x1f)==0x1f) {
                continue; /* skip unknown devices */
            }
            if((modi&0x80)==0x80) /* drive is removable */
                scsi_dev_desc[scsi_max_devs].removable=true;
            /* get info for this device */
            scsi_ident_cpy((unsigned char *)&scsi_dev_desc[scsi_max_devs].vendor[0],
                           &tempbuff[8], 8);
            scsi_ident_cpy((unsigned char *)&scsi_dev_desc[scsi_max_devs].product[0],
                           &tempbuff[16], 16);
            scsi_ident_cpy((unsigned char *)&scsi_dev_desc[scsi_max_devs].revision[0],
                           &tempbuff[32], 4);
            scsi_dev_desc[scsi_max_devs].target=pccb->target;
            scsi_dev_desc[scsi_max_devs].lun=pccb->lun;

            pccb->datalen=0;
            scsi_setup_test_unit_ready(pccb);
            if (scsi_exec(pccb) != true) {
                if (scsi_dev_desc[scsi_max_devs].removable == true) {
                    scsi_dev_desc[scsi_max_devs].type=perq;
                    goto removable;
                }
                scsi_print_error(pccb);
                continue;
            }
            if (scsi_read_capacity(pccb, &capacity, &blksz)) {
                scsi_print_error(pccb);
                continue;
            }
            scsi_dev_desc[scsi_max_devs].lba=capacity;
            scsi_dev_desc[scsi_max_devs].blksz=blksz;
            scsi_dev_desc[scsi_max_devs].log2blksz =
                LOG2(scsi_dev_desc[scsi_max_devs].blksz);
            scsi_dev_desc[scsi_max_devs].type=perq;
            init_part(&scsi_dev_desc[scsi_max_devs]);
removable:
            if(mode==1) {
                printf ("  Device %d: ", scsi_max_devs);
                dev_print(&scsi_dev_desc[scsi_max_devs]);
            } /* if mode */
            scsi_max_devs++;
        } /* next LUN */
    }
    if(scsi_max_devs>0)
        scsi_curr_dev=0;
    else
        scsi_curr_dev = -1;

    printf("Found %d device(s).\n", scsi_max_devs);
    setenv_ulong("scsidevs", scsi_max_devs);
}