]> git.sur5r.net Git - u-boot/blobdiff - drivers/net/e1000.c
rockchip: dts: rk3328-evb: Enable gmac2io for rk3328-evb
[u-boot] / drivers / net / e1000.c
index 6be2d9f98fe3060296045c188e82d125fa6e9650..875682b1b89e1ee31b7226e646be3c108b850933 100644 (file)
@@ -38,8 +38,13 @@ tested on both gig copper and gig fiber boards
 
 #define TOUT_LOOP   100000
 
+#ifdef CONFIG_DM_ETH
+#define virt_to_bus(devno, v)  dm_pci_virt_to_mem(devno, (void *) (v))
+#define bus_to_phys(devno, a)  dm_pci_mem_to_phys(devno, a)
+#else
 #define virt_to_bus(devno, v)  pci_virt_to_mem(devno, (void *) (v))
 #define bus_to_phys(devno, a)  pci_mem_to_phys(devno, a)
+#endif
 
 #define E1000_DEFAULT_PCI_PBA  0x00000030
 #define E1000_DEFAULT_PCIE_PBA 0x000a0026
@@ -1395,8 +1400,13 @@ e1000_reset_hw(struct e1000_hw *hw)
        /* For 82542 (rev 2.0), disable MWI before issuing a device reset */
        if (hw->mac_type == e1000_82542_rev2_0) {
                DEBUGOUT("Disabling MWI on 82542 rev 2.0\n");
+#ifdef CONFIG_DM_ETH
+               dm_pci_write_config16(hw->pdev, PCI_COMMAND,
+                               hw->pci_cmd_word & ~PCI_COMMAND_INVALIDATE);
+#else
                pci_write_config_word(hw->pdev, PCI_COMMAND,
                                hw->pci_cmd_word & ~PCI_COMMAND_INVALIDATE);
+#endif
        }
 
        /* Clear interrupt mask to stop board from generating interrupts */
@@ -1469,7 +1479,11 @@ e1000_reset_hw(struct e1000_hw *hw)
 
        /* If MWI was previously enabled, reenable it. */
        if (hw->mac_type == e1000_82542_rev2_0) {
+#ifdef CONFIG_DM_ETH
+               dm_pci_write_config16(hw->pdev, PCI_COMMAND, hw->pci_cmd_word);
+#else
                pci_write_config_word(hw->pdev, PCI_COMMAND, hw->pci_cmd_word);
+#endif
        }
        if (hw->mac_type != e1000_igb)
                E1000_WRITE_REG(hw, PBA, pba);
@@ -1508,11 +1522,10 @@ e1000_initialize_hardware_bits(struct e1000_hw *hw)
                reg_txdctl1 |= E1000_TXDCTL_COUNT_DESC;
                E1000_WRITE_REG(hw, TXDCTL1, reg_txdctl1);
 
