linux/drivers/fmc/fru-parse.c
<<
>>
Prefs
   1/*
   2 * Copyright (C) 2012 CERN (www.cern.ch)
   3 * Author: Alessandro Rubini <rubini@gnudd.com>
   4 *
   5 * Released according to the GNU GPL, version 2 or any later version.
   6 *
   7 * This work is part of the White Rabbit project, a research effort led
   8 * by CERN, the European Institute for Nuclear Research.
   9 */
  10#include <linux/ipmi-fru.h>
  11
  12/* Some internal helpers */
  13static struct fru_type_length *
  14__fru_get_board_tl(struct fru_common_header *header, int nr)
  15{
  16        struct fru_board_info_area *bia;
  17        struct fru_type_length *tl;
  18
  19        bia = fru_get_board_area(header);
  20        tl = bia->tl;
  21        while (nr > 0 && !fru_is_eof(tl)) {
  22                tl = fru_next_tl(tl);
  23                nr--;
  24        }
  25        if (fru_is_eof(tl))
  26                return NULL;
  27        return tl;
  28}
  29
  30static char *__fru_alloc_get_tl(struct fru_common_header *header, int nr)
  31{
  32        struct fru_type_length *tl;
  33        char *res;
  34
  35        tl = __fru_get_board_tl(header, nr);
  36        if (!tl)
  37                return NULL;
  38
  39        res = fru_alloc(fru_strlen(tl) + 1);
  40        if (!res)
  41                return NULL;
  42        return fru_strcpy(res, tl);
  43}
  44
  45/* Public checksum verifiers */
  46int fru_header_cksum_ok(struct fru_common_header *header)
  47{
  48        uint8_t *ptr = (void *)header;
  49        int i, sum;
  50
  51        for (i = sum = 0; i < sizeof(*header); i++)
  52                sum += ptr[i];
  53        return (sum & 0xff) == 0;
  54}
  55int fru_bia_cksum_ok(struct fru_board_info_area *bia)
  56{
  57        uint8_t *ptr = (void *)bia;
  58        int i, sum;
  59
  60        for (i = sum = 0; i < 8 * bia->area_len; i++)
  61                sum += ptr[i];
  62        return (sum & 0xff) == 0;
  63}
  64
  65/* Get various stuff, trivial */
  66char *fru_get_board_manufacturer(struct fru_common_header *header)
  67{
  68        return __fru_alloc_get_tl(header, 0);
  69}
  70char *fru_get_product_name(struct fru_common_header *header)
  71{
  72        return __fru_alloc_get_tl(header, 1);
  73}
  74char *fru_get_serial_number(struct fru_common_header *header)
  75{
  76        return __fru_alloc_get_tl(header, 2);
  77}
  78char *fru_get_part_number(struct fru_common_header *header)
  79{
  80        return __fru_alloc_get_tl(header, 3);
  81}
  82