Changeset 2934

Show
Ignore:
Timestamp:
03/19/05 03:50:35 (10 years ago)
Author:
mds
Message:

support IPMI version 0.9.

Patch from Yani Ioannou <yani.ioannou@…>
 http://bmcsensors-26.sourceforge.net/
and tested by him and others,
based on a previous patch from
Vladislav Bogdanov <slava@…> located here:
 http://bubble.nsys.by/projects/ipmi/

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • lm-sensors/trunk/kernel/chips/bmcsensors.c

    r2817 r2934  
    153153 
    154154#define IPMI_SDR_SIZE 67 
    155 static int ipmi_sdr_partial_size = IPMI_SDR_SIZE; 
     155#define IPMI_CHUNK_SIZE 16 
     156static int ipmi_sdr_partial_size = IPMI_CHUNK_SIZE; 
    156157static struct ipmi_msg tx_message;      /* send message */ 
    157158static unsigned char tx_msg_data[IPMI_MAX_MSG_LENGTH + 50]; 
     
    464465        int i; 
    465466        int rstate = STATE_SDR; 
     467        int ipmi_ver = 0; 
    466468        unsigned char * data; 
    467469        u8 id[SDR_MAX_UNPACKED_ID_LENGTH]; 
     
    517519                init = data[13]; 
    518520*/ 
    519                 stype = data[15]; 
     521                stype = data[(ipmi_ver == 0x90?16:15)]; 
    520522                if(stype <= STYPE_MAX) {        /* known sensor type */ 
    521523                        if(bmcs_count[stype] >= bmcs_max[stype]) { 
     
    535537                                       MAX_SDR_ENTRIES); 
    536538                                nextrecord = 0xffff; 
    537                         } else if(data[16] != 0x01) { 
     539                        } else if(data[(ipmi_ver == 0x90?17:16)] != 0x01) { 
    538540                                if(type == 1) 
    539541                                        ipmi_sprintf(id, &data[51], data[50] >> 6, data[50] & 0x1f); 
    540542                                else 
    541                                         ipmi_sprintf(id, &data[35], data[34] >> 6, data[34] & 0x1f); 
     543                                        ipmi_sprintf(id, &data[(ipmi_ver == 0x90?30:35)], data[(ipmi_ver == 0x90?29:34)] >> 6, data[(ipmi_ver == 0x90?29:34)] & 0x1f); 
    542544                                printk(KERN_INFO 
    543545                                       "bmcsensors.o: skipping non-threshold sensor \"%s\"\n", 
     
    547549                                sdrd[sdrd_count].stype = stype; 
    548550                                sdrd[sdrd_count].number = data[10]; 
    549                                 sdrd[sdrd_count].capab = data[14]; 
    550                                 sdrd[sdrd_count].thresh_mask = (((u16) data[22]) << 8) | data[21]; 
     551                                sdrd[sdrd_count].capab = data[(ipmi_ver == 0x90?15:14)]; 
     552                                sdrd[sdrd_count].thresh_mask = (((u16) data[(ipmi_ver == 0x90?21:22)]) << 8) | data[21]; 
    551553                                if(type == 1) { 
    552                                         sdrd[sdrd_count].format = data[24] >> 6; 
    553                                         sdrd[sdrd_count].linear = data[26] & 0x7f; 
    554                                         sdrd[sdrd_count].m = data[27]; 
    555                                         sdrd[sdrd_count].m |= ((u16) (data[28] & 0xc0)) << 2; 
     554                                        sdrd[sdrd_count].format = data[(ipmi_ver == 0x90?22:24)] >> 6; 
     555                                        sdrd[sdrd_count].linear = data[(ipmi_ver == 0x90?25:26)] & 0x7f; 
     556                                        sdrd[sdrd_count].m = data[(ipmi_ver == 0x90?26:27)]; 
     557                                        sdrd[sdrd_count].m |= ((u16) (data[(ipmi_ver == 0x90?27:28)] & 0xc0)) << 2; 
    556558                                        if(sdrd[sdrd_count].m & 0x0200) 
    557559                                                sdrd[sdrd_count].m |= 0xfc00;   /* sign extend */ 
    558                                         sdrd[sdrd_count].b = data[29]; 
    559                                         sdrd[sdrd_count].b |= ((u16) (data[30] & 0xc0)) << 2; 
     560                                        sdrd[sdrd_count].b = data[(ipmi_ver == 0x90?28:29)]; 
     561                                        sdrd[sdrd_count].b |= ((u16) (data[(ipmi_ver == 0x90?29:30)] & 0xc0)) << 2; 
    560562                                        if(sdrd[sdrd_count].b & 0x0200) 
    561563                                                sdrd[sdrd_count].b |= 0xfc00;   /* sign extend */ 
    562                                         sdrd[sdrd_count].k = data[32]; 
    563                                         sdrd[sdrd_count].nominal = data[34]; 
     564                                        sdrd[sdrd_count].k = data[(ipmi_ver == 0x90?31:32)]; 
     565                                        sdrd[sdrd_count].nominal = data[(ipmi_ver == 0x90?33:34)]; 
    564566                                        for(i = 0; i < SDR_LIMITS; i++)         /* assume readable */ 
    565                                                 sdrd[sdrd_count].limits[i] = data[39 + i]; 
     567                                                sdrd[sdrd_count].limits[i] = data[(ipmi_ver == 0x90?40:39) + i]; 
    566568                                        sdrd[sdrd_count].string_type = data[50] >> 6; 
    567569                                        id_length = data[50] & 0x1f; 
     
    572574                                        sdrd[sdrd_count].b = 0; 
    573575                                        sdrd[sdrd_count].k = 0; 
    574                                         sdrd[sdrd_count].string_type = data[34] >> 6; 
     576                                        sdrd[sdrd_count].string_type = data[(ipmi_ver == 0x90?29:34)] >> 6; 
    575577                                        id_length = data[34] & 0x1f; 
    576578                                        if(id_length > 0) 
    577                                                 memcpy(sdrd[sdrd_count].id, &data[35], id_length); 
     579                                                memcpy(sdrd[sdrd_count].id, &data[(ipmi_ver == 0x90?30:35)], id_length); 
    578580                                        sdrd[sdrd_count].id_length = id_length; 
    579581                                        /* limits?? */ 
     582                                        if(ipmi_ver == 0x90){ 
     583                                                memcpy(sdrd[sdrd_count].id, &data[30], id_length); 
     584                                                sdrd[sdrd_count].id_length = id_length; 
     585                                        } 
    580586                                } 
    581587                                bmcs_count[stype]++; 
     
    612618          nextrecord = 0xffff; /*YJ stop sensor scan on poweredge 1750 */ 
    613619        } 
    614                          
     620        if (ipmi_ver != 0x90) { 
     621                if (nextrecord>=6224) { 
     622                        nextrecord = 0xffff; /*YJ stop sensor scan on poweredge 1750 */ 
     623                } 
     624        } 
     625                 
    615626        if(nextrecord == 0xFFFF) { 
    616627                if(sdrd_count == 0) { 
     
    822833        rx_msg_data_offset = 0; 
    823834        errorcount = 0; 
    824         ipmi_sdr_partial_size = IPMI_SDR_SIZE; 
     835        ipmi_sdr_partial_size = IPMI_CHUNK_SIZE; 
    825836        for(i = 0; i <= STYPE_MAX; i++) 
    826837                bmcs_count[i] = 0;