Blame lib/ipmi_gendev.c

Packit d14fb6
/*
Packit d14fb6
 * Copyright (c) 2003 Kontron Canada, Inc.  All Rights Reserved.
Packit d14fb6
 *
Packit d14fb6
 * Redistribution and use in source and binary forms, with or without
Packit d14fb6
 * modification, are permitted provided that the following conditions
Packit d14fb6
 * are met:
Packit d14fb6
 *
Packit d14fb6
 * Redistribution of source code must retain the above copyright
Packit d14fb6
 * notice, this list of conditions and the following disclaimer.
Packit d14fb6
 *
Packit d14fb6
 * Redistribution in binary form must reproduce the above copyright
Packit d14fb6
 * notice, this list of conditions and the following disclaimer in the
Packit d14fb6
 * documentation and/or other materials provided with the distribution.
Packit d14fb6
 *
Packit d14fb6
 * Neither the name of Sun Microsystems, Inc. or the names of
Packit d14fb6
 * contributors may be used to endorse or promote products derived
Packit d14fb6
 * from this software without specific prior written permission.
Packit d14fb6
 *
Packit d14fb6
 * This software is provided "AS IS," without a warranty of any kind.
Packit d14fb6
 * ALL EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES,
Packit d14fb6
 * INCLUDING ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A
Packit d14fb6
 * PARTICULAR PURPOSE OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED.
Packit d14fb6
 * SUN MICROSYSTEMS, INC. ("SUN") AND ITS LICENSORS SHALL NOT BE LIABLE
Packit d14fb6
 * FOR ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING
Packit d14fb6
 * OR DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES.  IN NO EVENT WILL
Packit d14fb6
 * SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA,
Packit d14fb6
 * OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL, INCIDENTAL OR
Packit d14fb6
 * PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY OF
Packit d14fb6
 * LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,
Packit d14fb6
 * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
Packit d14fb6
 */
Packit d14fb6
Packit d14fb6
#include <string.h>
Packit d14fb6
Packit d14fb6
#include <math.h>
Packit d14fb6
#include <stdio.h>
Packit d14fb6
#include <unistd.h>
Packit d14fb6
#include <sys/types.h>
Packit d14fb6
#include <time.h>
Packit d14fb6
Packit d14fb6
#include <ipmitool/ipmi.h>
Packit d14fb6
#include <ipmitool/log.h>
Packit d14fb6
#include <ipmitool/ipmi_mc.h>
Packit d14fb6
#include <ipmitool/ipmi_sdr.h>
Packit d14fb6
#include <ipmitool/ipmi_gendev.h>
Packit d14fb6
#include <ipmitool/ipmi_intf.h>
Packit d14fb6
#include <ipmitool/ipmi_sel.h>
Packit d14fb6
#include <ipmitool/ipmi_entity.h>
Packit d14fb6
#include <ipmitool/ipmi_constants.h>
Packit d14fb6
#include <ipmitool/ipmi_strings.h>
Packit d14fb6
#include <ipmitool/ipmi_raw.h>
Packit d14fb6
Packit d14fb6
#if HAVE_CONFIG_H
Packit d14fb6
# include <config.h>
Packit d14fb6
#endif
Packit d14fb6
Packit d14fb6
extern int verbose;
Packit d14fb6
Packit d14fb6
Packit d14fb6
#define GENDEV_RETRY_COUNT    5
Packit d14fb6
#define GENDEV_MAX_SIZE       16
Packit d14fb6
Packit d14fb6
typedef struct gendev_eeprom_info
Packit d14fb6
{
Packit d14fb6
   uint32_t size;
Packit d14fb6
   uint16_t page_size;
Packit d14fb6
   uint8_t  address_span;
Packit d14fb6
   uint8_t  address_length;
Packit d14fb6
}t_gendev_eeprom_info;
Packit d14fb6
Packit d14fb6
Packit d14fb6
static int
Packit d14fb6
ipmi_gendev_get_eeprom_size(
Packit d14fb6
                        struct ipmi_intf *intf, 
Packit d14fb6
                        struct sdr_record_generic_locator *dev,
Packit d14fb6
                        t_gendev_eeprom_info *info
Packit d14fb6
                     )
