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) |