Index: uspace/lib/block/block.c
===================================================================
--- uspace/lib/block/block.c	(revision 35b8bfec4fe9165e74e88a84c760fdfb3fffcde9)
+++ uspace/lib/block/block.c	(revision c451d2214eee6d7cef53afd87177f8dbb0926c2f)
@@ -877,26 +877,14 @@
  *
  * @return Allocated TOC structure.
- * @return NULL on failure.
- *
- */
-toc_block_t *block_get_toc(service_id_t service_id, uint8_t session)
+ * @return EOK on success or negative error code.
+ *
+ */
+int block_read_toc(service_id_t service_id, uint8_t session, void *buf,
+    size_t bufsize)
 {
 	devcon_t *devcon = devcon_search(service_id);
-	toc_block_t *toc = NULL;
-	int rc;
-	
-	assert(devcon);
-	
-	toc = (toc_block_t *) malloc(sizeof(toc_block_t));
-	if (toc == NULL)
-		return NULL;
-	
-	rc = bd_read_toc(devcon->bd, session, toc, sizeof(toc_block_t));
-	if (rc != EOK) {
-		free(toc);
-		return NULL;
-	}
-	
-	return toc;
+	
+	assert(devcon);
+	return bd_read_toc(devcon->bd, session, buf, bufsize);
 }
 
Index: uspace/lib/block/block.h
===================================================================
--- uspace/lib/block/block.h	(revision 35b8bfec4fe9165e74e88a84c760fdfb3fffcde9)
+++ uspace/lib/block/block.h	(revision c451d2214eee6d7cef53afd87177f8dbb0926c2f)
@@ -99,17 +99,4 @@
 };
 
-typedef struct {
-	uint16_t size;
-	uint8_t first_session;
-	uint8_t last_session;
-	
-	uint8_t res0;
-	uint8_t adr_ctrl;
-	uint8_t first_track;
-	uint8_t res1;
-	
-	uint32_t first_lba;
-} __attribute__((packed)) toc_block_t;
-
 extern int block_init(exch_mgmt_t, service_id_t, size_t);
 extern void block_fini(service_id_t);
@@ -129,5 +116,5 @@
 extern int block_get_bsize(service_id_t, size_t *);
 extern int block_get_nblocks(service_id_t, aoff64_t *);
-extern toc_block_t *block_get_toc(service_id_t, uint8_t);
+extern int block_read_toc(service_id_t, uint8_t, void *, size_t);
 extern int block_read_direct(service_id_t, aoff64_t, size_t, void *);
 extern int block_read_bytes_direct(service_id_t, aoff64_t, size_t, void *);
Index: uspace/lib/scsi/include/scsi/mmc.h
===================================================================
--- uspace/lib/scsi/include/scsi/mmc.h	(revision 35b8bfec4fe9165e74e88a84c760fdfb3fffcde9)
+++ uspace/lib/scsi/include/scsi/mmc.h	(revision c451d2214eee6d7cef53afd87177f8dbb0926c2f)
@@ -69,4 +69,33 @@
 } __attribute__((packed)) scsi_cdb_read_toc_t;
 
+/** TOC Track Descriptor */
+typedef struct {
+	/** Reserved */
+	uint8_t reserved0;
+	/** ADR, Control */
+	uint8_t adr_control;
+	/** Track Number */
+	uint8_t track_no;
+	/** Reserved */
+	uint8_t reserved3;
+	/** Track Start Address */
+	uint32_t start_addr;
+} __attribute__((packed)) scsi_toc_track_desc_t;
+
+/** Read TOC response format 00001b: Multi-session Information
+ *
+ * Returned for Read TOC command with Format 0001b
+ */
+typedef struct {
+	/** TOC Data Length */
+	uint16_t toc_len;
+	/** First Complete Session Number */
+	uint8_t first_sess;
+	/** Last Complete Session Number */
+	uint8_t last_sess;
+	/** TOC Track Descriptor for first track in last complete session */
+	scsi_toc_track_desc_t ftrack_lsess;
+} __attribute__((packed)) scsi_toc_multisess_data_t;
+
 #endif
 
