ski2c.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:32k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /******************************************************************************
  2.  *
  3.  * Name: ski2c.c
  4.  * Project: GEnesis, PCI Gigabit Ethernet Adapter
  5.  * Version: $Revision: 1.47 $
  6.  * Date: $Date: 2001/04/05 11:38:09 $
  7.  * Purpose: Functions to access Voltage and Temperature Sensor
  8.  * (taken from Monalisa (taken from Concentrator))
  9.  *
  10.  ******************************************************************************/
  11. /******************************************************************************
  12.  *
  13.  * (C)Copyright 1998-2001 SysKonnect GmbH.
  14.  *
  15.  * This program is free software; you can redistribute it and/or modify
  16.  * it under the terms of the GNU General Public License as published by
  17.  * the Free Software Foundation; either version 2 of the License, or
  18.  * (at your option) any later version.
  19.  *
  20.  * The information in this file is provided "AS IS" without warranty.
  21.  *
  22.  ******************************************************************************/
  23. /******************************************************************************
  24.  *
  25.  * History:
  26.  *
  27.  * $Log: ski2c.c,v $
  28.  * Revision 1.47  2001/04/05 11:38:09  rassmann
  29.  * Set SenState to idle in SkI2cWaitIrq().
  30.  * Changed error message in SkI2cWaitIrq().
  31.  *
  32.  * Revision 1.46  2001/04/02 14:03:35  rassmann
  33.  * Changed pAC to IoC in SK_IN32().
  34.  *
  35.  * Revision 1.45  2001/03/21 12:12:49  rassmann
  36.  * Resetting I2C_READY interrupt in SkI2cInit1().
  37.  *
  38.  * Revision 1.44  2000/08/07 15:49:03  gklug
  39.  * Fix: SK_INFAST only in NetWare driver.
  40.  *
  41.  * Revision 1.43  2000/08/03 14:28:17  rassmann
  42.  * Added function to wait for I2C being ready before resetting the board.
  43.  * Replaced one duplicate "out of range" message with correct one.
  44.  *
  45.  * Revision 1.42  1999/11/22 13:35:12  cgoos
  46.  * Changed license header to GPL.
  47.  *
  48.  * Revision 1.41  1999/09/14 14:11:30  malthoff
  49.  * The 1000BT Dual Link adapter has got only one Fan.
  50.  * The second Fan has been removed.
  51.  *
  52.  * Revision 1.40  1999/05/27 13:37:27  malthoff
  53.  * Set divisor of 1 for fan count calculation.
  54.  *
  55.  * Revision 1.39  1999/05/20 14:54:43  malthoff
  56.  * I2c.DummyReads is not used in Diagnostics.
  57.  *
  58.  * Revision 1.38  1999/05/20 09:20:56  cgoos
  59.  * Changes for 1000Base-T (up to 9 sensors and fans).
  60.  *
  61.  * Revision 1.37  1999/03/25 15:11:36  gklug
  62.  * fix: reset error flag if sensor reads correct value
  63.  *
  64.  * Revision 1.36  1999/01/07 14:11:16  gklug
  65.  * fix: break added
  66.  *
  67.  * Revision 1.35  1999/01/05 15:31:49  gklug
  68.  * fix: CLEAR STAT command is now added correctly
  69.  *
  70.  * Revision 1.34  1998/12/01 13:45:16  gklug
  71.  * fix: introduced Init level, because we don't need reinits
  72.  *
  73.  * Revision 1.33  1998/11/09 14:54:25  malthoff
  74.  * Modify I2C Transfer Timeout handling for Diagnostics.
  75.  *
  76.  * Revision 1.32  1998/11/03 06:54:35  gklug
  77.  * fix: Need dummy reads at the beginning to init sensors
  78.  *
  79.  * Revision 1.31  1998/11/03 06:42:42  gklug
  80.  * fix: select correctVIO range only if between warning levels
  81.  *
  82.  * Revision 1.30  1998/11/02 07:36:53  gklug
  83.  * fix: Error should not include WARNING message
  84.  *
  85.  * Revision 1.29  1998/10/30 15:07:43  malthoff
  86.  * Disable 'I2C does not compelete' error log for diagnostics.
  87.  *
  88.  * Revision 1.28  1998/10/22 09:48:11  gklug
  89.  * fix: SysKonnectFileId typo
  90.  *
  91.  * Revision 1.27  1998/10/20 09:59:46  gklug
  92.  * add: parameter to SkOsGetTime
  93.  *
  94.  * Revision 1.26  1998/10/09 06:10:59  malthoff
  95.  * Remove ID_sccs by SysKonnectFileId.
  96.  *
  97.  * Revision 1.25  1998/09/08 12:40:26  gklug
  98.  * fix: syntax error in if clause
  99.  *
  100.  * Revision 1.24  1998/09/08 12:19:42  gklug
  101.  * chg: INIT Level checking
  102.  *
  103.  * Revision 1.23  1998/09/08 07:37:20  gklug
  104.  * fix: log error if PCI_IO voltage sensor could not be initialized
  105.  *
  106.  * Revision 1.22  1998/09/04 08:30:03  malthoff
  107.  * Bugfixes during SK_DIAG testing:
  108.  * - correct NS2BCLK() macro
  109.  * - correct SkI2cSndDev()
  110.  * - correct SkI2cWait() loop waiting for an event
  111.  *
  112.  * Revision 1.21  1998/08/27 14:46:01  gklug
  113.  * chg: if-then-else replaced by switch
  114.  *
  115.  * Revision 1.20  1998/08/27 14:40:07  gklug
  116.  * test: integral types
  117.  *
  118.  * Revision 1.19  1998/08/25 07:51:54  gklug
  119.  * fix: typos for compiling
  120.  *
  121.  * Revision 1.18  1998/08/25 06:12:24  gklug
  122.  * add: count errors and warnings
  123.  * fix: check not the sensor state but the ErrFlag!
  124.  *
  125.  * Revision 1.17  1998/08/25 05:56:48  gklug
  126.  * add: CheckSensor function
  127.  *
  128.  * Revision 1.16  1998/08/20 11:41:10  gklug
  129.  * chg: omit STRCPY macro by using char * as Sensor Description
  130.  *
  131.  * Revision 1.15  1998/08/20 11:37:35  gklug
  132.  * chg: change Ioc to IoC
  133.  *
  134.  * Revision 1.14  1998/08/20 11:32:52  gklug
  135.  * fix: Para compile error
  136.  *
  137.  * Revision 1.13  1998/08/20 11:27:41  gklug
  138.  * fix: Compile bugs with new awrning constants
  139.  *
  140.  * Revision 1.12  1998/08/20 08:53:05  gklug
  141.  * fix: compiler errors
  142.  * add: Threshold values
  143.  *
  144.  * Revision 1.11  1998/08/19 12:39:22  malthoff
  145.  * Compiler Fix: Some names have changed.
  146.  *
  147.  * Revision 1.10  1998/08/19 12:20:56  gklug
  148.  * fix: remove struct from C files (see CCC)
  149.  *
  150.  * Revision 1.9  1998/08/19 06:28:46  malthoff
  151.  * SkOsGetTime returns SK_U64 now.
  152.  *
  153.  * Revision 1.8  1998/08/17 13:53:33  gklug
  154.  * fix: Parameter of event function and its result
  155.  *
  156.  * Revision 1.7  1998/08/17 07:02:15  malthoff
  157.  * Modify the functions for accessing the I2C SW Registers.
  158.  * Modify SkI2cWait().
  159.  * Put Lm80RcvReg into sklm80.c
  160.  * Remove Compiler Errors.
  161.  *
  162.  * Revision 1.6  1998/08/14 07:13:20  malthoff
  163.  * remove pAc with pAC
  164.  * remove smc with pAC
  165.  * change names to new convention
  166.  *
  167.  * Revision 1.5  1998/08/14 06:24:49  gklug
  168.  * add: init level 1 and 2
  169.  *
  170.  * Revision 1.4  1998/08/12 14:31:12  gklug
  171.  * add: error log for unknown event
  172.  *
  173.  * Revision 1.3  1998/08/12 13:37:04  gklug
  174.  * add: Init 0 function
  175.  *
  176.  * Revision 1.2  1998/08/11 07:27:15  gklug
  177.  * add: functions of the interface
  178.  * adapt rest of source to C coding Conventions
  179.  * rmv: unneccessary code taken from Mona Lisa
  180.  *
  181.  * Revision 1.1  1998/06/19 14:28:43  malthoff
  182.  * Created. Sources taken from ML Projekt.
  183.  * Sources have to be reworked for GE.
  184.  *
  185.  *
  186.  ******************************************************************************/
  187. /*
  188.  * I2C Protocol
  189.  */
  190. static const char SysKonnectFileId[] =
  191. "$Id: ski2c.c,v 1.47 2001/04/05 11:38:09 rassmann Exp $";
  192. #include "h/skdrv1st.h" /* Driver Specific Definitions */
  193. #include "h/lm80.h"
  194. #include "h/skdrv2nd.h" /* Adapter Control- and Driver specific Def. */
  195. #ifdef __C2MAN__
  196. /*
  197. I2C protocol implementation.
  198. General Description:
  199. The I2C protocol is used for the temperature sensors and for
  200. the serial EEPROM which hold the configuration.
  201. This file covers functions that allow to read write and do
  202. some bulk requests a specified I2C address.
  203. The Genesis has 2 I2C buses. One for the EEPROM which holds
  204. the VPD Data and one for temperature and voltage sensor.
  205. The following picture shows the I2C buses, I2C devices and
  206. there control registers.
  207. Note: The VPD functions are in skvpd.c
  208. .
  209. . PCI Config I2C Bus for VPD Data:
  210. .
  211. .       +------------+
  212. .       | VPD EEPROM |
  213. .       +------------+
  214. .      |
  215. .      | <-- I2C
  216. .      |
  217. .  +-----------+-----------+
  218. .  |  |
  219. . +-----------------+ +-----------------+
  220. . | PCI_VPD_ADR_REG | | PCI_VPD_DAT_REG |
  221. . +-----------------+ +-----------------+
  222. .
  223. .
  224. . I2C Bus for LM80 sensor:
  225. .
  226. . +-----------------+
  227. . | Temperature and |
  228. . | Voltage Sensor  |
  229. . |  LM80   |
  230. . +-----------------+
  231. . |
  232. . |
  233. . I2C --> |
  234. . |
  235. .      +----+
  236. .      +-------------->| OR |<--+
  237. .      |      +----+   |
  238. .     +------+------+       |
  239. .     |     |       |
  240. . +--------+ +--------+ +----------+
  241. . | B2_I2C | | B2_I2C | |  B2_I2C  |
  242. . | _CTRL  | | _DATA  | |   _SW    |
  243. . +--------+ +--------+ +----------+
  244. .
  245. The I2C bus may be driven by the B2_I2C_SW or by the B2_I2C_CTRL
  246. and B2_I2C_DATA registers.
  247. For driver software it is recommended to use the I2C control and
  248. data register, because I2C bus timing is done by the ASIC and
  249. an interrupt may be received when the I2C request is completed.
  250. Clock Rate Timing: MIN MAX generated by
  251. VPD EEPROM: 50 kHz 100 kHz HW
  252. LM80 over I2C Ctrl/Data reg. 50 kHz 100 kHz HW
  253. LM80 over B2_I2C_SW register 0 400 kHz SW
  254. Note: The clock generated by the hardware is dependend on the
  255. PCI clock. If the PCI bus clock is 33 MHz, the I2C/VPD
  256. clock is 50 kHz.
  257.  */
  258. intro()
  259. {}
  260. #endif
  261. #ifdef SK_DIAG
  262. /*
  263.  * I2C Fast Mode timing values used by the LM80.
  264.  * If new devices are added to the I2C bus the timing values have to be checked.
  265.  */
  266. #ifndef I2C_SLOW_TIMING
  267. #define T_CLK_LOW 1300L /* clock low time in ns */
  268. #define T_CLK_HIGH  600L /* clock high time in ns */
  269. #define T_DATA_IN_SETUP  100L /* data in Set-UP Time */
  270. #define T_START_HOLD  600L /* start condition hold time */
  271. #define T_START_SETUP  600L /* start condition Set-up time */
  272. #define T_STOP_SETUP  600L /* stop condition Set-up time */
  273. #define T_BUS_IDLE 1300L /* time the bus must free after tx */
  274. #define T_CLK_2_DATA_OUT  900L /* max. clock low to data output valid */
  275. #else /* I2C_SLOW_TIMING */
  276. /* I2C Standard Mode Timing */
  277. #define T_CLK_LOW 4700L /* clock low time in ns */
  278. #define T_CLK_HIGH 4000L /* clock high time in ns */
  279. #define T_DATA_IN_SETUP  250L /* data in Set-UP Time */
  280. #define T_START_HOLD 4000L /* start condition hold time */
  281. #define T_START_SETUP 4700L /* start condition Set_up time */
  282. #define T_STOP_SETUP 4000L /* stop condition Set-up time */
  283. #define T_BUS_IDLE 4700L /* time the bus must free after tx */
  284. #endif /* !I2C_SLOW_TIMING */
  285. #define NS2BCLK(x) (((x)*125)/10000)
  286. /*
  287.  * I2C Wire Operations
  288.  *
  289.  * About I2C_CLK_LOW():
  290.  *
  291.  * The Data Direction bit (I2C_DATA_DIR) has to be set to input when setting
  292.  * clock to low, to prevent the ASIC and the I2C data client from driving the
  293.  * serial data line simultaneously (ASIC: last bit of a byte = '1', I2C client
  294.  * send an 'ACK'). See also Concentrator Bugreport No. 10192.
  295.  */
  296. #define I2C_DATA_HIGH(IoC) SK_I2C_SET_BIT(IoC, I2C_DATA)
  297. #define I2C_DATA_LOW(IoC) SK_I2C_CLR_BIT(IoC, I2C_DATA)
  298. #define I2C_DATA_OUT(IoC) SK_I2C_SET_BIT(IoC, I2C_DATA_DIR)
  299. #define I2C_DATA_IN(IoC) SK_I2C_CLR_BIT(IoC, I2C_DATA_DIR|I2C_DATA)
  300. #define I2C_CLK_HIGH(IoC) SK_I2C_SET_BIT(IoC, I2C_CLK)
  301. #define I2C_CLK_LOW(IoC) SK_I2C_CLR_BIT(IoC, I2C_CLK|I2C_DATA_DIR)
  302. #define I2C_START_COND(IoC) SK_I2C_CLR_BIT(IoC, I2C_CLK)
  303. #define NS2CLKT(x) ((x*125L)/10000)
  304. /*--------------- I2C Interface Register Functions --------------- */
  305. /*
  306.  * sending one bit
  307.  */
  308. void SkI2cSndBit(
  309. SK_IOC IoC, /* I/O Context */
  310. SK_U8 Bit) /* Bit to send */
  311. {
  312. I2C_DATA_OUT(IoC);
  313. if (Bit) {
  314. I2C_DATA_HIGH(IoC);
  315. } else {
  316. I2C_DATA_LOW(IoC);
  317. }
  318. SkDgWaitTime(IoC, NS2BCLK(T_DATA_IN_SETUP));
  319. I2C_CLK_HIGH(IoC);
  320. SkDgWaitTime(IoC, NS2BCLK(T_CLK_HIGH));
  321. I2C_CLK_LOW(IoC);
  322. } /* SkI2cSndBit*/
  323. /*
  324.  * Signal a start to the I2C Bus.
  325.  *
  326.  * A start is signaled when data goes to low in a high clock cycle.
  327.  *
  328.  * Ends with Clock Low.
  329.  *
  330.  * Status: not tested
  331.  */
  332. void SkI2cStart(
  333. SK_IOC IoC) /* I/O Context */
  334. {
  335. /* Init data and Clock to output lines */
  336. /* Set Data high */
  337. I2C_DATA_OUT(IoC);
  338. I2C_DATA_HIGH(IoC);
  339. /* Set Clock high */
  340. I2C_CLK_HIGH(IoC);
  341. SkDgWaitTime(IoC, NS2BCLK(T_START_SETUP));
  342. /* Set Data Low */
  343. I2C_DATA_LOW(IoC);
  344. SkDgWaitTime(IoC, NS2BCLK(T_START_HOLD));
  345. /* Clock low without Data to Input */
  346. I2C_START_COND(IoC);
  347. SkDgWaitTime(IoC, NS2BCLK(T_CLK_LOW));
  348. } /* SkI2cStart */
  349. void SkI2cStop(
  350. SK_IOC IoC) /* I/O Context */
  351. {
  352. /* Init data and Clock to output lines */
  353. /* Set Data low */
  354. I2C_DATA_OUT(IoC);
  355. I2C_DATA_LOW(IoC);
  356. SkDgWaitTime(IoC, NS2BCLK(T_CLK_2_DATA_OUT));
  357. /* Set Clock high */
  358. I2C_CLK_HIGH(IoC);
  359. SkDgWaitTime(IoC, NS2BCLK(T_STOP_SETUP));
  360. /*
  361.  * Set Data High: Do it by setting the Data Line to Input.
  362.  * Because of a pull up resistor the Data Line
  363.  * floods to high.
  364.  */
  365. I2C_DATA_IN(IoC);
  366. /*
  367.  * When I2C activity is stopped
  368.  *  o DATA should be set to input and
  369.  *  o CLOCK should be set to high!
  370.  */
  371. SkDgWaitTime(IoC, NS2BCLK(T_BUS_IDLE));
  372. } /* SkI2cStop */
  373. /*
  374.  * Receive just one bit via the I2C bus.
  375.  *
  376.  * Note: Clock must be set to LOW before calling this function.
  377.  *
  378.  * Returns The received bit.
  379.  */
  380. int SkI2cRcvBit(
  381. SK_IOC IoC) /* I/O Context */
  382. {
  383. int Bit;
  384. SK_U8 I2cSwCtrl;
  385. /* Init data as input line */
  386. I2C_DATA_IN(IoC);
  387. SkDgWaitTime(IoC, NS2BCLK(T_CLK_2_DATA_OUT));
  388. I2C_CLK_HIGH(IoC);
  389. SkDgWaitTime(IoC, NS2BCLK(T_CLK_HIGH));
  390. SK_I2C_GET_SW(IoC, &I2cSwCtrl);
  391. if (I2cSwCtrl & I2C_DATA) {
  392. Bit = 1;
  393. } else {
  394. Bit = 0;
  395. }
  396. I2C_CLK_LOW(IoC);
  397. SkDgWaitTime(IoC, NS2BCLK(T_CLK_LOW-T_CLK_2_DATA_OUT));
  398. return(Bit);
  399. } /* SkI2cRcvBit */
  400. /*
  401.  * Receive an ACK.
  402.  *
  403.  * returns 0 If acknoledged
  404.  * 1 in case of an error
  405.  */
  406. int SkI2cRcvAck(
  407. SK_IOC IoC) /* I/O Context */
  408. {
  409. /*
  410.  * Received bit must be zero.
  411.  */
  412. return (SkI2cRcvBit(IoC) != 0);
  413. } /* SkI2cRcvAck */
  414. /*
  415.  * Send an NACK.
  416.  */
  417. void SkI2cSndNAck(
  418. SK_IOC IoC) /* I/O Context */
  419. {
  420. /*
  421.  * Received bit must be zero.
  422.  */
  423. SkI2cSndBit(IoC, 1);
  424. } /* SkI2cSndNAck */
  425. /*
  426.  * Send an ACK.
  427.  */
  428. void SkI2cSndAck(
  429. SK_IOC IoC) /* I/O Context */
  430. {
  431. /*
  432.  * Received bit must be zero.
  433.  *
  434.  */
  435. SkI2cSndBit(IoC, 0);
  436. } /* SkI2cSndAck */
  437. /*
  438.  * Send one byte to the I2C device and wait for ACK.
  439.  *
  440.  * Return acknoleged status.
  441.  */
  442. int SkI2cSndByte(
  443. SK_IOC IoC, /* I/O Context */
  444. int Byte) /* byte to send */
  445. {
  446. int i;
  447. for (i = 0; i < 8; i++) {
  448. if (Byte & (1<<(7-i))) {
  449. SkI2cSndBit(IoC, 1);
  450. } else {
  451. SkI2cSndBit(IoC, 0);
  452. }
  453. }
  454. return(SkI2cRcvAck(IoC));
  455. } /* SkI2cSndByte */
  456. /*
  457.  * Receive one byte and ack it.
  458.  *
  459.  * Return byte.
  460.  */
  461. int SkI2cRcvByte(
  462. SK_IOC IoC, /* I/O Context */
  463. int Last) /* Last Byte Flag */
  464. {
  465. int i;
  466. int Byte = 0;
  467. for (i = 0; i < 8; i++) {
  468. Byte <<= 1;
  469. Byte |= SkI2cRcvBit(IoC);
  470. }
  471. if (Last) {
  472. SkI2cSndNAck(IoC);
  473. } else {
  474. SkI2cSndAck(IoC);
  475. }
  476. return(Byte);
  477. } /* SkI2cRcvByte */
  478. /*
  479.  * Start dialog and send device address
  480.  *
  481.  * Return 0 if acknoleged, 1 in case of an error
  482.  */
  483. int SkI2cSndDev(
  484. SK_IOC IoC, /* I/O Context */
  485. int Addr, /* Device Address */
  486. int Rw) /* Read / Write Flag */
  487. {
  488. SkI2cStart(IoC);
  489. Rw = ~Rw; 
  490. Rw &= I2C_WRITE;
  491. return(SkI2cSndByte(IoC, (Addr<<1) | Rw));
  492. } /* SkI2cSndDev */
  493. #endif /* SK_DIAG */
  494. /*----------------- I2C CTRL Register Functions ----------*/
  495. /*
  496.  * waits for a completion of an I2C transfer
  497.  *
  498.  * returns 0: success, transfer completes
  499.  * 1: error,  transfer does not complete, I2C transfer
  500.  *  killed, wait loop terminated.
  501.  */
  502. int SkI2cWait(
  503. SK_AC *pAC, /* Adapter Context */
  504. SK_IOC IoC, /* I/O Context */
  505. int Event) /* complete event to wait for (I2C_READ or I2C_WRITE) */
  506. {
  507. SK_U64 StartTime;
  508. SK_U32 I2cCtrl;
  509. StartTime = SkOsGetTime(pAC);
  510. do {
  511. if (SkOsGetTime(pAC) - StartTime > SK_TICKS_PER_SEC / 8) {
  512. SK_I2C_STOP(IoC);
  513. #ifndef SK_DIAG
  514. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E002, SKERR_I2C_E002MSG);
  515. #endif /* !SK_DIAG */
  516. return(1);
  517. }
  518. SK_I2C_GET_CTL(IoC, &I2cCtrl);
  519. } while ((I2cCtrl & I2C_FLAG) == (SK_U32)Event << 31);
  520. return(0);
  521. } /* SkI2cWait */
  522. /*
  523.  * waits for a completion of an I2C transfer
  524.  *
  525.  * Returns
  526.  * Nothing
  527.  */
  528. void SkI2cWaitIrq(
  529. SK_AC *pAC, /* Adapter Context */
  530. SK_IOC IoC) /* I/O Context */
  531. {
  532. SK_SENSOR *pSen;
  533. SK_U64 StartTime;
  534. SK_U32 IrqSrc;
  535. pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
  536. if (pSen->SenState == SK_SEN_IDLE) {
  537. return;
  538. }
  539. StartTime = SkOsGetTime(pAC);
  540. do {
  541. if (SkOsGetTime(pAC) - StartTime > SK_TICKS_PER_SEC / 8) {
  542. SK_I2C_STOP(IoC);
  543. #ifndef SK_DIAG
  544. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E016, SKERR_I2C_E016MSG);
  545. #endif /* !SK_DIAG */
  546. return;
  547. }
  548. SK_IN32(IoC, B0_ISRC, &IrqSrc);
  549. } while ((IrqSrc & IS_I2C_READY) == 0);
  550. pSen->SenState = SK_SEN_IDLE;
  551. return;
  552. } /* SkI2cWaitIrq */
  553. #ifdef SK_DIAG
  554. /*
  555.  * writes a single byte or 4 bytes into the I2C device
  556.  *
  557.  * returns 0: success
  558.  * 1: error
  559.  */
  560. int SkI2cWrite(
  561. SK_AC *pAC, /* Adapter Context */
  562. SK_IOC IoC, /* I/O Context */
  563. SK_U32 I2cData, /* I2C Data to write */
  564. int I2cDev, /* I2C Device Address */
  565. int I2cReg, /* I2C Device Register Address */
  566. int I2cBurst) /* I2C Burst Flag ( 0 || I2C_BURST ) */
  567. {
  568. SK_OUT32(IoC, B2_I2C_DATA, I2cData);
  569. SK_I2C_CTL(IoC, I2C_WRITE, I2cDev, I2cReg, I2cBurst);
  570. return(SkI2cWait(pAC, IoC, I2C_WRITE));
  571. } /* SkI2cWrite*/
  572. /*
  573.  * reads a single byte or 4 bytes from the I2C device
  574.  *
  575.  * returns the word read
  576.  */
  577. SK_U32 SkI2cRead(
  578. SK_AC *pAC, /* Adapter Context */
  579. SK_IOC IoC, /* I/O Context */
  580. int I2cDev, /* I2C Device Address */
  581. int I2cReg, /* I2C Device Register Address */
  582. int I2cBurst) /* I2C Burst Flag ( 0 || I2C_BURST ) */
  583. {
  584. SK_U32 Data;
  585. SK_OUT32(IoC, B2_I2C_DATA, 0);
  586. SK_I2C_CTL(IoC, I2C_READ, I2cDev, I2cReg, I2cBurst);
  587. if (SkI2cWait(pAC, IoC, I2C_READ)) {
  588. w_print("I2C Transfer Timeout!n"); 
  589. }
  590. SK_IN32(IoC, B2_I2C_DATA, &Data);
  591. return(Data);
  592. } /* SkI2cRead */
  593. #endif /* SK_DIAG */
  594. /*
  595.  * read a sensor's value
  596.  *
  597.  * This function reads a sensor's value from the I2C sensor chip. The sensor
  598.  * is defined by its index into the sensors database in the struct pAC points
  599.  * to.
  600.  * Returns
  601.  * 1 if the read is completed
  602.  * 0 if the read must be continued (I2C Bus still allocated)
  603.  */
  604. int SkI2cReadSensor(
  605. SK_AC *pAC, /* Adapter Context */
  606. SK_IOC IoC, /* I/O Context */
  607. SK_SENSOR *pSen) /* Sensor to be read */
  608. {
  609. return((*pSen->SenRead)(pAC, IoC, pSen));
  610. } /* SkI2cReadSensor*/
  611. /*
  612.  * Do the Init state 0 initialization
  613.  */
  614. static int SkI2cInit0(
  615. SK_AC *pAC) /* Adapter Context */
  616. {
  617. int i;
  618. /* Begin with first sensor */
  619. pAC->I2c.CurrSens = 0;
  620. /* Set to mimimum sensor number */
  621. pAC->I2c.MaxSens = SK_MIN_SENSORS;
  622. #ifndef SK_DIAG
  623. /* Initialize Number of Dummy Reads */
  624. pAC->I2c.DummyReads = SK_MAX_SENSORS;
  625. #endif
  626. for (i = 0; i < SK_MAX_SENSORS; i ++) {
  627. switch (i) {
  628. case 0:
  629. pAC->I2c.SenTable[i].SenDesc = "Temperature";
  630. pAC->I2c.SenTable[i].SenType = SK_SEN_TEMP;
  631. pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_ERRHIGH0;
  632. pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_ERRLOW0;
  633. pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_WARNHIGH0;
  634. pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_WARNLOW0;
  635. pAC->I2c.SenTable[i].SenReg = LM80_TEMP_IN;
  636. pAC->I2c.SenTable[i].SenInit = SK_TRUE;
  637. break;
  638. case 1:
  639. pAC->I2c.SenTable[i].SenDesc = "Voltage PCI";
  640. pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
  641. pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_ERRHIGH1;
  642. pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_ERRLOW1;
  643. pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_WARNHIGH1;
  644. pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_WARNLOW1;
  645. pAC->I2c.SenTable[i].SenReg = LM80_VT0_IN;
  646. pAC->I2c.SenTable[i].SenInit = SK_TRUE;
  647. break;
  648. case 2:
  649. pAC->I2c.SenTable[i].SenDesc = "Voltage PCI-IO";
  650. pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
  651. pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_ERRHIGH2;
  652. pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_ERRLOW2;
  653. pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_WARNHIGH2;
  654. pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_WARNLOW2;
  655. pAC->I2c.SenTable[i].SenReg = LM80_VT1_IN;
  656. pAC->I2c.SenTable[i].SenInit = SK_FALSE;
  657. break;
  658. case 3:
  659. pAC->I2c.SenTable[i].SenDesc = "Voltage ASIC";
  660. pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
  661. pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_ERRHIGH3;
  662. pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_ERRLOW3;
  663. pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_WARNHIGH3;
  664. pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_WARNLOW3;
  665. pAC->I2c.SenTable[i].SenReg = LM80_VT2_IN;
  666. pAC->I2c.SenTable[i].SenInit = SK_TRUE;
  667. break;
  668. case 4:
  669. pAC->I2c.SenTable[i].SenDesc = "Voltage PMA";
  670. pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
  671. pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_ERRHIGH4;
  672. pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_ERRLOW4;
  673. pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_WARNHIGH4;
  674. pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_WARNLOW4;
  675. pAC->I2c.SenTable[i].SenReg = LM80_VT3_IN;
  676. pAC->I2c.SenTable[i].SenInit = SK_TRUE;
  677. break;
  678. case 5:
  679. pAC->I2c.SenTable[i].SenDesc = "Voltage PHY 2V5";
  680. pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
  681. pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_ERRHIGH5;
  682. pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_ERRLOW5;
  683. pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_WARNHIGH5;
  684. pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_WARNLOW5;
  685. pAC->I2c.SenTable[i].SenReg = LM80_VT4_IN;
  686. pAC->I2c.SenTable[i].SenInit = SK_TRUE;
  687. break;
  688. case 6:
  689. pAC->I2c.SenTable[i].SenDesc = "Voltage PHY B PLL";
  690. pAC->I2c.SenTable[i].SenType = SK_SEN_VOLT;
  691. pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_ERRHIGH6;
  692. pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_ERRLOW6;
  693. pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_WARNHIGH6;
  694. pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_WARNLOW6;
  695. pAC->I2c.SenTable[i].SenReg = LM80_VT5_IN;
  696. pAC->I2c.SenTable[i].SenInit = SK_TRUE;
  697. break;
  698. case 7:
  699. pAC->I2c.SenTable[i].SenDesc = "Speed Fan";
  700. pAC->I2c.SenTable[i].SenType = SK_SEN_FAN;
  701. pAC->I2c.SenTable[i].SenThreErrHigh = SK_SEN_ERRHIGH;
  702. pAC->I2c.SenTable[i].SenThreErrLow = SK_SEN_ERRLOW;
  703. pAC->I2c.SenTable[i].SenThreWarnHigh = SK_SEN_WARNHIGH;
  704. pAC->I2c.SenTable[i].SenThreWarnLow = SK_SEN_WARNLOW;
  705. pAC->I2c.SenTable[i].SenReg = LM80_FAN2_IN;
  706. pAC->I2c.SenTable[i].SenInit = SK_TRUE;
  707. break;
  708. default:
  709. SK_ERR_LOG(pAC, SK_ERRCL_INIT | SK_ERRCL_SW,
  710. SKERR_I2C_E001, SKERR_I2C_E001MSG);
  711. break;
  712. }
  713. pAC->I2c.SenTable[i].SenValue = 0;
  714. pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_OK;
  715. pAC->I2c.SenTable[i].SenErrCts = 0;
  716. pAC->I2c.SenTable[i].SenBegErrTS = 0;
  717. pAC->I2c.SenTable[i].SenState = SK_SEN_IDLE;
  718. pAC->I2c.SenTable[i].SenRead = SkLm80ReadSensor;
  719. pAC->I2c.SenTable[i].SenDev = LM80_ADDR;
  720. }
  721. /* Now we are "INIT data"ed */
  722. pAC->I2c.InitLevel = SK_INIT_DATA;
  723. return(0);
  724. } /* SkI2cInit0*/
  725. /*
  726.  * Do the init state 1 initialization
  727.  *
  728.  * initialize the following register of the LM80:
  729.  * Configuration register:
  730.  * - START, noINT, activeLOW, noINT#Clear, noRESET, noCI, noGPO#, noINIT
  731.  *
  732.  * Interrupt Mask Register 1:
  733.  * - all interrupts are Disabled (0xff)
  734.  *
  735.  * Interrupt Mask Register 2:
  736.  * - all interrupts are Disabled (0xff) Interrupt modi doesn't matter.
  737.  *
  738.  * Fan Divisor/RST_OUT register:
  739.  * - Divisors set to 1 (bits 00), all others 0s.
  740.  *
  741.  * OS# Configuration/Temperature resolution Register:
  742.  * - all 0s
  743.  *
  744.  */
  745. static int SkI2cInit1(
  746. SK_AC *pAC, /* Adapter Context */
  747. SK_IOC IoC) /* I/O Context */
  748. {
  749. if (pAC->I2c.InitLevel != SK_INIT_DATA) {
  750. /* ReInit not needed in I2C module */
  751. return(0);
  752. }
  753. SK_OUT32(IoC, B2_I2C_DATA, 0);
  754. SK_I2C_CTL(IoC, I2C_WRITE, LM80_ADDR, LM80_CFG, 0);
  755. (void)SkI2cWait(pAC, IoC, I2C_WRITE);
  756. SK_OUT32(IoC, B2_I2C_DATA, 0xff);
  757. SK_I2C_CTL(IoC, I2C_WRITE, LM80_ADDR, LM80_IMSK_1, 0);
  758. (void)SkI2cWait(pAC, IoC, I2C_WRITE);
  759. SK_OUT32(IoC, B2_I2C_DATA, 0xff);
  760. SK_I2C_CTL(IoC, I2C_WRITE, LM80_ADDR, LM80_IMSK_2, 0);
  761. (void)SkI2cWait(pAC, IoC, I2C_WRITE);
  762. SK_OUT32(IoC, B2_I2C_DATA, 0x0);
  763. SK_I2C_CTL(IoC, I2C_WRITE, LM80_ADDR, LM80_FAN_CTRL, 0);
  764. (void)SkI2cWait(pAC, IoC, I2C_WRITE);
  765. SK_OUT32(IoC, B2_I2C_DATA, 0);
  766. SK_I2C_CTL(IoC, I2C_WRITE, LM80_ADDR, LM80_TEMP_CTRL, 0);
  767. (void)SkI2cWait(pAC, IoC, I2C_WRITE);
  768. SK_OUT32(IoC, B2_I2C_DATA, LM80_CFG_START);
  769. SK_I2C_CTL(IoC, I2C_WRITE, LM80_ADDR, LM80_CFG, 0);
  770. (void)SkI2cWait(pAC, IoC, I2C_WRITE);
  771. /*
  772.  * MaxSens has to be initialized here, because PhyType is not
  773.  * set when performing Init Level 1
  774.  */
  775. switch (pAC->GIni.GP[0].PhyType) {
  776. case SK_PHY_XMAC:
  777. pAC->I2c.MaxSens = 5;
  778. break;
  779. case SK_PHY_BCOM:
  780. pAC->I2c.SenTable[4].SenDesc = "Voltage PHY A PLL";
  781. if (pAC->GIni.GIMacsFound == 1) {
  782. pAC->I2c.MaxSens = 6;
  783. else {
  784. pAC->I2c.MaxSens = 8;
  785. }
  786. break;
  787. case SK_PHY_LONE:
  788. pAC->I2c.MaxSens = 5;
  789. break;
  790. }
  791. #ifndef SK_DIAG
  792. pAC->I2c.DummyReads = pAC->I2c.MaxSens;
  793. /* Clear the interrupt source */
  794. SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
  795. #endif /* !SK_DIAG */
  796. /* Now we are I/O initialized */
  797. pAC->I2c.InitLevel = SK_INIT_IO;
  798. return(0);
  799. } /* SkI2cInit1 */
  800. /*
  801.  * Init level 2: Start first sensor read.
  802.  */
  803. static int SkI2cInit2(
  804. SK_AC *pAC, /* Adapter Context */
  805. SK_IOC IoC) /* I/O Context */
  806. {
  807. int ReadComplete;
  808. SK_SENSOR *pSen;
  809. if (pAC->I2c.InitLevel != SK_INIT_IO) {
  810. /* ReInit not needed in I2C module */
  811. /* Init0 and Init2 not permitted */
  812. return(0);
  813. }
  814. pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
  815. ReadComplete = SkI2cReadSensor(pAC, IoC, pSen);
  816. if (ReadComplete) {
  817. SK_ERR_LOG(pAC, SK_ERRCL_INIT, SKERR_I2C_E008, SKERR_I2C_E008MSG);
  818. }
  819. /* Now we are correctly initialized */
  820. pAC->I2c.InitLevel = SK_INIT_RUN;
  821. return(0);
  822. } /* SkI2cInit2*/
  823. /*
  824.  * Initialize I2C devices
  825.  *
  826.  * Get the first voltage value and discard it.
  827.  * Go into temperature read mode. A default pointer is not set.
  828.  *
  829.  * The things to be done depend on the init level in the parameter list:
  830.  * Level 0:
  831.  * Initialize only the data structures. Do NOT access hardware.
  832.  * Level 1:
  833.  * Initialize hardware through SK_IN / SK_OUT commands. Do NOT use interrupts.
  834.  * Level 2:
  835.  * Everything is possible. Interrupts may be used from now on.
  836.  *
  837.  * return:
  838.  * 0 = success
  839.  * other = error.
  840.  */
  841. int SkI2cInit(
  842. SK_AC *pAC, /* Adapter Context */
  843. SK_IOC IoC, /* I/O Context needed in levels 1 and 2 */
  844. int Level) /* Init Level */
  845. {
  846. switch (Level) {
  847. case SK_INIT_DATA:
  848. return(SkI2cInit0(pAC));
  849. case SK_INIT_IO:
  850. return(SkI2cInit1(pAC, IoC));
  851. case SK_INIT_RUN:
  852. return(SkI2cInit2(pAC, IoC));
  853. default:
  854. break;
  855. }
  856. return(0);
  857. } /* SkI2cInit */
  858. #ifndef SK_DIAG
  859. /*
  860.  * Interrupt service function for the I2C Interface
  861.  *
  862.  * Clears the Interrupt source
  863.  *
  864.  * Reads the register and check it for sending a trap.
  865.  *
  866.  * Starts the timer if necessary.
  867.  */
  868. void SkI2cIsr(
  869. SK_AC *pAC, /* Adapter Context */
  870. SK_IOC IoC) /* I/O Context */
  871. {
  872. SK_EVPARA Para;
  873. /* Clear the interrupt source */
  874. SK_OUT32(IoC, B2_I2C_IRQ, I2C_CLR_IRQ);
  875. Para.Para64 = 0;
  876. SkEventQueue(pAC, SKGE_I2C, SK_I2CEV_IRQ, Para);
  877. } /* SkI2cIsr */
  878. /*
  879.  * Check this sensors Value against the threshold and send events.
  880.  */
  881. static void SkI2cCheckSensor(
  882. SK_AC *pAC, /* Adapter Context */
  883. SK_SENSOR *pSen)
  884. {
  885. SK_EVPARA ParaLocal;
  886. SK_BOOL TooHigh; /* Is sensor too high? */
  887. SK_BOOL TooLow; /* Is sensor too low? */
  888. SK_U64 CurrTime; /* Current Time */
  889. SK_BOOL DoTrapSend; /* We need to send a trap */
  890. SK_BOOL DoErrLog; /* We need to log the error */
  891. SK_BOOL IsError; /* We need to log the error */
  892. /* Check Dummy Reads first */
  893. if (pAC->I2c.DummyReads > 0) {
  894. pAC->I2c.DummyReads --;
  895. return;
  896. }
  897. /* Get the current time */
  898. CurrTime = SkOsGetTime(pAC);
  899. /* Set para to the most useful setting: The current sensor. */
  900. ParaLocal.Para64 = (SK_U64) pAC->I2c.CurrSens;
  901. /* Check the Value against the thresholds. First: Error Thresholds */
  902. TooHigh = (pSen->SenValue > pSen->SenThreErrHigh);
  903. TooLow = (pSen->SenValue < pSen->SenThreErrLow);
  904. IsError = SK_FALSE;
  905. if (TooHigh || TooLow) {
  906. /* Error condition is satisfied */
  907. DoTrapSend = SK_TRUE;
  908. DoErrLog = SK_TRUE;
  909. /* Now error condition is satisfied */
  910. IsError = SK_TRUE;
  911. if (pSen->SenErrFlag == SK_SEN_ERR_ERR) {
  912. /* This state is the former one */
  913. /* So check first whether we have to send a trap */
  914. if (pSen->SenLastErrTrapTS + SK_SEN_ERR_TR_HOLD >
  915.     CurrTime) {
  916. /*
  917.  * Do NOT send the Trap. The hold back time
  918.  * has to run out first.
  919.  */
  920. DoTrapSend = SK_FALSE;
  921. }
  922. /* Check now whether we have to log an Error */
  923. if (pSen->SenLastErrLogTS + SK_SEN_ERR_LOG_HOLD >
  924.     CurrTime) {
  925. /*
  926.  * Do NOT log the error. The hold back time
  927.  * has to run out first.
  928.  */
  929. DoErrLog = SK_FALSE;
  930. }
  931. } else {
  932. /* We came from a different state */
  933. /* -> Set Begin Time Stamp */
  934. pSen->SenBegErrTS = CurrTime;
  935. pSen->SenErrFlag = SK_SEN_ERR_ERR;
  936. }
  937. if (DoTrapSend) {
  938. /* Set current Time */
  939. pSen->SenLastErrTrapTS = CurrTime;
  940. pSen->SenErrCts ++;
  941. /* Queue PNMI Event */
  942. SkEventQueue(pAC, SKGE_PNMI, (TooHigh ?
  943. SK_PNMI_EVT_SEN_ERR_UPP :
  944. SK_PNMI_EVT_SEN_ERR_LOW),
  945. ParaLocal);
  946. }
  947. if (DoErrLog) {
  948. /* Set current Time */
  949. pSen->SenLastErrLogTS = CurrTime;
  950. if (pSen->SenType == SK_SEN_TEMP) {
  951. SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E011,
  952. SKERR_I2C_E011MSG);
  953. } else if (pSen->SenType == SK_SEN_VOLT) {
  954. SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E012,
  955. SKERR_I2C_E012MSG);
  956. } else
  957. {
  958. SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E015,
  959. SKERR_I2C_E015MSG);
  960. }
  961. }
  962. }
  963. /* Check the Value against the thresholds */
  964. /* 2nd: Warning thresholds */
  965. TooHigh = (pSen->SenValue > pSen->SenThreWarnHigh);
  966. TooLow = (pSen->SenValue < pSen->SenThreWarnLow);
  967. if (!IsError && (TooHigh || TooLow)) {
  968. /* Error condition is satisfied */
  969. DoTrapSend = SK_TRUE;
  970. DoErrLog = SK_TRUE;
  971. if (pSen->SenErrFlag == SK_SEN_ERR_WARN) {
  972. /* This state is the former one */
  973. /* So check first whether we have to send a trap */
  974. if (pSen->SenLastWarnTrapTS + SK_SEN_WARN_TR_HOLD >
  975.     CurrTime) {
  976. /*
  977.  * Do NOT send the Trap. The hold back time
  978.  * has to run out first.
  979.  */
  980. DoTrapSend = SK_FALSE;
  981. }
  982. /* Check now whether we have to log an Error */
  983. if (pSen->SenLastWarnLogTS + SK_SEN_WARN_LOG_HOLD >
  984.     CurrTime) {
  985. /*
  986.  * Do NOT log the error. The hold back time
  987.  * has to run out first.
  988.  */
  989. DoErrLog = SK_FALSE;
  990. }
  991. } else {
  992. /* We came from a different state */
  993. /* -> Set Begin Time Stamp */
  994. pSen->SenBegWarnTS = CurrTime;
  995. pSen->SenErrFlag = SK_SEN_ERR_WARN;
  996. }
  997. if (DoTrapSend) {
  998. /* Set current Time */
  999. pSen->SenLastWarnTrapTS = CurrTime;
  1000. pSen->SenWarnCts ++;
  1001. /* Queue PNMI Event */
  1002. SkEventQueue(pAC, SKGE_PNMI, (TooHigh ?
  1003. SK_PNMI_EVT_SEN_WAR_UPP :
  1004. SK_PNMI_EVT_SEN_WAR_LOW),
  1005. ParaLocal);
  1006. }
  1007. if (DoErrLog) {
  1008. /* Set current Time */
  1009. pSen->SenLastWarnLogTS = CurrTime;
  1010. if (pSen->SenType == SK_SEN_TEMP) {
  1011. SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E009,
  1012. SKERR_I2C_E009MSG);
  1013. } else if (pSen->SenType == SK_SEN_VOLT) {
  1014. SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E010,
  1015. SKERR_I2C_E010MSG);
  1016. } else
  1017. {
  1018. SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E014,
  1019. SKERR_I2C_E014MSG);
  1020. }
  1021. }
  1022. }
  1023. /* Check for NO error at all */
  1024. if (!IsError && !TooHigh && !TooLow) {
  1025. /* Set o.k. Status if no error and no warning condition */
  1026. pSen->SenErrFlag = SK_SEN_ERR_OK;
  1027. }
  1028. /* End of check against the thresholds */
  1029. /*
  1030.  * Check initialization state:
  1031.  * The VIO Thresholds need adaption
  1032.  */
  1033. if (!pSen->SenInit && pSen->SenReg == LM80_VT1_IN &&
  1034.      pSen->SenValue > SK_SEN_WARNLOW2C &&
  1035.      pSen->SenValue < SK_SEN_WARNHIGH2) {
  1036. pSen->SenThreErrLow = SK_SEN_ERRLOW2C; 
  1037. pSen->SenThreWarnLow = SK_SEN_WARNLOW2C; 
  1038. pSen->SenInit = SK_TRUE;
  1039. }
  1040. if (!pSen->SenInit && pSen->SenReg == LM80_VT1_IN &&
  1041.      pSen->SenValue > SK_SEN_WARNLOW2 &&
  1042.      pSen->SenValue < SK_SEN_WARNHIGH2C) {
  1043. pSen->SenThreErrHigh = SK_SEN_ERRHIGH2C; 
  1044. pSen->SenThreWarnHigh = SK_SEN_WARNHIGH2C; 
  1045. pSen->SenInit = SK_TRUE;
  1046. }
  1047. if (!pSen->SenInit) {
  1048. SK_ERR_LOG(pAC, SK_ERRCL_HW, SKERR_I2C_E013, SKERR_I2C_E013MSG);
  1049. }
  1050. } /* SkI2cCheckSensor*/
  1051. /*
  1052.  * The only Event to be served is the timeout event
  1053.  *
  1054.  */
  1055. int SkI2cEvent(
  1056. SK_AC *pAC, /* Adapter Context */
  1057. SK_IOC IoC, /* I/O Context */
  1058. SK_U32 Event, /* Module specific Event */
  1059. SK_EVPARA Para) /* Event specific Parameter */
  1060. {
  1061. int ReadComplete;
  1062. SK_SENSOR *pSen;
  1063. SK_U32 Time;
  1064. SK_EVPARA ParaLocal;
  1065. int i;
  1066. switch (Event) {
  1067. case SK_I2CEV_IRQ:
  1068. case SK_I2CEV_TIM:
  1069. pSen = &pAC->I2c.SenTable[pAC->I2c.CurrSens];
  1070. ReadComplete = SkI2cReadSensor(pAC, IoC, pSen);
  1071. if (ReadComplete) {
  1072. /* Check sensor against defined thresholds */
  1073. SkI2cCheckSensor (pAC, pSen);
  1074. /* Increment Current and set appropriate Timeout */
  1075. Time = SK_I2C_TIM_SHORT;
  1076. pAC->I2c.CurrSens ++;
  1077. if (pAC->I2c.CurrSens == pAC->I2c.MaxSens) {
  1078. pAC->I2c.CurrSens = 0;
  1079. Time = SK_I2C_TIM_LONG;
  1080. }
  1081. /* Start Timer */
  1082. ParaLocal.Para64 = (SK_U64) 0;
  1083. SkTimerStart(pAC, IoC, &pAC->I2c.SenTimer, Time,
  1084. SKGE_I2C, SK_I2CEV_TIM, ParaLocal);
  1085. }
  1086. break;
  1087. case SK_I2CEV_CLEAR:
  1088. for (i = 0; i < SK_MAX_SENSORS; i ++) {
  1089. pAC->I2c.SenTable[i].SenErrFlag = SK_SEN_ERR_OK;
  1090. pAC->I2c.SenTable[i].SenErrCts = 0;
  1091. pAC->I2c.SenTable[i].SenWarnCts = 0;
  1092. pAC->I2c.SenTable[i].SenBegErrTS = 0;
  1093. pAC->I2c.SenTable[i].SenBegWarnTS = 0;
  1094. pAC->I2c.SenTable[i].SenLastErrTrapTS = (SK_U64)0;
  1095. pAC->I2c.SenTable[i].SenLastErrLogTS = (SK_U64)0;
  1096. pAC->I2c.SenTable[i].SenLastWarnTrapTS = (SK_U64)0;
  1097. pAC->I2c.SenTable[i].SenLastWarnLogTS = (SK_U64)0;
  1098. }
  1099. break;
  1100. default:
  1101. SK_ERR_LOG(pAC, SK_ERRCL_SW, SKERR_I2C_E006, SKERR_I2C_E006MSG);
  1102. }
  1103. return(0);
  1104. } /* SkI2cEvent*/
  1105. #endif /* !SK_DIAG */