]> Pileus Git - ~andy/linux/blobdiff - drivers/net/ethernet/stmicro/stmmac/chain_mode.c
stmmac: support extend descriptors
[~andy/linux] / drivers / net / ethernet / stmicro / stmmac / chain_mode.c
index 08ff51e9c791193a993cb15f882695097195a1cb..688c3f4f1781c2e6a764c5985694d05630ca3f29 100644 (file)
@@ -89,27 +89,38 @@ static unsigned int stmmac_is_jumbo_frm(int len, int enh_desc)
        return ret;
 }
 
-static void stmmac_init_dma_chain(struct dma_desc *des, dma_addr_t phy_addr,
-                                 unsigned int size)
+static void stmmac_init_dma_chain(void *des, dma_addr_t phy_addr,
+                                 unsigned int size, unsigned int extend_desc)
 {
        /*
         * In chained mode the des3 points to the next element in the ring.
         * The latest element has to point to the head.
         */
        int i;
-       struct dma_desc *p = des;
        dma_addr_t dma_phy = phy_addr;
 
-       for (i = 0; i < (size - 1); i++) {
-               dma_phy += sizeof(struct dma_desc);
-               p->des3 = (unsigned int)dma_phy;
-               p++;
+       if (extend_desc) {
+               struct dma_extended_desc *p = (struct dma_extended_desc *) des;
+               for (i = 0; i < (size - 1); i++) {
+                       dma_phy += sizeof(struct dma_extended_desc);
+                       p->basic.des3 = (unsigned int)dma_phy;
+                       p++;
+               }
+               p->basic.des3 = (unsigned int)phy_addr;
+
+       } else {
+               struct dma_desc *p = (struct dma_desc *) des;
+               for (i = 0; i < (size - 1); i++) {
+                       dma_phy += sizeof(struct dma_desc);
+                       p->des3 = (unsigned int)dma_phy;
+                       p++;
+               }
+               p->des3 = (unsigned int)phy_addr;
        }
-       p->des3 = (unsigned int)phy_addr;
 }
 
 const struct stmmac_chain_mode_ops chain_mode_ops = {
+       .init = stmmac_init_dma_chain,
        .is_jumbo_frm = stmmac_is_jumbo_frm,
        .jumbo_frm = stmmac_jumbo_frm,
-       .init_dma_chain = stmmac_init_dma_chain,
 };