Source
x
static int fetch_stats(struct atm_dev *dev,struct sonet_stats __user *arg,int zero)
/*
* drivers/atm/suni.c - S/UNI PHY driver
*
* Supports the following:
* PMC PM5346 S/UNI LITE
* PMC PM5350 S/UNI 155 ULTRA
* PMC PM5355 S/UNI 622
*/
/* Written 1995-2000 by Werner Almesberger, EPFL LRC/ICA */
static struct timer_list poll_timer;
static struct suni_priv *sunis = NULL;
static DEFINE_SPINLOCK(sunis_lock);
static void suni_hz(struct timer_list *timer)
{
struct suni_priv *walk;
struct atm_dev *dev;
struct k_sonet_stats *stats;
for (walk = sunis; walk; walk = walk->next) {
dev = walk->dev;
stats = &walk->sonet_stats;
PUT(0,MRI); /* latch counters */
udelay(1);
ADD_LIMITED(section_bip,(GET(RSOP_SBL) & 0xff) |
((GET(RSOP_SBM) & 0xff) << 8));
ADD_LIMITED(line_bip,(GET(RLOP_LBL) & 0xff) |
((GET(RLOP_LB) & 0xff) << 8) |
((GET(RLOP_LBM) & 0xf) << 16));
ADD_LIMITED(path_bip,(GET(RPOP_PBL) & 0xff) |
((GET(RPOP_PBM) & 0xff) << 8));
ADD_LIMITED(line_febe,(GET(RLOP_LFL) & 0xff) |
((GET(RLOP_LF) & 0xff) << 8) |
((GET(RLOP_LFM) & 0xf) << 16));
ADD_LIMITED(path_febe,(GET(RPOP_PFL) & 0xff) |
((GET(RPOP_PFM) & 0xff) << 8));
ADD_LIMITED(corr_hcs,GET(RACP_CHEC) & 0xff);
ADD_LIMITED(uncorr_hcs,GET(RACP_UHEC) & 0xff);
ADD_LIMITED(rx_cells,(GET(RACP_RCCL) & 0xff) |
((GET(RACP_RCC) & 0xff) << 8) |
((GET(RACP_RCCM) & 7) << 16));
ADD_LIMITED(tx_cells,(GET(TACP_TCCL) & 0xff) |
((GET(TACP_TCC) & 0xff) << 8) |
((GET(TACP_TCCM) & 7) << 16));
}
if (timer) mod_timer(&poll_timer,jiffies+HZ);
}