diff options
Diffstat (limited to 'drivers/net/sunhme.c')
-rw-r--r-- | drivers/net/sunhme.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/drivers/net/sunhme.c b/drivers/net/sunhme.c index 37d721bbdb35..6762f1c6ec8a 100644 --- a/drivers/net/sunhme.c +++ b/drivers/net/sunhme.c | |||
@@ -1226,10 +1226,16 @@ static void happy_meal_clean_rings(struct happy_meal *hp) | |||
1226 | for (frag = 0; frag <= skb_shinfo(skb)->nr_frags; frag++) { | 1226 | for (frag = 0; frag <= skb_shinfo(skb)->nr_frags; frag++) { |
1227 | txd = &hp->happy_block->happy_meal_txd[i]; | 1227 | txd = &hp->happy_block->happy_meal_txd[i]; |
1228 | dma_addr = hme_read_desc32(hp, &txd->tx_addr); | 1228 | dma_addr = hme_read_desc32(hp, &txd->tx_addr); |
1229 | dma_unmap_single(hp->dma_dev, dma_addr, | 1229 | if (!frag) |
1230 | (hme_read_desc32(hp, &txd->tx_flags) | 1230 | dma_unmap_single(hp->dma_dev, dma_addr, |
1231 | & TXFLAG_SIZE), | 1231 | (hme_read_desc32(hp, &txd->tx_flags) |
1232 | DMA_TO_DEVICE); | 1232 | & TXFLAG_SIZE), |
1233 | DMA_TO_DEVICE); | ||
1234 | else | ||
1235 | dma_unmap_page(hp->dma_dev, dma_addr, | ||
1236 | (hme_read_desc32(hp, &txd->tx_flags) | ||
1237 | & TXFLAG_SIZE), | ||
1238 | DMA_TO_DEVICE); | ||
1233 | 1239 | ||
1234 | if (frag != skb_shinfo(skb)->nr_frags) | 1240 | if (frag != skb_shinfo(skb)->nr_frags) |
1235 | i++; | 1241 | i++; |
@@ -1953,7 +1959,10 @@ static void happy_meal_tx(struct happy_meal *hp) | |||
1953 | dma_len = hme_read_desc32(hp, &this->tx_flags); | 1959 | dma_len = hme_read_desc32(hp, &this->tx_flags); |
1954 | 1960 | ||
1955 | dma_len &= TXFLAG_SIZE; | 1961 | dma_len &= TXFLAG_SIZE; |
1956 | dma_unmap_single(hp->dma_dev, dma_addr, dma_len, DMA_TO_DEVICE); | 1962 | if (!frag) |
1963 | dma_unmap_single(hp->dma_dev, dma_addr, dma_len, DMA_TO_DEVICE); | ||
1964 | else | ||
1965 | dma_unmap_page(hp->dma_dev, dma_addr, dma_len, DMA_TO_DEVICE); | ||
1957 | 1966 | ||
1958 | elem = NEXT_TX(elem); | 1967 | elem = NEXT_TX(elem); |
1959 | this = &txbase[elem]; | 1968 | this = &txbase[elem]; |
@@ -2184,7 +2193,7 @@ static int happy_meal_open(struct net_device *dev) | |||
2184 | * into a single source which we register handling at probe time. | 2193 | * into a single source which we register handling at probe time. |
2185 | */ | 2194 | */ |
2186 | if ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO) { | 2195 | if ((hp->happy_flags & (HFLAG_QUATTRO|HFLAG_PCI)) != HFLAG_QUATTRO) { |
2187 | if (request_irq(dev->irq, &happy_meal_interrupt, | 2196 | if (request_irq(dev->irq, happy_meal_interrupt, |
2188 | IRQF_SHARED, dev->name, (void *)dev)) { | 2197 | IRQF_SHARED, dev->name, (void *)dev)) { |
2189 | HMD(("EAGAIN\n")); | 2198 | HMD(("EAGAIN\n")); |
2190 | printk(KERN_ERR "happy_meal(SBUS): Can't order irq %d to go.\n", | 2199 | printk(KERN_ERR "happy_meal(SBUS): Can't order irq %d to go.\n", |
@@ -3047,9 +3056,9 @@ static int __devinit happy_meal_pci_probe(struct pci_dev *pdev, | |||
3047 | int len; | 3056 | int len; |
3048 | 3057 | ||
3049 | if (qfe_slot != -1 && | 3058 | if (qfe_slot != -1 && |
3050 | (addr = of_get_property(dp, | 3059 | (addr = of_get_property(dp, "local-mac-address", &len)) |
3051 | "local-mac-address", &len)) != NULL | 3060 | != NULL && |
3052 | && len == 6) { | 3061 | len == 6) { |
3053 | memcpy(dev->dev_addr, addr, 6); | 3062 | memcpy(dev->dev_addr, addr, 6); |
3054 | } else { | 3063 | } else { |
3055 | memcpy(dev->dev_addr, idprom->id_ethaddr, 6); | 3064 | memcpy(dev->dev_addr, idprom->id_ethaddr, 6); |