/* * 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); } }
/* * 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; }