X-Git-Url: http://git.openwrt.org/?p=openwrt%2Fopenwrt.git;a=blobdiff_plain;f=target%2Flinux%2Fadm8668%2Fpatches-3.18%2F004-tulip_pci_split.patch;fp=target%2Flinux%2Fadm8668%2Fpatches-3.18%2F004-tulip_pci_split.patch;h=e57bdb73cc88ccb13f294fcc4ef333fff7b61cdd;hp=0000000000000000000000000000000000000000;hb=f51f3ee9bc0ebd26b28fa7687cc4b7dd6dadc1b4;hpb=26cf81b94b22a3cc95676ff63e6d69dd256de080 diff --git a/target/linux/adm8668/patches-3.18/004-tulip_pci_split.patch b/target/linux/adm8668/patches-3.18/004-tulip_pci_split.patch new file mode 100644 index 0000000000..e57bdb73cc --- /dev/null +++ b/target/linux/adm8668/patches-3.18/004-tulip_pci_split.patch @@ -0,0 +1,452 @@ +--- a/drivers/net/ethernet/dec/tulip/tulip_core.c ++++ b/drivers/net/ethernet/dec/tulip/tulip_core.c +@@ -207,6 +207,7 @@ struct tulip_chip_table tulip_tbl[] = { + }; + + ++#ifdef CONFIG_TULIP_PCI + static const struct pci_device_id tulip_pci_tbl[] = { + { 0x1011, 0x0009, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DC21140 }, + { 0x1011, 0x0019, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DC21143 }, +@@ -250,7 +251,7 @@ static const struct pci_device_id tulip_ + { } /* terminate list */ + }; + MODULE_DEVICE_TABLE(pci, tulip_pci_tbl); +- ++#endif + + /* A full-duplex map for media types. */ + const char tulip_media_cap[32] = +@@ -268,11 +269,14 @@ static void tulip_down(struct net_device + static struct net_device_stats *tulip_get_stats(struct net_device *dev); + static int private_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); + static void set_rx_mode(struct net_device *dev); ++#ifdef CONFIG_TULIP_PCI + static void tulip_set_wolopts(struct pci_dev *pdev, u32 wolopts); ++#endif + #ifdef CONFIG_NET_POLL_CONTROLLER + static void poll_tulip(struct net_device *dev); + #endif + ++#ifdef CONFIG_TULIP_PCI + static void tulip_set_power_state (struct tulip_private *tp, + int sleep, int snooze) + { +@@ -289,7 +293,7 @@ static void tulip_set_power_state (struc + } + + } +- ++#endif + + static void tulip_up(struct net_device *dev) + { +@@ -303,6 +307,7 @@ static void tulip_up(struct net_device * + napi_enable(&tp->napi); + #endif + ++#ifdef CONFIG_TULIP_PCI + /* Wake the chip from sleep/snooze mode. */ + tulip_set_power_state (tp, 0, 0); + +@@ -310,6 +315,7 @@ static void tulip_up(struct net_device * + pci_enable_wake(tp->pdev, PCI_D3hot, 0); + pci_enable_wake(tp->pdev, PCI_D3cold, 0); + tulip_set_wolopts(tp->pdev, 0); ++#endif + + /* On some chip revs we must set the MII/SYM port before the reset!? */ + if (tp->mii_cnt || (tp->mtable && tp->mtable->has_mii)) +@@ -317,18 +323,22 @@ static void tulip_up(struct net_device * + + /* Reset the chip, holding bit 0 set at least 50 PCI cycles. */ + iowrite32(0x00000001, ioaddr + CSR0); ++#ifdef CONFIG_TULIP_PCI + pci_read_config_dword(tp->pdev, PCI_COMMAND, ®); /* flush write */ ++#endif + udelay(100); + + /* Deassert reset. + Wait the specified 50 PCI cycles after a reset by initializing + Tx and Rx queues and the address filter list. */ + iowrite32(tp->csr0, ioaddr + CSR0); ++#ifdef CONFIG_TULIP_PCI + pci_read_config_dword(tp->pdev, PCI_COMMAND, ®); /* flush write */ ++#endif + udelay(100); + + if (tulip_debug > 1) +- netdev_dbg(dev, "tulip_up(), irq==%d\n", tp->pdev->irq); ++ netdev_dbg(dev, "tulip_up(), irq==%d\n", tp->irq); + + iowrite32(tp->rx_ring_dma, ioaddr + CSR3); + iowrite32(tp->tx_ring_dma, ioaddr + CSR4); +@@ -362,9 +372,11 @@ static void tulip_up(struct net_device * + *setup_frm++ = eaddrs[1]; *setup_frm++ = eaddrs[1]; + *setup_frm++ = eaddrs[2]; *setup_frm++ = eaddrs[2]; + ++#ifdef CONFIG_TULIP_PCI + mapping = pci_map_single(tp->pdev, tp->setup_frame, + sizeof(tp->setup_frame), + PCI_DMA_TODEVICE); ++#endif + tp->tx_buffers[tp->cur_tx].skb = NULL; + tp->tx_buffers[tp->cur_tx].mapping = mapping; + +@@ -520,7 +532,7 @@ tulip_open(struct net_device *dev) + + tulip_init_ring (dev); + +- retval = request_irq(tp->pdev->irq, tulip_interrupt, IRQF_SHARED, ++ retval = request_irq(tp->irq, tulip_interrupt, IRQF_SHARED, + dev->name, dev); + if (retval) + goto free_ring; +@@ -644,8 +656,10 @@ static void tulip_init_ring(struct net_d + tp->rx_buffers[i].skb = skb; + if (skb == NULL) + break; ++#ifdef CONFIG_TULIP_PCI + mapping = pci_map_single(tp->pdev, skb->data, + PKT_BUF_SZ, PCI_DMA_FROMDEVICE); ++#endif + tp->rx_buffers[i].mapping = mapping; + tp->rx_ring[i].status = cpu_to_le32(DescOwned); /* Owned by Tulip chip */ + tp->rx_ring[i].buffer1 = cpu_to_le32(mapping); +@@ -678,8 +692,10 @@ tulip_start_xmit(struct sk_buff *skb, st + entry = tp->cur_tx % TX_RING_SIZE; + + tp->tx_buffers[entry].skb = skb; ++#ifdef CONFIG_TULIP_PCI + mapping = pci_map_single(tp->pdev, skb->data, + skb->len, PCI_DMA_TODEVICE); ++#endif + tp->tx_buffers[entry].mapping = mapping; + tp->tx_ring[entry].buffer1 = cpu_to_le32(mapping); + +@@ -730,16 +746,19 @@ static void tulip_clean_tx_ring(struct t + if (tp->tx_buffers[entry].skb == NULL) { + /* test because dummy frames not mapped */ + if (tp->tx_buffers[entry].mapping) ++#ifdef CONFIG_TULIP_PCI + pci_unmap_single(tp->pdev, + tp->tx_buffers[entry].mapping, + sizeof(tp->setup_frame), + PCI_DMA_TODEVICE); ++#endif + continue; + } +- ++#ifdef CONFIG_TULIP_PCI + pci_unmap_single(tp->pdev, tp->tx_buffers[entry].mapping, + tp->tx_buffers[entry].skb->len, + PCI_DMA_TODEVICE); ++#endif + + /* Free the original skb. */ + dev_kfree_skb_irq(tp->tx_buffers[entry].skb); +@@ -790,7 +809,9 @@ static void tulip_down (struct net_devic + dev->if_port = tp->saved_if_port; + + /* Leave the driver in snooze, not sleep, mode. */ ++#ifdef CONFIG_TULIP_PCI + tulip_set_power_state (tp, 0, 1); ++#endif + } + + static void tulip_free_ring (struct net_device *dev) +@@ -811,8 +832,10 @@ static void tulip_free_ring (struct net_ + /* An invalid address. */ + tp->rx_ring[i].buffer1 = cpu_to_le32(0xBADF00D0); + if (skb) { ++#ifdef CONFIG_TULIP_PCI + pci_unmap_single(tp->pdev, mapping, PKT_BUF_SZ, + PCI_DMA_FROMDEVICE); ++#endif + dev_kfree_skb (skb); + } + } +@@ -821,8 +844,10 @@ static void tulip_free_ring (struct net_ + struct sk_buff *skb = tp->tx_buffers[i].skb; + + if (skb != NULL) { ++#ifdef CONFIG_TULIP_PCI + pci_unmap_single(tp->pdev, tp->tx_buffers[i].mapping, + skb->len, PCI_DMA_TODEVICE); ++#endif + dev_kfree_skb (skb); + } + tp->tx_buffers[i].skb = NULL; +@@ -843,7 +868,7 @@ static int tulip_close (struct net_devic + netdev_dbg(dev, "Shutting down ethercard, status was %02x\n", + ioread32 (ioaddr + CSR5)); + +- free_irq (tp->pdev->irq, dev); ++ free_irq (tp->irq, dev); + + tulip_free_ring (dev); + +@@ -874,7 +899,9 @@ static void tulip_get_drvinfo(struct net + struct tulip_private *np = netdev_priv(dev); + strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); + strlcpy(info->version, DRV_VERSION, sizeof(info->version)); ++#ifdef CONFIG_TULIP_PCI + strlcpy(info->bus_info, pci_name(np->pdev), sizeof(info->bus_info)); ++#endif + } + + +@@ -887,7 +914,9 @@ static int tulip_ethtool_set_wol(struct + return -EOPNOTSUPP; + + tp->wolinfo.wolopts = wolinfo->wolopts; +- device_set_wakeup_enable(&tp->pdev->dev, tp->wolinfo.wolopts); ++#ifdef CONFIG_TULIP_PCI ++ device_set_wakeup_enable(tp->kdev, tp->wolinfo.wolopts); ++#endif + return 0; + } + +@@ -1165,9 +1194,11 @@ static void set_rx_mode(struct net_devic + + tp->tx_buffers[entry].skb = NULL; + tp->tx_buffers[entry].mapping = ++#ifdef CONFIG_TULIP_PCI + pci_map_single(tp->pdev, tp->setup_frame, + sizeof(tp->setup_frame), + PCI_DMA_TODEVICE); ++#endif + /* Put the setup frame on the Tx list. */ + if (entry == TX_RING_SIZE-1) + tx_flags |= DESC_RING_WRAP; /* Wrap ring. */ +@@ -1264,19 +1295,22 @@ out: + netdev_dbg(dev, "MWI config cacheline=%d, csr0=%08x\n", + cache, csr0); + } +-#endif + + /* + * Chips that have the MRM/reserved bit quirk and the burst quirk. That + * is the DM910X and the on chip ULi devices + */ ++#endif + ++#ifdef CONFIG_TULIP_PCI + static int tulip_uli_dm_quirk(struct pci_dev *pdev) + { + if (pdev->vendor == 0x1282 && pdev->device == 0x9102) + return 1; + return 0; + } ++#endif ++ + + static const struct net_device_ops tulip_netdev_ops = { + .ndo_open = tulip_open, +@@ -1294,6 +1328,7 @@ static const struct net_device_ops tulip + #endif + }; + ++#ifdef CONFIG_TULIP_PCI + const struct pci_device_id early_486_chipsets[] = { + { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82424) }, + { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_496) }, +@@ -1471,6 +1506,8 @@ static int tulip_init_one(struct pci_dev + } + } + tp->pdev = pdev; ++ tp->kdev = &pdev->dev; ++ tp->irq = irq; + tp->base_addr = ioaddr; + tp->revision = pdev->revision; + tp->csr0 = csr0; +@@ -1801,6 +1838,7 @@ err_out_free_netdev: + } + + ++#ifdef CONFIG_TULIP_PCI + /* set the registers according to the given wolopts */ + static void tulip_set_wolopts (struct pci_dev *pdev, u32 wolopts) + { +@@ -1829,6 +1867,7 @@ static void tulip_set_wolopts (struct pc + iowrite32(tmp, ioaddr + CSR13); + } + } ++#endif + + #ifdef CONFIG_PM + +@@ -1943,6 +1982,7 @@ static void tulip_remove_one(struct pci_ + + /* pci_power_off (pdev, -1); */ + } ++#endif /* CONFIG_TULIP_PCI */ + + #ifdef CONFIG_NET_POLL_CONTROLLER + /* +@@ -1964,7 +2004,8 @@ static void poll_tulip (struct net_devic + } + #endif + +-static struct pci_driver tulip_driver = { ++#ifdef CONFIG_TULIP_PCI ++static struct pci_driver tulip_pci_driver = { + .name = DRV_NAME, + .id_table = tulip_pci_tbl, + .probe = tulip_init_one, +@@ -1974,10 +2015,12 @@ static struct pci_driver tulip_driver = + .resume = tulip_resume, + #endif /* CONFIG_PM */ + }; ++#endif + + + static int __init tulip_init (void) + { ++ int ret = 0; + #ifdef MODULE + pr_info("%s", version); + #endif +@@ -1987,13 +2030,18 @@ static int __init tulip_init (void) + tulip_max_interrupt_work = max_interrupt_work; + + /* probe for and init boards */ +- return pci_register_driver(&tulip_driver); ++#ifdef CONFIG_TULIP_PCI ++ ret = pci_register_driver(&tulip_pci_driver); ++#endif ++ return ret; + } + + + static void __exit tulip_cleanup (void) + { +- pci_unregister_driver (&tulip_driver); ++#ifdef CONFIG_TULIP_PCI ++ pci_unregister_driver (&tulip_pci_driver); ++#endif + } + + +--- a/drivers/net/ethernet/dec/tulip/interrupt.c ++++ b/drivers/net/ethernet/dec/tulip/interrupt.c +@@ -73,10 +73,11 @@ int tulip_refill_rx(struct net_device *d + netdev_alloc_skb(dev, PKT_BUF_SZ); + if (skb == NULL) + break; +- ++#ifdef CONFIG_TULIP_PCI + mapping = pci_map_single(tp->pdev, skb->data, PKT_BUF_SZ, + PCI_DMA_FROMDEVICE); +- if (dma_mapping_error(&tp->pdev->dev, mapping)) { ++#endif ++ if (dma_mapping_error(tp->kdev, mapping)) { + dev_kfree_skb(skb); + tp->rx_buffers[entry].skb = NULL; + break; +@@ -210,9 +211,11 @@ int tulip_poll(struct napi_struct *napi, + if (pkt_len < tulip_rx_copybreak && + (skb = netdev_alloc_skb(dev, pkt_len + 2)) != NULL) { + skb_reserve(skb, 2); /* 16 byte align the IP header */ ++#ifdef CONFIG_TULIP_PCI + pci_dma_sync_single_for_cpu(tp->pdev, + tp->rx_buffers[entry].mapping, + pkt_len, PCI_DMA_FROMDEVICE); ++#endif + #if ! defined(__alpha__) + skb_copy_to_linear_data(skb, tp->rx_buffers[entry].skb->data, + pkt_len); +@@ -222,9 +225,11 @@ int tulip_poll(struct napi_struct *napi, + tp->rx_buffers[entry].skb->data, + pkt_len); + #endif ++#ifdef CONFIG_TULIP_PCI + pci_dma_sync_single_for_device(tp->pdev, + tp->rx_buffers[entry].mapping, + pkt_len, PCI_DMA_FROMDEVICE); ++#endif + } else { /* Pass up the skb already on the Rx ring. */ + char *temp = skb_put(skb = tp->rx_buffers[entry].skb, + pkt_len); +@@ -239,9 +244,10 @@ int tulip_poll(struct napi_struct *napi, + skb->head, temp); + } + #endif +- ++#ifdef CONFIG_TULIP_PCI + pci_unmap_single(tp->pdev, tp->rx_buffers[entry].mapping, + PKT_BUF_SZ, PCI_DMA_FROMDEVICE); ++#endif + + tp->rx_buffers[entry].skb = NULL; + tp->rx_buffers[entry].mapping = 0; +@@ -597,10 +603,12 @@ irqreturn_t tulip_interrupt(int irq, voi + if (tp->tx_buffers[entry].skb == NULL) { + /* test because dummy frames not mapped */ + if (tp->tx_buffers[entry].mapping) ++#ifdef CONFIG_TULIP_PCI + pci_unmap_single(tp->pdev, + tp->tx_buffers[entry].mapping, + sizeof(tp->setup_frame), + PCI_DMA_TODEVICE); ++#endif + continue; + } + +@@ -628,10 +636,11 @@ irqreturn_t tulip_interrupt(int irq, voi + dev->stats.collisions += (status >> 3) & 15; + dev->stats.tx_packets++; + } +- ++#ifdef CONFIG_TULIP_PCI + pci_unmap_single(tp->pdev, tp->tx_buffers[entry].mapping, + tp->tx_buffers[entry].skb->len, + PCI_DMA_TODEVICE); ++#endif + + /* Free the original skb. */ + dev_kfree_skb_irq(tp->tx_buffers[entry].skb); +--- a/drivers/net/ethernet/dec/tulip/Kconfig ++++ b/drivers/net/ethernet/dec/tulip/Kconfig +@@ -40,8 +40,12 @@ config DE2104X_DSL + Default is 0, and range is 0 to 31. + + config TULIP ++ tristate ++ ++config TULIP_PCI + tristate "DECchip Tulip (dc2114x) PCI support" + depends on PCI ++ select TULIP + select CRC32 + ---help--- + This driver is developed for the SMC EtherPower series Ethernet +@@ -58,7 +62,7 @@ config TULIP + + config TULIP_MWI + bool "New bus configuration" +- depends on TULIP ++ depends on TULIP_PCI + ---help--- + This configures your Tulip card specifically for the card and + system cache line size type you are using. +@@ -69,7 +73,7 @@ config TULIP_MWI + + config TULIP_MMIO + bool "Use PCI shared mem for NIC registers" +- depends on TULIP ++ depends on TULIP_PCI + ---help--- + Use PCI shared memory for the NIC registers, rather than going through + the Tulip's PIO (programmed I/O ports). Faster, but could produce +--- a/drivers/net/ethernet/dec/tulip/tulip.h ++++ b/drivers/net/ethernet/dec/tulip/tulip.h +@@ -447,6 +447,8 @@ struct tulip_private { + int cur_index; /* Current media index. */ + int saved_if_port; + struct pci_dev *pdev; ++ struct device *kdev; ++ int irq; + int ttimer; + int susp_rx; + unsigned long nir;