static void efx_mtd_remove_device(struct efx_mtd *efx_mtd) { struct efx_mtd_partition *part; efx_for_each_partition(part, efx_mtd) efx_mtd_remove_partition(part); list_del(&efx_mtd->node); kfree(efx_mtd); }
void efx_mtd_remove(struct efx_nic *efx) { struct efx_mtd_partition *parts, *part, *next; WARN_ON(efx_dev_registered(efx)); if (list_empty(&efx->mtd_list)) return; parts = list_first_entry(&efx->mtd_list, struct efx_mtd_partition, node); list_for_each_entry_safe(part, next, &efx->mtd_list, node) efx_mtd_remove_partition(part); kfree(parts); }
int efx_mtd_add(struct efx_nic *efx, struct efx_mtd_partition *parts, size_t n_parts, size_t sizeof_part) { struct efx_mtd_partition *part; size_t i; for (i = 0; i < n_parts; i++) { part = (struct efx_mtd_partition *)((char *)parts + i * sizeof_part); part->mtd.writesize = 1; part->mtd.owner = THIS_MODULE; part->mtd.priv = efx; part->mtd.name = part->name; part->mtd._erase = efx_mtd_erase; part->mtd._read = efx->type->mtd_read; part->mtd._write = efx->type->mtd_write; part->mtd._sync = efx_mtd_sync; efx->type->mtd_rename(part); if (mtd_device_register(&part->mtd, NULL, 0)) goto fail; /* Add to list in order - efx_mtd_remove() depends on this */ list_add_tail(&part->node, &efx->mtd_list); } return 0; fail: while (i--) { part = (struct efx_mtd_partition *)((char *)parts + i * sizeof_part); efx_mtd_remove_partition(part); } /* Failure is unlikely here, but probably means we're out of memory */ return -ENOMEM; }