linux/drivers/scsi/bfa/plog.c
<<
>>
Prefs
   1/*
   2 * Copyright (c) 2005-2009 Brocade Communications Systems, Inc.
   3 * All rights reserved
   4 * www.brocade.com
   5 *
   6 * Linux driver for Brocade Fibre Channel Host Bus Adapter.
   7 *
   8 * This program is free software; you can redistribute it and/or modify it
   9 * under the terms of the GNU General Public License (GPL) Version 2 as
  10 * published by the Free Software Foundation
  11 *
  12 * This program is distributed in the hope that it will be useful, but
  13 * WITHOUT ANY WARRANTY; without even the implied warranty of
  14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  15 * General Public License for more details.
  16 */
  17
  18#include <bfa_os_inc.h>
  19#include <cs/bfa_plog.h>
  20#include <cs/bfa_debug.h>
  21
  22static int
  23plkd_validate_logrec(struct bfa_plog_rec_s *pl_rec)
  24{
  25        if ((pl_rec->log_type != BFA_PL_LOG_TYPE_INT)
  26            && (pl_rec->log_type != BFA_PL_LOG_TYPE_STRING))
  27                return 1;
  28
  29        if ((pl_rec->log_type != BFA_PL_LOG_TYPE_INT)
  30            && (pl_rec->log_num_ints > BFA_PL_INT_LOG_SZ))
  31                return 1;
  32
  33        return 0;
  34}
  35
  36static void
  37bfa_plog_add(struct bfa_plog_s *plog, struct bfa_plog_rec_s *pl_rec)
  38{
  39        u16        tail;
  40        struct bfa_plog_rec_s *pl_recp;
  41
  42        if (plog->plog_enabled == 0)
  43                return;
  44
  45        if (plkd_validate_logrec(pl_rec)) {
  46                bfa_assert(0);
  47                return;
  48        }
  49
  50        tail = plog->tail;
  51
  52        pl_recp = &(plog->plog_recs[tail]);
  53
  54        bfa_os_memcpy(pl_recp, pl_rec, sizeof(struct bfa_plog_rec_s));
  55
  56        pl_recp->tv = BFA_TRC_TS(plog);
  57        BFA_PL_LOG_REC_INCR(plog->tail);
  58
  59        if (plog->head == plog->tail)
  60                BFA_PL_LOG_REC_INCR(plog->head);
  61}
  62
  63void
  64bfa_plog_init(struct bfa_plog_s *plog)
  65{
  66        bfa_os_memset((char *)plog, 0, sizeof(struct bfa_plog_s));
  67
  68        bfa_os_memcpy(plog->plog_sig, BFA_PL_SIG_STR, BFA_PL_SIG_LEN);
  69        plog->head = plog->tail = 0;
  70        plog->plog_enabled = 1;
  71}
  72
  73void
  74bfa_plog_str(struct bfa_plog_s *plog, enum bfa_plog_mid mid,
  75                enum bfa_plog_eid event,
  76                u16 misc, char *log_str)
  77{
  78        struct bfa_plog_rec_s  lp;
  79
  80        if (plog->plog_enabled) {
  81                bfa_os_memset(&lp, 0, sizeof(struct bfa_plog_rec_s));
  82                lp.mid = mid;
  83                lp.eid = event;
  84                lp.log_type = BFA_PL_LOG_TYPE_STRING;
  85                lp.misc = misc;
  86                strncpy(lp.log_entry.string_log, log_str,
  87                        BFA_PL_STRING_LOG_SZ - 1);
  88                lp.log_entry.string_log[BFA_PL_STRING_LOG_SZ - 1] = '\0';
  89                bfa_plog_add(plog, &lp);
  90        }
  91}
  92
  93void
  94bfa_plog_intarr(struct bfa_plog_s *plog, enum bfa_plog_mid mid,
  95                enum bfa_plog_eid event,
  96                u16 misc, u32 *intarr, u32 num_ints)
  97{
  98        struct bfa_plog_rec_s  lp;
  99        u32        i;
 100
 101        if (num_ints > BFA_PL_INT_LOG_SZ)
 102                num_ints = BFA_PL_INT_LOG_SZ;
 103
 104        if (plog->plog_enabled) {
 105                bfa_os_memset(&lp, 0, sizeof(struct bfa_plog_rec_s));
 106                lp.mid = mid;
 107                lp.eid = event;
 108                lp.log_type = BFA_PL_LOG_TYPE_INT;
 109                lp.misc = misc;
 110
 111                for (i = 0; i < num_ints; i++)
 112                        bfa_os_assign(lp.log_entry.int_log[i],
 113                                        intarr[i]);
 114
 115                lp.log_num_ints = (u8) num_ints;
 116
 117                bfa_plog_add(plog, &lp);
 118        }
 119}
 120
 121void
 122bfa_plog_fchdr(struct bfa_plog_s *plog, enum bfa_plog_mid mid,
 123                        enum bfa_plog_eid event,
 124                        u16 misc, struct fchs_s *fchdr)
 125{
 126        struct bfa_plog_rec_s  lp;
 127        u32       *tmp_int = (u32 *) fchdr;
 128        u32        ints[BFA_PL_INT_LOG_SZ];
 129
 130        if (plog->plog_enabled) {
 131                bfa_os_memset(&lp, 0, sizeof(struct bfa_plog_rec_s));
 132
 133                ints[0] = tmp_int[0];
 134                ints[1] = tmp_int[1];
 135                ints[2] = tmp_int[4];
 136
 137                bfa_plog_intarr(plog, mid, event, misc, ints, 3);
 138        }
 139}
 140
 141void
 142bfa_plog_fchdr_and_pl(struct bfa_plog_s *plog, enum bfa_plog_mid mid,
 143                      enum bfa_plog_eid event, u16 misc, struct fchs_s *fchdr,
 144                      u32 pld_w0)
 145{
 146        struct bfa_plog_rec_s  lp;
 147        u32       *tmp_int = (u32 *) fchdr;
 148        u32        ints[BFA_PL_INT_LOG_SZ];
 149
 150        if (plog->plog_enabled) {
 151                bfa_os_memset(&lp, 0, sizeof(struct bfa_plog_rec_s));
 152
 153                ints[0] = tmp_int[0];
 154                ints[1] = tmp_int[1];
 155                ints[2] = tmp_int[4];
 156                ints[3] = pld_w0;
 157
 158                bfa_plog_intarr(plog, mid, event, misc, ints, 4);
 159        }
 160}
 161
 162void
 163bfa_plog_clear(struct bfa_plog_s *plog)
 164{
 165        plog->head = plog->tail = 0;
 166}
 167
 168void
 169bfa_plog_enable(struct bfa_plog_s *plog)
 170{
 171        plog->plog_enabled = 1;
 172}
 173
 174void
 175bfa_plog_disable(struct bfa_plog_s *plog)
 176{
 177        plog->plog_enabled = 0;
 178}
 179
 180bfa_boolean_t
 181bfa_plog_get_setting(struct bfa_plog_s *plog)
 182{
 183        return((bfa_boolean_t)plog->plog_enabled);
 184}
 185