aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Cox <alan@linux.intel.com>2010-12-08 10:57:24 +0000
committerAlan Cox <alan@linux.intel.com>2010-12-08 10:57:24 +0000
commit0cf884cefc32229e44b5ba70dbcd9cc235a4efe7 (patch)
treeef8d054dfa6f85de8b75c3e22e93c99fd4c76e67
parent873172cfbaad50ff25d78a3d109c99c12e494785 (diff)
downloadmrst-s0i3-test-0cf884cefc32229e44b5ba70dbcd9cc235a4efe7.tar.gz
mrst-s0i3-test-0cf884cefc32229e44b5ba70dbcd9cc235a4efe7.tar.xz
mrst-s0i3-test-0cf884cefc32229e44b5ba70dbcd9cc235a4efe7.zip
Signed-off-by: Mark A. Allyn <mark.a.allyn@intel.com>
-rw-r--r--drivers/staging/sep/sep_dev.h101
-rw-r--r--drivers/staging/sep/sep_driver_api.h472
2 files changed, 265 insertions, 308 deletions
diff --git a/drivers/staging/sep/sep_dev.h b/drivers/staging/sep/sep_dev.h
index 9200524bb64..f5ee28a1299 100644
--- a/drivers/staging/sep/sep_dev.h
+++ b/drivers/staging/sep/sep_dev.h
@@ -10,8 +10,7 @@
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
+ * Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
@@ -24,62 +23,108 @@
*
* CONTACTS:
*
- * Alan Cox alan@linux.intel.com
+ * Mark Allyn mark.a.allyn@intel.com
*
+ * CHANGES
+ * 2010.09.14 upgrade to Medfield
*/
struct sep_device {
/* pointer to pci dev */
struct pci_dev *pdev;
+ /* character device file */
+ struct cdev sep_cdev;
+ struct cdev sep_daemon_cdev;
+ struct cdev sep_singleton_cdev;
+
+ /* major / minor numbers of device */
+ dev_t sep_devno;
+ dev_t sep_daemon_devno;
+ dev_t sep_singleton_devno;
+
+ /* counter used to indicate how many have device open */
unsigned long in_use;
+ /* flags to indicate use and lock status of sep */
+ u32 pid_doing_transaction;
+ unsigned long in_use_flags;
+
+ /* request daemon alread open */
+ unsigned long request_daemon_open;
+
+ /* device may not be ready until after the rar_register driver
+ is probed */
+ unsigned int probed;
+
+ /* 1 = Moorestown; 0 = Medfield */
+ int mrst;
+
/* address of the shared memory allocated during init for SEP driver
(coherent alloc) */
- void *shared_addr;
- /* the physical address of the shared area */
dma_addr_t shared_bus;
+ size_t shared_size;
+ void *shared_addr;
/* restricted access region (coherent alloc) */
dma_addr_t rar_bus;
+ size_t rar_size;
void *rar_addr;
- /* firmware regions: cache is at rar_addr */
- unsigned long cache_size;
- /* follows the cache */
+ /* Firmware regions; cache is at rar for Moorestown and
+ resident is at rar for Medfield */
+ dma_addr_t cache_bus;
+ size_t cache_size;
+ void *cache_addr;
+
dma_addr_t resident_bus;
- unsigned long resident_size;
+ size_t resident_size;
void *resident_addr;
+ /* sep's scratchpad */
+ dma_addr_t dcache_bus;
+ size_t dcache_size;
+ void *dcache_addr;
+
+ /* Only used on Medfield */
+ dma_addr_t extapp_bus;
+ size_t extapp_size;
+ void *extapp_addr;
+
/* start address of the access to the SEP registers from driver */
+ dma_addr_t reg_physical_addr;
+ dma_addr_t reg_physical_end;
void __iomem *reg_addr;
- /* transaction counter that coordinates the transactions between SEP and HOST */
+
+ /* wait queue head (event) of the driver */
+ wait_queue_head_t event;
+ wait_queue_head_t event_request_daemon;
+ wait_queue_head_t event_mmap;
+
+ struct sep_caller_id_entry
+ caller_id_table[SEP_CALLER_ID_TABLE_NUM_ENTRIES];
+
+ /* access flag for singleton device */
+ unsigned long singleton_access_flag;
+
+ /* transaction counter that coordinates the
+ transactions between SEP and HOST */
unsigned long send_ct;
/* counter for the messages from sep */
unsigned long reply_ct;
- /* counter for the number of bytes allocated in the pool for the current
- transaction */
+ /* counter for the number of bytes allocated in the pool for the
+ current transaction */
unsigned long data_pool_bytes_allocated;
- /* array of pointers to the pages that represent input data for the synchronic
- DMA action */
- struct page **in_page_array;
-
- /* array of pointers to the pages that represent out data for the synchronic
- DMA action */
- struct page **out_page_array;
-
- /* number of pages in the sep_in_page_array */
- unsigned long in_num_pages;
+ u32 num_of_data_allocations;
- /* number of pages in the sep_out_page_array */
- unsigned long out_num_pages;
+ /* number of the lli tables created in the current transaction */
+ u32 num_lli_tables_created;
- /* global data for every flow */
- struct sep_flow_context_t flows[SEP_DRIVER_NUM_FLOWS];
+ /* number of data control blocks */
+ u32 nr_dcb_creat;
- /* pointer to the workqueue that handles the flow done interrupts */
- struct workqueue_struct *flow_wq;
+ struct sep_dma_resource dma_res_arr[SEP_MAX_NUM_SYNC_DMA_OPS];
};
diff --git a/drivers/staging/sep/sep_driver_api.h b/drivers/staging/sep/sep_driver_api.h
index 383543d97f9..cdebc217cc9 100644
--- a/drivers/staging/sep/sep_driver_api.h
+++ b/drivers/staging/sep/sep_driver_api.h
@@ -7,8 +7,7 @@
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
- * Software Foundation; either version 2 of the License, or (at your option)
- * any later version.
+ * Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
@@ -25,76 +24,19 @@
*
* CHANGES:
*
- * 2009.06.26 Initial publish
+ * 2010.09.14 Upgrade to Medfield
*
*/
#ifndef __SEP_DRIVER_API_H__
#define __SEP_DRIVER_API_H__
+/* Type of request from device */
+#define SEP_DRIVER_SRC_REPLY 1
+#define SEP_DRIVER_SRC_REQ 2
+#define SEP_DRIVER_SRC_PRINTF 3
-/*----------------------------------------------------------------
- IOCTL command defines
- -----------------------------------------------------------------*/
-
-/* magic number 1 of the sep IOCTL command */
-#define SEP_IOC_MAGIC_NUMBER 's'
-
-/* sends interrupt to sep that message is ready */
-#define SEP_IOCSENDSEPCOMMAND _IO(SEP_IOC_MAGIC_NUMBER , 0)
-
-/* sends interrupt to sep that message is ready */
-#define SEP_IOCSENDSEPRPLYCOMMAND _IO(SEP_IOC_MAGIC_NUMBER , 1)
-
-/* allocate memory in data pool */
-#define SEP_IOCALLOCDATAPOLL _IO(SEP_IOC_MAGIC_NUMBER , 2)
-
-/* write to pre-allocated memory in data pool */
-#define SEP_IOCWRITEDATAPOLL _IO(SEP_IOC_MAGIC_NUMBER , 3)
-
-/* read from pre-allocated memory in data pool */
-#define SEP_IOCREADDATAPOLL _IO(SEP_IOC_MAGIC_NUMBER , 4)
-
-/* create sym dma lli tables */
-#define SEP_IOCCREATESYMDMATABLE _IO(SEP_IOC_MAGIC_NUMBER , 5)
-
-/* create flow dma lli tables */
-#define SEP_IOCCREATEFLOWDMATABLE _IO(SEP_IOC_MAGIC_NUMBER , 6)
-
-/* free dynamic data aalocated during table creation */
-#define SEP_IOCFREEDMATABLEDATA _IO(SEP_IOC_MAGIC_NUMBER , 7)
-
-/* get the static pool area addersses (physical and virtual) */
-#define SEP_IOCGETSTATICPOOLADDR _IO(SEP_IOC_MAGIC_NUMBER , 8)
-
-/* set flow id command */
-#define SEP_IOCSETFLOWID _IO(SEP_IOC_MAGIC_NUMBER , 9)
-
-/* add tables to the dynamic flow */
-#define SEP_IOCADDFLOWTABLE _IO(SEP_IOC_MAGIC_NUMBER , 10)
-
-/* add flow add tables message */
-#define SEP_IOCADDFLOWMESSAGE _IO(SEP_IOC_MAGIC_NUMBER , 11)
-
-/* start sep command */
-#define SEP_IOCSEPSTART _IO(SEP_IOC_MAGIC_NUMBER , 12)
-
-/* init sep command */
-#define SEP_IOCSEPINIT _IO(SEP_IOC_MAGIC_NUMBER , 13)
-
-/* end transaction command */
-#define SEP_IOCENDTRANSACTION _IO(SEP_IOC_MAGIC_NUMBER , 15)
-
-/* reallocate cache and resident */
-#define SEP_IOCREALLOCCACHERES _IO(SEP_IOC_MAGIC_NUMBER , 16)
-
-/* get the offset of the address starting from the beginnnig of the map area */
-#define SEP_IOCGETMAPPEDADDROFFSET _IO(SEP_IOC_MAGIC_NUMBER , 17)
-
-/* get time address and value */
-#define SEP_IOCGETIME _IO(SEP_IOC_MAGIC_NUMBER , 19)
-
/*-------------------------------------------
TYPEDEFS
----------------------------------------------*/
@@ -104,63 +46,41 @@
*/
struct sep_driver_init_t {
/* start of the 1G of the host memory address that SEP can access */
- unsigned long message_addr;
+ u32 *message_addr;
/* start address of resident */
- unsigned long message_size_in_words;
+ u32 message_size_in_words;
-};
+ /* offset of the init message in the sep sram */
+ u32 sep_sram_addr;
+ /* resident size in bytes*/
+ u32 resident_size_in_bytes;
-/*
- realloc cache resident command
-*/
-struct sep_driver_realloc_cache_resident_t {
- /* new cache address */
- u64 new_cache_addr;
- /* new resident address */
- u64 new_resident_addr;
- /* new resident address */
- u64 new_shared_area_addr;
- /* new base address */
- u64 new_base_addr;
-};
+ /* cache size in bytes*/
+ u32 cache_size_in_bytes;
-struct sep_driver_alloc_t {
- /* virtual address of allocated space */
- unsigned long offset;
+ /* ext cache current address */
+ void *extcache_addr;
- /* physical address of allocated space */
- unsigned long phys_address;
-
- /* number of bytes to allocate */
- unsigned long num_bytes;
+ /* ext cache size in bytes*/
+ u32 extcache_size_in_bytes;
};
-/*
- */
-struct sep_driver_write_t {
- /* application space address */
- unsigned long app_address;
+struct sep_driver_realloc_ext_cache_t {
+ /* current external cache address */
+ void *ext_cache_addr;
- /* address of the data pool */
- unsigned long datapool_address;
-
- /* number of bytes to write */
- unsigned long num_bytes;
+ /* external cache size in bytes*/
+ u32 ext_cache_size_in_bytes;
};
-/*
- */
-struct sep_driver_read_t {
- /* application space address */
- unsigned long app_address;
-
- /* address of the data pool */
- unsigned long datapool_address;
+struct sep_driver_alloc_t {
+ /* virtual address of allocated space */
+ u32 offset;
- /* number of bytes to read */
- unsigned long num_bytes;
+ /* number of bytes to allocate */
+ u32 num_bytes;
};
/*
@@ -170,256 +90,248 @@ struct sep_driver_build_sync_table_t {
unsigned long app_in_address;
/* size of data in */
- unsigned long data_in_size;
+ u32 data_in_size;
/* address of the data out */
unsigned long app_out_address;
/* the size of the block of the operation - if needed,
every table will be modulo this parameter */
- unsigned long block_size;
+ u32 block_size;
+
+ /* distinct user/kernel layout */
+ bool isKernelVirtualAddress;
- /* the physical address of the first input DMA table */
- unsigned long in_table_address;
+};
- /* number of entries in the first input DMA table */
- unsigned long in_table_num_entries;
+/* command struct for static pool addresses */
+struct sep_driver_static_pool_addr_t {
- /* the physical address of the first output DMA table */
- unsigned long out_table_address;
+ /* virtual address of the static pool */
+ void *static_virt_address;
+};
- /* number of entries in the first output DMA table */
- unsigned long out_table_num_entries;
+/* command struct for getiing offset of the physical address from
+ the start of the mapped area */
+struct sep_driver_get_mapped_offset_t {
+ /* physical address of the static pool */
+ unsigned long physical_address;
- /* data in the first input table */
- unsigned long table_data_size;
+ /* virtual address of the static pool */
+ u32 offset;
+};
- /* distinct user/kernel layout */
- bool isKernelVirtualAddress;
+/* command struct for getting time value and address */
+struct sep_driver_set_caller_id_t {
+ /* pid of the process */
+ u32 pid;
+ /* virtual address of the caller id hash */
+ void *callerIdAddress;
+
+ /* caller id hash size in bytes */
+ u32 callerIdSizeInBytes;
};
/*
+ structure that represents DCB
*/
-struct sep_driver_build_flow_table_t {
- /* flow type */
- unsigned long flow_type;
+struct sep_dcb_t {
+ /* physical address of the first input mlli */
+ u32 input_mlli_address;
- /* flag for input output */
- unsigned long input_output_flag;
+ /* num of entries in the first input mlli */
+ u32 input_mlli_num_entries;
- /* address value of the data in */
- unsigned long virt_buff_data_addr;
+ /* size of data in the first input mlli */
+ u32 input_mlli_data_size;
- /* size of data in */
- unsigned long num_virtual_buffers;
+ /* physical address of the first output mlli */
+ u32 output_mlli_address;
- /* the physical address of the first input DMA table */
- unsigned long first_table_addr;
+ /* num of entries in the first output mlli */
+ u32 output_mlli_num_entries;
- /* number of entries in the first input DMA table */
- unsigned long first_table_num_entries;
+ /* size of data in the first output mlli */
+ u32 output_mlli_data_size;
- /* data in the first input table */
- unsigned long first_table_data_size;
-
- /* distinct user/kernel layout */
- bool isKernelVirtualAddress;
-};
+ /* pointer to the output virtual tail */
+ void *out_vr_tail_pt;
+ /* size of tail data */
+ u32 tail_data_size;
-struct sep_driver_add_flow_table_t {
- /* flow id */
- unsigned long flow_id;
+ /* input tail data array */
+ u8 tail_data[64];
+};
- /* flag for input output */
- unsigned long inputOutputFlag;
+struct sep_caller_id_entry {
+ int pid;
+ unsigned char callerIdHash[SEP_CALLER_ID_HASH_SIZE_IN_BYTES];
+};
+/*
+ command structure for building dcb block (currently for ext app only
+*/
+struct sep_driver_build_dcb_t {
/* address value of the data in */
- unsigned long virt_buff_data_addr;
+ unsigned long app_in_address;
/* size of data in */
- unsigned long num_virtual_buffers;
+ u32 data_in_size;
- /* address of the first table */
- unsigned long first_table_addr;
+ /* address of the data out */
+ unsigned long app_out_address;
- /* number of entries in the first table */
- unsigned long first_table_num_entries;
+ /* the size of the block of the operation - if needed,
+ every table will be modulo this parameter */
+ u32 block_size;
- /* data size of the first table */
- unsigned long first_table_data_size;
+ /* the size of the block of the operation - if needed,
+ every table will be modulo this parameter */
+ u32 tail_block_size;
+};
- /* distinct user/kernel layout */
- bool isKernelVirtualAddress;
+/**
+ * @struct sep_dma_map
+ *
+ * Structure that contains all information needed for mapping the user pages
+ * or kernel buffers for dma operations
+ *
+ *
+ */
+struct sep_dma_map {
-};
+ /* mapped dma address */
+ dma_addr_t dma_addr;
-/*
- command struct for set flow id
-*/
-struct sep_driver_set_flow_id_t {
- /* flow id to set */
- unsigned long flow_id;
+ /* size of the mapped data */
+ size_t size;
};
+struct sep_dma_resource {
+ /* array of pointers to the pages that represent
+ input data for the synchronic DMA action */
+ struct page **in_page_array;
-/* command struct for add tables message */
-struct sep_driver_add_message_t {
- /* flow id to set */
- unsigned long flow_id;
+ /* array of pointers to the pages that represent out
+ data for the synchronic DMA action */
+ struct page **out_page_array;
- /* message size in bytes */
- unsigned long message_size_in_bytes;
+ /* number of pages in the sep_in_page_array */
+ u32 in_num_pages;
- /* address of the message */
- unsigned long message_address;
-};
+ /* number of pages in the sep_out_page_array */
+ u32 out_num_pages;
-/* command struct for static pool addresses */
-struct sep_driver_static_pool_addr_t {
- /* physical address of the static pool */
- unsigned long physical_static_address;
+ /* map array of the input data */
+ struct sep_dma_map *in_map_array;
- /* virtual address of the static pool */
- unsigned long virtual_static_address;
-};
+ /* map array of the output data */
+ struct sep_dma_map *out_map_array;
-/* command struct for getiing offset of the physical address from
- the start of the mapped area */
-struct sep_driver_get_mapped_offset_t {
- /* physical address of the static pool */
- unsigned long physical_address;
+ /* number of entries of the input mapp array */
+ u32 in_map_num_entries;
- /* virtual address of the static pool */
- unsigned long offset;
+ /* number of entries of the output mapp array */
+ u32 out_map_num_entries;
};
-/* command struct for getting time value and address */
-struct sep_driver_get_time_t {
- /* physical address of stored time */
- unsigned long time_physical_address;
- /* value of the stored time */
- unsigned long time_value;
-};
+/* command struct for translating rar handle to bus address
+ and setting it at predefined location */
+struct sep_driver_rar_handle_to_bus {
+ /* rar handle */
+ void *rar_handle;
+};
/*
structure that represent one entry in the DMA LLI table
*/
struct sep_lli_entry_t {
/* physical address */
- unsigned long physical_address;
+ u32 bus_address;
/* block size */
- unsigned long block_size;
+ u32 block_size;
};
-/*
- structure that reperesents data needed for lli table construction
-*/
-struct sep_lli_prepare_table_data_t {
- /* pointer to the memory where the first lli entry to be built */
- struct sep_lli_entry_t *lli_entry_ptr;
-
- /* pointer to the array of lli entries from which the table is to be built */
- struct sep_lli_entry_t *lli_array_ptr;
-
- /* number of elements in lli array */
- int lli_array_size;
-
- /* number of entries in the created table */
- int num_table_entries;
+/*----------------------------------------------------------------
+ IOCTL command defines
+ -----------------------------------------------------------------*/
- /* number of array entries processed during table creation */
- int num_array_entries_processed;
+/* magic number 1 of the sep IOCTL command */
+#define SEP_IOC_MAGIC_NUMBER 's'
- /* the totatl data size in the created table */
- int lli_table_total_data_size;
-};
+/* sends interrupt to sep that message is ready */
+#define SEP_IOCSENDSEPCOMMAND \
+ _IO(SEP_IOC_MAGIC_NUMBER, 0)
-/*
- structure that represent tone table - it is not used in code, jkust
- to show what table looks like
-*/
-struct sep_lli_table_t {
- /* number of pages mapped in this tables. If 0 - means that the table
- is not defined (used as a valid flag) */
- unsigned long num_pages;
- /*
- pointer to array of page pointers that represent the mapping of the
- virtual buffer defined by the table to the physical memory. If this
- pointer is NULL, it means that the table is not defined
- (used as a valid flag)
- */
- struct page **table_page_array_ptr;
-
- /* maximum flow entries in table */
- struct sep_lli_entry_t lli_entries[SEP_DRIVER_MAX_FLOW_NUM_ENTRIES_IN_TABLE];
-};
+/* sends interrupt to sep that message is ready */
+#define SEP_IOCSENDSEPRPLYCOMMAND \
+ _IO(SEP_IOC_MAGIC_NUMBER, 1)
+/* allocate memory in data pool */
+#define SEP_IOCALLOCDATAPOLL \
+ _IOW(SEP_IOC_MAGIC_NUMBER, 2, struct sep_driver_alloc_t)
-/*
- structure for keeping the mapping of the virtual buffer into physical pages
-*/
-struct sep_flow_buffer_data {
- /* pointer to the array of page structs pointers to the pages of the
- virtual buffer */
- struct page **page_array_ptr;
+/* create sym dma lli tables */
+#define SEP_IOCCREATESYMDMATABLE \
+ _IOW(SEP_IOC_MAGIC_NUMBER, 5, struct sep_driver_build_sync_table_t)
- /* number of pages taken by the virtual buffer */
- unsigned long num_pages;
+/* free dynamic data aalocated during table creation */
+#define SEP_IOCFREEDMATABLEDATA \
+ _IO(SEP_IOC_MAGIC_NUMBER, 7)
- /* this flag signals if this page_array is the last one among many that were
- sent in one setting to SEP */
- unsigned long last_page_array_flag;
-};
+/* get the static pool area addersses (physical and virtual) */
+#define SEP_IOCGETSTATICPOOLADDR \
+ _IOR(SEP_IOC_MAGIC_NUMBER, 8, struct sep_driver_static_pool_addr_t)
-/*
- struct that keeps all the data for one flow
-*/
-struct sep_flow_context_t {
- /*
- work struct for handling the flow done interrupt in the workqueue
- this structure must be in the first place, since it will be used
- forcasting to the containing flow context
- */
- struct work_struct flow_wq;
+/* set flow id command */
+#define SEP_IOCSETFLOWID \
+ _IO(SEP_IOC_MAGIC_NUMBER, 9)
- /* flow id */
- unsigned long flow_id;
+/* add tables to the dynamic flow */
+#define SEP_IOCADDFLOWTABLE \
+ _IO(SEP_IOC_MAGIC_NUMBER, 10)
- /* additional input tables exists */
- unsigned long input_tables_flag;
+/* add flow add tables message */
+#define SEP_IOCADDFLOWMESSAGE \
+ _IO(SEP_IOC_MAGIC_NUMBER, 11)
- /* additional output tables exists */
- unsigned long output_tables_flag;
+/* start sep command */
+#define SEP_IOCSEPSTART \
+ _IO(SEP_IOC_MAGIC_NUMBER, 12)
- /* data of the first input file */
- struct sep_lli_entry_t first_input_table;
+/* init sep command */
+#define SEP_IOCSEPINIT \
+ _IOW(SEP_IOC_MAGIC_NUMBER, 13, struct sep_driver_init_t)
- /* data of the first output table */
- struct sep_lli_entry_t first_output_table;
+/* end transaction command */
+#define SEP_IOCENDTRANSACTION \
+ _IO(SEP_IOC_MAGIC_NUMBER, 15)
- /* last input table data */
- struct sep_lli_entry_t last_input_table;
+/* reallocate external app */
+#define SEP_IOCREALLOCEXTCACHE \
+ _IOW(SEP_IOC_MAGIC_NUMBER, 18, struct sep_driver_realloc_ext_cache_t)
- /* last output table data */
- struct sep_lli_entry_t last_output_table;
+#define SEP_IOCRARPREPAREMESSAGE \
+ _IOW(SEP_IOC_MAGIC_NUMBER, 20, struct sep_driver_rar_handle_to_bus)
- /* first list of table */
- struct sep_lli_entry_t input_tables_in_process;
+#define SEP_IOCTLSINGLETONLOCK \
+ _IO(SEP_IOC_MAGIC_NUMBER, 32)
- /* output table in process (in sep) */
- struct sep_lli_entry_t output_tables_in_process;
+#define SEP_IOCTLSINGLETONUNLOCK \
+ _IO(SEP_IOC_MAGIC_NUMBER, 33)
- /* size of messages in bytes */
- unsigned long message_size_in_bytes;
+#define SEP_IOCTLSETCALLERID \
+ _IOW(SEP_IOC_MAGIC_NUMBER, 34, struct sep_driver_set_caller_id_t)
- /* message */
- unsigned char message[SEP_MAX_ADD_MESSAGE_LENGTH_IN_BYTES];
-};
+#define SEP_IOCPREPAREDCB \
+ _IOW(SEP_IOC_MAGIC_NUMBER, 35, struct sep_driver_build_dcb_t)
+#define SEP_IOCFREEDCB \
+ _IO(SEP_IOC_MAGIC_NUMBER, 36)
#endif