-       /* IGB is cool */
-       if (hw->mac_type == e1000_igb)
-               return;
 
                switch (hw->mac_type) {
+               case e1000_igb:                 /* IGB is cool */
+                       return;
                case e1000_82571:
                case e1000_82572:
                        /* Clear PHY TX compatible mode bits */
@@ -1655,9 +1668,15 @@ e1000_init_hw(struct e1000_hw *hw, unsigned char enetaddr[6])
        /* For 82542 (rev 2.0), disable MWI and put the receiver into reset */
        if (hw->mac_type == e1000_82542_rev2_0) {
                DEBUGOUT("Disabling MWI on 82542 rev 2.0\n");
+#ifdef CONFIG_DM_ETH
+               dm_pci_write_config16(hw->pdev, PCI_COMMAND,
+                                     hw->
+                                     pci_cmd_word & ~PCI_COMMAND_INVALIDATE);
+#else
                pci_write_config_word(hw->pdev, PCI_COMMAND,
                                      hw->
                                      pci_cmd_word & ~PCI_COMMAND_INVALIDATE);
+#endif
                E1000_WRITE_REG(hw, RCTL, E1000_RCTL_RST);
                E1000_WRITE_FLUSH(hw);
                mdelay(5);
@@ -1673,7 +1692,11 @@ e1000_init_hw(struct e1000_hw *hw, unsigned char enetaddr[6])
                E1000_WRITE_REG(hw, RCTL, 0);
                E1000_WRITE_FLUSH(hw);
                mdelay(1);
+#ifdef CONFIG_DM_ETH
+               dm_pci_write_config16(hw->pdev, PCI_COMMAND, hw->pci_cmd_word);
+#else
                pci_write_config_word(hw->pdev, PCI_COMMAND, hw->pci_cmd_word);
+#endif
        }
 
        /* Zero out the Multicast HASH table */
@@ -1696,10 +1719,17 @@ e1000_init_hw(struct e1000_hw *hw, unsigned char enetaddr[6])
        default:
        /* Workaround for PCI-X problem when BIOS sets MMRBC incorrectly. */
        if (hw->bus_type == e1000_bus_type_pcix) {
+#ifdef CONFIG_DM_ETH
+               dm_pci_read_config16(hw->pdev, PCIX_COMMAND_REGISTER,
+                                    &pcix_cmd_word);
+               dm_pci_read_config16(hw->pdev, PCIX_STATUS_REGISTER_HI,
+                                    &pcix_stat_hi_word);
+#else
                pci_read_config_word(hw->pdev, PCIX_COMMAND_REGISTER,
                                     &pcix_cmd_word);
                pci_read_config_word(hw->pdev, PCIX_STATUS_REGISTER_HI,
                                     &pcix_stat_hi_word);
+#endif
                cmd_mmrbc =
                    (pcix_cmd_word & PCIX_COMMAND_MMRBC_MASK) >>
                    PCIX_COMMAND_MMRBC_SHIFT;
@@ -1711,8 +1741,13 @@ e1000_init_hw(struct e1000_hw *hw, unsigned char enetaddr[6])
                if (cmd_mmrbc > stat_mmrbc) {
                        pcix_cmd_word &= ~PCIX_COMMAND_MMRBC_MASK;
                        pcix_cmd_word |= stat_mmrbc << PCIX_COMMAND_MMRBC_SHIFT;
+#ifdef CONFIG_DM_ETH
+                       dm_pci_write_config16(hw->pdev, PCIX_COMMAND_REGISTER,
+                                             pcix_cmd_word);
+#else
                        pci_write_config_word(hw->pdev, PCIX_COMMAND_REGISTER,
                                              pcix_cmd_word);
+#endif
                }
        }
                break;
@@ -4809,6 +4844,16 @@ e1000_sw_init(struct e1000_hw *hw)
        int result;
 
        /* PCI config space info */
+#ifdef CONFIG_DM_ETH
+       dm_pci_read_config16(hw->pdev, PCI_VENDOR_ID, &hw->vendor_id);
+       dm_pci_read_config16(hw->pdev, PCI_DEVICE_ID, &hw->device_id);
+       dm_pci_read_config16(hw->pdev, PCI_SUBSYSTEM_VENDOR_ID,
+                            &hw->subsystem_vendor_id);
+       dm_pci_read_config16(hw->pdev, PCI_SUBSYSTEM_ID, &hw->subsystem_id);
+
+       dm_pci_read_config8(hw->pdev, PCI_REVISION_ID, &hw->revision_id);
+       dm_pci_read_config16(hw->pdev, PCI_COMMAND, &hw->pci_cmd_word);
+#else
        pci_read_config_word(hw->pdev, PCI_VENDOR_ID, &hw->vendor_id);
        pci_read_config_word(hw->pdev, PCI_DEVICE_ID, &hw->device_id);
        pci_read_config_word(hw->pdev, PCI_SUBSYSTEM_VENDOR_ID,
@@ -4817,6 +4862,7 @@ e1000_sw_init(struct e1000_hw *hw)
 
        pci_read_config_byte(hw->pdev, PCI_REVISION_ID, &hw->revision_id);
        pci_read_config_word(hw->pdev, PCI_COMMAND, &hw->pci_cmd_word);
+#endif
 
        /* identify the MAC */
        result = e1000_set_mac_type(hw);
@@ -5096,11 +5142,11 @@ _e1000_poll(struct e1000_hw *hw)
        inval_end = inval_start + roundup(sizeof(*rd), ARCH_DMA_MINALIGN);
        invalidate_dcache_range(inval_start, inval_end);
 
-       if (!(le32_to_cpu(rd->status)) & E1000_RXD_STAT_DD)
+       if (!(rd->status & E1000_RXD_STAT_DD))
                return 0;
        /* DEBUGOUT("recv: packet len=%d\n", rd->length); */
        /* Packet received, make sure the data are re-loaded from RAM. */
-       len = le32_to_cpu(rd->length);
+       len = le16_to_cpu(rd->length);
        invalidate_dcache_range((unsigned long)packet,
                                (unsigned long)packet +
                                roundup(len, ARCH_DMA_MINALIGN));
@@ -5232,25 +5278,46 @@ void e1000_get_bus_type(struct e1000_hw *hw)
 static LIST_HEAD(e1000_hw_list);
 #endif
 
+#ifdef CONFIG_DM_ETH
+static int e1000_init_one(struct e1000_hw *hw, int cardnum,
+                         struct udevice *devno, unsigned char enetaddr[6])
+#else
 static int e1000_init_one(struct e1000_hw *hw, int cardnum, pci_dev_t devno,
                          unsigned char enetaddr[6])
+#endif
 {
        u32 val;
 
        /* Assign the passed-in values */
+#ifdef CONFIG_DM_ETH
+       hw->pdev = devno;
+#else
        hw->pdev = devno;
+#endif
        hw->cardnum = cardnum;
 
        /* Print a debug message with the IO base address */
+#ifdef CONFIG_DM_ETH
+       dm_pci_read_config32(devno, PCI_BASE_ADDRESS_0, &val);
+#else
        pci_read_config_dword(devno, PCI_BASE_ADDRESS_0, &val);
+#endif
        E1000_DBG(hw, "iobase 0x%08x\n", val & 0xfffffff0);
 
        /* Try to enable I/O accesses and bus-mastering */
        val = PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
+#ifdef CONFIG_DM_ETH
+       dm_pci_write_config32(devno, PCI_COMMAND, val);
+#else
        pci_write_config_dword(devno, PCI_COMMAND, val);
+#endif
 
        /* Make sure it worked */
+#ifdef CONFIG_DM_ETH
+       dm_pci_read_config32(devno, PCI_COMMAND, &val);
+#else
        pci_read_config_dword(devno, PCI_COMMAND, &val);
+#endif
        if (!(val & PCI_COMMAND_MEMORY)) {
                E1000_ERR(hw, "Can't enable I/O memory\n");
                return -ENOSPC;
@@ -5269,8 +5336,13 @@ static int e1000_init_one(struct e1000_hw *hw, int cardnum, pci_dev_t devno,
 #ifndef CONFIG_E1000_NO_NVM
        hw->eeprom_semaphore_present = true;
 #endif
+#ifdef CONFIG_DM_ETH
+       hw->hw_addr = dm_pci_map_bar(devno,     PCI_BASE_ADDRESS_0,
+                                               PCI_REGION_MEM);
+#else
        hw->hw_addr = pci_map_bar(devno,        PCI_BASE_ADDRESS_0,
                                                PCI_REGION_MEM);
+#endif
        hw->mac_type = e1000_undefined;
 
        /* MAC and Phy settings */
@@ -5380,7 +5452,7 @@ e1000_initialize(bd_t * bis)
        for (i = 0; (devno = pci_find_devices(e1000_supported, i)) >= 0; i++) {
                /*
                 * These will never get freed due to errors, this allows us to
-                * perform SPI EEPROM programming from U-boot, for example.
+                * perform SPI EEPROM programming from U-Boot, for example.
                 */
                struct eth_device *nic = malloc(sizeof(*nic));
                struct e1000_hw *hw = malloc(sizeof(*hw));
@@ -5440,7 +5512,8 @@ static int do_e1000(cmd_tbl_t *cmdtp, int flag,
        struct udevice *dev;
        char name[30];
        int ret;
-#else
+#endif
+#if !defined(CONFIG_DM_ETH) || defined(CONFIG_E1000_SPI)
        struct e1000_hw *hw;
 #endif
        int cardnum;
@@ -5476,6 +5549,9 @@ static int do_e1000(cmd_tbl_t *cmdtp, int flag,
        }
 
 #ifdef CONFIG_E1000_SPI
+#ifdef CONFIG_DM_ETH
+       hw = dev_get_priv(dev);
+#endif
        /* Handle the "SPI" subcommand */
        if (!strcmp(argv[2], "spi"))
                return do_e1000_spi(cmdtp, hw, argc - 3, argv + 3);
@@ -5553,8 +5629,8 @@ static int e1000_eth_probe(struct udevice *dev)
        int ret;
 
        hw->name = dev->name;
-       ret = e1000_init_one(hw, trailing_strtol(dev->name), pci_get_bdf(dev),
-                            plat->enetaddr);
+       ret = e1000_init_one(hw, trailing_strtol(dev->name),
+                            dev, plat->enetaddr);
        if (ret < 0) {
                printf(pr_fmt("failed to initialize card: %d\n"), ret);
                return ret;