Merge commit 'origin/HEAD' into test-merge
authorBenjamin Herrenschmidt <benh@kernel.crashing.org>
Mon, 14 Jul 2008 04:29:49 +0000 (14:29 +1000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Mon, 14 Jul 2008 04:29:49 +0000 (14:29 +1000)
Manual fixup of include/asm-powerpc/pgtable-ppc64.h

1  2 
arch/powerpc/boot/Makefile
drivers/net/ibm_newemac/core.c
include/asm-powerpc/pgtable-ppc64.h

index 751a6e6070d232340223d05c69bb19c1404fcc8a,095e04db1c0e1f75e39cbd01c6419c8b890295c2..0055edbc774c80d5e139ff3cdfad1d4f9f314700
@@@ -35,8 -35,6 +35,8 @@@ endi
  
  BOOTCFLAGS    += -I$(obj) -I$(srctree)/$(obj) -I$(srctree)/$(src)/libfdt
  
 +DTS_FLAGS     ?= -p 1024
 +
  $(obj)/4xx.o: BOOTCFLAGS += -mcpu=405
  $(obj)/ebony.o: BOOTCFLAGS += -mcpu=405
  $(obj)/cuboot-taishan.o: BOOTCFLAGS += -mcpu=405
@@@ -65,10 -63,10 +65,10 @@@ src-plat := of.c cuboot-52xx.c cuboot-8
                ps3-head.S ps3-hvcall.S ps3.c treeboot-bamboo.c cuboot-8xx.c \
                cuboot-pq2.c cuboot-sequoia.c treeboot-walnut.c \
                cuboot-bamboo.c cuboot-mpc7448hpc2.c cuboot-taishan.c \
 -              fixed-head.S ep88xc.c ep405.c \
 +              fixed-head.S ep88xc.c ep405.c cuboot-c2k.c \
                cuboot-katmai.c cuboot-rainier.c redboot-8xx.c ep8248e.c \
                cuboot-warp.c cuboot-85xx-cpm2.c cuboot-yosemite.c simpleboot.c \
 -              virtex405-head.S
 +              virtex405-head.S redboot-83xx.c cuboot-sam440ep.c
  src-boot := $(src-wlib) $(src-plat) empty.c
  
  src-boot := $(addprefix $(obj)/, $(src-boot))
@@@ -215,7 -213,6 +215,7 @@@ image-$(CONFIG_WALNUT)                     += treeImage.w
  # Board ports in arch/powerpc/platform/44x/Kconfig
  image-$(CONFIG_EBONY)                 += treeImage.ebony cuImage.ebony
  image-$(CONFIG_BAMBOO)                        += treeImage.bamboo cuImage.bamboo
 +image-$(CONFIG_SAM440EP)              += cuImage.sam440ep
  image-$(CONFIG_SEQUOIA)                       += cuImage.sequoia
  image-$(CONFIG_RAINIER)                       += cuImage.rainier
  image-$(CONFIG_TAISHAN)                       += cuImage.taishan
@@@ -245,7 -242,6 +245,7 @@@ image-$(CONFIG_MPC834x_ITX)                += cuImage
                                           cuImage.mpc8349emitxgp
  image-$(CONFIG_MPC834x_MDS)           += cuImage.mpc834x_mds
  image-$(CONFIG_MPC836x_MDS)           += cuImage.mpc836x_mds
 +image-$(CONFIG_ASP834x)                       += dtbImage.asp834x-redboot
  
  # Board ports in arch/powerpc/platform/85xx/Kconfig
  image-$(CONFIG_MPC8540_ADS)           += cuImage.mpc8540ads
@@@ -258,7 -254,6 +258,7 @@@ image-$(CONFIG_MPC85xx_DS)         += cuImage.
                                           cuImage.mpc8572ds
  image-$(CONFIG_TQM8540)                       += cuImage.tqm8540
  image-$(CONFIG_TQM8541)                       += cuImage.tqm8541
 +image-$(CONFIG_TQM8548)                       += cuImage.tqm8548
  image-$(CONFIG_TQM8555)                       += cuImage.tqm8555
  image-$(CONFIG_TQM8560)                       += cuImage.tqm8560
  image-$(CONFIG_SBC8548)                       += cuImage.sbc8548
@@@ -268,7 -263,6 +268,7 @@@ image-$(CONFIG_KSI8560)                    += cuImage.ks
  # Board ports in arch/powerpc/platform/embedded6xx/Kconfig
  image-$(CONFIG_STORCENTER)            += cuImage.storcenter
  image-$(CONFIG_MPC7448HPC2)           += cuImage.mpc7448hpc2
 +image-$(CONFIG_PPC_C2K)                       += cuImage.c2k
  
  # For 32-bit powermacs, build the COFF and miboot images
  # as well as the ELF images.
@@@ -279,7 -273,8 +279,8 @@@ endi
  initrd-  := $(patsubst zImage%, zImage.initrd%, $(image-n) $(image-))
  initrd-y := $(patsubst zImage%, zImage.initrd%, \
                $(patsubst dtbImage%, dtbImage.initrd%, \
-               $(patsubst treeImage%, treeImage.initrd%, $(image-y))))
+               $(patsubst simpleImage%, simpleImage.initrd%, \
+               $(patsubst treeImage%, treeImage.initrd%, $(image-y)))))
  initrd-y := $(filter-out $(image-y), $(initrd-y))
  targets       += $(image-y) $(initrd-y)
  
