On 2019-03-19 11:37, Stanislaw Gruszka wrote: > diff --git a/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c b/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c > index ec94d612f53c..75dceeeed059 100644 > --- a/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c > +++ b/drivers/net/wireless/mediatek/mt76/mt76x02_mmio.c > @@ -152,6 +152,21 @@ static void mt76x02_pre_tbtt_tasklet(unsigned long arg) > spin_unlock_bh(&q->lock); > } > > +void mt76x02e_init_beacon_config(struct mt76x02_dev *dev) > +{ > + tasklet_init(&dev->pre_tbtt_tasklet, mt76x02_pre_tbtt_tasklet, > + (unsigned long)dev); > + > + /* Fire a pre-TBTT interrupt 8 ms before TBTT */ > + mt76_rmw_field(dev, MT_INT_TIMER_CFG, MT_INT_TIMER_CFG_PRE_TBTT, 8 << 4); > + mt76_rmw_field(dev, MT_INT_TIMER_CFG, MT_INT_TIMER_CFG_GP_TIMER, > + MT_DFS_GP_INTERVAL); > + mt76_wr(dev, MT_INT_TIMER_EN, 0); > + > + mt76x02_init_beacon_config(dev); > +} > +EXPORT_SYMBOL_GPL(mt76x02e_init_beacon_config); > + > static int > mt76x02_init_tx_queue(struct mt76x02_dev *dev, struct mt76_sw_queue *q, > int idx, int n_desc) > @@ -230,8 +245,6 @@ int mt76x02_dma_init(struct mt76x02_dev *dev) > return -ENOMEM; > > tasklet_init(&dev->tx_tasklet, mt76x02_tx_tasklet, (unsigned long) dev); > - tasklet_init(&dev->pre_tbtt_tasklet, mt76x02_pre_tbtt_tasklet, > - (unsigned long)dev); Moving the tasklet init to mt76x02e_init_beacon_config can crash the kernel, because it leads to the tasklet being re-initialized on every reset. I will update that commit and move it back. - Felix