SOLConfig.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619
  1. /*****************************************************************
  2. *****************************************************************
  3. *** **
  4. *** (C)Copyright 2005-2006, American Megatrends Inc. **
  5. *** **
  6. *** All Rights Reserved. **
  7. *** **
  8. *** 6145-F, Northbelt Parkway, Norcross, **
  9. *** **
  10. *** Georgia - 30071, USA. Phone-(770)-246-8600. **
  11. *** **
  12. *****************************************************************
  13. ****************************************************************
  14. *
  15. * SOLConfig.c
  16. * SOL configuration
  17. *
  18. * Author: Govind kothandapani <govindk@ami.com>
  19. ****************************************************************/
  20. #define ENABLE_DEBUG_MACROS 0
  21. #include "Types.h"
  22. #include "Debug.h"
  23. #include "MsgHndlr.h"
  24. #include "Support.h"
  25. #include "IPMIDefs.h"
  26. #include "SharedMem.h"
  27. #include "PMConfig.h"
  28. #include "IPMI_SOLConfig.h"
  29. #include "NVRAccess.h"
  30. #include "PDKDefs.h"
  31. #include "PDKAccess.h"
  32. #include"Ethaddr.h"
  33. #include "IPMIConf.h"
  34. /*** Local Definitions ***/
  35. #define SOL_SET_IN_PROGRESS 0
  36. #define SOL_ENABLE_PARAM 1
  37. #define SOL_AUTHENTICATION_PARAM 2
  38. #define SOL_ACCUM_THRESHOLD_PARAM 3
  39. #define SOL_RETRY_PARAM 4
  40. #define SOL_NVOL_BIT_RATE_PARAM 5
  41. #define SOL_VOL_BIT_RATE_PARAM 6
  42. #define SOL_PAYLD_CHANNEL_PARAM 7
  43. #define SOL_PAYLD_PORT_NUM_PARAM 8
  44. #define SET_IN_PROGRESS 0x01
  45. #define SET_COMPLETE 0x00
  46. #define PARAM_REVISION 0x11
  47. #define GET_PARAM_REV_ONLY_MASK 0x80
  48. #define BAUD_RATE_9600 6
  49. #define BAUD_RATE_19200 7
  50. #define BAUD_RATE_38400 8
  51. #define BAUD_RATE_57600 9
  52. #define BAUD_RATE_115200 10
  53. /* Reserved Bits table */
  54. #define MAX_SOL_PARAMS_DATA 9
  55. #define RESERVED_VALUE_70 0x70
  56. #define RESERVED_VALUE_F0 0xF0
  57. typedef struct
  58. {
  59. INT8U Params;
  60. INT8U ReservedBits [MAX_SOL_PARAMS_DATA];
  61. INT8U DataLen;
  62. } SOLCfgRsvdBits_T;
  63. static SOLCfgRsvdBits_T m_RsvdBitsCheck [] = {
  64. /* Param Reserved Bits Data Size */
  65. { 0, { 0xFC }, 0x1 },
  66. { 1, { 0xFE }, 0x1 },
  67. { 2, { 0x30 }, 0x1 },
  68. { 4, { 0xF8 }, 0x1 },
  69. { 5, { 0xF0 }, 0x1 }
  70. };
  71. /*** Module Variables ***/
  72. /**
  73. * @brief SOL Configuration Parameter Lengths
  74. **/
  75. static const INT8U SOLConfigParamLengths [] = { 1,1,1,2,2,1,1,1,2 };
  76. /**
  77. * IsBaudRateValid
  78. **/
  79. static int IsBaudRateValid (INT8U BaudRate);
  80. // Function to check if valid privileges
  81. static int IsValidPrivilege(INT8U authtype);
  82. #if SOL_ACTIVATING_COMMAND != UNIMPLEMENTED
  83. /*---------------------------------------
  84. * SOLActivating
  85. *---------------------------------------*/
  86. int
  87. SOLActivating (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  88. {
  89. /**
  90. * Send SOL activating Message to Remote Application connected to
  91. * Connected to Serial port
  92. **/
  93. *pRes = CC_NORMAL;
  94. return sizeof (*pRes);
  95. }
  96. #endif /* SOL_ACTIVATING_COMMAND */
  97. #if GET_SOL_CONFIGURATION != UNIMPLEMENTED
  98. /*---------------------------------------
  99. * GetSOLConfig
  100. *---------------------------------------*/
  101. int
  102. GetSOLConfig (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  103. {
  104. _NEAR_ GetSOLConfigReq_T* GetReq = (_NEAR_ GetSOLConfigReq_T*) pReq;
  105. _NEAR_ GetSOLConfigRes_T* GetRes = (_NEAR_ GetSOLConfigRes_T*) pRes;
  106. _NEAR_ GetSOLConfigOEMRes_T* GetOEMRes = (_NEAR_ GetSOLConfigOEMRes_T*) pRes;
  107. _FAR_ BMCSharedMem_T* pSharedMem = BMC_GET_SHARED_MEM (BMCInst);
  108. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  109. INT8U Size,*curchannel;
  110. INT8U ChannelNum, EthIndex;
  111. INT8U oem_len;
  112. unsigned long oem_addr;
  113. ChannelNum = GetReq->ChannelNum & 0x0F;
  114. if(GetReq->ChannelNum & RESERVED_VALUE_70)
  115. {
  116. /* Alarm !!! Somebody is trying to set Reseved Bits */
  117. *pRes = CC_INV_DATA_FIELD;
  118. return sizeof (*pRes);
  119. }
  120. if (ChannelNum > 0x0F)
  121. {
  122. *pRes =CC_INV_DATA_FIELD;
  123. return sizeof(*pRes);
  124. }
  125. if (0x0E == ChannelNum)
  126. {
  127. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  128. EthIndex = GetEthIndex (*curchannel & 0xF, BMCInst);
  129. }
  130. else
  131. {
  132. EthIndex = GetEthIndex (ChannelNum, BMCInst);
  133. }
  134. if (0xFF == EthIndex)
  135. {
  136. *pRes = CC_INV_DATA_FIELD;
  137. return sizeof (*pRes);
  138. }
  139. if((GetReq->SetSel != 0x00) ||(GetReq->BlkSEl != 0x00))
  140. {
  141. *pRes =CC_INV_DATA_FIELD;
  142. return sizeof(*pRes);
  143. }
  144. GetRes->CompletionCode = CC_NORMAL;
  145. GetRes->ParamRev = PARAM_REVISION;
  146. /* Check if only parameter revision is required */
  147. if (0 != (GetReq->ChannelNum & GET_PARAM_REV_ONLY_MASK))
  148. {
  149. if((MAX_SOL_CONF_PARAM >= GetReq->ParamSel))
  150. {
  151. return sizeof(GetSOLConfigRes_T);
  152. }
  153. else if(( NULL != g_PDKHandle[PDK_GETSOLOEMPARAM]) &&
  154. ((MIN_SOL_OEM_CONF_PARAM <= GetReq->ParamSel) && (MAX_SOL_OEM_CONF_PARAM >= GetReq->ParamSel)))
  155. {
  156. oem_len = ((int(*)(INT8U, unsigned long*,int))(g_PDKHandle[PDK_GETSOLOEMPARAM]))(GetReq->ParamSel, &oem_addr ,BMCInst);
  157. if( oem_len == 0)
  158. {
  159. GetRes->CompletionCode = CC_PARAM_NOT_SUPPORTED;
  160. return sizeof(INT8U);
  161. }
  162. else
  163. return sizeof(GetSOLConfigRes_T);
  164. }
  165. else
  166. {
  167. *pRes = CC_PARAM_NOT_SUPPORTED;
  168. return sizeof (*pRes);
  169. }
  170. }
  171. Size = sizeof (GetSOLConfigRes_T);
  172. /* Load individual configurations */
  173. switch (GetReq->ParamSel)
  174. {
  175. case SOL_SET_IN_PROGRESS:
  176. LOCK_BMC_SHARED_MEM(BMCInst);
  177. (*(_NEAR_ INT8U*)(GetRes + 1)) = BMC_GET_SHARED_MEM(BMCInst)->m_SOL_SetInProgress;
  178. UNLOCK_BMC_SHARED_MEM(BMCInst);
  179. Size = Size + sizeof (INT8U);
  180. break;
  181. case SOL_ENABLE_PARAM:
  182. (*(_NEAR_ INT8U*)(GetRes + 1)) = pBMCInfo->SOLCfg[EthIndex].SOLEnable;
  183. Size = Size + sizeof (INT8U);
  184. break;
  185. case SOL_AUTHENTICATION_PARAM:
  186. (*(_NEAR_ INT8U*)(GetRes + 1)) = pBMCInfo->SOLCfg[EthIndex].SOLAuth;
  187. Size = Size + sizeof (INT8U);
  188. break;
  189. case SOL_ACCUM_THRESHOLD_PARAM:
  190. _fmemcpy((INT8U *)(GetRes+1),(INT8U *)&pBMCInfo->SOLCfg[EthIndex].CharAccThresh,sizeof(INT16U));
  191. Size = Size + sizeof (INT16U);
  192. break;
  193. case SOL_RETRY_PARAM:
  194. (*((_NEAR_ INT8U*)(GetRes + 1))) = pBMCInfo->SOLCfg[EthIndex].SOLRetryCount;
  195. (*((_NEAR_ INT8U*)(GetRes + 1) + 1)) = pBMCInfo->SOLCfg[EthIndex].SOLRetryInterval;
  196. Size = Size + sizeof (INT16U);
  197. break;
  198. case SOL_NVOL_BIT_RATE_PARAM:
  199. (*(_NEAR_ INT8U*)(GetRes + 1)) = pBMCInfo->SOLCfg[EthIndex].NVBitRate;
  200. Size = Size + sizeof (INT8U);
  201. break;
  202. case SOL_VOL_BIT_RATE_PARAM:
  203. (*(_NEAR_ INT8U*)(GetRes + 1)) = pSharedMem->SOLBitRate[EthIndex];
  204. Size = Size + sizeof (INT8U);
  205. break;
  206. case SOL_PAYLD_CHANNEL_PARAM:
  207. (*(_NEAR_ INT8U*)(GetRes + 1)) = pBMCInfo->SOLCfg[EthIndex].PayldChannel;
  208. Size = Size + sizeof (INT8U);
  209. break;
  210. case SOL_PAYLD_PORT_NUM_PARAM:
  211. _fmemcpy((INT8U *)(GetRes+1),(INT8U *)&pBMCInfo->SOLCfg[EthIndex].PayldPortNum,sizeof(INT16U));
  212. Size = Size + sizeof (INT16U);
  213. break;
  214. default:
  215. if(g_PDKHandle[PDK_GETSOLOEMPARAM] != NULL &&
  216. (GetReq->ParamSel >= 192 && GetReq->ParamSel <= 255))
  217. {
  218. oem_len = ((int(*)(INT8U, unsigned long*,int))(g_PDKHandle[PDK_GETSOLOEMPARAM]))(GetReq->ParamSel, &oem_addr ,BMCInst);
  219. if( oem_len == 0)
  220. {
  221. GetRes->CompletionCode = CC_PARAM_NOT_SUPPORTED;
  222. return sizeof(INT8U);
  223. }
  224. else
  225. {
  226. //Acquire the OEM parameters
  227. if( oem_len < MSG_PAYLOAD_SIZE - sizeof(GetSOLConfigOEMRes_T))
  228. {
  229. memcpy((char*)GetOEMRes + sizeof(GetSOLConfigOEMRes_T) ,\
  230. (unsigned int*)oem_addr , oem_len);
  231. }
  232. else
  233. {
  234. GetRes->CompletionCode = CC_PARAM_NOT_SUPPORTED;
  235. return sizeof(INT8U);
  236. }
  237. return sizeof(GetSystemInfoParamOEMRes_T) + oem_len;
  238. }
  239. }
  240. else
  241. {
  242. GetRes->CompletionCode = CC_PARAM_NOT_SUPPORTED;
  243. Size = sizeof (INT8U);
  244. }
  245. }
  246. return Size;
  247. }
  248. #endif /* GET_SOL_CONFIGURATION */
  249. #if SET_SOL_CONFIGURATION != UNIMPLEMENTED
  250. /*---------------------------------------
  251. * SetSOLConfig
  252. *---------------------------------------*/
  253. int
  254. SetSOLConfig (_NEAR_ INT8U* pReq, INT8U ReqLen, _NEAR_ INT8U* pRes,_NEAR_ int BMCInst)
  255. {
  256. _NEAR_ SetSOLConfigReq_T* SetReq = (_NEAR_ SetSOLConfigReq_T*) pReq;
  257. _NEAR_ SetSOLConfigOEMReq_T* pSetOEMReq = (_NEAR_ SetSOLConfigOEMReq_T*) pReq;
  258. _FAR_ BMCSharedMem_T* pSharedMem = BMC_GET_SHARED_MEM (BMCInst);
  259. BMCInfo_t *pBMCInfo = &g_BMCInfo[BMCInst];
  260. int i=0, j=0;
  261. INT8U ChannelNum, EthIndex,*curchannel;
  262. unsigned long oem_addr;
  263. int size;
  264. INT8U m_SOL_SetInProgress; /**< Contains setting SOL configuration status */
  265. ChannelNum = SetReq->ChannelNum & 0x0F;
  266. if (ChannelNum > 0x0F)
  267. {
  268. *pRes =CC_INV_DATA_FIELD;
  269. return sizeof(*pRes);
  270. }
  271. if (0x0E == ChannelNum)
  272. {
  273. OS_THREAD_TLS_GET(g_tls.CurChannel,curchannel);
  274. EthIndex = GetEthIndex (*curchannel & 0xF, BMCInst);
  275. }
  276. else
  277. {
  278. EthIndex = GetEthIndex (ChannelNum, BMCInst);
  279. }
  280. if (0xFF == EthIndex)
  281. {
  282. *pRes = CC_INV_DATA_FIELD;
  283. return sizeof (*pRes);
  284. }
  285. if (SetReq->ParamSel >= sizeof (SOLConfigParamLengths))
  286. {
  287. *pRes = CC_PARAM_NOT_SUPPORTED;
  288. return sizeof (*pRes);
  289. }
  290. /* Validate Req Lengths */
  291. if (ReqLen != (sizeof (SetSOLConfigReq_T) +
  292. SOLConfigParamLengths [SetReq->ParamSel]))
  293. {
  294. *pRes = CC_REQ_INV_LEN;
  295. return sizeof (*pRes);
  296. }
  297. if(SetReq->ChannelNum & RESERVED_VALUE_F0)
  298. {
  299. /* Alarm !!! Somebody is trying to set Reseved Bits */
  300. *pRes = CC_INV_DATA_FIELD;
  301. return sizeof (*pRes);
  302. }
  303. /* Check for Reserved Bits */
  304. for (i = 0; i < sizeof (m_RsvdBitsCheck)/ sizeof (m_RsvdBitsCheck[0]); i++)
  305. {
  306. /* Check if this Parameter Selector needs Reserved bit checking !! */
  307. if (m_RsvdBitsCheck[i].Params == SetReq->ParamSel )
  308. {
  309. for (j = 0; j < m_RsvdBitsCheck[i].DataLen; j++)
  310. {
  311. if ( 0 != (pReq[2+j] & m_RsvdBitsCheck[i].ReservedBits[j]))
  312. {
  313. /* Alarm !!! Somebody is trying to set Reseved Bits */
  314. *pRes = CC_INV_DATA_FIELD;
  315. return sizeof (*pRes);
  316. }
  317. }
  318. }
  319. }
  320. *pRes = CC_NORMAL;
  321. switch (SetReq->ParamSel)
  322. {
  323. case SOL_SET_IN_PROGRESS:
  324. LOCK_BMC_SHARED_MEM(BMCInst);
  325. m_SOL_SetInProgress = BMC_GET_SHARED_MEM(BMCInst)->m_SOL_SetInProgress;
  326. UNLOCK_BMC_SHARED_MEM(BMCInst);
  327. /* Commit Write is optional and supported
  328. * only if rollback is supported */
  329. if ((SET_COMPLETE != (*(_NEAR_ INT8U*)(SetReq + 1))) &&
  330. (SET_IN_PROGRESS != (*(_NEAR_ INT8U*)(SetReq + 1))))
  331. {
  332. *pRes = CC_PARAM_NOT_SUPPORTED;
  333. return sizeof (*pRes);
  334. }
  335. else if ((SET_IN_PROGRESS == m_SOL_SetInProgress) &&
  336. (SET_IN_PROGRESS == (*(_NEAR_ INT8U*)(SetReq + 1))))
  337. {
  338. /*Set In Progress already Set */
  339. *pRes = CC_SET_IN_PROGRESS;
  340. return sizeof (*pRes);
  341. }
  342. LOCK_BMC_SHARED_MEM(BMCInst);
  343. BMC_GET_SHARED_MEM(BMCInst)->m_SOL_SetInProgress = (*(_NEAR_ INT8U*)(SetReq + 1));
  344. UNLOCK_BMC_SHARED_MEM(BMCInst);
  345. break;
  346. case SOL_ENABLE_PARAM:
  347. pBMCInfo->SOLCfg[EthIndex].SOLEnable = (*(_NEAR_ INT8U*)(SetReq + 1));
  348. break;
  349. case SOL_AUTHENTICATION_PARAM:
  350. /*
  351. #34323: Check if user is setting reserved bits. This cannot be handled at main logic
  352. of reserve bit checking.
  353. */
  354. if (0 != IsValidPrivilege((0x3F & (*(_NEAR_ INT8U*)(SetReq + 1)))))
  355. {
  356. *pRes = CC_INV_DATA_FIELD;
  357. return sizeof (*pRes);
  358. }
  359. pBMCInfo->SOLCfg[EthIndex].SOLAuth = (*(_NEAR_ INT8U*)(SetReq + 1));
  360. break;
  361. case SOL_ACCUM_THRESHOLD_PARAM:
  362. if(((*(_NEAR_ INT8U*)(SetReq + 1)) == 0) || ((*((_NEAR_ INT8U*)(SetReq +1)+1)) == 0))
  363. {
  364. *pRes = CC_INV_DATA_FIELD;
  365. return sizeof (*pRes);
  366. }
  367. pBMCInfo->SOLCfg[EthIndex].CharAccThresh = (*(_NEAR_ INT16U*)(SetReq + 1));
  368. break;
  369. case SOL_RETRY_PARAM:
  370. pBMCInfo->SOLCfg[EthIndex].SOLRetryCount = (*((_NEAR_ INT8U*)(SetReq +1) ) );
  371. pBMCInfo->SOLCfg[EthIndex].SOLRetryInterval = (*((_NEAR_ INT8U*)(SetReq +1)+1));
  372. break;
  373. case SOL_NVOL_BIT_RATE_PARAM:
  374. if ( 0 != IsBaudRateValid (*(_NEAR_ INT8U*)(SetReq + 1)))
  375. {
  376. /*Invalid baud rate setting */
  377. *pRes = CC_INV_DATA_FIELD;
  378. return sizeof (*pRes);
  379. }
  380. if((*(_NEAR_ INT8U*)(SetReq+1)) == 0)
  381. *(_NEAR_ INT8U*)(SetReq+1) = BAUD_RATE_9600;
  382. pBMCInfo->SOLCfg[EthIndex].NVBitRate = *(_NEAR_ INT8U*)(SetReq + 1);
  383. break;
  384. case SOL_VOL_BIT_RATE_PARAM:
  385. if ( 0 != IsBaudRateValid (*(_NEAR_ INT8U*)(SetReq + 1)))
  386. {
  387. /*Invalid baud rate setting */
  388. *pRes = CC_INV_DATA_FIELD;
  389. return sizeof (*pRes);
  390. }
  391. if((*(_NEAR_ INT8U*)(SetReq+1)) == 0)
  392. *(_NEAR_ INT8U*)(SetReq+1) = BAUD_RATE_9600;
  393. pSharedMem->SOLBitRate[EthIndex] = *(_NEAR_ INT8U*)(SetReq + 1);
  394. break;
  395. case SOL_PAYLD_CHANNEL_PARAM:
  396. *pRes = CC_ATTEMPT_TO_SET_RO_PARAM;
  397. return sizeof (*pRes);
  398. break;
  399. case SOL_PAYLD_PORT_NUM_PARAM:
  400. *pRes = CC_ATTEMPT_TO_SET_RO_PARAM;
  401. return sizeof (*pRes);
  402. break;
  403. default:
  404. if(g_PDKHandle[PDK_SETSOLOEMPARAM] != NULL &&
  405. (SetReq->ParamSel >= 192 && SetReq->ParamSel <= 255))
  406. {
  407. oem_addr = (unsigned long)((char*)pSetOEMReq + sizeof(SetSOLConfigOEMReq_T));
  408. size = ((int(*)(INT8U, unsigned long*,int))(g_PDKHandle[PDK_SETSOLOEMPARAM]))(SetReq->ParamSel, &oem_addr ,BMCInst);
  409. if(size <= 0)
  410. {
  411. *pRes = CC_PARAM_NOT_SUPPORTED;
  412. return sizeof(*pRes);
  413. }
  414. else
  415. {
  416. *pRes = CC_PARAM_NOT_SUPPORTED;
  417. return sizeof(*pRes);
  418. }
  419. }
  420. }
  421. FlushIPMI((INT8U*)&pBMCInfo->SOLCfg[0],(INT8U*)&pBMCInfo->SOLCfg[EthIndex],pBMCInfo->IPMIConfLoc.SOLCfgAddr,
  422. sizeof(SOLConfig_T),BMCInst);
  423. return sizeof (*pRes);
  424. }
  425. #endif /* SET_SOL_CONFIGURATION */
  426. /**
  427. * IsBaudRateValid
  428. **/
  429. int
  430. IsBaudRateValid (INT8U BaudRate)
  431. {
  432. /* Check against supported Baud Rates */
  433. if ((BaudRate == 0) ||
  434. (BaudRate == BAUD_RATE_9600) ||
  435. (BaudRate == BAUD_RATE_19200) ||
  436. (BaudRate == BAUD_RATE_38400) ||
  437. (BaudRate == BAUD_RATE_57600) ||
  438. (BaudRate == BAUD_RATE_115200))
  439. {
  440. //Baud rate is valid
  441. return 0;
  442. }
  443. //Baud rate is invvalid
  444. return -1;
  445. }
  446. /*
  447. Check if user entered Auth type is valid
  448. */
  449. int IsValidPrivilege(INT8U priv_lvl)
  450. {
  451. if ((priv_lvl == 02) ||
  452. (priv_lvl == 03) ||
  453. (priv_lvl == 04) ||
  454. (priv_lvl == 05))
  455. return 0;
  456. else
  457. return -1; //// Invalid privilege
  458. }
  459. #if 0
  460. /**
  461. * InitSOLPort
  462. **/
  463. int
  464. InitSOLPort (INT8U BaudRate)
  465. {
  466. int status;
  467. int fd;
  468. struct termios tty_struct;
  469. if ((fd = open(SOL_IFC_PORT,O_RDONLY)) < 0)
  470. {
  471. IPMI_WARNING ("Can't open serial port..%s\n",strerror(errno));
  472. return -1;
  473. }
  474. status = tcgetattr(fd,&tty_struct); /* get termios structure */
  475. switch (BaudRate) {
  476. case BAUD_RATE_9600:
  477. cfsetospeed(&tty_struct, B9600);
  478. cfsetispeed(&tty_struct, B9600);
  479. break;
  480. case BAUD_RATE_19200:
  481. cfsetospeed(&tty_struct, B19200);
  482. cfsetispeed(&tty_struct, B19200);
  483. break;
  484. case BAUD_RATE_38400:
  485. cfsetospeed(&tty_struct, B38400);
  486. cfsetispeed(&tty_struct, B38400);
  487. break;
  488. case BAUD_RATE_57600:
  489. cfsetospeed(&tty_struct, B57600);
  490. cfsetispeed(&tty_struct, B57600);
  491. break;
  492. case BAUD_RATE_115200:
  493. cfsetospeed(&tty_struct, B115200);
  494. cfsetispeed(&tty_struct, B115200);
  495. break;
  496. default:
  497. IPMI_ERROR ("SOLConfig.c : Invalid baud rate = %x\n", BaudRate);
  498. }
  499. tty_struct.c_cflag |= CS8; /* Set 8bits/charecter */
  500. tty_struct.c_cflag &= ~CSTOPB; /* set framing to 1 stop bits */
  501. tty_struct.c_cflag &= ~(PARENB); /* set parity to NONE */
  502. tty_struct.c_iflag &= ~(INPCK);
  503. /* Set Hardware flow control */
  504. tty_struct.c_cflag |= CRTSCTS;
  505. tty_struct.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG); /* Raw input mode */
  506. tty_struct.c_oflag &= ~(OCRNL | ONOCR | ONLRET);
  507. tty_struct.c_iflag &= ~(IXON | IXOFF); /* no sw flow ctrl */
  508. tty_struct.c_iflag &= ~INLCR;
  509. tty_struct.c_iflag &= ~ICRNL;
  510. tty_struct.c_iflag &= ~IGNCR;
  511. PDK_InitSOLPort (&tty_struct); /* OEM specific SOL initialization */
  512. /* set the new attributes in the tty driver */
  513. status = tcsetattr(fd, TCSANOW, &tty_struct);
  514. close (fd);
  515. return 0;
  516. }
  517. #endif /* #if 0 */