Ejemplo n.º 1
0
/*
 * remove all mmc card
 */
void mmc_card_remove(void)
{
	struct mmc_card_list * list;
	struct list_head * head, * curr, * next;
	struct disk * disk;

	head = &mmc_card_list->entry;
	curr = head->next;

	while(curr != head)
	{
		list = list_entry(curr, struct mmc_card_list, entry);

		next = curr->next;
		list_del(curr);
		curr = next;

		disk = (struct disk *)(list->card->priv);
		unregister_disk(disk);
		free(disk);

		free(list->card->info);
		free(list->card);
		free(list);
	}
}
Ejemplo n.º 2
0
/*
 * register a disk into disk_list
 */
bool_t register_disk(struct disk * disk, enum blkdev_type type)
{
	struct disk_list * list;
	struct partition * part;
	struct blkdev * dev;
	struct disk_block * dblk;
	struct list_head * part_pos;
	s32_t i;

	if(!disk || !disk->name || search_disk(disk->name))
		return FALSE;

	if((disk->sector_size <= 0) || (disk->sector_count <=0))
		return FALSE;

	if((!disk->read_sectors) || (!disk->write_sectors))
		return FALSE;

	if(!partition_parser_probe(disk))
		return FALSE;

	if(list_empty(&(disk->info.entry)))
		return FALSE;

	list = malloc(sizeof(struct disk_list));
	if(!list)
		return FALSE;

	/*
	 * add disk to disk_list
	 */
	list->disk = disk;
	list_add(&list->entry, &disk_list->entry);

	/*
	 * register block device using partition information
	 */
	for(i = 0, part_pos = (&(disk->info.entry))->next; part_pos != &(disk->info.entry); i++, part_pos = part_pos->next)
	{
		part = list_entry(part_pos, struct partition, entry);

		dev = malloc(sizeof(struct blkdev));
		dblk = malloc(sizeof(struct disk_block));
		if(!dev || !dblk)
		{
			/*
			 * please do not free 'list'.
			 */
			free(dev);
			free(dblk);
			unregister_disk(disk);

			return FALSE;
		}

		if(i == 0)
			snprintf((char *)dblk->name, sizeof(dblk->name), (const char *)"%s", disk->name);
		else
			snprintf((char *)dblk->name, sizeof(dblk->name), (const char *)"%sp%ld", disk->name, i);

		part->dev = dev;
		dblk->part = part;
		dblk->offset = part->sector_from;
		dblk->busy = FALSE;
		dblk->disk = disk;

		dev->name	= dblk->name;
		dev->type	= type;
		dev->blksz	= part->sector_size;
		dev->blkcnt	= part->sector_to - part->sector_from + 1;
		dev->open 	= disk_block_open;
		dev->read 	= disk_block_read;
		dev->write	= disk_block_write;
		dev->ioctl 	= disk_block_ioctl;
		dev->close	= disk_block_close;
		dev->driver = dblk;

		if(!register_blkdev(dev))
		{
			/*
			 * please do not free 'list'.
			 */
			free(dev);
			free(dblk);
			unregister_disk(disk);

			return FALSE;
		}
	}

	return TRUE;
}