diff options
author | Santosh Shilimkar <santosh.shilimkar@ti.com> | 2009-07-03 18:01:37 +0530 |
---|---|---|
committer | Santosh Shilimkar <santosh.shilimkar@ti.com> | 2009-07-03 18:01:37 +0530 |
commit | 0c6b3419ce0085908c5f39792dc7130dec80c166 (patch) | |
tree | 1e3e8424a2d94d6d0ea17ea032e51ac22e360aa2 | |
parent | 31755ec97d3022e773079cccb27758bf7631e970 (diff) | |
parent | 496ef4fbc56dda409f61400e25b3815e4efd5ae1 (diff) |
Merge tag 'ti-teslabridgedev-omap4-24.0.9' of git://dev.omapzoom.org/pub/scm/tisyslink/kernel-syslink into temp
Conflicts:
TI_OMAP4_Syslink_Release_Notes_L24.x.txt
arch/arm/mach-omap2/io.c
Resolved
Signed-off-by: Santosh Shilimkar <santosh.shilimkar@ti.com>
-rw-r--r-- | TI_OMAP4_Syslink_Release_Notes_L24.x.txt | 125 | ||||
-rwxr-xr-x | drivers/dsp/syslink/multicore_ipc/gatepeterson.c | 5 | ||||
-rwxr-xr-x[-rw-r--r--] | drivers/dsp/syslink/multicore_ipc/heapbuf.c | 101 | ||||
-rwxr-xr-x | drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c | 2 | ||||
-rw-r--r-- | drivers/dsp/syslink/multicore_ipc/nameserver.c | 15 | ||||
-rwxr-xr-x[-rw-r--r--] | drivers/dsp/syslink/multicore_ipc/nameserver_remotenotify.c | 26 | ||||
-rwxr-xr-x | drivers/dsp/syslink/multicore_ipc/nameserver_remotenotify_ioctl.c | 2 | ||||
-rwxr-xr-x | drivers/dsp/syslink/multicore_ipc/sharedregion.c | 2 | ||||
-rwxr-xr-x | drivers/dsp/syslink/procmgr/proc4430/proc4430.c | 1 |
9 files changed, 174 insertions, 105 deletions
diff --git a/TI_OMAP4_Syslink_Release_Notes_L24.x.txt b/TI_OMAP4_Syslink_Release_Notes_L24.x.txt index dab88ace8d08..609ded631803 100644 --- a/TI_OMAP4_Syslink_Release_Notes_L24.x.txt +++ b/TI_OMAP4_Syslink_Release_Notes_L24.x.txt @@ -3,7 +3,7 @@ OMAP4 Syslink List Handoff ================================================================================ Author : Ramesh Gupta G / Suman Anna -Date : June 1 2009 +Date : June 30 2009 =========== Summary: @@ -60,7 +60,7 @@ contact TI counter part. ======= Setup: ======= -Virtio : VPOM4430_1.08a + patch1 +Virtio : VPOM4430_1.09a + patch3 CCS: Version 3.3 with VPOM simulator. For more information on CCS availability please contact TI. CCSv4 with VPOM simulator is also supported. @@ -106,7 +106,7 @@ From the Kernel sources run below commands. <M> Syslink Procmgr <M> Proc 4430 Device Drivers --><M> DSP Bridge driver--> - [*] DSP Bridge Debug Support + [M] DSP Bridge Debug Support Select DSP Bridge Debug Support option as above. 7. Save Configuration @@ -124,7 +124,10 @@ From the Kernel sources run below commands. 13. Run below command once the kernel is built. - 14. Make CROSS_COMPILE=arm-none-linux-gnueabi- modules + 14. Make CROSS_COMPILE=arm-none-linux-gnueabi- modules. This command + is applicable only if we select the required drivers as modules. + if all the drivers are selected as part of the kernel steps + from 14 to 23 can be ignored. 15. Bridgedriver module (bridgedriver.ko) is built under folder drivers/dsp/bridge/ dspbridge module(dspbridge.ko) is built @@ -226,12 +229,19 @@ Build the syslink samples by running below commands. Run make command as below. - 2. make PREFIX=<path to syslink folder> TGTROOT=<path to syslink folder> clean + 2. make PREFIX=<path to syslink folder> TGTROOT=<path to syslink folder> + KRNLSRC=<kernel sources > clean 3. make PREFIX=<path to syslink folder> TGTROOT=<path to syslink folder> + KRNLSRC=<kernel sources > 4. The sample .out files are build in the respective source directories underneath syslink/samples folder. + 5. The kernel sample procmgr_app.ko is built under + syslink/samples/proc_sample/krnl + 6. make sure to build the samples from the same session from which the + kernel is built or export ARCH and PATH variables as mentioned + in above in kernel building. ======================================== Building Tesla images and Ducati samples @@ -255,7 +265,10 @@ Running Tesla Samples 2. Once kernel is booted, cd into the folder where all the binaries are placed. - 3. install all the drivers in the sequence as below + 3. install all the drivers in the sequence as below, this step is + required only if the drivers are build as modules, + if all the drivers are build as part of the kernel one can + ignore steps 3 and 4 insmod omap_notify.ko @@ -339,7 +352,10 @@ Running Syslink Samples 2. Once kernel is booted, cd into the folder where all the binaries are placed. - 3. install all the drivers in the sequence as below + 3. install all the drivers in the sequence as below, this step is + required only if the drivers are build as modules, + if all the drivers are build as part of the kernel one can + ignore steps 3 and 4 insmod omap_notify.ko @@ -393,7 +409,7 @@ Remove the IVAHD-iCONT1, IVAHD-iCONT2, and Modena. The System Configuration must have only Tesla and Duati-ARM-M3-1, Ducati-ARM-M3-2 ------------------------------------------------------------------------------- -Two baseimages Bios6Boot.xm3 and Bios6Boot_Core1.xm3 can be used to validate +Two baseimages Bios6Boot.xem3 and Bios6Boot_Core1.xem3 can be used to validate the BIOS6 boot validation on each of the cores respectively. Please contact TI representative for these images. @@ -406,7 +422,10 @@ to boot the Core1 as well. 2. Break the platform by typing 'y' in the Virtio Console after the bash shell prompt appears. - 3. install below drivers in below sequence. + 3. install all the drivers in the sequence as below, this step is + required only if the drivers are build as modules, + if all the drivers are build as part of the kernel one can + ignore this step insmod omap_notify.ko @@ -418,7 +437,6 @@ to boot the Core1 as well. 4. The syslink_proc4430 driver programs MMU and updates page table entries. - 5. Break the Virtio by typing y in console. 6. Open CCS and select Ducati core. @@ -426,9 +444,10 @@ to boot the Core1 as well. 7. Load the base image into Ducati core0. 8. In Virtio design , browse to - VPOM4430->SDP->OMAP4430-> InitValue_DUCATI_SYS_1. Right click and open. - - Right click on Signal (InitValue) and select Send Signal To Platform. + VPOM4430->SDP->OMAP4430-> InitValue_DUCATI_SYS_1. + Right click and open. + Right click on Signal (InitValue) and select + Send Signal To Platform. Send 1 and press OK. This resets the core. 9. Press F11 once to have the Reset release become effective. @@ -440,7 +459,9 @@ Running Notify ping sample on Ducati: ------------------------------------- 1. Boot Vartio as usual. 2. Follow the same steps as above install required drivers (step 3 - above). + above), this step is required only if the drivers + are build as modules, if all the drivers are build + as part of the kernel one can ignore this step 3. create nodes for ipcnotify and notifyducatidrv accordinngly. e.g: mknod /dev/ipcnotify c 232 0 mknod /dev/notifyducatidrv c 234 0 @@ -453,7 +474,7 @@ Running Notify ping sample on Ducati: 7. Open CCS and select Ducati-ARM-M3-1 core. - 6. Load ducati image (notifyxfer_bios6.xm3) image. + 6. Load ducati image (notifyxfer_bios6.xem3) image. 7. Open source file notifyxfer_bios6.c file and add some breakpoints in the main function. @@ -468,6 +489,61 @@ Running Notify ping sample on Ducati: 10. The Notifyping sample running on the Chiron shows event messages and call back function messages. +Loading ducati images using the userspace loader: +------------------------------------------------ + 1. On successful ducati sample build user space binary loader + ducati_load.out is build underi folder + syslink/samples/samples/procmgr/ducati_load/ + 2. One can load the ducati image on to SYSM3 or APPM3 using the + userspace binary loader as below. + ./ducati_load.out <image_name> + 3. on successful load the loader displays the entry point for + the image at the end. + + ------snip---- + loaded_program: 0xea19 + Completed Loading Image ..... notifyxfer_bios6.xem3 + entry_point is 0xea19 + Hit any key to terminate cexec. + -------------- + 4. Due to Virtio issues we cannot start SYSM3/APPM3 from the + MPU side, one has to use CCS for SYSM3/APPM3 start by + following below step. + 5. Break Virtio and open CCS, Select the processor on which + image is loaded. + 6. Open the PC registers. + 7. Set the PC value to the entry point displayed from the loading + step. + 8. Run couple of times step run. + 9. Run the Processor. + +loading images on both SYSM3/APPM3 processors +--------------------------------------------- + +Follow below procedure to load images on both SYSM3/APPM3 using +user space loader + + 1. SYSM3 should be reached main() before loading the APPM3 image. + 2. SYSM3 should be in running state to load APPM3 from MPU using + user space loader. Otherwise MPU will not respond. + 3. Because of the above reasons, one need to introduce a continuos + while loop in both the SYSM3/APPM3 programs immediately in the main() + function at the first place. e.g: + + while(flag) + ; + 4. Load the SYSM3 image using the loader, set the PC using CCS and tun the + SYSM3 processor. Now SYSM3 executing the while(flag) loop. + 5. Load the APPM3 using the loader, set the PC using the CCS and run the + APPM3 processor, now the APPM3 is executing the while(flag) loop. + 6. Stop APPM3 processor. + 7. Stop SYSM3 processor. + 8. Bring SYSM3 out of while loop by changing the variable flag to 0 on the + fly. + 9. Bring APP3 out of while loop by changing the variable flag to 0 on the + fly. + 10. Run SYSM3 and Run APPM3. + ================================================================================ Highlights / Important Notes ================================================================================ @@ -477,7 +553,6 @@ Tesla Bridge ============== Features Introduced -------------------------- -- All modules now can be built alng with the Kernel. - Fixed checkpatch errors and warnings for all modules under syslink. - Dynamic Loading Support has been added. - Bridge Trace Support has been added. @@ -487,7 +562,12 @@ Features Introduced ============== Syslink ============== -- First version of Syslink IPC code. +- RCM server and client works on Chiron, Ducati SYSM3 and APPM3. +- Added load support by Proc manager. +- All modules can be built along with the Kernel. +- All modules are working as expected. +- Userspace binary image loader utility is implemented for loading images on + Ducati. Ducati Bridge ============== @@ -508,6 +588,8 @@ Important Notes set bootargs root=/dev/ram0 rw mem=54M console=ttyS0,115200n8 initrd=0x81600000,20M ramdisk_size=20480 + - One need to have CCS to start the Ducati processors as the Virtio doesn't have + the PRCM support to reset Ducati processors. - Code Composer Studio is required to write the Start DSP Address to the PC register * CCS_v3.3_SR9_79.exe or CCS_v3.3_SR10_80.exe or CCS_v3.3_SR11 @@ -526,9 +608,7 @@ Important Notes ================================== Issues Resolved ================================== - - Due to timing issues some of the static samples were not - working properly. This issue got fixed. Please refer - TI internal tracking id:OMAPS00198805 + - NONE ================================== Known Issues @@ -539,3 +619,8 @@ Known Issues is not backward compatible with Virtio versions < 1.06a. 3. Notipy ping sample some times not working because of timing issues. Need to have break points in Ducati side. + 4. CCS is required to start Ducati processors (SYSM3/APPM3), as the + current Virtio doesn't have the PRCM support to reset Ducati Processors. + 5. ping sample is not working in dynamic mode in Tesla due to dependant + library issue this is been tracked by internal tracking number id: + OMAPS00202802 diff --git a/drivers/dsp/syslink/multicore_ipc/gatepeterson.c b/drivers/dsp/syslink/multicore_ipc/gatepeterson.c index 74a21085bc1f..a8e3e8351a30 100755 --- a/drivers/dsp/syslink/multicore_ipc/gatepeterson.c +++ b/drivers/dsp/syslink/multicore_ipc/gatepeterson.c @@ -281,11 +281,6 @@ void *gatepeterson_create(const struct gatepeterson_params *params) goto exit; } - if (WARN_ON(params->name == NULL)) { - retval = -EINVAL; - goto exit; - } - handle = kmalloc(sizeof(struct gatepeterson_object), GFP_KERNEL); if (handle == NULL) { retval = -ENOMEM; diff --git a/drivers/dsp/syslink/multicore_ipc/heapbuf.c b/drivers/dsp/syslink/multicore_ipc/heapbuf.c index c12bd199848f..f88cf133185d 100644..100755 --- a/drivers/dsp/syslink/multicore_ipc/heapbuf.c +++ b/drivers/dsp/syslink/multicore_ipc/heapbuf.c @@ -183,29 +183,24 @@ int heapbuf_destroy(void) { s32 retval = 0; struct mutex *lock = NULL; - /*struct heapbuf_obj *obj = NULL;*/ + struct heapbuf_obj *obj = NULL; if (WARN_ON(heapbuf_state.nshandle == NULL)) { retval = -ENODEV; goto error; } -#if 0 - /* Check if any heapbuf instances have not been deleted so far. - * if not, delete them or close + /* Check if any heapbuf instances have not been deleted/closed so far. + * if there any, delete or close them */ list_for_each_entry(obj, &heapbuf_state.obj_list, list_elem) { if (obj->owner->proc_id == multiproc_get_id(NULL)) - heapbuf_delete(&obj->free_list); + heapbuf_delete(&obj->top); else - heapbuf_close(&obj->free_list); - } -#endif + heapbuf_close(obj->top); - /* If a heapbuf instance exist, do not proceed IS THIS OK */ - if (!list_empty(&heapbuf_state.obj_list)) { - retval = -EBUSY; - goto error; + if (list_empty(&heapbuf_state.obj_list)) + break; } retval = nameserver_delete(&heapbuf_state.nshandle); @@ -306,19 +301,19 @@ static void *_heapbuf_create(const struct heapbuf_params *params, listmp_sharedmemory_shared_memreq(&listmp_params); listmp_params.lock_handle = params->lock_handle; obj->lock_handle = params->lock_handle; - if (createflag == true) - obj->free_list = listmp_sharedmemory_create(&listmp_params); - else + /* Assign the memory with proper cache line padding */ + obj->attrs = (struct heapbuf_attrs *) params->shared_addr; + + if (createflag == false) listmp_sharedmemory_open(&obj->free_list, &listmp_params); + else { + obj->free_list = listmp_sharedmemory_create(&listmp_params); - if (obj->free_list == NULL) { - retval = -ENOMEM; - goto listmp_error; - } + if (obj->free_list == NULL) { + retval = -ENOMEM; + goto listmp_error; + } - /* Assign the memory with proper cache line padding */ - obj->attrs = (struct heapbuf_attrs *) params->shared_addr; - if (createflag == true) { obj->attrs->version = HEAPBUF_VERSION; obj->attrs->num_free_blocks = params->num_blocks; obj->attrs->min_free_blocks = params->num_blocks; @@ -333,7 +328,7 @@ static void *_heapbuf_create(const struct heapbuf_params *params, obj->attrs->buf = buf; /* * Split the buffer into blocks that are length - * block_size" and add into the free_list Queue + * block_size" and add into the free_list Queue */ for (i = 0; i < obj->attrs->num_blocks; i++) { listmp_put_tail((struct listmp_object *) @@ -345,18 +340,16 @@ static void *_heapbuf_create(const struct heapbuf_params *params, /* Populate the params member */ memcpy(&obj->params, params, sizeof(struct heapbuf_params)); - if (createflag == true) { - if (params->name != NULL) { - obj->params.name = kmalloc(strlen(params->name) + 1, + if (params->name != NULL) { + obj->params.name = kmalloc(strlen(params->name) + 1, GFP_KERNEL); - if (obj->params.name == NULL) { - retval = -ENOMEM; - goto name_alloc_error; - } - - strncpy(obj->params.name, params->name, - strlen(params->name) + 1); + if (obj->params.name == NULL) { + retval = -ENOMEM; + goto name_alloc_error; } + + strncpy(obj->params.name, params->name, + strlen(params->name) + 1); } /* Update processor information */ @@ -555,11 +548,8 @@ int heapbuf_open(void **hphandle, s32 retval = 0; u16 myproc_id; - gt_1trace(heap_debugmask, GT_ENTER, - "heapbuf_open:\n params: %x\n", params); BUG_ON(hphandle == NULL); BUG_ON(params == NULL); - if (WARN_ON(heapbuf_state.nshandle == NULL)) { retval = -ENODEV; goto error; @@ -618,7 +608,6 @@ int heapbuf_close(void *hphandle) { struct heap_object *handle = NULL; struct heapbuf_obj *obj = NULL; - struct heapbuf_params *params = NULL; s32 retval = 0; u16 myproc_id = 0; @@ -639,27 +628,27 @@ int heapbuf_close(void *hphandle) goto error; myproc_id = multiproc_get_id(NULL); - if ((obj->remote->proc_id == myproc_id) - && (obj->remote->open_count == 0)) { - list_del(&obj->list_elem); - params = (struct heapbuf_params *)&obj->params; - if (params->name != NULL) { - retval = nameserver_remove(heapbuf_state.nshandle, - params->name); - if (unlikely(retval != 0)) - goto error; - } + /* opening an instance created locally */ + if (obj->owner->proc_id == myproc_id) { + if (obj->owner->open_count > 1) + obj->owner->open_count--; - kfree(params->name); + goto owner_close_done; + } else + obj->remote->open_count--; + + if (obj->remote->open_count == 0) { + list_del(&obj->list_elem); + listmp_sharedmemory_close((listmp_sharedmemory_handle *) + obj->free_list); + kfree(obj->owner); + kfree(obj->remote); + kfree(obj); + kfree(handle); + handle = NULL; } - listmp_sharedmemory_close((listmp_sharedmemory_handle *) - obj->free_list); - kfree(obj->owner); - kfree(obj->remote); - kfree(obj); - kfree(handle); - handle = NULL; +owner_close_done: mutex_unlock(heapbuf_state.list_lock); return 0; @@ -869,7 +858,7 @@ int heapbuf_get_extended_stats(void *hphandle, mutex_unlock(heapbuf_state.list_lock); error: - printk(KERN_ERR "heapbuf_get_extended_stats failed status: %x\n", + printk(KERN_ERR "heapbuf_get_extended_stats status: %x\n", retval); return retval; } diff --git a/drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c b/drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c index 2dba28c71dbe..8df5b5f631ab 100755 --- a/drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c +++ b/drivers/dsp/syslink/multicore_ipc/ipc_ioctl.c @@ -41,7 +41,7 @@ int ipc_ioc_router(u32 cmd, ulong arg) s32 retval = 0; u32 ioc_nr = _IOC_NR(cmd); - printk(KERN_ERR "ipc_ioc_router \n" + gt_4trace(ipcdrv_trace, GT_ENTER, "ipc_ioc_router \n" "cmd: %x, ioc_nr: %x(%d), arg: %x\n", cmd, ioc_nr, ioc_nr, (unsigned int) arg); diff --git a/drivers/dsp/syslink/multicore_ipc/nameserver.c b/drivers/dsp/syslink/multicore_ipc/nameserver.c index c543fcba713d..2be633adab58 100644 --- a/drivers/dsp/syslink/multicore_ipc/nameserver.c +++ b/drivers/dsp/syslink/multicore_ipc/nameserver.c @@ -767,13 +767,16 @@ int nameserver_get_local(void *handle, const char *name, goto error; } - if (entry->len >= length) + if (entry->len >= length) { memcpy(buffer, entry->buf, length); - else + retval = length; + } else { memcpy(buffer, entry->buf, entry->len); + retval = entry->len; + } mutex_unlock(temp_obj->gate_handle); - return 0; + return retval; error: mutex_unlock(temp_obj->gate_handle); @@ -814,7 +817,7 @@ int nameserver_get(void *handle, const char *name, if (proc_id == NULL) { retval = nameserver_get_local(temp_obj, name, buffer, length); - if (retval == 0) /* Got the value */ + if (retval > 0) /* Got the value */ goto exit; for (i = 0; i < max_proc_id; i++) { @@ -838,7 +841,7 @@ int nameserver_get(void *handle, const char *name, if (i == local_proc_id) { retval = nameserver_get_local(temp_obj, name, buffer, length); - if (retval == 0) + if (retval > 0) break; } else { @@ -851,7 +854,7 @@ int nameserver_get(void *handle, const char *name, } exit: - printk(KERN_ERR "nameserver_get_local failed status:%x \n", retval); + printk(KERN_ERR "nameserver_get status:%x \n", retval); return retval; } EXPORT_SYMBOL(nameserver_get); diff --git a/drivers/dsp/syslink/multicore_ipc/nameserver_remotenotify.c b/drivers/dsp/syslink/multicore_ipc/nameserver_remotenotify.c index ffe690ce6610..eb9d479def13 100644..100755 --- a/drivers/dsp/syslink/multicore_ipc/nameserver_remotenotify.c +++ b/drivers/dsp/syslink/multicore_ipc/nameserver_remotenotify.c @@ -277,8 +277,7 @@ void nameserver_remotenotify_callback(u16 proc_id, u32 event_no, void *nshandle = NULL; u32 value; u32 key; - s32 retval; - void *entry = NULL; + s32 retval = 0; BUG_ON(arg == NULL); proc_count = multiproc_get_max_processors(); @@ -293,19 +292,20 @@ void nameserver_remotenotify_callback(u16 proc_id, u32 event_no, goto exit; /* This is a request */ - entry = nameserver_get_handle(handle->msg[1 - offset]->instance_name); - if (entry == NULL) - goto exit; - - /* Search for the NameServer entry */ - retval = nameserver_get_local(nshandle, handle->msg[1 - offset]->name, - &value, handle->msg[1 - offset]->value_len); - if (retval != 0) - goto exit; + nshandle = nameserver_get_handle( + handle->msg[1 - offset]->instance_name); + if (nshandle != NULL) + /* Search for the NameServer entry */ + retval = nameserver_get_local(nshandle, + handle->msg[1 - offset]->name, &value, + handle->msg[1 - offset]->value_len); key = gatepeterson_enter(handle->params.gate); - handle->msg[1 - offset]->request_status = true; - handle->msg[1 - offset]->value = value; + /* If retval != 0 then an entry was found */ + if (retval > 0) { + handle->msg[1 - offset]->request_status = true; + handle->msg[1 - offset]->value = value; + } /* Send a response back */ handle->msg[1 - offset]->response = true; handle->msg[1 - offset]->request = false; diff --git a/drivers/dsp/syslink/multicore_ipc/nameserver_remotenotify_ioctl.c b/drivers/dsp/syslink/multicore_ipc/nameserver_remotenotify_ioctl.c index 227e34991b13..45e6239b4d15 100755 --- a/drivers/dsp/syslink/multicore_ipc/nameserver_remotenotify_ioctl.c +++ b/drivers/dsp/syslink/multicore_ipc/nameserver_remotenotify_ioctl.c @@ -333,8 +333,6 @@ int nameserver_remotenotify_ioctl(struct inode *inode, struct file *filp, goto exit; } - printk(KERN_ERR "\n"); - exit: return status; } diff --git a/drivers/dsp/syslink/multicore_ipc/sharedregion.c b/drivers/dsp/syslink/multicore_ipc/sharedregion.c index f310017799ed..072fee2ddeb1 100755 --- a/drivers/dsp/syslink/multicore_ipc/sharedregion.c +++ b/drivers/dsp/syslink/multicore_ipc/sharedregion.c @@ -372,7 +372,7 @@ void *sharedregion_get_ptr(u32 *srptr) if (WARN_ON(sharedregion_state.table == NULL)) goto error; - if (WARN_ON(srptr == SHAREDREGION_INVALIDSRPTR)) + if (srptr == SHAREDREGION_INVALIDSRPTR) goto error; myproc_id = multiproc_get_id(NULL); diff --git a/drivers/dsp/syslink/procmgr/proc4430/proc4430.c b/drivers/dsp/syslink/procmgr/proc4430/proc4430.c index 6f3e9ac12d22..a67b7486607b 100755 --- a/drivers/dsp/syslink/procmgr/proc4430/proc4430.c +++ b/drivers/dsp/syslink/procmgr/proc4430/proc4430.c @@ -233,7 +233,6 @@ void *proc4430_create(u16 proc_id, const struct proc4430_params *params) if (proc4430_state.proc_handles[proc_id] != NULL) { printk(KERN_WARNING "Processor already exists for specified" "%d proc_id\n", proc_id); - WARN_ON(1); handle = proc4430_state.proc_handles[proc_id]; goto func_end; } else { |