usr/src/uts/common/io/fibre-channel/fca/oce/oce_stat.c
changeset 11723 b7b5ccb8e5c5
parent 11374 b345d20da176
child 13032 1b6086d6d5a1
equal deleted inserted replaced
11722:30a0e837513e 11723:b7b5ccb8e5c5
    45 oce_update_stats(kstat_t *ksp, int rw)
    45 oce_update_stats(kstat_t *ksp, int rw)
    46 {
    46 {
    47 	struct oce_dev *dev;
    47 	struct oce_dev *dev;
    48 	struct oce_stat *stats;
    48 	struct oce_stat *stats;
    49 	struct rx_port_stats *port_stats;
    49 	struct rx_port_stats *port_stats;
    50 	clock_t new;
       
    51 	boolean_t is_update_stats = B_FALSE;
       
    52 	int ret;
    50 	int ret;
    53 
    51 
    54 	if (rw == KSTAT_WRITE) {
    52 	if (rw == KSTAT_WRITE) {
    55 		return (EACCES);
    53 		return (EACCES);
    56 	}
    54 	}
    62 	mutex_enter(&dev->dev_lock);
    60 	mutex_enter(&dev->dev_lock);
    63 	if (dev->suspended) {
    61 	if (dev->suspended) {
    64 		mutex_exit(&dev->dev_lock);
    62 		mutex_exit(&dev->dev_lock);
    65 		return (EIO);
    63 		return (EIO);
    66 	}
    64 	}
    67 
    65 	ret = oce_get_hw_stats(dev);
    68 	/*
    66 	if (ret != DDI_SUCCESS) {
    69 	 * allow stats update only if enough
    67 		oce_log(dev, CE_WARN, MOD_CONFIG,
    70 	 * time has elapsed since last update
    68 		    "Failed to get stats:%d", ret);
    71 	 */
    69 		mutex_exit(&dev->dev_lock);
    72 	new = ddi_get_lbolt();
    70 		return (EIO);
    73 	if ((new - dev->stat_ticks) >= drv_usectohz(STAT_TIMEOUT)) {
       
    74 		dev->stat_ticks = new;
       
    75 		is_update_stats = B_TRUE;
       
    76 	}
       
    77 
       
    78 	mutex_exit(&dev->dev_lock);
       
    79 
       
    80 	/* fetch the latest stats from the adapter */
       
    81 	if (is_update_stats) {
       
    82 		if (dev->in_stats) {
       
    83 			return (EIO);
       
    84 		} else {
       
    85 			atomic_add_32(&dev->in_stats, 1);
       
    86 			ret = oce_get_hw_stats(dev);
       
    87 			atomic_add_32(&dev->in_stats, -1);
       
    88 			if (ret != DDI_SUCCESS) {
       
    89 				oce_log(dev, CE_WARN, MOD_CONFIG,
       
    90 				    "Failed to get stats:%d", ret);
       
    91 				return (EIO);
       
    92 			}
       
    93 		}
       
    94 	}
    71 	}
    95 
    72 
    96 	/* update the stats */
    73 	/* update the stats */
    97 	stats->rx_bytes_lo.value.ul = port_stats->rx_bytes_lsd;
    74 	stats->rx_bytes_lo.value.ul = port_stats->rx_bytes_lsd;
    98 	stats->rx_bytes_hi.value.ul = port_stats->rx_bytes_msd;
    75 	stats->rx_bytes_hi.value.ul = port_stats->rx_bytes_msd;
   165 	    port_stats->tx_broadcast_frames;
   142 	    port_stats->tx_broadcast_frames;
   166 	stats->tx_pause_frames.value.ul =
   143 	stats->tx_pause_frames.value.ul =
   167 	    port_stats->tx_pause_frames;
   144 	    port_stats->tx_pause_frames;
   168 	stats->tx_control_frames.value.ul =
   145 	stats->tx_control_frames.value.ul =
   169 	    port_stats->tx_control_frames;
   146 	    port_stats->tx_control_frames;
       
   147 	mutex_exit(&dev->dev_lock);
   170 	return (DDI_SUCCESS);
   148 	return (DDI_SUCCESS);
   171 } /* oce_update_stats */
   149 } /* oce_update_stats */
   172 
   150 
   173 /*
   151 /*
   174  * function to setup the kstat_t structure for the device and install it
   152  * function to setup the kstat_t structure for the device and install it
   300 oce_m_stat(void *arg, uint_t stat, uint64_t *val)
   278 oce_m_stat(void *arg, uint_t stat, uint64_t *val)
   301 {
   279 {
   302 	struct oce_dev *dev = arg;
   280 	struct oce_dev *dev = arg;
   303 	struct oce_stat *stats;
   281 	struct oce_stat *stats;
   304 	struct rx_port_stats *port_stats;
   282 	struct rx_port_stats *port_stats;
   305 	boolean_t is_update_stats = B_FALSE;
       
   306 	clock_t new;
       
   307 
   283 
   308 	stats = (struct oce_stat *)dev->oce_kstats->ks_data;
   284 	stats = (struct oce_stat *)dev->oce_kstats->ks_data;
   309 	port_stats = &dev->hw_stats->params.rsp.rx.port[dev->port_id];
   285 	port_stats = &dev->hw_stats->params.rsp.rx.port[dev->port_id];
   310 
   286 
   311 	mutex_enter(&dev->dev_lock);
   287 	mutex_enter(&dev->dev_lock);
   313 	if (dev->suspended ||
   289 	if (dev->suspended ||
   314 	    (dev->state & STATE_MAC_STOPPING) ||
   290 	    (dev->state & STATE_MAC_STOPPING) ||
   315 	    !(dev->state & STATE_MAC_STARTED)) {
   291 	    !(dev->state & STATE_MAC_STARTED)) {
   316 		mutex_exit(&dev->dev_lock);
   292 		mutex_exit(&dev->dev_lock);
   317 		return (EIO);
   293 		return (EIO);
   318 	}
       
   319 
       
   320 	/*
       
   321 	 * allow stats update only if enough
       
   322 	 * time has elapsed since last update
       
   323 	 */
       
   324 	new = ddi_get_lbolt();
       
   325 	if ((new - dev->stat_ticks) >= drv_usectohz(STAT_TIMEOUT)) {
       
   326 		dev->stat_ticks = new;
       
   327 		is_update_stats = B_TRUE;
       
   328 	}
       
   329 	mutex_exit(&dev->dev_lock);
       
   330 
       
   331 	/* update hw stats. Required for netstat */
       
   332 	if (is_update_stats) {
       
   333 		if (dev->in_stats == 0) {
       
   334 			atomic_add_32(&dev->in_stats, 1);
       
   335 			(void) oce_get_hw_stats(dev);
       
   336 			atomic_add_32(&dev->in_stats, -1);
       
   337 		}
       
   338 	}
   294 	}
   339 
   295 
   340 	switch (stat) {
   296 	switch (stat) {
   341 	case MAC_STAT_IFSPEED:
   297 	case MAC_STAT_IFSPEED:
   342 		if (dev->state & STATE_MAC_STARTED)
   298 		if (dev->state & STATE_MAC_STARTED)
   477 		else if (dev->flow_control == 0)
   433 		else if (dev->flow_control == 0)
   478 			*val = LINK_FLOWCTRL_NONE;
   434 			*val = LINK_FLOWCTRL_NONE;
   479 	break;
   435 	break;
   480 
   436 
   481 	default:
   437 	default:
       
   438 		mutex_exit(&dev->dev_lock);
   482 		return (ENOTSUP);
   439 		return (ENOTSUP);
   483 	}
   440 	}
       
   441 	mutex_exit(&dev->dev_lock);
   484 	return (0);
   442 	return (0);
   485 } /* oce_m_stat */
   443 } /* oce_m_stat */