| .. | .. |
|---|
| 51 | 51 | #include <linux/dma-mapping.h> |
|---|
| 52 | 52 | #include <linux/bitrev.h> |
|---|
| 53 | 53 | #include <linux/slab.h> |
|---|
| 54 | +#include <linux/pgtable.h> |
|---|
| 54 | 55 | |
|---|
| 55 | | -#include <asm/pgtable.h> |
|---|
| 56 | 56 | #include <asm/io.h> |
|---|
| 57 | 57 | #include <asm/hwtest.h> |
|---|
| 58 | 58 | #include <asm/dma.h> |
|---|
| .. | .. |
|---|
| 114 | 114 | addr[i] = bitrev8(addr[i]); |
|---|
| 115 | 115 | } |
|---|
| 116 | 116 | |
|---|
| 117 | | -static irqreturn_t macsonic_interrupt(int irq, void *dev_id) |
|---|
| 118 | | -{ |
|---|
| 119 | | - irqreturn_t result; |
|---|
| 120 | | - unsigned long flags; |
|---|
| 121 | | - |
|---|
| 122 | | - local_irq_save(flags); |
|---|
| 123 | | - result = sonic_interrupt(irq, dev_id); |
|---|
| 124 | | - local_irq_restore(flags); |
|---|
| 125 | | - return result; |
|---|
| 126 | | -} |
|---|
| 127 | | - |
|---|
| 128 | 117 | static int macsonic_open(struct net_device* dev) |
|---|
| 129 | 118 | { |
|---|
| 130 | 119 | int retval; |
|---|
| .. | .. |
|---|
| 135 | 124 | dev->name, dev->irq); |
|---|
| 136 | 125 | goto err; |
|---|
| 137 | 126 | } |
|---|
| 138 | | - /* Under the A/UX interrupt scheme, the onboard SONIC interrupt comes |
|---|
| 139 | | - * in at priority level 3. However, we sometimes get the level 2 inter- |
|---|
| 140 | | - * rupt as well, which must prevent re-entrance of the sonic handler. |
|---|
| 127 | + /* Under the A/UX interrupt scheme, the onboard SONIC interrupt gets |
|---|
| 128 | + * moved from level 2 to level 3. Unfortunately we still get some |
|---|
| 129 | + * level 2 interrupts so register the handler for both. |
|---|
| 141 | 130 | */ |
|---|
| 142 | 131 | if (dev->irq == IRQ_AUTO_3) { |
|---|
| 143 | | - retval = request_irq(IRQ_NUBUS_9, macsonic_interrupt, 0, |
|---|
| 132 | + retval = request_irq(IRQ_NUBUS_9, sonic_interrupt, 0, |
|---|
| 144 | 133 | "sonic", dev); |
|---|
| 145 | 134 | if (retval) { |
|---|
| 146 | 135 | printk(KERN_ERR "%s: unable to get IRQ %d.\n", |
|---|
| .. | .. |
|---|
| 186 | 175 | static int macsonic_init(struct net_device *dev) |
|---|
| 187 | 176 | { |
|---|
| 188 | 177 | struct sonic_local* lp = netdev_priv(dev); |
|---|
| 178 | + int err = sonic_alloc_descriptors(dev); |
|---|
| 189 | 179 | |
|---|
| 190 | | - /* Allocate the entire chunk of memory for the descriptors. |
|---|
| 191 | | - Note that this cannot cross a 64K boundary. */ |
|---|
| 192 | | - lp->descriptors = dma_alloc_coherent(lp->device, |
|---|
| 193 | | - SIZEOF_SONIC_DESC * |
|---|
| 194 | | - SONIC_BUS_SCALE(lp->dma_bitmode), |
|---|
| 195 | | - &lp->descriptors_laddr, |
|---|
| 196 | | - GFP_KERNEL); |
|---|
| 197 | | - if (lp->descriptors == NULL) |
|---|
| 198 | | - return -ENOMEM; |
|---|
| 199 | | - |
|---|
| 200 | | - /* Now set up the pointers to point to the appropriate places */ |
|---|
| 201 | | - lp->cda = lp->descriptors; |
|---|
| 202 | | - lp->tda = lp->cda + (SIZEOF_SONIC_CDA |
|---|
| 203 | | - * SONIC_BUS_SCALE(lp->dma_bitmode)); |
|---|
| 204 | | - lp->rda = lp->tda + (SIZEOF_SONIC_TD * SONIC_NUM_TDS |
|---|
| 205 | | - * SONIC_BUS_SCALE(lp->dma_bitmode)); |
|---|
| 206 | | - lp->rra = lp->rda + (SIZEOF_SONIC_RD * SONIC_NUM_RDS |
|---|
| 207 | | - * SONIC_BUS_SCALE(lp->dma_bitmode)); |
|---|
| 208 | | - |
|---|
| 209 | | - lp->cda_laddr = lp->descriptors_laddr; |
|---|
| 210 | | - lp->tda_laddr = lp->cda_laddr + (SIZEOF_SONIC_CDA |
|---|
| 211 | | - * SONIC_BUS_SCALE(lp->dma_bitmode)); |
|---|
| 212 | | - lp->rda_laddr = lp->tda_laddr + (SIZEOF_SONIC_TD * SONIC_NUM_TDS |
|---|
| 213 | | - * SONIC_BUS_SCALE(lp->dma_bitmode)); |
|---|
| 214 | | - lp->rra_laddr = lp->rda_laddr + (SIZEOF_SONIC_RD * SONIC_NUM_RDS |
|---|
| 215 | | - * SONIC_BUS_SCALE(lp->dma_bitmode)); |
|---|
| 180 | + if (err) |
|---|
| 181 | + return err; |
|---|
| 216 | 182 | |
|---|
| 217 | 183 | dev->netdev_ops = &macsonic_netdev_ops; |
|---|
| 218 | 184 | dev->watchdog_timeo = TX_TIMEOUT; |
|---|