Packit d14fb6
{
Packit d14fb6
   int eeprom_size = 0;
Packit d14fb6
   /*
Packit d14fb6
   lprintf(LOG_ERR, "Gen Device : %s", dev->id_string);
Packit d14fb6
   lprintf(LOG_ERR, "Access Addr: %x", dev->dev_access_addr);
Packit d14fb6
   lprintf(LOG_ERR, "Slave Addr : %x", dev->dev_slave_addr);
Packit d14fb6
   lprintf(LOG_ERR, "Channel Num: %x", dev->channel_num);
Packit d14fb6
   lprintf(LOG_ERR, "Lun        : %x", dev->lun);
Packit d14fb6
   lprintf(LOG_ERR, "Bus        : %x", dev->bus);
Packit d14fb6
   lprintf(LOG_ERR, "Addr Span  : %x", dev->addr_span);
Packit d14fb6
   lprintf(LOG_ERR, "DevType    : %x", dev->dev_type);
Packit d14fb6
   lprintf(LOG_ERR, "DevType Mod: %x", dev->dev_type_modifier);
Packit d14fb6
   */
Packit d14fb6
   if( info != NULL)
Packit d14fb6
   {
Packit d14fb6
      switch(dev->dev_type)
Packit d14fb6
      {
Packit d14fb6
         case 0x08:  // 24C01
Packit d14fb6
            info->size = 128;
Packit d14fb6
            info->page_size = 8;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 1;
Packit d14fb6
         break;   
Packit d14fb6
         case 0x09:  // 24C02
Packit d14fb6
            info->size = 256;
Packit d14fb6
            info->page_size = 8;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 1;
Packit d14fb6
         break;   
Packit d14fb6
         case 0x0A:  // 24C04
Packit d14fb6
            info->size = 512;
Packit d14fb6
            info->page_size = 8;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 2;
Packit d14fb6
         break;   
Packit d14fb6
         case 0x0B:  // 24C08
Packit d14fb6
            info->size = 1024;
Packit d14fb6
            info->page_size = 8;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 2;
Packit d14fb6
         break;   
Packit d14fb6
         case 0x0C:  // 24C16
Packit d14fb6
            info->size = 2048;
Packit d14fb6
            info->page_size = 256;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 2;
Packit d14fb6
         break;   
Packit d14fb6
         case 0x0D:  // 24C17
Packit d14fb6
            info->size = 2048;
Packit d14fb6
            info->page_size = 256;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 2;
Packit d14fb6
         break;   
Packit d14fb6
         case 0x0E:  // 24C32
Packit d14fb6
            info->size = 4096;
Packit d14fb6
            info->page_size = 8;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 2;
Packit d14fb6
         break;   
Packit d14fb6
         case 0x0F:  // 24C64
Packit d14fb6
            info->size = 8192;
Packit d14fb6
            info->page_size = 32;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 2;
Packit d14fb6
         break;   
Packit d14fb6
         case 0xC0:  // Proposed OEM Code for 24C128
Packit d14fb6
            info->size = 16384;
Packit d14fb6
            info->page_size = 64;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 2;
Packit d14fb6
         break;   
Packit d14fb6
         case 0xC1:  // Proposed OEM Code for 24C256
Packit d14fb6
            info->size = 32748;
Packit d14fb6
            info->page_size = 64;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 2;
Packit d14fb6
         break;   
Packit d14fb6
         case 0xC2:  // Proposed OEM Code for 24C512
Packit d14fb6
            info->size = 65536;
Packit d14fb6
            info->page_size = 128;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 2;
Packit d14fb6
         break;
Packit d14fb6
         case 0xC3:  // Proposed OEM Code for 24C1024
Packit d14fb6
            info->size = 131072;
Packit d14fb6
            info->page_size = 128;
Packit d14fb6
            info->address_span = dev->addr_span;
Packit d14fb6
            info->address_length = 2;
Packit d14fb6
         break;
Packit d14fb6
         /* Please reserved up to CFh for future update */    
Packit d14fb6
         default:   // Not a eeprom, return size = 0;
Packit d14fb6
            info->size = 0;
Packit d14fb6
            info->page_size = 0;
Packit d14fb6
            info->address_span = 0;
Packit d14fb6
            info->address_length = 0;
Packit d14fb6
         break;
Packit d14fb6
      }
Packit d14fb6
      
Packit d14fb6
      eeprom_size = info->size;
Packit d14fb6
   }
Packit d14fb6
Packit d14fb6
   return eeprom_size;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
Packit d14fb6
static int
Packit d14fb6
ipmi_gendev_read_file(
Packit d14fb6
                        struct ipmi_intf *intf, 
Packit d14fb6
                        struct sdr_record_generic_locator *dev, 
Packit d14fb6
                        const char *ofile
Packit d14fb6
                     )
Packit d14fb6
{
Packit d14fb6
   int rc = 0;
Packit d14fb6
   int eeprom_size;
Packit d14fb6
   t_gendev_eeprom_info eeprom_info;
Packit d14fb6
Packit d14fb6
   eeprom_size = ipmi_gendev_get_eeprom_size(intf, dev, &eeprom_info);
Packit d14fb6
Packit d14fb6
   if(eeprom_size > 0)
Packit d14fb6
   {
Packit d14fb6
      FILE *fp;
Packit d14fb6
   
Packit d14fb6
      /* now write to file */
Packit d14fb6
      fp = ipmi_open_file_write(ofile);
Packit d14fb6
Packit d14fb6
      if(fp)
Packit d14fb6
      {
Packit d14fb6
         struct ipmi_rs *rsp;
Packit d14fb6
         int numWrite;
Packit d14fb6
         uint32_t counter;
Packit d14fb6
         uint8_t msize;
Packit d14fb6
         uint8_t channel = dev->channel_num;
Packit d14fb6
         uint8_t i2cbus = dev->bus;
Packit d14fb6
         uint8_t i2caddr = dev->dev_slave_addr;
Packit d14fb6
         uint8_t privatebus = 1;
Packit d14fb6
         uint32_t address_span_size;
Packit d14fb6
         uint8_t percentCompleted = 0;
Packit d14fb6
Packit d14fb6
Packit d14fb6
         /* Handle Address Span */
Packit d14fb6
         if( eeprom_info.address_span != 0)
Packit d14fb6
         {
Packit d14fb6
            address_span_size = 
Packit d14fb6
               (eeprom_info.size / (eeprom_info.address_span+1));
Packit d14fb6
         }
Packit d14fb6
         else
Packit d14fb6
         {
Packit d14fb6
            address_span_size = eeprom_info.size;
Packit d14fb6
         }
Packit d14fb6
Packit d14fb6
         /* Setup read/write size */
Packit d14fb6
         if( eeprom_info.page_size < GENDEV_MAX_SIZE)
Packit d14fb6
         {
Packit d14fb6
            msize = eeprom_info.page_size;
Packit d14fb6
         }
Packit d14fb6
         else
Packit d14fb6
         {
Packit d14fb6
            msize = GENDEV_MAX_SIZE;  
Packit d14fb6
               // All eeprom with page higher than 32 is on the 
Packit d14fb6
               // 16 bytes boundary
Packit d14fb6
         }
Packit d14fb6
Packit d14fb6
         /* Setup i2c bus byte */
Packit d14fb6
         i2cbus = ((channel & 0xF) << 4) | ((i2cbus & 7) << 1) | privatebus;
Packit d14fb6
Packit d14fb6
/*   
Packit d14fb6
         lprintf(LOG_ERR, "Generic device: %s", dev->id_string);
Packit d14fb6
         lprintf(LOG_ERR, "I2C Chnl: %x", channel);
Packit d14fb6
         lprintf(LOG_ERR, "I2C Bus : %x", i2cbus);
Packit d14fb6
         lprintf(LOG_ERR, "I2C Addr: %x", i2caddr);    */
Packit d14fb6
Packit d14fb6
         for (
Packit d14fb6
               counter = 0; 
Packit d14fb6
               (counter < (eeprom_info.size)) && (rc == 0); 
Packit d14fb6
               counter+= msize
Packit d14fb6
             ) 
Packit d14fb6
         {
Packit d14fb6
            uint8_t retryCounter;
Packit d14fb6
Packit d14fb6
            for(
Packit d14fb6
                  retryCounter = 0; 
Packit d14fb6
                  retryCounter
Packit d14fb6
                  retryCounter ++
Packit d14fb6
               )
Packit d14fb6
            {
Packit d14fb6
               uint8_t wrByte[GENDEV_MAX_SIZE+2];
Packit d14fb6
Packit d14fb6
               wrByte[0] =  (uint8_t) (counter>>0);
Packit d14fb6
               if(eeprom_info.address_length > 1)
Packit d14fb6
               {
Packit d14fb6
                  wrByte[1] =  (uint8_t) (counter>>8);
Packit d14fb6
               }
Packit d14fb6
            
Packit d14fb6
               i2caddr+= (((eeprom_info.size) % address_span_size) * 2);
Packit d14fb6
                                           
Packit d14fb6
               rsp = ipmi_master_write_read(
Packit d14fb6
                           intf,
Packit d14fb6
                           i2cbus,
Packit d14fb6
                           i2caddr,
Packit d14fb6
                           (uint8_t *) wrByte,
Packit d14fb6
                           eeprom_info.address_length,
Packit d14fb6
                           msize
Packit d14fb6
                           );
Packit d14fb6
Packit d14fb6
               if (rsp != NULL) 
Packit d14fb6
               {
Packit d14fb6
                  retryCounter = GENDEV_RETRY_COUNT;
Packit d14fb6
                  rc = 0;
Packit d14fb6
               }
Packit d14fb6
               else if(retryCounter < GENDEV_RETRY_COUNT)
Packit d14fb6
               {
Packit d14fb6
                  retryCounter ++;
Packit d14fb6
                  lprintf(LOG_ERR, "Retry");
Packit d14fb6
                  sleep(1);
Packit d14fb6
                  rc = -1;
Packit d14fb6
               }
Packit d14fb6
               else
Packit d14fb6
               {
Packit d14fb6
                  lprintf(LOG_ERR, "Unable to perform I2C Master Write-Read");
Packit d14fb6
                  rc = -1;
Packit d14fb6
               }
Packit d14fb6
            }
Packit d14fb6
Packit d14fb6
            if( rc == 0 )
Packit d14fb6
            {
Packit d14fb6
               static uint8_t previousCompleted = 101;
Packit d14fb6
               numWrite = fwrite(rsp->data, 1, msize, fp);
Packit d14fb6
               if (numWrite != msize) 
Packit d14fb6
               {
Packit d14fb6
                  lprintf(LOG_ERR, "Error writing file %s", ofile);
Packit d14fb6
                  rc = -1;
Packit d14fb6
                  break;
Packit d14fb6
               }
Packit d14fb6
Packit d14fb6
               percentCompleted = ((counter * 100) / eeprom_info.size );
Packit d14fb6
               
Packit d14fb6
               if(percentCompleted != previousCompleted)
Packit d14fb6
               {
Packit d14fb6
                  printf("\r%i percent completed", percentCompleted);
Packit d14fb6
                  previousCompleted = percentCompleted;
Packit d14fb6
               }
Packit d14fb6
Packit d14fb6
Packit d14fb6
            }
Packit d14fb6
         }
Packit d14fb6
         if(counter == (eeprom_info.size))
Packit d14fb6
         {
Packit d14fb6
            printf("\r%%100 percent completed\n");
Packit d14fb6
         }
Packit d14fb6
         else
Packit d14fb6
         {
Packit d14fb6
            printf("\rError: %i percent completed, read not completed \n", percentCompleted);
Packit d14fb6
         }
Packit d14fb6
Packit d14fb6
         fclose(fp);
Packit d14fb6
      }
Packit d14fb6
   }
Packit d14fb6
   else
Packit d14fb6
   {
Packit d14fb6
      lprintf(LOG_ERR, "The selected generic device is not an eeprom");
Packit d14fb6
   }
Packit d14fb6
Packit d14fb6
   return rc;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
/* ipmi_gendev_write_file  -  Read raw SDR from binary file
Packit d14fb6
 *
Packit d14fb6
 * used for writing generic locator device Eeprom type
Packit d14fb6
 *
Packit d14fb6
 * @intf:	ipmi interface
Packit d14fb6
 * @dev:		generic device to read
Packit d14fb6
 * @ofile:	output filename
Packit d14fb6
 *
Packit d14fb6
 * returns 0 on success
Packit d14fb6
 * returns -1 on error
Packit d14fb6
 */
Packit d14fb6
static int
Packit d14fb6
ipmi_gendev_write_file(
Packit d14fb6
                        struct ipmi_intf *intf, 
Packit d14fb6
                        struct sdr_record_generic_locator *dev, 
Packit d14fb6
                        const char *ofile
Packit d14fb6
                     )
Packit d14fb6
{
Packit d14fb6
   int rc = 0;
Packit d14fb6
   int eeprom_size;
Packit d14fb6
   t_gendev_eeprom_info eeprom_info;
Packit d14fb6
Packit d14fb6
   eeprom_size = ipmi_gendev_get_eeprom_size(intf, dev, &eeprom_info);
Packit d14fb6
Packit d14fb6
   if(eeprom_size > 0)
Packit d14fb6
   {
Packit d14fb6
      FILE *fp;
Packit d14fb6
      uint32_t fileLength = 0;
Packit d14fb6
   
Packit d14fb6
      /* now write to file */
Packit d14fb6
      fp = ipmi_open_file_read(ofile);
Packit d14fb6
      
Packit d14fb6
      if(fp)
Packit d14fb6
      {
Packit d14fb6
         /* Retreive file length, check if it's fits the Eeprom Size */
Packit d14fb6
         fseek(fp, 0 ,SEEK_END);
Packit d14fb6
         fileLength = ftell(fp);
Packit d14fb6
Packit d14fb6
         lprintf(LOG_ERR, "File   Size: %i", fileLength);
Packit d14fb6
         lprintf(LOG_ERR, "Eeprom Size: %i", eeprom_size);
Packit d14fb6
         if(fileLength != eeprom_size)
Packit d14fb6
         {
Packit d14fb6
            lprintf(LOG_ERR, "File size does not fit Eeprom Size");
Packit d14fb6
            fclose(fp);
Packit d14fb6
            fp = NULL;
Packit d14fb6
         }
Packit d14fb6
         else
Packit d14fb6
         {
Packit d14fb6
            fseek(fp, 0 ,SEEK_SET);
Packit d14fb6
         }
Packit d14fb6
      }
Packit d14fb6
      
Packit d14fb6
      if(fp)
Packit d14fb6
      {
Packit d14fb6
         struct ipmi_rs *rsp;
Packit d14fb6
         int numRead;
Packit d14fb6
         uint32_t counter;
Packit d14fb6
         uint8_t msize;
Packit d14fb6
         uint8_t channel = dev->channel_num;
Packit d14fb6
         uint8_t i2cbus = dev->bus;
Packit d14fb6
         uint8_t i2caddr = dev->dev_slave_addr;
Packit d14fb6
         uint8_t privatebus = 1;
Packit d14fb6
         uint32_t address_span_size;
Packit d14fb6
         uint8_t percentCompleted = 0;
Packit d14fb6
Packit d14fb6
Packit d14fb6
         /* Handle Address Span */
Packit d14fb6
         if( eeprom_info.address_span != 0)
Packit d14fb6
         {
Packit d14fb6
            address_span_size = 
Packit d14fb6
               (eeprom_info.size / (eeprom_info.address_span+1));
Packit d14fb6
         }
Packit d14fb6
         else
Packit d14fb6
         {
Packit d14fb6
            address_span_size = eeprom_info.size;
Packit d14fb6
         }
Packit d14fb6
Packit d14fb6
         /* Setup read/write size */
Packit d14fb6
         if( eeprom_info.page_size < GENDEV_MAX_SIZE)
Packit d14fb6
         {
Packit d14fb6
            msize = eeprom_info.page_size;
Packit d14fb6
         }
Packit d14fb6
         else
Packit d14fb6
         {
Packit d14fb6
            msize = GENDEV_MAX_SIZE;  
Packit d14fb6
                     // All eeprom with page higher than 32 is on the 
Packit d14fb6
                     // 16 bytes boundary
Packit d14fb6
         }
Packit d14fb6
Packit d14fb6
         /* Setup i2c bus byte */
Packit d14fb6
         i2cbus = ((channel & 0xF) << 4) | ((i2cbus & 7) << 1) | privatebus;
Packit d14fb6
Packit d14fb6
/*   
Packit d14fb6
         lprintf(LOG_ERR, "Generic device: %s", dev->id_string);
Packit d14fb6
         lprintf(LOG_ERR, "I2C Chnl: %x", channel);
Packit d14fb6
         lprintf(LOG_ERR, "I2C Bus : %x", i2cbus);
Packit d14fb6
         lprintf(LOG_ERR, "I2C Addr: %x", i2caddr);    */
Packit d14fb6
Packit d14fb6
         for (
Packit d14fb6
               counter = 0; 
Packit d14fb6
               (counter < (eeprom_info.size)) && (rc == 0); 
Packit d14fb6
               counter+= msize
Packit d14fb6
             ) 
Packit d14fb6
         {
Packit d14fb6
            uint8_t retryCounter;
Packit d14fb6
            uint8_t readByte[GENDEV_MAX_SIZE];
Packit d14fb6
Packit d14fb6
            numRead = fread(readByte, 1, msize, fp);
Packit d14fb6
            if (numRead != msize) 
Packit d14fb6
            {
Packit d14fb6
               lprintf(LOG_ERR, "Error reading file %s", ofile);
Packit d14fb6
               rc = -1;
Packit d14fb6
               break;
Packit d14fb6
            }
Packit d14fb6
Packit d14fb6
Packit d14fb6
Packit d14fb6
            for(
Packit d14fb6
                  retryCounter = 0; 
Packit d14fb6
                  retryCounter
Packit d14fb6
                  retryCounter ++
Packit d14fb6
               )
Packit d14fb6
            {
Packit d14fb6
               uint8_t wrByte[GENDEV_MAX_SIZE+2];
Packit d14fb6
               wrByte[0] =  (uint8_t) (counter>>0);
Packit d14fb6
               if(eeprom_info.address_length > 1)
Packit d14fb6
               {
Packit d14fb6
                  wrByte[1] =  (uint8_t) (counter>>8);
Packit d14fb6
               }
Packit d14fb6
               memcpy(&wrByte[eeprom_info.address_length], readByte, msize);
Packit d14fb6
Packit d14fb6
               i2caddr+= (((eeprom_info.size) % address_span_size) * 2);
Packit d14fb6
Packit d14fb6
               rsp = ipmi_master_write_read(intf, i2cbus, i2caddr, (uint8_t *) wrByte, eeprom_info.address_length+msize, 0);
Packit d14fb6
               if (rsp != NULL) 
Packit d14fb6
               {
Packit d14fb6
                  retryCounter = GENDEV_RETRY_COUNT;
Packit d14fb6
                  rc = 0;
Packit d14fb6
               }
Packit d14fb6
               else if(retryCounter < GENDEV_RETRY_COUNT)
Packit d14fb6
               {
Packit d14fb6
                  retryCounter ++;
Packit d14fb6
                  lprintf(LOG_ERR, "Retry");
Packit d14fb6
                  sleep(1);
Packit d14fb6
                  rc = -1;
Packit d14fb6
               }
Packit d14fb6
               else
Packit d14fb6
               {
Packit d14fb6
                  lprintf(LOG_ERR, "Unable to perform I2C Master Write-Read");
Packit d14fb6
                  rc = -1;
Packit d14fb6
               }
Packit d14fb6
            }
Packit d14fb6
Packit d14fb6
            if( rc == 0 )
Packit d14fb6
            {
Packit d14fb6
               static uint8_t previousCompleted = 101;
Packit d14fb6
               percentCompleted = ((counter * 100) / eeprom_info.size );
Packit d14fb6
Packit d14fb6
               if(percentCompleted != previousCompleted)
Packit d14fb6
               {
Packit d14fb6
                  printf("\r%i percent completed", percentCompleted);
Packit d14fb6
                  previousCompleted = percentCompleted;
Packit d14fb6
               }
Packit d14fb6
Packit d14fb6
            }
Packit d14fb6
         }
Packit d14fb6
         if(counter == (eeprom_info.size))
Packit d14fb6
         {
Packit d14fb6
            printf("\r%%100 percent completed\n");
Packit d14fb6
         }
Packit d14fb6
         else
Packit d14fb6
         {
Packit d14fb6
            printf("\rError: %i percent completed, read not completed \n", percentCompleted);
Packit d14fb6
         }
Packit d14fb6
Packit d14fb6
         fclose(fp);
Packit d14fb6
      }
Packit d14fb6
   }
Packit d14fb6
   else
Packit d14fb6
   {
Packit d14fb6
      lprintf(LOG_ERR, "The selected generic device is not an eeprom");
Packit d14fb6
   }
Packit d14fb6
Packit d14fb6
   return rc;
Packit d14fb6
}
Packit d14fb6
Packit d14fb6
Packit d14fb6
/* ipmi_gendev_main  -  top-level handler for generic device
Packit d14fb6
 *
Packit d14fb6
 * @intf:	ipmi interface
Packit d14fb6
 * @argc:	number of arguments
Packit d14fb6
 * @argv:	argument list
Packit d14fb6
 *
Packit d14fb6
 * returns 0 on success
Packit d14fb6
 * returns -1 on error
Packit d14fb6
 */
Packit d14fb6
int
Packit d14fb6
ipmi_gendev_main(struct ipmi_intf *intf, int argc, char **argv)
Packit d14fb6
{
Packit d14fb6
   int rc = 0;
Packit d14fb6
Packit d14fb6
   /* initialize random numbers used later */
Packit d14fb6
   srand(time(NULL));
Packit d14fb6
Packit d14fb6
   lprintf(LOG_ERR, "Rx gendev command: %s", argv[0]);
Packit d14fb6
Packit d14fb6
   if (
Packit d14fb6
         (argc == 0)
Packit d14fb6
         ||
Packit d14fb6
         (strncmp(argv[0], "help", 4) == 0) 
Packit d14fb6
      )
Packit d14fb6
   {
Packit d14fb6
      lprintf(LOG_ERR,
Packit d14fb6
         "SDR Commands:  list read write");
Packit d14fb6
      lprintf(LOG_ERR,
Packit d14fb6
         "                     list                     List All Generic Device Locators");
Packit d14fb6
      lprintf(LOG_ERR,
Packit d14fb6
         "                     read <sdr name> <file>   Read to file eeprom specify by Generic Device Locators");
Packit d14fb6
      lprintf(LOG_ERR,
Packit d14fb6
         "                     write <sdr name> <file>  Write from file eeprom specify by Generic Device Locators");
Packit d14fb6
   } 
Packit d14fb6
   else if ( strncmp(argv[0], "list", 4) == 0)
Packit d14fb6
   {
Packit d14fb6
      rc = ipmi_sdr_print_sdr(intf,
Packit d14fb6
                  SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR);
Packit d14fb6
   }
Packit d14fb6
   else if (strncmp(argv[0], "read", 4) == 0) 
Packit d14fb6
   {
Packit d14fb6
      if (argc < 3)
Packit d14fb6
         lprintf(LOG_ERR, "usage: gendev read <gendev> <filename>");
Packit d14fb6
      else
Packit d14fb6
      {
Packit d14fb6
         struct sdr_record_list *sdr;
Packit d14fb6
Packit d14fb6
         lprintf(LOG_ERR, "Gendev read sdr name : %s", argv[1]);
Packit d14fb6
Packit d14fb6
         printf("Locating sensor record '%s'...\n", argv[1]);
Packit d14fb6
Packit d14fb6
         /* lookup by sensor name */
Packit d14fb6
         sdr = ipmi_sdr_find_sdr_byid(intf, argv[1]);
Packit d14fb6
         if (sdr == NULL) 
Packit d14fb6
         {
Packit d14fb6
            lprintf(LOG_ERR, "Sensor data record not found!");
Packit d14fb6
            return -1;
Packit d14fb6
         }
Packit d14fb6
Packit d14fb6
         if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) 
Packit d14fb6
         {
Packit d14fb6
            lprintf(LOG_ERR, "Target SDR is not a generic device locator");
Packit d14fb6
            return -1;
Packit d14fb6
         }
Packit d14fb6
Packit d14fb6
         lprintf(LOG_ERR, "Gendev read file name: %s", argv[2]);
Packit d14fb6
         ipmi_gendev_read_file(intf, sdr->record.genloc, argv[2]);
Packit d14fb6
Packit d14fb6
      }
Packit d14fb6
   } 
Packit d14fb6
   else if (strncmp(argv[0], "write", 5) == 0) 
Packit d14fb6
   {
Packit d14fb6
      if (argc < 3)
Packit d14fb6
         lprintf(LOG_ERR, "usage: gendev write <gendev> <filename>");
Packit d14fb6
      else
Packit d14fb6
      {
Packit d14fb6
         struct sdr_record_list *sdr;
Packit d14fb6
Packit d14fb6
         lprintf(LOG_ERR, "Gendev write sdr name : %s", argv[1]);
Packit d14fb6
Packit d14fb6
         printf("Locating sensor record '%s'...\n", argv[1]);
Packit d14fb6
Packit d14fb6
         /* lookup by sensor name */
Packit d14fb6
         sdr = ipmi_sdr_find_sdr_byid(intf, argv[1]);
Packit d14fb6
         if (sdr == NULL) 
Packit d14fb6
         {
Packit d14fb6
            lprintf(LOG_ERR, "Sensor data record not found!");
Packit d14fb6
            return -1;
Packit d14fb6
         }
Packit d14fb6
Packit d14fb6
         if (sdr->type != SDR_RECORD_TYPE_GENERIC_DEVICE_LOCATOR) 
Packit d14fb6
         {
Packit d14fb6
            lprintf(LOG_ERR, "Target SDR is not a generic device locator");
Packit d14fb6
            return -1;
Packit d14fb6
         }
Packit d14fb6
Packit d14fb6
         lprintf(LOG_ERR, "Gendev write file name: %s", argv[2]);
Packit d14fb6
         ipmi_gendev_write_file(intf, sdr->record.genloc, argv[2]);
Packit d14fb6
Packit d14fb6
      }
Packit d14fb6
   } 
Packit d14fb6
   else 
Packit d14fb6
   {
Packit d14fb6
      lprintf(LOG_ERR, "Invalid gendev command: %s", argv[0]);
Packit d14fb6
      rc = -1;
Packit d14fb6
   }
Packit d14fb6
Packit d14fb6
   return rc;
Packit d14fb6
}