index ed24a1d607dd011f6de6203f1453ecdcfe651bcb,babc79ad490b6ada422a3ce96f9fefd510050b65..61af02b4c9d88b88365e1917d47193c23a61d475
@@@ -363,31 -363,25 +363,31 @@@ static int emac_reset(struct emac_insta
  
  static void emac_hash_mc(struct emac_instance *dev)
  {
 -      struct emac_regs __iomem *p = dev->emacp;
 -      u16 gaht[4] = { 0 };
 +      const int regs = EMAC_XAHT_REGS(dev);
 +      u32 *gaht_base = emac_gaht_base(dev);
 +      u32 gaht_temp[regs];
        struct dev_mc_list *dmi;
 +      int i;
  
        DBG(dev, "hash_mc %d" NL, dev->ndev->mc_count);
  
 +      memset(gaht_temp, 0, sizeof (gaht_temp));
 +
        for (dmi = dev->ndev->mc_list; dmi; dmi = dmi->next) {
 -              int bit;
 +              int slot, reg, mask;
                DBG2(dev, "mc %02x:%02x:%02x:%02x:%02x:%02x" NL,
                     dmi->dmi_addr[0], dmi->dmi_addr[1], dmi->dmi_addr[2],
                     dmi->dmi_addr[3], dmi->dmi_addr[4], dmi->dmi_addr[5]);
  
 -              bit = 63 - (ether_crc(ETH_ALEN, dmi->dmi_addr) >> 26);
 -              gaht[bit >> 4] |= 0x8000 >> (bit & 0x0f);
 +              slot = EMAC_XAHT_CRC_TO_SLOT(dev, ether_crc(ETH_ALEN, dmi->dmi_addr));
 +              reg = EMAC_XAHT_SLOT_TO_REG(dev, slot);
 +              mask = EMAC_XAHT_SLOT_TO_MASK(dev, slot);
 +
 +              gaht_temp[reg] |= mask;
        }
 -      out_be32(&p->gaht1, gaht[0]);
 -      out_be32(&p->gaht2, gaht[1]);
 -      out_be32(&p->gaht3, gaht[2]);
 -      out_be32(&p->gaht4, gaht[3]);
 +
 +      for (i = 0; i < regs; i++)
 +              out_be32(gaht_base + i, gaht_temp[i]);
  }
  
  static inline u32 emac_iff2rmr(struct net_device *ndev)
  
        if (ndev->flags & IFF_PROMISC)
                r |= EMAC_RMR_PME;
 -      else if (ndev->flags & IFF_ALLMULTI || ndev->mc_count > 32)
 +      else if (ndev->flags & IFF_ALLMULTI ||
 +                       (ndev->mc_count > EMAC_XAHT_SLOTS(dev)))
                r |= EMAC_RMR_PMME;
        else if (ndev->mc_count > 0)
                r |= EMAC_RMR_MAE;
@@@ -549,7 -542,7 +549,7 @@@ static int emac_configure(struct emac_i
                        /* Put some arbitrary OUI, Manuf & Rev IDs so we can
                         * identify this GPCS PHY later.
                         */
 -                      out_be32(&p->ipcr, 0xdeadbeef);
 +                      out_be32(&p->u1.emac4.ipcr, 0xdeadbeef);
                } else
                        mr1 |= EMAC_MR1_MF_1000;
  
@@@ -1643,6 -1636,12 +1643,12 @@@ static int emac_poll_rx(void *param, in
                        goto next;
                }
  
+               if (len < ETH_HLEN) {
+                       ++dev->estats.rx_dropped_stack;
+                       emac_recycle_rx_skb(dev, slot, len);
+                       goto next;
+               }
                if (len && len < EMAC_RX_COPY_THRESH) {
                        struct sk_buff *copy_skb =
                            alloc_skb(len + EMAC_RX_SKB_HEADROOM + 2, GFP_ATOMIC);
@@@ -2022,10 -2021,10 +2028,10 @@@ static int emac_get_regs_len(struct ema
  {
        if (emac_has_feature(dev, EMAC_FTR_EMAC4))
                return sizeof(struct emac_ethtool_regs_subhdr) +
 -                      EMAC4_ETHTOOL_REGS_SIZE;
 +                      EMAC4_ETHTOOL_REGS_SIZE(dev);
        else
                return sizeof(struct emac_ethtool_regs_subhdr) +
 -                      EMAC_ETHTOOL_REGS_SIZE;
 +                      EMAC_ETHTOOL_REGS_SIZE(dev);
  }
  
  static int emac_ethtool_get_regs_len(struct net_device *ndev)
@@@ -2052,12 -2051,12 +2058,12 @@@ static void *emac_dump_regs(struct emac
        hdr->index = dev->cell_index;
        if (emac_has_feature(dev, EMAC_FTR_EMAC4)) {
                hdr->version = EMAC4_ETHTOOL_REGS_VER;
 -              memcpy_fromio(hdr + 1, dev->emacp, EMAC4_ETHTOOL_REGS_SIZE);
 -              return ((void *)(hdr + 1) + EMAC4_ETHTOOL_REGS_SIZE);
 +              memcpy_fromio(hdr + 1, dev->emacp, EMAC4_ETHTOOL_REGS_SIZE(dev));
 +              return ((void *)(hdr + 1) + EMAC4_ETHTOOL_REGS_SIZE(dev));
        } else {
                hdr->version = EMAC_ETHTOOL_REGS_VER;
 -              memcpy_fromio(hdr + 1, dev->emacp, EMAC_ETHTOOL_REGS_SIZE);
 -              return ((void *)(hdr + 1) + EMAC_ETHTOOL_REGS_SIZE);
 +              memcpy_fromio(hdr + 1, dev->emacp, EMAC_ETHTOOL_REGS_SIZE(dev));
 +              return ((void *)(hdr + 1) + EMAC_ETHTOOL_REGS_SIZE(dev));
        }
  }
  
@@@ -2547,9 -2546,7 +2553,9 @@@ static int __devinit emac_init_config(s
        }
  
        /* Check EMAC version */
 -      if (of_device_is_compatible(np, "ibm,emac4")) {
 +      if (of_device_is_compatible(np, "ibm,emac4sync")) {
 +              dev->features |= (EMAC_FTR_EMAC4 | EMAC_FTR_EMAC4SYNC);
 +      } else if (of_device_is_compatible(np, "ibm,emac4")) {
                dev->features |= EMAC_FTR_EMAC4;
                if (of_device_is_compatible(np, "ibm,emac-440gx"))
                        dev->features |= EMAC_FTR_440GX_PHY_CLK_FIX;
        }
        memcpy(dev->ndev->dev_addr, p, 6);
  
 +      /* IAHT and GAHT filter parameterization */
 +      if (emac_has_feature(dev, EMAC_FTR_EMAC4SYNC)) {
 +              dev->xaht_slots_shift = EMAC4SYNC_XAHT_SLOTS_SHIFT;
 +              dev->xaht_width_shift = EMAC4SYNC_XAHT_WIDTH_SHIFT;
 +      } else {
 +              dev->xaht_slots_shift = EMAC4_XAHT_SLOTS_SHIFT;
 +              dev->xaht_width_shift = EMAC4_XAHT_WIDTH_SHIFT;
 +      }
 +
        DBG(dev, "features     : 0x%08x / 0x%08x\n", dev->features, EMAC_FTRS_POSSIBLE);
        DBG(dev, "tx_fifo_size : %d (%d gige)\n", dev->tx_fifo_size, dev->tx_fifo_size_gige);
        DBG(dev, "rx_fifo_size : %d (%d gige)\n", dev->rx_fifo_size, dev->rx_fifo_size_gige);
@@@ -2690,8 -2678,7 +2696,8 @@@ static int __devinit emac_probe(struct 
                goto err_irq_unmap;
        }
        // TODO : request_mem_region
 -      dev->emacp = ioremap(dev->rsrc_regs.start, sizeof(struct emac_regs));
 +      dev->emacp = ioremap(dev->rsrc_regs.start,
 +                           dev->rsrc_regs.end - dev->rsrc_regs.start + 1);
        if (dev->emacp == NULL) {
                printk(KERN_ERR "%s: Can't map device registers!\n",
                       np->full_name);
        /* Clean rings */
        memset(dev->tx_desc, 0, NUM_TX_BUFF * sizeof(struct mal_descriptor));
        memset(dev->rx_desc, 0, NUM_RX_BUFF * sizeof(struct mal_descriptor));
+       memset(dev->tx_skb, 0, NUM_TX_BUFF * sizeof(struct sk_buff *));
+       memset(dev->rx_skb, 0, NUM_RX_BUFF * sizeof(struct sk_buff *));
  
        /* Attach to ZMII, if needed */
        if (emac_has_feature(dev, EMAC_FTR_HAS_ZMII) &&
@@@ -2903,10 -2892,6 +2911,10 @@@ static struct of_device_id emac_match[
                .type           = "network",
                .compatible     = "ibm,emac4",
        },
 +      {
 +              .type           = "network",
 +              .compatible     = "ibm,emac4sync",
 +      },
        {},
  };
  
index d09599cccb353c08f5883c6e0ca2fa5d61b5142a,7686569a0bef396dd5828fcc8b194eca96db2036..ab98a9c80b2883b60957a0a7a69f2758de133687
  #define _PAGE_DIRTY   0x0080 /* C: page changed */
  #define _PAGE_ACCESSED        0x0100 /* R: page referenced */
  #define _PAGE_RW      0x0200 /* software: user write access allowed */
 -#define _PAGE_HASHPTE 0x0400 /* software: pte has an associated HPTE */
  #define _PAGE_BUSY    0x0800 /* software: PTE & hash are busy */
  
 +/* Strong Access Ordering */
 +#define _PAGE_SAO     (_PAGE_WRITETHRU | _PAGE_NO_CACHE | _PAGE_COHERENT)
 +
  #define _PAGE_BASE    (_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_COHERENT)
  
  #define _PAGE_WRENABLE        (_PAGE_RW | _PAGE_DIRTY)
@@@ -315,13 -313,14 +315,14 @@@ static inline void ptep_set_wrprotect(s
                        return;
        old = pte_update(mm, addr, ptep, _PAGE_RW, 0);
  }
  static inline void huge_ptep_set_wrprotect(struct mm_struct *mm,
                                           unsigned long addr, pte_t *ptep)
  {
        unsigned long old;
  
-               if ((pte_val(*ptep) & _PAGE_RW) == 0)
-                       return;
+       if ((pte_val(*ptep) & _PAGE_RW) == 0)
+               return;
        old = pte_update(mm, addr, ptep, _PAGE_RW, 1);
  }