2828#define SIO_DRVNAME "SMF"
2929#define DEBUG 1
3030#define LABELS 1
31+ #define SMF_VERSION_ADDR 0x0000
3132
3233#define FANIN_MAX 12 /* Counted from 1 */
3334#define VSEN_MAX 48 /* VSEN1.. */
@@ -471,6 +472,35 @@ static int smf_read_reg16(struct smf_data *data, u16 reg)
471472 return res ;
472473}
473474
475+ /* SMF Version */
476+ static ssize_t show_smf_version (struct device * dev ,
477+ struct device_attribute * devattr , char * buf )
478+ {
479+ int index = to_sensor_dev_attr (devattr )-> index ;
480+ unsigned int ret = 0 ;
481+ unsigned int smf_version = 0 ;
482+ unsigned int smf_firmware_major_ver = 0 ;
483+ unsigned int smf_firmware_minor_ver = 0 ;
484+ struct smf_data * data = dev_get_drvdata (dev );
485+
486+ ret = smf_read_reg (data , (SMF_VERSION_ADDR + index * 2 ));
487+
488+ printk ("smf_firmware_details-->0x%x index[%d]" , ret , index );
489+
490+ if (index > 0 ) {
491+ smf_firmware_major_ver = ((ret & (0xC0 )) >> 6 );
492+ smf_firmware_minor_ver = (ret & (0x3F ));
493+
494+ ret = sprintf (buf , "%u.%u\n" , smf_firmware_major_ver ,
495+ smf_firmware_minor_ver );
496+ } else {
497+ smf_version = ret ;
498+ ret = sprintf (buf , "%u\n" , smf_version );
499+ }
500+
501+ return ret ;
502+ }
503+
474504
475505/* FANIN ATTR */
476506static ssize_t
@@ -514,6 +544,9 @@ static ssize_t show_fan(struct device *dev,
514544 if (ret < 0 )
515545 return ret ;
516546
547+ if (ret & 0x8000 )
548+ ret = - (ret & 0x7fff );
549+
517550 rpm = ret ;
518551
519552 if (export_hex )
@@ -1327,23 +1360,28 @@ static ssize_t show_temp_crit(struct device *dev,
13271360}
13281361
13291362
1330- /* static ssize_t show_temp_alarm(struct device *dev,
1363+ static ssize_t show_temp_alarm (struct device * dev ,
13311364 struct device_attribute * devattr , char * buf )
13321365{
13331366 int index = to_sensor_dev_attr (devattr )-> index ;
13341367 struct smf_data * data = dev_get_drvdata (dev );
1335- int ret;
1336- int temp;
1368+ int ret = 0 ;
1369+ int temp = 0 ;
13371370
1338- ret = smf_read_reg16 (data, TEMP_SENSOR_1_STATUS + index * 2 );
1371+ ret = smf_read_reg (data , TEMP_SENSOR_1_STATUS + index );
13391372
1340- if (ret < 0)
1341- return ret;
1373+ if (ret < 0 ) {
1374+ return ret ;
1375+ }
1376+
1377+ if (ret == 0xff ) {
1378+ ret = 0 ;
1379+ }
13421380
13431381 temp = ret ;
13441382
13451383 return sprintf (buf , "%d\n" , temp );
1346- }*/
1384+ }
13471385
13481386
13491387static umode_t smf_tcpu_is_visible (struct kobject * kobj ,
@@ -1432,6 +1470,25 @@ static SENSOR_DEVICE_ATTR(temp13_max, S_IRUGO, show_temp_crit, NULL, 50);
14321470static SENSOR_DEVICE_ATTR (temp14_max , S_IRUGO , show_temp_crit , NULL, 46 ) ;
14331471static SENSOR_DEVICE_ATTR (temp15_max , S_IRUGO , show_temp_crit , NULL, 50 ) ;
14341472
1473+ static SENSOR_DEVICE_ATTR (temp1_alarm , S_IRUGO , show_temp_alarm , NULL, 0 ) ;
1474+ static SENSOR_DEVICE_ATTR (temp2_alarm , S_IRUGO , show_temp_alarm , NULL, 1 ) ;
1475+ static SENSOR_DEVICE_ATTR (temp3_alarm , S_IRUGO , show_temp_alarm , NULL, 2 ) ;
1476+ static SENSOR_DEVICE_ATTR (temp4_alarm , S_IRUGO , show_temp_alarm , NULL, 3 ) ;
1477+ static SENSOR_DEVICE_ATTR (temp5_alarm , S_IRUGO , show_temp_alarm , NULL, 4 ) ;
1478+ static SENSOR_DEVICE_ATTR (temp6_alarm , S_IRUGO , show_temp_alarm , NULL, 5 ) ;
1479+ static SENSOR_DEVICE_ATTR (temp7_alarm , S_IRUGO , show_temp_alarm , NULL, 6 ) ;
1480+ static SENSOR_DEVICE_ATTR (temp8_alarm , S_IRUGO , show_temp_alarm , NULL, 7 ) ;
1481+ static SENSOR_DEVICE_ATTR (temp9_alarm , S_IRUGO , show_temp_alarm , NULL, 8 ) ;
1482+ static SENSOR_DEVICE_ATTR (temp10_alarm , S_IRUGO , show_temp_alarm , NULL, 9 ) ;
1483+ static SENSOR_DEVICE_ATTR (temp11_alarm , S_IRUGO , show_temp_alarm , NULL, 10 ) ;
1484+ static SENSOR_DEVICE_ATTR (temp12_alarm , S_IRUGO , show_temp_alarm , NULL, 11 ) ;
1485+ static SENSOR_DEVICE_ATTR (temp13_alarm , S_IRUGO , show_temp_alarm , NULL, 12 ) ;
1486+
1487+ static SENSOR_DEVICE_ATTR (temp14_alarm , S_IRUGO , show_temp_alarm , NULL, 13 ) ;
1488+ static SENSOR_DEVICE_ATTR (temp15_alarm , S_IRUGO , show_temp_alarm , NULL, 14 ) ;
1489+
1490+
1491+
14351492
14361493static struct attribute * smf_tcpu_attrs [] = {
14371494 & sensor_dev_attr_temp1_input .dev_attr .attr ,
@@ -1498,6 +1555,23 @@ static struct attribute *smf_tcpu_attrs[] = {
14981555 & sensor_dev_attr_temp14_max .dev_attr .attr ,
14991556 & sensor_dev_attr_temp15_max .dev_attr .attr ,
15001557
1558+ & sensor_dev_attr_temp1_alarm .dev_attr .attr ,
1559+ & sensor_dev_attr_temp2_alarm .dev_attr .attr ,
1560+ & sensor_dev_attr_temp3_alarm .dev_attr .attr ,
1561+ & sensor_dev_attr_temp4_alarm .dev_attr .attr ,
1562+ & sensor_dev_attr_temp5_alarm .dev_attr .attr ,
1563+ & sensor_dev_attr_temp6_alarm .dev_attr .attr ,
1564+ & sensor_dev_attr_temp7_alarm .dev_attr .attr ,
1565+ & sensor_dev_attr_temp8_alarm .dev_attr .attr ,
1566+ & sensor_dev_attr_temp9_alarm .dev_attr .attr ,
1567+ & sensor_dev_attr_temp10_alarm .dev_attr .attr ,
1568+ & sensor_dev_attr_temp11_alarm .dev_attr .attr ,
1569+ & sensor_dev_attr_temp12_alarm .dev_attr .attr ,
1570+ & sensor_dev_attr_temp13_alarm .dev_attr .attr ,
1571+ & sensor_dev_attr_temp14_alarm .dev_attr .attr ,
1572+ & sensor_dev_attr_temp15_alarm .dev_attr .attr ,
1573+
1574+
15011575 NULL
15021576};
15031577
@@ -1525,26 +1599,36 @@ static ssize_t show_psu(struct device *dev,
15251599 struct smf_data * data = dev_get_drvdata (dev );
15261600 int ret = 0 , export_hex = 0 ;
15271601 int psu_status = 0 , pow ;
1602+ int pow_val = 0 ;
15281603
15291604 switch (index ) {
15301605
15311606 case 0 :
15321607 pow = smf_read_reg16 (data , PSU_1_MAX_POWER );
1533- /* TODO Fix */
1534- if (data -> kind == s6100smf )
1535- ret = 1000000 * 1100 ;
1536- else
1537- ret = 1000000 * 750 ;
1608+ if (data -> kind == s6100smf )
1609+ ret = 1000000 * 1100 ;
1610+ else
1611+ ret = 1000000 * 750 ;
15381612 break ;
15391613 case 1 :
15401614 ret = smf_read_reg (data , PSU_1_STATUS );
15411615 export_hex = 1 ;
15421616 break ;
15431617 case 2 :
1544- ret = 100000 * smf_read_reg16 (data , PSU_1_INPUT_POWER );
1618+ pow_val = smf_read_reg16 (data , PSU_1_INPUT_POWER );
1619+ /* In case of absent psu, pow_val will be 0xffff */
1620+ if (pow_val == 0xffff ) {
1621+ pow_val = 0 ;
1622+ }
1623+ ret = 100000 * pow_val ;
15451624 break ;
15461625 case 3 :
1547- ret = 100000 * smf_read_reg16 (data , PSU_1_OUTPUT_POWER );
1626+ pow_val = smf_read_reg16 (data , PSU_1_OUTPUT_POWER );
1627+ /* In case of absent psu, pow_val will be 0xffff */
1628+ if (pow_val == 0xffff ) {
1629+ pow_val = 0 ;
1630+ }
1631+ ret = 100000 * pow_val ;
15481632 break ;
15491633 case 4 :
15501634 psu_status = smf_read_reg (data , PSU_1_STATUS );
@@ -1554,21 +1638,30 @@ static ssize_t show_psu(struct device *dev,
15541638 case 5 :
15551639 pow = smf_read_reg16 (data , PSU_2_MAX_POWER );
15561640 ret = 1000000 * pow ;
1557- /* TODO Fix */
1558- if (data -> kind == s6100smf )
1559- ret = 1000000 * 1100 ;
1560- else
1561- ret = 1000000 * 750 ;
1641+ if (data -> kind == s6100smf )
1642+ ret = 1000000 * 1100 ;
1643+ else
1644+ ret = 1000000 * 750 ;
15621645 break ;
15631646 case 6 :
15641647 ret = smf_read_reg (data , PSU_2_STATUS );
15651648 export_hex = 1 ;
15661649 break ;
15671650 case 7 :
1568- ret = 100000 * smf_read_reg16 (data , PSU_2_INPUT_POWER );
1651+ pow_val = smf_read_reg16 (data , PSU_2_INPUT_POWER );
1652+ /* In case of absent psu, pow_val will be 0xffff */
1653+ if (pow_val == 0xffff ) {
1654+ pow_val = 0 ;
1655+ }
1656+ ret = 100000 * pow_val ;
15691657 break ;
15701658 case 8 :
1571- ret = 100000 * smf_read_reg16 (data , PSU_2_OUTPUT_POWER );
1659+ pow_val = smf_read_reg16 (data , PSU_2_OUTPUT_POWER );
1660+ /* In case of absent psu, pow_val will be 0xffff */
1661+ if (pow_val == 0xffff ) {
1662+ pow_val = 0 ;
1663+ }
1664+ ret = 100000 * pow_val ;
15721665 break ;
15731666 case 9 :
15741667 psu_status = smf_read_reg (data , PSU_2_STATUS );
@@ -1577,6 +1670,10 @@ static ssize_t show_psu(struct device *dev,
15771670 break ;
15781671 case 10 :
15791672 pow = smf_read_reg16 (data , CURRENT_TOTAL_POWER );
1673+ /* In case of both psu absent, pow will be 0xffff */
1674+ if (pow == 0xffff ) {
1675+ pow = 0 ;
1676+ }
15801677 ret = pow /10 ;
15811678 break ;
15821679 default :
@@ -1678,7 +1775,14 @@ static SENSOR_DEVICE_ATTR(psu1_presence, S_IRUGO, show_psu, NULL, 1);
16781775static SENSOR_DEVICE_ATTR (psu2_presence , S_IRUGO , show_psu , NULL, 6 ) ;
16791776static SENSOR_DEVICE_ATTR (current_total_power , S_IRUGO , show_psu , NULL, 10 ) ;
16801777
1778+ /* SMF Version */
1779+ static SENSOR_DEVICE_ATTR (smf_version , S_IRUGO , show_smf_version , NULL, 0 ) ;
1780+ static SENSOR_DEVICE_ATTR (smf_firmware_ver , S_IRUGO , show_smf_version , NULL, 1 ) ;
1781+
1782+
16811783static struct attribute * smf_dell_attrs [] = {
1784+ & sensor_dev_attr_smf_version .dev_attr .attr ,
1785+ & sensor_dev_attr_smf_firmware_ver .dev_attr .attr ,
16821786 & sensor_dev_attr_fan_tray_presence .dev_attr .attr ,
16831787 & sensor_dev_attr_fan1_airflow .dev_attr .attr ,
16841788 & sensor_dev_attr_fan3_airflow .dev_attr .attr ,
0 commit comments