1 /*
   2  * This file and its contents are supplied under the terms of the
   3  * Common Development and Distribution License ("CDDL"), version 1.0.
   4  * You may only use this file in accordance with the terms of version
   5  * 1.0 of the CDDL.
   6  *
   7  * A full copy of the text of the CDDL should have accompanied this
   8  * source.  A copy of the CDDL is also available via the Internet at
   9  * http://www.illumos.org/license/CDDL.
  10  */
  11 
  12 /*
  13  * Copyright 2015 OmniTI Computer Consulting, Inc. All rights reserved.
  14  */
  15 
  16 #include "i40e_sw.h"
  17 
  18 /*
  19  * Functions for keeping track of an i40e_t's statistics.
  20  */
  21 boolean_t
  22 i40e_init_stats(i40e_t *i40e)
  23 {
  24         kstat_t *ks;
  25         i40e_kstat_t *i40e_kstats;
  26 
  27         ks = kstat_create(MODULE_NAME, ddi_get_instance(i40e->i40e_dip),
  28             "statistics", "net", KSTAT_TYPE_NAMED,
  29             sizeof (i40e_kstat_t) / sizeof (kstat_named_t), 0);
  30         if (ks == NULL) {
  31                 i40e_error(i40e, "Could not create kernel statistics.");
  32                 return (B_FALSE);
  33         }
  34 
  35         i40e->i40e_kstats = ks;
  36 
  37         i40e_kstats = (i40e_kstat_t *)ks->ks_data;
  38 
  39         /*
  40          * Initialize all of the statistics now.
  41          */
  42         kstat_named_init(&i40e_kstats->link_speed, "link_speed",
  43             KSTAT_DATA_UINT64);
  44         /* XXX KEBE SAYS MORE MORE MORE! */
  45 
  46         return (B_TRUE);
  47 }
  48 
  49 /*
  50  * For Nemo/GLDv3.
  51  */
  52 int
  53 i40e_m_stat(void *arg, uint_t stat, uint64_t *val)
  54 {
  55         i40e_t *i40e = (i40e_t *)arg;
  56         /* struct i40e_hw *hw = &i40e->i40e_hw_space;
  57            i40e_kstat_t *i40e_kstats; */
  58 
  59         mutex_enter(&i40e->i40e_general_lock);
  60 
  61         if (i40e->i40e_state & I40E_SUSPENDED) {
  62                 mutex_exit(&i40e->i40e_general_lock);
  63                 return (ECANCELED);
  64         }
  65 
  66         switch (stat) {
  67         case MAC_STAT_IFSPEED:
  68                 *val = i40e->i40e_link_speed * 1000000ull;
  69                 break;
  70 
  71         /* XXX KEBE SAYS LOTS TO DO HERE... */
  72         case MAC_STAT_MULTIRCV:
  73         case MAC_STAT_BRDCSTRCV:
  74         case MAC_STAT_MULTIXMT:
  75         case MAC_STAT_BRDCSTXMT:
  76         case MAC_STAT_NORCVBUF:
  77         case MAC_STAT_IERRORS:
  78         case MAC_STAT_RBYTES:
  79         case MAC_STAT_OBYTES:
  80         case MAC_STAT_IPACKETS:
  81         case MAC_STAT_OPACKETS:
  82         /* RFC 1643 stats */
  83         case ETHER_STAT_FCS_ERRORS:
  84         case ETHER_STAT_TOOLONG_ERRORS:
  85         case ETHER_STAT_MACRCV_ERRORS:
  86         /* MII/GMII stats */
  87         case ETHER_STAT_XCVR_ADDR:
  88         case ETHER_STAT_XCVR_ID:
  89         case ETHER_STAT_XCVR_INUSE:
  90         case ETHER_STAT_CAP_10GFDX:
  91         case ETHER_STAT_CAP_1000FDX:
  92         case ETHER_STAT_CAP_100FDX:
  93         case ETHER_STAT_CAP_ASMPAUSE:
  94         case ETHER_STAT_CAP_PAUSE:
  95         case ETHER_STAT_CAP_AUTONEG:
  96         case ETHER_STAT_ADV_CAP_10GFDX:
  97         case ETHER_STAT_ADV_CAP_1000FDX:
  98         case ETHER_STAT_ADV_CAP_100FDX:
  99         case ETHER_STAT_ADV_CAP_ASMPAUSE:
 100         case ETHER_STAT_ADV_CAP_PAUSE:
 101         case ETHER_STAT_ADV_CAP_AUTONEG:
 102         case ETHER_STAT_LP_CAP_10GFDX:
 103         case ETHER_STAT_LP_CAP_1000FDX:
 104         case ETHER_STAT_LP_CAP_100FDX:
 105         case ETHER_STAT_LP_CAP_ASMPAUSE:
 106         case ETHER_STAT_LP_CAP_PAUSE:
 107         case ETHER_STAT_LP_CAP_AUTONEG:
 108         case ETHER_STAT_LINK_ASMPAUSE:
 109         case ETHER_STAT_LINK_PAUSE:
 110         case ETHER_STAT_LINK_AUTONEG:
 111         case ETHER_STAT_LINK_DUPLEX:
 112         case ETHER_STAT_TOOSHORT_ERRORS:
 113         case ETHER_STAT_CAP_REMFAULT:
 114         case ETHER_STAT_ADV_REMFAULT:
 115         case ETHER_STAT_LP_REMFAULT:
 116         case ETHER_STAT_JABBER_ERRORS:
 117         default:
 118                 mutex_exit(&i40e->i40e_general_lock);
 119                 return (ENOTSUP);
 120         }
 121 
 122         mutex_exit(&i40e->i40e_general_lock);
 123 
 124         if (i40e_check_acc_handle(i40e->i40e_osdep_space.reg_handle) !=
 125             DDI_FM_OK) {
 126                 ddi_fm_service_impact(i40e->i40e_dip, DDI_SERVICE_DEGRADED);
 127                 return (EIO);
 128         }
 129 
 130         return (0);
 131 }
 132 
 133 int
 134 i40e_rx_ring_stat(mac_ring_driver_t rh, uint_t stat, uint64_t *val)
 135 {
 136         i40e_trqpair_t  *itrq = (i40e_trqpair_t *)rh;
 137         i40e_t *i40e = itrq->itrq_i40e;
 138         int rc = 0;
 139 
 140         if (i40e->i40e_state & I40E_SUSPENDED) {
 141                 return (ECANCELED);
 142         }
 143 
 144         switch (stat) {
 145         /* XXX KEBE SAYS FILL ME IN! */
 146         case MAC_STAT_RBYTES:
 147         case MAC_STAT_IPACKETS:
 148         default:
 149                 *val = 0;
 150                 rc = ENOTSUP;
 151                 break;
 152         }
 153 
 154         return (rc);
 155 }
 156 
 157 int
 158 i40e_tx_ring_stat(mac_ring_driver_t rh, uint_t stat, uint64_t *val)
 159 {
 160         i40e_trqpair_t  *itrq = (i40e_trqpair_t *)rh;
 161         i40e_t *i40e = itrq->itrq_i40e;
 162         int rc = 0;
 163 
 164         if (i40e->i40e_state & I40E_SUSPENDED) {
 165                 return (ECANCELED);
 166         }
 167 
 168         switch (stat) {
 169         /* XXX KEBE SAYS FILL ME IN! */
 170         case MAC_STAT_OBYTES:
 171         case MAC_STAT_OPACKETS:
 172         default:
 173                 *val = 0;
 174                 rc = ENOTSUP;
 175                 break;
 176         }
 177 
 178         return (rc);
 179 }