ioat: preserve chanctrl bits when re-arming interrupts
[linux-2.6.git] / drivers / dma / ioat / dma_v2.c
index ca11342493419ea57e9525058b64d8f913e3426a..2f34f290041ef81a1f441d4d5c5151cc23edd181 100644 (file)
@@ -341,8 +341,7 @@ static void ioat2_cleanup_tasklet(unsigned long data)
        struct ioat2_dma_chan *ioat = (void *) data;
 
        ioat2_cleanup(ioat);
-       writew(IOAT_CHANCTRL_INT_DISABLE,
-              ioat->base.reg_base + IOAT_CHANCTRL_OFFSET);
+       writew(IOAT_CHANCTRL_RUN, ioat->base.reg_base + IOAT_CHANCTRL_OFFSET);
 }
 
 /**
@@ -359,7 +358,14 @@ static int ioat2_enumerate_channels(struct ioatdma_device *device)
 
        INIT_LIST_HEAD(&dma->channels);
        dma->chancnt = readb(device->reg_base + IOAT_CHANCNT_OFFSET);
+       dma->chancnt &= 0x1f; /* bits [4:0] valid */
+       if (dma->chancnt > ARRAY_SIZE(device->idx)) {
+               dev_warn(dev, "(%d) exceeds max supported channels (%zu)\n",
+                        dma->chancnt, ARRAY_SIZE(device->idx));
+               dma->chancnt = ARRAY_SIZE(device->idx);
+       }
        xfercap_log = readb(device->reg_base + IOAT_XFERCAP_OFFSET);
+       xfercap_log &= 0x1f; /* bits [4:0] valid */
        if (xfercap_log == 0)
                return 0;
        dev_dbg(dev, "%s: xfercap = %d\n", __func__, 1 << xfercap_log);
@@ -447,7 +453,6 @@ static int ioat2_alloc_chan_resources(struct dma_chan *c)
        struct ioat2_dma_chan *ioat = to_ioat2_chan(c);
        struct ioat_chan_common *chan = &ioat->base;
        struct ioat_ring_ent **ring;
-       u16 chanctrl;
        u32 chanerr;
        int descs;
        int i;
@@ -457,9 +462,7 @@ static int ioat2_alloc_chan_resources(struct dma_chan *c)
                return 1 << ioat->alloc_order;
 
        /* Setup register to interrupt and write completion status on error */
-       chanctrl = IOAT_CHANCTRL_ERR_INT_EN | IOAT_CHANCTRL_ANY_ERR_ABORT_EN |
-                  IOAT_CHANCTRL_ERR_COMPLETION_EN;
-       writew(chanctrl, chan->reg_base + IOAT_CHANCTRL_OFFSET);
+       writew(IOAT_CHANCTRL_RUN, chan->reg_base + IOAT_CHANCTRL_OFFSET);
 
        chanerr = readl(chan->reg_base + IOAT_CHANERR_OFFSET);
        if (chanerr) {