diff options
Diffstat (limited to 'Acceleration/library/icp_telephony/tdm_infrastructure_downloader/source/IxPiuDlFwLoader.c')
-rw-r--r-- | Acceleration/library/icp_telephony/tdm_infrastructure_downloader/source/IxPiuDlFwLoader.c | 210 |
1 files changed, 210 insertions, 0 deletions
diff --git a/Acceleration/library/icp_telephony/tdm_infrastructure_downloader/source/IxPiuDlFwLoader.c b/Acceleration/library/icp_telephony/tdm_infrastructure_downloader/source/IxPiuDlFwLoader.c new file mode 100644 index 0000000..79ccf51 --- /dev/null +++ b/Acceleration/library/icp_telephony/tdm_infrastructure_downloader/source/IxPiuDlFwLoader.c @@ -0,0 +1,210 @@ +/** + * @file IxPiuDlFwLoader.c + * + * @author Intel Corporation + * @date 25 June 2007 + * + * @brief Contents are the implementation of a method for reading PIU firmware + * from file using the 'request_firmware' loading mechanism available in Linux + * kernel v2.6 + * + * + * @par + * This file is provided under a dual BSD/GPLv2 license. When using or + * redistributing this file, you may do so under either license. + * + * GPL LICENSE SUMMARY + * + * Copyright(c) 2007,2008,2009 Intel Corporation. All rights reserved. + * Copyright(c) 2010,2011,2012 Avencall + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of version 2 of the GNU General Public License as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St - Fifth Floor, Boston, MA 02110-1301 USA. + * The full GNU General Public License is included in this distribution + * in the file called LICENSE.GPL. + * + * BSD LICENSE + * + * Copyright(c) 2007,2008,2009 Intel Corporation. All rights reserved. + * All rights reserved. + * Copyright(c) 2010,2011,2012 Avencall + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * * Neither the name of Intel Corporation nor the names of its + * contributors may be used to endorse or promote products derived + * from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * + * + */ + +/* + * Put the system defined include files required + */ + +#include "linux/device.h" +#include "linux/firmware.h" + +/* + * Put the user defined include files required + */ +#include "IxPiuDlFwLoader_p.h" +#include "IxPiuDlMacros_p.h" + +/* + * Variable declarations global to this file only. Externs are followed + * by static variables. + */ + +/* + * release function for piu firmware temporary device below + */ +static void piuDeviceRelease(struct device *dev) +{ + printk("piuDevice released after loading firmware\n"); +} + +/* + * The following is a temporary device which is used for loading the firmware + * image - the 'request_firmware()' function needs a device to be passed to it - + * it doesn't matter what the device is - once the device is within the system, + * the udev looks for the requested file from the /lib/firmware location - the + * approach here is to create a temporary device so as not to have any + * dependencies on any particular devices + */ + +static struct device piuFirmwareDevice = { +#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,30) + .init_name = "piuDevice", +#else + .bus_id = "piuDevice", +#endif + .release = piuDeviceRelease +}; + +/* + * the following is used to record when firmware has been loaded such that + * loading a new image without freeing a previous one and freeing an image + * before loading can be prevented + */ +static BOOL piuFwLoaded = FALSE; + +/* + * the following is used to store the firmware (populated by the + * request_firmware function) + */ +const struct firmware *piuFwEntry; + +/* + * the name of the file to load + */ +#define PIU_FIRMWARE_FILENAME "IxPiuMicrocode.dat" + +/* + * Function definition: ixPiuDlFwLoaderGetFw + */ +ix_error +ixPiuDlFwLoaderGetFw(ix_uint32** firmwareArray) +{ + int r; + + IX_PIUDL_TRACE0 (IX_PIUDL_FN_ENTRY_EXIT, + "Entering ixPiuDlFwLoaderGetFw\n"); + + /* + * first check if the fw is already loaded - if it is then release the + * piuFwEntry structure + */ + if (piuFwLoaded) + { + release_firmware(piuFwEntry); + piuFwLoaded = FALSE; + } + + /* register the temporary device used for requesting firmware */ + if (device_register(&piuFirmwareDevice) != 0) + { + /* BUGBUG? should we also put_device? */ + IX_PIUDL_ERROR_REPORT ("ixPiuDlFwLoaderGetFw: could not register device\n"); + return IX_FAIL; + } + + /* load the firmware */ + if ((r = request_firmware(&piuFwEntry, PIU_FIRMWARE_FILENAME, + &piuFirmwareDevice)) != 0) + { + ixOsalLog(IX_OSAL_LOG_LVL_ERROR, IX_OSAL_LOG_DEV_STDOUT, + "Error loading " PIU_FIRMWARE_FILENAME " from file: %d\n", + r, 0, 0, 0, 0, 0); + + /* unregister the temporary device from the system */ + device_unregister(&piuFirmwareDevice); + + return IX_FAIL; + } + + /* record successful load */ + piuFwLoaded = TRUE; + + /* cast the firmware pointer to the required type */ + *firmwareArray = (ix_uint32*) piuFwEntry->data; + + /* unregister the temporary device from the system */ + device_unregister(&piuFirmwareDevice); + + IX_PIUDL_TRACE0 (IX_PIUDL_FN_ENTRY_EXIT, + "Exiting ixPiuDlFwLoaderGetFw\n"); + + return IX_SUCCESS; +} + +/* + * Function definition: ixPiuDlFwLoaderCleanup + */ +void +ixPiuDlFwLoaderCleanup(void) +{ + IX_PIUDL_TRACE0 (IX_PIUDL_FN_ENTRY_EXIT, + "Entering ixPiuDlFwLoaderCleanup\n"); + + if (piuFwLoaded) + { + /* release the structure used to hold the firmware */ + release_firmware(piuFwEntry); + piuFwLoaded = FALSE; + } + + IX_PIUDL_TRACE0 (IX_PIUDL_FN_ENTRY_EXIT, + "Exiting ixPiuDlFwLoaderCleanup\n"); +} |