dscc4 endian fixes
authorAl Viro <viro@ftp.linux.org.uk>
Sun, 13 Jan 2008 14:17:05 +0000 (14:17 +0000)
committerJeff Garzik <jeff@garzik.org>
Fri, 18 Jan 2008 19:44:32 +0000 (14:44 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
drivers/net/wan/dscc4.c

index 33dc713..c6f26e2 100644 (file)
@@ -139,19 +139,21 @@ struct thingie {
 };
 
 struct TxFD {
-       u32 state;
-       u32 next;
-       u32 data;
-       u32 complete;
+       __le32 state;
+       __le32 next;
+       __le32 data;
+       __le32 complete;
        u32 jiffies; /* Allows sizeof(TxFD) == sizeof(RxFD) + extra hack */
+                    /* FWIW, datasheet calls that "dummy" and says that card
+                     * never looks at it; neither does the driver */
 };
 
 struct RxFD {
-       u32 state1;
-       u32 next;
-       u32 data;
-       u32 state2;
-       u32 end;
+       __le32 state1;
+       __le32 next;
+       __le32 data;
+       __le32 state2;
+       __le32 end;
 };
 
 #define DUMMY_SKB_SIZE         64
@@ -181,7 +183,7 @@ struct RxFD {
 #define SCC_REG_START(dpriv)   (SCC_START+(dpriv->dev_id)*SCC_OFFSET)
 
 struct dscc4_pci_priv {
-        u32 *iqcfg;
+        __le32 *iqcfg;
         int cfg_cur;
         spinlock_t lock;
         struct pci_dev *pdev;
@@ -197,8 +199,8 @@ struct dscc4_dev_priv {
 
         struct RxFD *rx_fd;
         struct TxFD *tx_fd;
-        u32 *iqrx;
-        u32 *iqtx;
+        __le32 *iqrx;
+        __le32 *iqtx;
 
        /* FIXME: check all the volatile are required */
         volatile u32 tx_current;
@@ -298,7 +300,7 @@ struct dscc4_dev_priv {
 #define BrrExpMask     0x00000f00
 #define BrrMultMask    0x0000003f
 #define EncodingMask   0x00700000
-#define Hold           0x40000000
+#define Hold           cpu_to_le32(0x40000000)
 #define SccBusy                0x10000000
 #define PowerUp                0x80000000
 #define Vis            0x00001000
@@ -307,14 +309,14 @@ struct dscc4_dev_priv {
 #define FrameRdo       0x40
 #define FrameCrc       0x20
 #define FrameRab       0x10
-#define FrameAborted   0x00000200
-#define FrameEnd       0x80000000
-#define DataComplete   0x40000000
+#define FrameAborted   cpu_to_le32(0x00000200)
+#define FrameEnd       cpu_to_le32(0x80000000)
+#define DataComplete   cpu_to_le32(0x40000000)
 #define LengthCheck    0x00008000
 #define SccEvt         0x02000000
 #define NoAck          0x00000200
 #define Action         0x00000001
-#define HiDesc         0x20000000
+#define HiDesc         cpu_to_le32(0x20000000)
 
 /* SCC events */
 #define RxEvt          0xf0000000
@@ -489,8 +491,8 @@ static void dscc4_release_ring(struct dscc4_dev_priv *dpriv)
        skbuff = dpriv->tx_skbuff;
        for (i = 0; i < TX_RING_SIZE; i++) {
                if (*skbuff) {
-                       pci_unmap_single(pdev, tx_fd->data, (*skbuff)->len,
-                               PCI_DMA_TODEVICE);
+                       pci_unmap_single(pdev, le32_to_cpu(tx_fd->data),
+                               (*skbuff)->len, PCI_DMA_TODEVICE);
                        dev_kfree_skb(*skbuff);
                }
                skbuff++;
@@ -500,7 +502,7 @@ static void dscc4_release_ring(struct dscc4_dev_priv *dpriv)
        skbuff = dpriv->rx_skbuff;
        for (i = 0; i < RX_RING_SIZE; i++) {
                if (*skbuff) {
-                       pci_unmap_single(pdev, rx_fd->data,
+                       pci_unmap_single(pdev, le32_to_cpu(rx_fd->data),
                                RX_MAX(HDLC_MAX_MRU), PCI_DMA_FROMDEVICE);
                        dev_kfree_skb(*skbuff);
                }
@@ -522,10 +524,10 @@ static inline int try_get_rx_skb(struct dscc4_dev_priv *dpriv,
        dpriv->rx_skbuff[dirty] = skb;
        if (skb) {
                skb->protocol = hdlc_type_trans(skb, dev);
-               rx_fd->data = pci_map_single(dpriv->pci_priv->pdev, skb->data,
-                                            len, PCI_DMA_FROMDEVICE);
+               rx_fd->data = cpu_to_le32(pci_map_single(dpriv->pci_priv->pdev,
+                                         skb->data, len, PCI_DMA_FROMDEVICE));
        } else {
-               rx_fd->data = (u32) NULL;
+               rx_fd->data = 0;
                ret = -1;
        }
        return ret;
@@ -587,7 +589,7 @@ static inline int dscc4_xpr_ack(struct dscc4_dev_priv *dpriv)
 
        do {
                if (!(dpriv->flags & (NeedIDR | NeedIDT)) ||
-                   (dpriv->iqtx[cur] & Xpr))
+                   (dpriv->iqtx[cur] & cpu_to_le32(Xpr)))
                        break;
                smp_rmb();
                schedule_timeout_uninterruptible(10);
@@ -650,8 +652,9 @@ static inline void dscc4_rx_skb(struct dscc4_dev_priv *dpriv,
                printk(KERN_DEBUG "%s: skb=0 (%s)\n", dev->name, __FUNCTION__);
                goto refill;
        }
-       pkt_len = TO_SIZE(rx_fd->state2);
-       pci_unmap_single(pdev, rx_fd->data, RX_MAX(HDLC_MAX_MRU), PCI_DMA_FROMDEVICE);
+       pkt_len = TO_SIZE(le32_to_cpu(rx_fd->state2));
+       pci_unmap_single(pdev, le32_to_cpu(rx_fd->data),
+                        RX_MAX(HDLC_MAX_MRU), PCI_DMA_FROMDEVICE);
        if ((skb->data[--pkt_len] & FrameOk) == FrameOk) {
                stats->rx_packets++;
                stats->rx_bytes += pkt_len;
@@ -679,7 +682,7 @@ refill:
        }
        dscc4_rx_update(dpriv, dev);
        rx_fd->state2 = 0x00000000;
-       rx_fd->end = 0xbabeface;
+       rx_fd->end = cpu_to_le32(0xbabeface);
 }
 
 static void dscc4_free1(struct pci_dev *pdev)
@@ -772,8 +775,8 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
        }
        /* Global interrupt queue */
        writel((u32)(((IRQ_RING_SIZE >> 5) - 1) << 20), ioaddr + IQLENR1);
-       priv->iqcfg = (u32 *) pci_alloc_consistent(pdev,
-               IRQ_RING_SIZE*sizeof(u32), &priv->iqcfg_dma);
+       priv->iqcfg = (__le32 *) pci_alloc_consistent(pdev,
+               IRQ_RING_SIZE*sizeof(__le32), &priv->iqcfg_dma);
        if (!priv->iqcfg)
                goto err_free_irq_5;
        writel(priv->iqcfg_dma, ioaddr + IQCFG);
@@ -786,7 +789,7 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
         */
        for (i = 0; i < dev_per_card; i++) {
                dpriv = priv->root + i;
-               dpriv->iqtx = (u32 *) pci_alloc_consistent(pdev,
+               dpriv->iqtx = (__le32 *) pci_alloc_consistent(pdev,
                        IRQ_RING_SIZE*sizeof(u32), &dpriv->iqtx_dma);
                if (!dpriv->iqtx)
                        goto err_free_iqtx_6;
@@ -794,7 +797,7 @@ static int __devinit dscc4_init_one(struct pci_dev *pdev,
        }
        for (i = 0; i < dev_per_card; i++) {
                dpriv = priv->root + i;
-               dpriv->iqrx = (u32 *) pci_alloc_consistent(pdev,
+               dpriv->iqrx = (__le32 *) pci_alloc_consistent(pdev,
                        IRQ_RING_SIZE*sizeof(u32), &dpriv->iqrx_dma);
                if (!dpriv->iqrx)
                        goto err_free_iqrx_7;
@@ -1156,8 +1159,8 @@ static int dscc4_start_xmit(struct sk_buff *skb, struct net_device *dev)
        dpriv->tx_skbuff[next] = skb;
        tx_fd = dpriv->tx_fd + next;
        tx_fd->state = FrameEnd | TO_STATE_TX(skb->len);
-       tx_fd->data = pci_map_single(ppriv->pdev, skb->data, skb->len,
-                                    PCI_DMA_TODEVICE);
+       tx_fd->data = cpu_to_le32(pci_map_single(ppriv->pdev, skb->data, skb->len,
+                                    PCI_DMA_TODEVICE));
        tx_fd->complete = 0x00000000;
        tx_fd->jiffies = jiffies;
        mb();
@@ -1508,7 +1511,7 @@ static irqreturn_t dscc4_irq(int irq, void *token)
        if (state & Cfg) {
                if (debug > 0)
                        printk(KERN_DEBUG "%s: CfgIV\n", DRV_NAME);
-               if (priv->iqcfg[priv->cfg_cur++%IRQ_RING_SIZE] & Arf)
+               if (priv->iqcfg[priv->cfg_cur++%IRQ_RING_SIZE] & cpu_to_le32(Arf))
                        printk(KERN_ERR "%s: %s failed\n", dev->name, "CFG");
                if (!(state &= ~Cfg))
                        goto out;
@@ -1541,7 +1544,7 @@ static void dscc4_tx_irq(struct dscc4_pci_priv *ppriv,
 
 try:
        cur = dpriv->iqtx_current%IRQ_RING_SIZE;
-       state = dpriv->iqtx[cur];
+       state = le32_to_cpu(dpriv->iqtx[cur]);
        if (!state) {
                if (debug > 4)
                        printk(KERN_DEBUG "%s: Tx ISR = 0x%08x\n", dev->name,
@@ -1580,7 +1583,7 @@ try:
                        tx_fd = dpriv->tx_fd + cur;
                        skb = dpriv->tx_skbuff[cur];
                        if (skb) {
-                               pci_unmap_single(ppriv->pdev, tx_fd->data,
+                               pci_unmap_single(ppriv->pdev, le32_to_cpu(tx_fd->data),
                                                 skb->len, PCI_DMA_TODEVICE);
                                if (tx_fd->state & FrameEnd) {
                                        stats->tx_packets++;
@@ -1711,7 +1714,7 @@ static void dscc4_rx_irq(struct dscc4_pci_priv *priv,
 
 try:
        cur = dpriv->iqrx_current%IRQ_RING_SIZE;
-       state = dpriv->iqrx[cur];
+       state = le32_to_cpu(dpriv->iqrx[cur]);
        if (!state)
                return;
        dpriv->iqrx[cur] = 0;
@@ -1755,7 +1758,7 @@ try:
                                        goto try;
                                rx_fd->state1 &= ~Hold;
                                rx_fd->state2 = 0x00000000;
-                               rx_fd->end = 0xbabeface;
+                               rx_fd->end = cpu_to_le32(0xbabeface);
                        //}
                        goto try;
                }
@@ -1834,7 +1837,7 @@ try:
                                        hdlc_stats(dev)->rx_over_errors++;
                                        rx_fd->state1 |= Hold;
                                        rx_fd->state2 = 0x00000000;
-                                       rx_fd->end = 0xbabeface;
+                                       rx_fd->end = cpu_to_le32(0xbabeface);
                                } else
                                        dscc4_rx_skb(dpriv, dev);
                        } while (1);
@@ -1904,8 +1907,9 @@ static struct sk_buff *dscc4_init_dummy_skb(struct dscc4_dev_priv *dpriv)
                skb_copy_to_linear_data(skb, version,
                                        strlen(version) % DUMMY_SKB_SIZE);
                tx_fd->state = FrameEnd | TO_STATE_TX(DUMMY_SKB_SIZE);
-               tx_fd->data = pci_map_single(dpriv->pci_priv->pdev, skb->data,
-                                            DUMMY_SKB_SIZE, PCI_DMA_TODEVICE);
+               tx_fd->data = cpu_to_le32(pci_map_single(dpriv->pci_priv->pdev,
+                                            skb->data, DUMMY_SKB_SIZE,
+                                            PCI_DMA_TODEVICE));
                dpriv->tx_skbuff[last] = skb;
        }
        return skb;
@@ -1937,8 +1941,8 @@ static int dscc4_init_ring(struct net_device *dev)
                tx_fd->state = FrameEnd | TO_STATE_TX(2*DUMMY_SKB_SIZE);
                tx_fd->complete = 0x00000000;
                /* FIXME: NULL should be ok - to be tried */
-               tx_fd->data = dpriv->tx_fd_dma;
-               (tx_fd++)->next = (u32)(dpriv->tx_fd_dma +
+               tx_fd->data = cpu_to_le32(dpriv->tx_fd_dma);
+               (tx_fd++)->next = cpu_to_le32(dpriv->tx_fd_dma +
                                        (++i%TX_RING_SIZE)*sizeof(*tx_fd));
        } while (i < TX_RING_SIZE);
 
@@ -1951,12 +1955,12 @@ static int dscc4_init_ring(struct net_device *dev)
                /* size set by the host. Multiple of 4 bytes please */
                rx_fd->state1 = HiDesc;
                rx_fd->state2 = 0x00000000;
-               rx_fd->end = 0xbabeface;
+               rx_fd->end = cpu_to_le32(0xbabeface);
                rx_fd->state1 |= TO_STATE_RX(HDLC_MAX_MRU);
                // FIXME: return value verifiee mais traitement suspect
                if (try_get_rx_skb(dpriv, dev) >= 0)
                        dpriv->rx_dirty++;
-               (rx_fd++)->next = (u32)(dpriv->rx_fd_dma +
+               (rx_fd++)->next = cpu_to_le32(dpriv->rx_fd_dma +
                                        (++i%RX_RING_SIZE)*sizeof(*rx_fd));
        } while (i < RX_RING_SIZE);