USB Storage: unusual_devs: add supertop drives
[pandora-kernel.git] / drivers / net / spider_net.c
index f88fcac..ebb6aa3 100644 (file)
@@ -88,12 +88,11 @@ MODULE_DEVICE_TABLE(pci, spider_net_pci_tbl);
 static inline u32
 spider_net_read_reg(struct spider_net_card *card, u32 reg)
 {
-       u32 value;
-
-       value = readl(card->regs + reg);
-       value = le32_to_cpu(value);
-
-       return value;
+       /* We use the powerpc specific variants instead of readl_be() because
+        * we know spidernet is not a real PCI device and we can thus avoid the
+        * performance hit caused by the PCI workarounds.
+        */
+       return in_be32(card->regs + reg);
 }
 
 /**
@@ -105,8 +104,11 @@ spider_net_read_reg(struct spider_net_card *card, u32 reg)
 static inline void
 spider_net_write_reg(struct spider_net_card *card, u32 reg, u32 value)
 {
-       value = cpu_to_le32(value);
-       writel(value, card->regs + reg);
+       /* We use the powerpc specific variants instead of writel_be() because
+        * we know spidernet is not a real PCI device and we can thus avoid the
+        * performance hit caused by the PCI workarounds.
+        */
+       out_be32(card->regs + reg, value);
 }
 
 /** spider_net_write_phy - write to phy register
@@ -644,20 +646,12 @@ spider_net_prepare_tx_descr(struct spider_net_card *card,
        struct spider_net_descr *descr;
        dma_addr_t buf;
        unsigned long flags;
-       int length;
-
-       length = skb->len;
-       if (length < ETH_ZLEN) {
-               if (skb_pad(skb, ETH_ZLEN-length))
-                       return 0;
-               length = ETH_ZLEN;
-       }
 
-       buf = pci_map_single(card->pdev, skb->data, length, PCI_DMA_TODEVICE);
+       buf = pci_map_single(card->pdev, skb->data, skb->len, PCI_DMA_TODEVICE);
        if (pci_dma_mapping_error(buf)) {
                if (netif_msg_tx_err(card) && net_ratelimit())
                        pr_err("could not iommu-map packet (%p, %i). "
-                                 "Dropping packet\n", skb->data, length);
+                                 "Dropping packet\n", skb->data, skb->len);
                card->spider_stats.tx_iommu_map_error++;
                return -ENOMEM;
        }
@@ -667,7 +661,7 @@ spider_net_prepare_tx_descr(struct spider_net_card *card,
        card->tx_chain.head = descr->next;
 
        descr->buf_addr = buf;
-       descr->buf_size = length;
+       descr->buf_size = skb->len;
        descr->next_descr_addr = 0;
        descr->skb = skb;
        descr->data_status = 0;
@@ -802,8 +796,8 @@ spider_net_release_tx_chain(struct spider_net_card *card, int brutal)
 
                /* unmap the skb */
                if (skb) {
-                       int len = skb->len < ETH_ZLEN ? ETH_ZLEN : skb->len;
-                       pci_unmap_single(card->pdev, buf_addr, len, PCI_DMA_TODEVICE);
+                       pci_unmap_single(card->pdev, buf_addr, skb->len,
+                                       PCI_DMA_TODEVICE);
                        dev_kfree_skb(skb);
                }
        }
@@ -1641,7 +1635,7 @@ spider_net_enable_card(struct spider_net_card *card)
                             SPIDER_NET_INT2_MASK_VALUE);
 
        spider_net_write_reg(card, SPIDER_NET_GDTDMACCNTR,
-                            SPIDER_NET_GDTBSTA | SPIDER_NET_GDTDCEIDIS);
+                            SPIDER_NET_GDTBSTA);
 }
 
 /**