void show_disk(struct s_hardware *hardware, ZZJSON_CONFIG *conf, ZZJSON **it, int drive) { config=conf; item=it; int i = drive - 0x80; struct driveinfo *d = &hardware->disk_info[i]; char mbr_name[50]={0}; char disk_size[11]={0}; get_mbr_string(hardware->mbr_ids[i], &mbr_name,sizeof(mbr_name)); if ((int)d->edd_params.sectors > 0) sectors_to_size((int)d->edd_params.sectors, disk_size); char disk[5]={0}; char edd_version[5]={0}; snprintf(disk,sizeof(disk),"0x%X",d->disk); snprintf(edd_version,sizeof(edd_version),"%X",d->edd_version); zzjson_print(config, *item); zzjson_free(config, *item); CREATE_ARRAY add_as("disk->number",disk) add_ai("disk->cylinders",d->legacy_max_cylinder +1) add_ai("disk->heads",d->legacy_max_head +1) add_ai("disk->sectors_per_track",d->legacy_sectors_per_track) add_as("disk->edd_version",edd_version) add_as("disk->size",disk_size) add_ai("disk->bytes_per_sector",(int)d->edd_params.bytes_per_sector) add_ai("disk->sectors_per_track",(int)d->edd_params.sectors_per_track) add_as("disk->host_bus",remove_spaces((char *)d->edd_params.host_bus_type)) add_as("disk->interface_type",remove_spaces((char *)d->edd_params.interface_type)) add_as("disk->mbr_name",mbr_name) add_ai("disk->mbr_id",hardware->mbr_ids[i]) END_OF_ARRAY; if (parse_partition_table(d, &show_partition_information)) { if (errno_disk) { APPEND_ARRAY add_as("disk->error", "IO Error") END_OF_APPEND; } else { APPEND_ARRAY add_as("disk->error", "Unrecognized Partition Layout") END_OF_APPEND; } } }
void main_show_disk(int argc, char **argv, struct s_hardware *hardware) { if (!argc) { more_printf("Which disk?\n"); return; } int drive = strtol(argv[0], (char **)NULL, 16); if (drive < 0x80 || drive >= 0xff) { more_printf("Invalid disk: %d.\n", drive); return; } int i = drive - 0x80; struct driveinfo *d = &hardware->disk_info[i]; char disk_size[11]; char mbr_name[50]; reset_more_printf(); if (!hardware->disk_info[i].cbios) { more_printf("No disk found\n"); return; /* Invalid geometry */ } get_mbr_string(hardware->mbr_ids[i], &mbr_name, 50); if ((int)d->edd_params.sectors > 0) sectors_to_size((int)d->edd_params.sectors, disk_size); else memset(disk_size, 0, sizeof disk_size); more_printf("DISK 0x%X:\n" " C/H/S: %d cylinders, %d heads, %d sectors/track\n" " EDD: Version: %X\n" " Size: %s, %d bytes/sector, %d sectors/track\n" " Host bus: %s, Interface type: %s\n" " MBR: %s (id 0x%X)\n\n", d->disk, d->legacy_max_cylinder + 1, d->legacy_max_head + 1, d->legacy_sectors_per_track, d->edd_version, disk_size, (int)d->edd_params.bytes_per_sector, (int)d->edd_params.sectors_per_track, remove_spaces((char *)d->edd_params.host_bus_type), remove_spaces((char *)d->edd_params.interface_type), mbr_name, hardware->mbr_ids[i]); display_line_nb += 6; if (parse_partition_table(d, &show_partition_information)) { if (errno_disk) { fprintf(stderr, "I/O error parsing disk 0x%X\n", d->disk); get_error("parse_partition_table"); } else { fprintf(stderr, "Disk 0x%X: unrecognized partition layout\n", d->disk); } fprintf(stderr, "\n"); } more_printf("\n"); }
static int ata_port_init(struct ata_port *port) { int rc; struct ata_port_operations *ops = port->ops; struct device_d *dev = &port->class_dev; if (ops->init) { rc = ops->init(port); if (rc) return rc; } port->id = dma_alloc(SECTOR_SIZE); port->blk.dev = dev; port->blk.ops = &ata_ops; if (ops->reset) { rc = ops->reset(port); if (rc) { dev_dbg(dev, "Resetting failed\n"); goto on_error; } } rc = ops->read_id(port, port->id); if (rc != 0) { dev_dbg(dev, "Reading ID failed\n"); goto on_error; } ata_fix_endianess(port->id, SECTOR_SIZE / sizeof(uint16_t)); rc = ata_id_is_valid(port->id); if (rc) { dev_err(dev, "ata id invalid\n"); free(port->id); return rc; } #ifdef DEBUG ata_dump_id(port->id); #endif rc = cdev_find_free_index("ata"); if (rc == -1) pr_err("Cannot find a free index for the disk node\n"); port->blk.num_blocks = ata_id_n_sectors(port->id); port->blk.cdev.name = asprintf("ata%d", rc); port->blk.blockbits = SECTOR_SHIFT; rc = blockdevice_register(&port->blk); if (rc != 0) { dev_err(dev, "Failed to register blockdevice\n"); goto on_error; } dev_info(dev, "registered /dev/%s\n", port->blk.cdev.name); /* create partitions on demand */ rc = parse_partition_table(&port->blk); if (rc != 0) dev_warn(dev, "No partition table found\n"); return 0; on_error: return rc; }