mirror of
				git://git.openwrt.org/openwrt/openwrt.git
				synced 2025-10-31 05:54:26 -04:00 
			
		
		
		
	Isolate the PCI specific parts and group them under CONFIG_TULIP_PCI CONFIG_TULIP_PLATFORM can be enabled for a platform style Tulip driver. Signed-off-by: Florian Fainelli <florian@openwrt.org> SVN-Revision: 34557
		
			
				
	
	
		
			408 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			408 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| --- a/drivers/net/ethernet/dec/tulip/tulip_core.c
 | |
| +++ b/drivers/net/ethernet/dec/tulip/tulip_core.c
 | |
| @@ -206,7 +206,7 @@ struct tulip_chip_table tulip_tbl[] = {
 | |
|  
 | |
|  };
 | |
|  
 | |
| -
 | |
| +#ifdef CONFIG_TULIP_PCI
 | |
|  static DEFINE_PCI_DEVICE_TABLE(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 +250,7 @@ static DEFINE_PCI_DEVICE_TABLE(tulip_pci
 | |
|  	{ } /* 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 +268,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 +292,7 @@ static void tulip_set_power_state (struc
 | |
|  	}
 | |
|  
 | |
|  }
 | |
| -
 | |
| +#endif
 | |
|  
 | |
|  static void tulip_up(struct net_device *dev)
 | |
|  {
 | |
| @@ -303,6 +306,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 +314,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,14 +322,18 @@ 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)
 | |
| @@ -362,9 +371,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;
 | |
|  
 | |
| @@ -642,8 +653,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;
 | |
|  		skb->dev = dev;			/* Mark as being used by this device. */
 | |
|  		tp->rx_ring[i].status = cpu_to_le32(DescOwned);	/* Owned by Tulip chip */
 | |
| @@ -677,8 +690,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);
 | |
|  
 | |
| @@ -729,16 +744,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);
 | |
| @@ -789,7 +807,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)
 | |
| @@ -810,8 +830,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);
 | |
|  		}
 | |
|  	}
 | |
| @@ -820,8 +842,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;
 | |
| @@ -873,7 +897,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
 | |
|  }
 | |
|  
 | |
|  
 | |
| @@ -886,7 +912,9 @@ static int tulip_ethtool_set_wol(struct
 | |
|  		   return -EOPNOTSUPP;
 | |
|  
 | |
|  	tp->wolinfo.wolopts = wolinfo->wolopts;
 | |
| +#ifdef CONFIG_TULIP_PCI
 | |
|  	device_set_wakeup_enable(&tp->pdev->dev, tp->wolinfo.wolopts);
 | |
| +#endif
 | |
|  	return 0;
 | |
|  }
 | |
|  
 | |
| @@ -1167,9 +1195,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. */
 | |
| @@ -1267,19 +1297,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,
 | |
| @@ -1297,6 +1330,7 @@ static const struct net_device_ops tulip
 | |
|  #endif
 | |
|  };
 | |
|  
 | |
| +#ifdef CONFIG_TULIP_PCI
 | |
|  DEFINE_PCI_DEVICE_TABLE(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) },
 | |
| @@ -1814,6 +1848,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)
 | |
|  {
 | |
| @@ -1842,6 +1877,7 @@ static void tulip_set_wolopts (struct pc
 | |
|  		iowrite32(tmp, ioaddr + CSR13);
 | |
|  	}
 | |
|  }
 | |
| +#endif
 | |
|  
 | |
|  #ifdef CONFIG_PM
 | |
|  
 | |
| @@ -1953,6 +1989,7 @@ static void __devexit tulip_remove_one (
 | |
|  
 | |
|  	/* pci_power_off (pdev, -1); */
 | |
|  }
 | |
| +#endif /* CONFIG_TULIP_PCI */
 | |
|  
 | |
|  #ifdef CONFIG_NET_POLL_CONTROLLER
 | |
|  /*
 | |
| @@ -1971,7 +2008,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,
 | |
| @@ -1981,10 +2019,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
 | |
| @@ -1994,13 +2034,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
 | |
| @@ -72,9 +72,10 @@ int tulip_refill_rx(struct net_device *d
 | |
|  			skb = tp->rx_buffers[entry].skb = dev_alloc_skb(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);
 | |
| +#endif
 | |
|  			tp->rx_buffers[entry].mapping = mapping;
 | |
|  
 | |
|  			skb->dev = dev;			/* Mark as being used by this device. */
 | |
| @@ -204,9 +205,11 @@ int tulip_poll(struct napi_struct *napi,
 | |
|                                 if (pkt_len < tulip_rx_copybreak &&
 | |
|                                     (skb = dev_alloc_skb(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);
 | |
| @@ -216,9 +219,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);
 | |
| @@ -233,9 +238,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;
 | |
| @@ -591,10 +597,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;
 | |
|  				}
 | |
|  
 | |
| @@ -622,10 +630,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 (EXPERIMENTAL)"
 | |
| -	depends on TULIP && EXPERIMENTAL
 | |
| +	depends on TULIP_PCI && EXPERIMENTAL
 | |
|  	---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
 |