mt7615_init_work(dev);
 }
 
+static int mt7663s_parse_intr(struct mt76_dev *dev, struct mt76s_intr *intr)
+{
+       struct mt76_sdio *sdio = &dev->sdio;
+       struct mt7663s_intr *irq_data = sdio->intr_data;
+       int i, err;
+
+       err = sdio_readsb(sdio->func, irq_data, MCR_WHISR, sizeof(*irq_data));
+       if (err)
+               return err;
+
+       intr->isr = irq_data->isr;
+       intr->rec_mb = irq_data->rec_mb;
+       intr->tx.wtqcr = irq_data->tx.wtqcr;
+       intr->rx.num = irq_data->rx.num;
+       for (i = 0; i < 2 ; i++)
+               intr->rx.len[i] = irq_data->rx.len[i];
+
+       return 0;
+}
+
 static int mt7663s_probe(struct sdio_func *func,
                         const struct sdio_device_id *id)
 {
                    (mt76_rr(dev, MT_HW_REV) & 0xff);
        dev_dbg(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
 
+       mdev->sdio.parse_irq = mt7663s_parse_intr;
        mdev->sdio.intr_data = devm_kmalloc(mdev->dev,
-                                           sizeof(struct mt76s_intr),
+                                           sizeof(struct mt7663s_intr),
                                            GFP_KERNEL);
        if (!mdev->sdio.intr_data) {
                ret = -ENOMEM;
 
 static int mt76s_rx_handler(struct mt76_dev *dev)
 {
        struct mt76_sdio *sdio = &dev->sdio;
-       struct mt76s_intr *intr = sdio->intr_data;
+       struct mt76s_intr intr;
        int nframes = 0, ret;
 
-       ret = sdio_readsb(sdio->func, intr, MCR_WHISR, sizeof(*intr));
-       if (ret < 0)
+       ret = sdio->parse_irq(dev, &intr);
+       if (ret)
                return ret;
 
-       trace_dev_irq(dev, intr->isr, 0);
+       trace_dev_irq(dev, intr.isr, 0);
 
-       if (intr->isr & WHIER_RX0_DONE_INT_EN) {
-               ret = mt76s_rx_run_queue(dev, 0, intr);
+       if (intr.isr & WHIER_RX0_DONE_INT_EN) {
+               ret = mt76s_rx_run_queue(dev, 0, &intr);
                if (ret > 0) {
                        mt76_worker_schedule(&sdio->net_worker);
                        nframes += ret;
                }
        }
 
-       if (intr->isr & WHIER_RX1_DONE_INT_EN) {
-               ret = mt76s_rx_run_queue(dev, 1, intr);
+       if (intr.isr & WHIER_RX1_DONE_INT_EN) {
+               ret = mt76s_rx_run_queue(dev, 1, &intr);
                if (ret > 0) {
                        mt76_worker_schedule(&sdio->net_worker);
                        nframes += ret;
                }
        }
 
-       nframes += !!mt76s_refill_sched_quota(dev, intr->tx.wtqcr);
+       nframes += !!mt76s_refill_sched_quota(dev, intr.tx.wtqcr);
 
        return nframes;
 }