Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3) * smapi.c -- SMAPI interface routines
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6) * Written By: Mike Sullivan IBM Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) * Copyright (C) 1999 IBM Corporation
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10) * This program is free software; you can redistribute it and/or modify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) * it under the terms of the GNU General Public License as published by
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) * the Free Software Foundation; either version 2 of the License, or
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) * (at your option) any later version.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) * This program is distributed in the hope that it will be useful,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) * but WITHOUT ANY WARRANTY; without even the implied warranty of
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) * GNU General Public License for more details.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) * NO WARRANTY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) * THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) * CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) * LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) * solely responsible for determining the appropriateness of using and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) * distributing the Program and assumes all risks associated with its
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27) * exercise of rights under this Agreement, including but not limited to
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) * the risks and costs of program errors, damage to or loss of data,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29) * programs or equipment, and unavailability or interruption of operations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31) * DISCLAIMER OF LIABILITY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) * NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) * DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) * USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) * HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) * You should have received a copy of the GNU General Public License
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) * along with this program; if not, write to the Free Software
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42) * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) * 10/23/2000 - Alpha Release
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) *	First release to the public
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) #include <linux/mc146818rtc.h>	/* CMOS defines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) #include "smapi.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) #include "mwavedd.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) static unsigned short g_usSmapiPort = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) static int smapi_request(unsigned short inBX, unsigned short inCX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 			 unsigned short inDI, unsigned short inSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 			 unsigned short *outAX, unsigned short *outBX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 			 unsigned short *outCX, unsigned short *outDX,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 			 unsigned short *outDI, unsigned short *outSI)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 	unsigned short myoutAX = 2, *pmyoutAX = &myoutAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 	unsigned short myoutBX = 3, *pmyoutBX = &myoutBX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) 	unsigned short myoutCX = 4, *pmyoutCX = &myoutCX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 	unsigned short myoutDX = 5, *pmyoutDX = &myoutDX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 	unsigned short myoutDI = 6, *pmyoutDI = &myoutDI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	unsigned short myoutSI = 7, *pmyoutSI = &myoutSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69) 	unsigned short usSmapiOK = -EIO, *pusSmapiOK = &usSmapiOK;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) 	unsigned int inBXCX = (inBX << 16) | inCX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) 	unsigned int inDISI = (inDI << 16) | inSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 	int retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) 	PRINTK_5(TRACE_SMAPI, "inBX %x inCX %x inDI %x inSI %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 		inBX, inCX, inDI, inSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	__asm__ __volatile__("movw  $0x5380,%%ax\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 			    "movl  %7,%%ebx\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 			    "shrl  $16, %%ebx\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 			    "movw  %7,%%cx\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 			    "movl  %8,%%edi\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 			    "shrl  $16,%%edi\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 			    "movw  %8,%%si\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 			    "movw  %9,%%dx\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 			    "out   %%al,%%dx\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 			    "out   %%al,$0x4F\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 			    "cmpb  $0x53,%%ah\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 			    "je    2f\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 			    "1:\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 			    "orb   %%ah,%%ah\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 			    "jnz   2f\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 			    "movw  %%ax,%0\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 			    "movw  %%bx,%1\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 			    "movw  %%cx,%2\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 			    "movw  %%dx,%3\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 			    "movw  %%di,%4\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 			    "movw  %%si,%5\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 			    "movw  $1,%6\n\t"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 			    "2:\n\t":"=m"(*(unsigned short *) pmyoutAX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 			    "=m"(*(unsigned short *) pmyoutBX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 			    "=m"(*(unsigned short *) pmyoutCX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 			    "=m"(*(unsigned short *) pmyoutDX),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 			    "=m"(*(unsigned short *) pmyoutDI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 			    "=m"(*(unsigned short *) pmyoutSI),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 			    "=m"(*(unsigned short *) pusSmapiOK)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 			    :"m"(inBXCX), "m"(inDISI), "m"(g_usSmapiPort)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 			    :"%eax", "%ebx", "%ecx", "%edx", "%edi",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 			    "%esi");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 	PRINTK_8(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 		"myoutAX %x myoutBX %x myoutCX %x myoutDX %x myoutDI %x myoutSI %x usSmapiOK %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 		myoutAX, myoutBX, myoutCX, myoutDX, myoutDI, myoutSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 		usSmapiOK);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 	*outAX = myoutAX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 	*outBX = myoutBX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 	*outCX = myoutCX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 	*outDX = myoutDX;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 	*outDI = myoutDI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 	*outSI = myoutSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 	retval = (usSmapiOK == 1) ? 0 : -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 	PRINTK_2(TRACE_SMAPI, "smapi::smapi_request exit retval %x\n", retval);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) int smapi_query_DSP_cfg(SMAPI_DSP_SETTINGS * pSettings)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	int bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	unsigned short usAX, usBX, usCX, usDX, usDI, usSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 	static const unsigned short ausDspBases[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 		0x0030, 0x4E30, 0x8E30, 0xCE30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 		0x0130, 0x0350, 0x0070, 0x0DB0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	static const unsigned short ausUartBases[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) 		0x03F8, 0x02F8, 0x03E8, 0x02E8 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) 	PRINTK_1(TRACE_SMAPI, "smapi::smapi_query_DSP_cfg entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) 	bRC = smapi_request(0x1802, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) 		&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 	if (bRC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) 		PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_query_DSP_cfg: Error: Could not get DSP Settings. Aborting.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 		return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 	PRINTK_1(TRACE_SMAPI, "smapi::smapi_query_DSP_cfg, smapi_request OK\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	pSettings->bDSPPresent = ((usBX & 0x0100) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	pSettings->bDSPEnabled = ((usCX & 0x0001) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	pSettings->usDspIRQ = usSI & 0x00FF;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 	pSettings->usDspDMA = (usSI & 0xFF00) >> 8;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	if ((usDI & 0x00FF) < ARRAY_SIZE(ausDspBases)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 		pSettings->usDspBaseIO = ausDspBases[usDI & 0x00FF];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 		pSettings->usDspBaseIO = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	PRINTK_6(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 		"smapi::smapi_query_DSP_cfg get DSP Settings bDSPPresent %x bDSPEnabled %x usDspIRQ %x usDspDMA %x usDspBaseIO %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		pSettings->bDSPPresent, pSettings->bDSPEnabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		pSettings->usDspIRQ, pSettings->usDspDMA,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 		pSettings->usDspBaseIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) 	/* check for illegal values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 	if ( pSettings->usDspBaseIO == 0 ) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 		PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_query_DSP_cfg: Worry: DSP base I/O address is 0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) 	if ( pSettings->usDspIRQ == 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 		PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_query_DSP_cfg: Worry: DSP IRQ line is 0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 	bRC = smapi_request(0x1804, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	   	&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) 	if (bRC) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) 		PRINTK_ERROR("smapi::smapi_query_DSP_cfg: Error: Could not get DSP modem settings. Aborting.\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 		return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) 	} 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 	PRINTK_1(TRACE_SMAPI, "smapi::smapi_query_DSP_cfg, smapi_request OK\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 	pSettings->bModemEnabled = ((usCX & 0x0001) != 0);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 	pSettings->usUartIRQ = usSI & 0x000F;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	if (((usSI & 0xFF00) >> 8) < ARRAY_SIZE(ausUartBases)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 		pSettings->usUartBaseIO = ausUartBases[(usSI & 0xFF00) >> 8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 		pSettings->usUartBaseIO = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 	PRINTK_4(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		"smapi::smapi_query_DSP_cfg get DSP modem settings bModemEnabled %x usUartIRQ %x usUartBaseIO %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		pSettings->bModemEnabled,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 		pSettings->usUartIRQ,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 		pSettings->usUartBaseIO);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 	/* check for illegal values */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 	if ( pSettings->usUartBaseIO == 0 ) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 		PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_query_DSP_cfg: Worry: UART base I/O address is 0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) 	if ( pSettings->usUartIRQ == 0 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) 		PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_query_DSP_cfg: Worry: UART IRQ line is 0\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) 	PRINTK_2(TRACE_SMAPI, "smapi::smapi_query_DSP_cfg exit bRC %x\n", bRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 	return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) int smapi_set_DSP_cfg(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) 	int bRC = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) 	int i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) 	unsigned short usAX, usBX, usCX, usDX, usDI, usSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	static const unsigned short ausDspBases[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 		0x0030, 0x4E30, 0x8E30, 0xCE30,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 		0x0130, 0x0350, 0x0070, 0x0DB0 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 	static const unsigned short ausUartBases[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 		0x03F8, 0x02F8, 0x03E8, 0x02E8 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	static const unsigned short ausDspIrqs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 		5, 7, 10, 11, 15 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 	static const unsigned short ausUartIrqs[] = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) 		3, 4 };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 	unsigned short dspio_index = 0, uartio_index = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 	PRINTK_5(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 		"smapi::smapi_set_DSP_cfg entry mwave_3780i_irq %x mwave_3780i_io %x mwave_uart_irq %x mwave_uart_io %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 		mwave_3780i_irq, mwave_3780i_io, mwave_uart_irq, mwave_uart_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 	if (mwave_3780i_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) 		for (i = 0; i < ARRAY_SIZE(ausDspBases); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) 			if (mwave_3780i_io == ausDspBases[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 		if (i == ARRAY_SIZE(ausDspBases)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 			PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_set_DSP_cfg: Error: Invalid mwave_3780i_io address %x. Aborting.\n", mwave_3780i_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) 			return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 		dspio_index = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 	if (mwave_3780i_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) 		for (i = 0; i < ARRAY_SIZE(ausDspIrqs); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) 			if (mwave_3780i_irq == ausDspIrqs[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 		if (i == ARRAY_SIZE(ausDspIrqs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 			PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_set_DSP_cfg: Error: Invalid mwave_3780i_irq %x. Aborting.\n", mwave_3780i_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) 			return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 	if (mwave_uart_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 		for (i = 0; i < ARRAY_SIZE(ausUartBases); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 			if (mwave_uart_io == ausUartBases[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 		if (i == ARRAY_SIZE(ausUartBases)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 			PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_set_DSP_cfg: Error: Invalid mwave_uart_io address %x. Aborting.\n", mwave_uart_io);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 			return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 		uartio_index = i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	if (mwave_uart_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 		for (i = 0; i < ARRAY_SIZE(ausUartIrqs); i++) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 			if (mwave_uart_irq == ausUartIrqs[i])
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 				break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 		if (i == ARRAY_SIZE(ausUartIrqs)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 			PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_set_DSP_cfg: Error: Invalid mwave_uart_irq %x. Aborting.\n", mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 			return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 	if (mwave_uart_irq || mwave_uart_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 		/* Check serial port A */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 		bRC = smapi_request(0x1402, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 			&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 		if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 		/* bRC == 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 		if (usBX & 0x0100) {	/* serial port A is present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 			if (usCX & 1) {	/* serial port is enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 				if ((usSI & 0xFF) == mwave_uart_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 					PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 						"smapi::smapi_set_DSP_cfg: Serial port A irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 					PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 						"smapi::smapi_set_DSP_cfg: Serial port A irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 					PRINTK_1(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 						"smapi::smapi_set_DSP_cfg Disabling conflicting serial port\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 					bRC = smapi_request(0x1403, 0x0100, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 						&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 					if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 					bRC = smapi_request(0x1402, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 						&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 					if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 					goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 				} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 					if ((usSI >> 8) == uartio_index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 						PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 							"smapi::smapi_set_DSP_cfg: Serial port A base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) 						PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) 							"smapi::smapi_set_DSP_cfg: Serial port A base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 						PRINTK_1(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 							"smapi::smapi_set_DSP_cfg Disabling conflicting serial port A\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) 						bRC = smapi_request (0x1403, 0x0100, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) 							&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) 						if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) 						bRC = smapi_request (0x1402, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) 							&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 						if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) 						goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) 		/* Check serial port B */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) 		bRC = smapi_request(0x1404, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 			&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 		if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 		/* bRC == 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) 		if (usBX & 0x0100) {	/* serial port B is present */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 			if (usCX & 1) {	/* serial port is enabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 				if ((usSI & 0xFF) == mwave_uart_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 					PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) 						"smapi::smapi_set_DSP_cfg: Serial port B irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 					PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 						"smapi::smapi_set_DSP_cfg: Serial port B irq %x conflicts with mwave_uart_irq %x\n", usSI & 0xFF, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 					PRINTK_1(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 						"smapi::smapi_set_DSP_cfg Disabling conflicting serial port B\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 					bRC = smapi_request(0x1405, 0x0100, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 						&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) 					if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 					bRC = smapi_request(0x1404, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 						&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 					if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 					goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 				} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 					if ((usSI >> 8) == uartio_index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) 						PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 							"smapi::smapi_set_DSP_cfg: Serial port B base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 						PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 							"smapi::smapi_set_DSP_cfg: Serial port B base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI >> 8], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 						PRINTK_1 (TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) 						    "smapi::smapi_set_DSP_cfg Disabling conflicting serial port B\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 						bRC = smapi_request (0x1405, 0x0100, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) 							&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 						if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) 						bRC = smapi_request (0x1404, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) 							&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) 						if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) 						goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 					}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 		/* Check IR port */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 		bRC = smapi_request(0x1700, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 			&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 		if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 		bRC = smapi_request(0x1704, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 			&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 		if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 		/* bRC == 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 		if ((usCX & 0xff) != 0xff) { /* IR port not disabled */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 			if ((usCX & 0xff) == mwave_uart_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 				PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 					"smapi::smapi_set_DSP_cfg: IR port irq %x conflicts with mwave_uart_irq %x\n", usCX & 0xff, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) 				PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 					"smapi::smapi_set_DSP_cfg: IR port irq %x conflicts with mwave_uart_irq %x\n", usCX & 0xff, mwave_uart_irq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) 				PRINTK_1(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 					"smapi::smapi_set_DSP_cfg Disabling conflicting IR port\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 				bRC = smapi_request(0x1701, 0x0100, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 					&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 				if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) 				bRC = smapi_request(0x1700, 0, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) 					&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 				if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) 				bRC = smapi_request(0x1705, 0x01ff, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 					&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 				if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 				bRC = smapi_request(0x1704, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 					&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 				if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 				goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 			} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 				if ((usSI & 0xff) == uartio_index) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) #ifndef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 					PRINTK_ERROR(KERN_ERR_MWAVE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 						"smapi::smapi_set_DSP_cfg: IR port base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI & 0xff], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 					PRINTK_3(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 						"smapi::smapi_set_DSP_cfg: IR port base I/O address %x conflicts with mwave uart I/O %x\n", ausUartBases[usSI & 0xff], ausUartBases[uartio_index]);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) #ifdef MWAVE_FUTZ_WITH_OTHER_DEVICES
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 					PRINTK_1(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 						"smapi::smapi_set_DSP_cfg Disabling conflicting IR port\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 					bRC = smapi_request(0x1701, 0x0100, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 						&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 					if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 					bRC = smapi_request(0x1700, 0, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 						&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 					if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 					bRC = smapi_request(0x1705, 0x01ff, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 						&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 					if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 					bRC = smapi_request(0x1704, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 						&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 					if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 					goto exit_conflict;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 				}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 	bRC = smapi_request(0x1802, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 		&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 	if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	if (mwave_3780i_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 		usDI = dspio_index;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 	if (mwave_3780i_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 		usSI = (usSI & 0xff00) | mwave_3780i_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	bRC = smapi_request(0x1803, 0x0101, usDI, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 		&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 	bRC = smapi_request(0x1804, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 		&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) 	if (mwave_uart_io) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 		usSI = (usSI & 0x00ff) | (uartio_index << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 	if (mwave_uart_irq) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) 		usSI = (usSI & 0xff00) | mwave_uart_irq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) 	bRC = smapi_request(0x1805, 0x0101, 0, usSI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) 		&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 	if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) 	bRC = smapi_request(0x1802, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 		&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 	if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) 	bRC = smapi_request(0x1804, 0x0000, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 		&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 	if (bRC) goto exit_smapi_request_error;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) /* normal exit: */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) 	PRINTK_1(TRACE_SMAPI, "smapi::smapi_set_DSP_cfg exit\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) exit_conflict:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) 	/* Message has already been printed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) 	return -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) exit_smapi_request_error:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) 	PRINTK_ERROR(KERN_ERR_MWAVE "smapi::smapi_set_DSP_cfg exit on smapi_request error bRC %x\n", bRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) 	return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) int smapi_set_DSP_power_state(bool bOn)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) 	int bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) 	unsigned short usAX, usBX, usCX, usDX, usDI, usSI;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) 	unsigned short usPowerFunction;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) 	PRINTK_2(TRACE_SMAPI, "smapi::smapi_set_DSP_power_state entry bOn %x\n", bOn);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) 	usPowerFunction = (bOn) ? 1 : 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) 	bRC = smapi_request(0x4901, 0x0000, 0, usPowerFunction,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) 		&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) 	PRINTK_2(TRACE_SMAPI, "smapi::smapi_set_DSP_power_state exit bRC %x\n", bRC);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) 	return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) static int SmapiQuerySystemID(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) 	int bRC = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) 	unsigned short usAX = 0xffff, usBX = 0xffff, usCX = 0xffff,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) 		usDX = 0xffff, usDI = 0xffff, usSI = 0xffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) 	printk("smapi::SmapiQUerySystemID entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) 	bRC = smapi_request(0x0000, 0, 0, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525) 		&usAX, &usBX, &usCX, &usDX, &usDI, &usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) 	if (bRC == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) 		printk("AX=%x, BX=%x, CX=%x, DX=%x, DI=%x, SI=%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529) 			usAX, usBX, usCX, usDX, usDI, usSI);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) 		printk("smapi::SmapiQuerySystemID smapi_request error\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) 	return bRC;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) #endif  /*  0  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538) int smapi_init(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) 	int retval = -EIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) 	unsigned short usSmapiID = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) 	unsigned long flags;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544) 	PRINTK_1(TRACE_SMAPI, "smapi::smapi_init entry\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) 	spin_lock_irqsave(&rtc_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) 	usSmapiID = CMOS_READ(0x7C);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) 	usSmapiID |= (CMOS_READ(0x7D) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) 	spin_unlock_irqrestore(&rtc_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) 	PRINTK_2(TRACE_SMAPI, "smapi::smapi_init usSmapiID %x\n", usSmapiID);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) 	if (usSmapiID == 0x5349) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) 		spin_lock_irqsave(&rtc_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) 		g_usSmapiPort = CMOS_READ(0x7E);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555) 		g_usSmapiPort |= (CMOS_READ(0x7F) << 8);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) 		spin_unlock_irqrestore(&rtc_lock, flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557) 		if (g_usSmapiPort == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) 			PRINTK_ERROR("smapi::smapi_init, ERROR unable to read from SMAPI port\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) 		} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) 			PRINTK_2(TRACE_SMAPI,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) 				"smapi::smapi_init, exit true g_usSmapiPort %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) 				g_usSmapiPort);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) 			retval = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) 			//SmapiQuerySystemID();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) 	} else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) 		PRINTK_ERROR("smapi::smapi_init, ERROR invalid usSmapiID\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) 		retval = -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) 	return retval;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) }