| 1 | --- a/drivers/net/ethernet/dec/tulip/tulip_core.c |
| 2 | +++ b/drivers/net/ethernet/dec/tulip/tulip_core.c |
| 3 | @@ -206,7 +206,7 @@ struct tulip_chip_table tulip_tbl[] = { |
| 4 | |
| 5 | }; |
| 6 | |
| 7 | - |
| 8 | +#ifdef CONFIG_TULIP_PCI |
| 9 | static DEFINE_PCI_DEVICE_TABLE(tulip_pci_tbl) = { |
| 10 | { 0x1011, 0x0009, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DC21140 }, |
| 11 | { 0x1011, 0x0019, PCI_ANY_ID, PCI_ANY_ID, 0, 0, DC21143 }, |
| 12 | @@ -250,7 +250,7 @@ static DEFINE_PCI_DEVICE_TABLE(tulip_pci |
| 13 | { } /* terminate list */ |
| 14 | }; |
| 15 | MODULE_DEVICE_TABLE(pci, tulip_pci_tbl); |
| 16 | - |
| 17 | +#endif |
| 18 | |
| 19 | /* A full-duplex map for media types. */ |
| 20 | const char tulip_media_cap[32] = |
| 21 | @@ -268,11 +268,14 @@ static void tulip_down(struct net_device |
| 22 | static struct net_device_stats *tulip_get_stats(struct net_device *dev); |
| 23 | static int private_ioctl(struct net_device *dev, struct ifreq *rq, int cmd); |
| 24 | static void set_rx_mode(struct net_device *dev); |
| 25 | +#ifdef CONFIG_TULIP_PCI |
| 26 | static void tulip_set_wolopts(struct pci_dev *pdev, u32 wolopts); |
| 27 | +#endif |
| 28 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 29 | static void poll_tulip(struct net_device *dev); |
| 30 | #endif |
| 31 | |
| 32 | +#ifdef CONFIG_TULIP_PCI |
| 33 | static void tulip_set_power_state (struct tulip_private *tp, |
| 34 | int sleep, int snooze) |
| 35 | { |
| 36 | @@ -289,7 +292,7 @@ static void tulip_set_power_state (struc |
| 37 | } |
| 38 | |
| 39 | } |
| 40 | - |
| 41 | +#endif |
| 42 | |
| 43 | static void tulip_up(struct net_device *dev) |
| 44 | { |
| 45 | @@ -303,6 +306,7 @@ static void tulip_up(struct net_device * |
| 46 | napi_enable(&tp->napi); |
| 47 | #endif |
| 48 | |
| 49 | +#ifdef CONFIG_TULIP_PCI |
| 50 | /* Wake the chip from sleep/snooze mode. */ |
| 51 | tulip_set_power_state (tp, 0, 0); |
| 52 | |
| 53 | @@ -310,6 +314,7 @@ static void tulip_up(struct net_device * |
| 54 | pci_enable_wake(tp->pdev, PCI_D3hot, 0); |
| 55 | pci_enable_wake(tp->pdev, PCI_D3cold, 0); |
| 56 | tulip_set_wolopts(tp->pdev, 0); |
| 57 | +#endif |
| 58 | |
| 59 | /* On some chip revs we must set the MII/SYM port before the reset!? */ |
| 60 | if (tp->mii_cnt || (tp->mtable && tp->mtable->has_mii)) |
| 61 | @@ -317,14 +322,18 @@ static void tulip_up(struct net_device * |
| 62 | |
| 63 | /* Reset the chip, holding bit 0 set at least 50 PCI cycles. */ |
| 64 | iowrite32(0x00000001, ioaddr + CSR0); |
| 65 | +#ifdef CONFIG_TULIP_PCI |
| 66 | pci_read_config_dword(tp->pdev, PCI_COMMAND, ®); /* flush write */ |
| 67 | +#endif |
| 68 | udelay(100); |
| 69 | |
| 70 | /* Deassert reset. |
| 71 | Wait the specified 50 PCI cycles after a reset by initializing |
| 72 | Tx and Rx queues and the address filter list. */ |
| 73 | iowrite32(tp->csr0, ioaddr + CSR0); |
| 74 | +#ifdef CONFIG_TULIP_PCI |
| 75 | pci_read_config_dword(tp->pdev, PCI_COMMAND, ®); /* flush write */ |
| 76 | +#endif |
| 77 | udelay(100); |
| 78 | |
| 79 | if (tulip_debug > 1) |
| 80 | @@ -362,9 +371,11 @@ static void tulip_up(struct net_device * |
| 81 | *setup_frm++ = eaddrs[1]; *setup_frm++ = eaddrs[1]; |
| 82 | *setup_frm++ = eaddrs[2]; *setup_frm++ = eaddrs[2]; |
| 83 | |
| 84 | +#ifdef CONFIG_TULIP_PCI |
| 85 | mapping = pci_map_single(tp->pdev, tp->setup_frame, |
| 86 | sizeof(tp->setup_frame), |
| 87 | PCI_DMA_TODEVICE); |
| 88 | +#endif |
| 89 | tp->tx_buffers[tp->cur_tx].skb = NULL; |
| 90 | tp->tx_buffers[tp->cur_tx].mapping = mapping; |
| 91 | |
| 92 | @@ -642,8 +653,10 @@ static void tulip_init_ring(struct net_d |
| 93 | tp->rx_buffers[i].skb = skb; |
| 94 | if (skb == NULL) |
| 95 | break; |
| 96 | +#ifdef CONFIG_TULIP_PCI |
| 97 | mapping = pci_map_single(tp->pdev, skb->data, |
| 98 | PKT_BUF_SZ, PCI_DMA_FROMDEVICE); |
| 99 | +#endif |
| 100 | tp->rx_buffers[i].mapping = mapping; |
| 101 | skb->dev = dev; /* Mark as being used by this device. */ |
| 102 | tp->rx_ring[i].status = cpu_to_le32(DescOwned); /* Owned by Tulip chip */ |
| 103 | @@ -677,8 +690,10 @@ tulip_start_xmit(struct sk_buff *skb, st |
| 104 | entry = tp->cur_tx % TX_RING_SIZE; |
| 105 | |
| 106 | tp->tx_buffers[entry].skb = skb; |
| 107 | +#ifdef CONFIG_TULIP_PCI |
| 108 | mapping = pci_map_single(tp->pdev, skb->data, |
| 109 | skb->len, PCI_DMA_TODEVICE); |
| 110 | +#endif |
| 111 | tp->tx_buffers[entry].mapping = mapping; |
| 112 | tp->tx_ring[entry].buffer1 = cpu_to_le32(mapping); |
| 113 | |
| 114 | @@ -729,16 +744,19 @@ static void tulip_clean_tx_ring(struct t |
| 115 | if (tp->tx_buffers[entry].skb == NULL) { |
| 116 | /* test because dummy frames not mapped */ |
| 117 | if (tp->tx_buffers[entry].mapping) |
| 118 | +#ifdef CONFIG_TULIP_PCI |
| 119 | pci_unmap_single(tp->pdev, |
| 120 | tp->tx_buffers[entry].mapping, |
| 121 | sizeof(tp->setup_frame), |
| 122 | PCI_DMA_TODEVICE); |
| 123 | +#endif |
| 124 | continue; |
| 125 | } |
| 126 | - |
| 127 | +#ifdef CONFIG_TULIP_PCI |
| 128 | pci_unmap_single(tp->pdev, tp->tx_buffers[entry].mapping, |
| 129 | tp->tx_buffers[entry].skb->len, |
| 130 | PCI_DMA_TODEVICE); |
| 131 | +#endif |
| 132 | |
| 133 | /* Free the original skb. */ |
| 134 | dev_kfree_skb_irq(tp->tx_buffers[entry].skb); |
| 135 | @@ -789,7 +807,9 @@ static void tulip_down (struct net_devic |
| 136 | dev->if_port = tp->saved_if_port; |
| 137 | |
| 138 | /* Leave the driver in snooze, not sleep, mode. */ |
| 139 | +#ifdef CONFIG_TULIP_PCI |
| 140 | tulip_set_power_state (tp, 0, 1); |
| 141 | +#endif |
| 142 | } |
| 143 | |
| 144 | static void tulip_free_ring (struct net_device *dev) |
| 145 | @@ -810,8 +830,10 @@ static void tulip_free_ring (struct net_ |
| 146 | /* An invalid address. */ |
| 147 | tp->rx_ring[i].buffer1 = cpu_to_le32(0xBADF00D0); |
| 148 | if (skb) { |
| 149 | +#ifdef CONFIG_TULIP_PCI |
| 150 | pci_unmap_single(tp->pdev, mapping, PKT_BUF_SZ, |
| 151 | PCI_DMA_FROMDEVICE); |
| 152 | +#endif |
| 153 | dev_kfree_skb (skb); |
| 154 | } |
| 155 | } |
| 156 | @@ -820,8 +842,10 @@ static void tulip_free_ring (struct net_ |
| 157 | struct sk_buff *skb = tp->tx_buffers[i].skb; |
| 158 | |
| 159 | if (skb != NULL) { |
| 160 | +#ifdef CONFIG_TULIP_PCI |
| 161 | pci_unmap_single(tp->pdev, tp->tx_buffers[i].mapping, |
| 162 | skb->len, PCI_DMA_TODEVICE); |
| 163 | +#endif |
| 164 | dev_kfree_skb (skb); |
| 165 | } |
| 166 | tp->tx_buffers[i].skb = NULL; |
| 167 | @@ -873,7 +897,9 @@ static void tulip_get_drvinfo(struct net |
| 168 | struct tulip_private *np = netdev_priv(dev); |
| 169 | strlcpy(info->driver, DRV_NAME, sizeof(info->driver)); |
| 170 | strlcpy(info->version, DRV_VERSION, sizeof(info->version)); |
| 171 | +#ifdef CONFIG_TULIP_PCI |
| 172 | strlcpy(info->bus_info, pci_name(np->pdev), sizeof(info->bus_info)); |
| 173 | +#endif |
| 174 | } |
| 175 | |
| 176 | |
| 177 | @@ -886,7 +912,9 @@ static int tulip_ethtool_set_wol(struct |
| 178 | return -EOPNOTSUPP; |
| 179 | |
| 180 | tp->wolinfo.wolopts = wolinfo->wolopts; |
| 181 | +#ifdef CONFIG_TULIP_PCI |
| 182 | device_set_wakeup_enable(&tp->pdev->dev, tp->wolinfo.wolopts); |
| 183 | +#endif |
| 184 | return 0; |
| 185 | } |
| 186 | |
| 187 | @@ -1167,9 +1195,11 @@ static void set_rx_mode(struct net_devic |
| 188 | |
| 189 | tp->tx_buffers[entry].skb = NULL; |
| 190 | tp->tx_buffers[entry].mapping = |
| 191 | +#ifdef CONFIG_TULIP_PCI |
| 192 | pci_map_single(tp->pdev, tp->setup_frame, |
| 193 | sizeof(tp->setup_frame), |
| 194 | PCI_DMA_TODEVICE); |
| 195 | +#endif |
| 196 | /* Put the setup frame on the Tx list. */ |
| 197 | if (entry == TX_RING_SIZE-1) |
| 198 | tx_flags |= DESC_RING_WRAP; /* Wrap ring. */ |
| 199 | @@ -1267,19 +1297,22 @@ out: |
| 200 | netdev_dbg(dev, "MWI config cacheline=%d, csr0=%08x\n", |
| 201 | cache, csr0); |
| 202 | } |
| 203 | -#endif |
| 204 | |
| 205 | /* |
| 206 | * Chips that have the MRM/reserved bit quirk and the burst quirk. That |
| 207 | * is the DM910X and the on chip ULi devices |
| 208 | */ |
| 209 | +#endif |
| 210 | |
| 211 | +#ifdef CONFIG_TULIP_PCI |
| 212 | static int tulip_uli_dm_quirk(struct pci_dev *pdev) |
| 213 | { |
| 214 | if (pdev->vendor == 0x1282 && pdev->device == 0x9102) |
| 215 | return 1; |
| 216 | return 0; |
| 217 | } |
| 218 | +#endif |
| 219 | + |
| 220 | |
| 221 | static const struct net_device_ops tulip_netdev_ops = { |
| 222 | .ndo_open = tulip_open, |
| 223 | @@ -1297,6 +1330,7 @@ static const struct net_device_ops tulip |
| 224 | #endif |
| 225 | }; |
| 226 | |
| 227 | +#ifdef CONFIG_TULIP_PCI |
| 228 | DEFINE_PCI_DEVICE_TABLE(early_486_chipsets) = { |
| 229 | { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82424) }, |
| 230 | { PCI_DEVICE(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_496) }, |
| 231 | @@ -1814,6 +1848,7 @@ err_out_free_netdev: |
| 232 | } |
| 233 | |
| 234 | |
| 235 | +#ifdef CONFIG_TULIP_PCI |
| 236 | /* set the registers according to the given wolopts */ |
| 237 | static void tulip_set_wolopts (struct pci_dev *pdev, u32 wolopts) |
| 238 | { |
| 239 | @@ -1842,6 +1877,7 @@ static void tulip_set_wolopts (struct pc |
| 240 | iowrite32(tmp, ioaddr + CSR13); |
| 241 | } |
| 242 | } |
| 243 | +#endif |
| 244 | |
| 245 | #ifdef CONFIG_PM |
| 246 | |
| 247 | @@ -1953,6 +1989,7 @@ static void __devexit tulip_remove_one ( |
| 248 | |
| 249 | /* pci_power_off (pdev, -1); */ |
| 250 | } |
| 251 | +#endif /* CONFIG_TULIP_PCI */ |
| 252 | |
| 253 | #ifdef CONFIG_NET_POLL_CONTROLLER |
| 254 | /* |
| 255 | @@ -1971,7 +2008,8 @@ static void poll_tulip (struct net_devic |
| 256 | } |
| 257 | #endif |
| 258 | |
| 259 | -static struct pci_driver tulip_driver = { |
| 260 | +#ifdef CONFIG_TULIP_PCI |
| 261 | +static struct pci_driver tulip_pci_driver = { |
| 262 | .name = DRV_NAME, |
| 263 | .id_table = tulip_pci_tbl, |
| 264 | .probe = tulip_init_one, |
| 265 | @@ -1981,10 +2019,12 @@ static struct pci_driver tulip_driver = |
| 266 | .resume = tulip_resume, |
| 267 | #endif /* CONFIG_PM */ |
| 268 | }; |
| 269 | +#endif |
| 270 | |
| 271 | |
| 272 | static int __init tulip_init (void) |
| 273 | { |
| 274 | + int ret = 0; |
| 275 | #ifdef MODULE |
| 276 | pr_info("%s", version); |
| 277 | #endif |
| 278 | @@ -1994,13 +2034,18 @@ static int __init tulip_init (void) |
| 279 | tulip_max_interrupt_work = max_interrupt_work; |
| 280 | |
| 281 | /* probe for and init boards */ |
| 282 | - return pci_register_driver(&tulip_driver); |
| 283 | +#ifdef CONFIG_TULIP_PCI |
| 284 | + ret = pci_register_driver(&tulip_pci_driver); |
| 285 | +#endif |
| 286 | + return ret; |
| 287 | } |
| 288 | |
| 289 | |
| 290 | static void __exit tulip_cleanup (void) |
| 291 | { |
| 292 | - pci_unregister_driver (&tulip_driver); |
| 293 | +#ifdef CONFIG_TULIP_PCI |
| 294 | + pci_unregister_driver (&tulip_pci_driver); |
| 295 | +#endif |
| 296 | } |
| 297 | |
| 298 | |
| 299 | --- a/drivers/net/ethernet/dec/tulip/interrupt.c |
| 300 | +++ b/drivers/net/ethernet/dec/tulip/interrupt.c |
| 301 | @@ -72,9 +72,10 @@ int tulip_refill_rx(struct net_device *d |
| 302 | skb = tp->rx_buffers[entry].skb = dev_alloc_skb(PKT_BUF_SZ); |
| 303 | if (skb == NULL) |
| 304 | break; |
| 305 | - |
| 306 | +#ifdef CONFIG_TULIP_PCI |
| 307 | mapping = pci_map_single(tp->pdev, skb->data, PKT_BUF_SZ, |
| 308 | PCI_DMA_FROMDEVICE); |
| 309 | +#endif |
| 310 | tp->rx_buffers[entry].mapping = mapping; |
| 311 | |
| 312 | skb->dev = dev; /* Mark as being used by this device. */ |
| 313 | @@ -204,9 +205,11 @@ int tulip_poll(struct napi_struct *napi, |
| 314 | if (pkt_len < tulip_rx_copybreak && |
| 315 | (skb = dev_alloc_skb(pkt_len + 2)) != NULL) { |
| 316 | skb_reserve(skb, 2); /* 16 byte align the IP header */ |
| 317 | +#ifdef CONFIG_TULIP_PCI |
| 318 | pci_dma_sync_single_for_cpu(tp->pdev, |
| 319 | tp->rx_buffers[entry].mapping, |
| 320 | pkt_len, PCI_DMA_FROMDEVICE); |
| 321 | +#endif |
| 322 | #if ! defined(__alpha__) |
| 323 | skb_copy_to_linear_data(skb, tp->rx_buffers[entry].skb->data, |
| 324 | pkt_len); |
| 325 | @@ -216,9 +219,11 @@ int tulip_poll(struct napi_struct *napi, |
| 326 | tp->rx_buffers[entry].skb->data, |
| 327 | pkt_len); |
| 328 | #endif |
| 329 | +#ifdef CONFIG_TULIP_PCI |
| 330 | pci_dma_sync_single_for_device(tp->pdev, |
| 331 | tp->rx_buffers[entry].mapping, |
| 332 | pkt_len, PCI_DMA_FROMDEVICE); |
| 333 | +#endif |
| 334 | } else { /* Pass up the skb already on the Rx ring. */ |
| 335 | char *temp = skb_put(skb = tp->rx_buffers[entry].skb, |
| 336 | pkt_len); |
| 337 | @@ -233,9 +238,10 @@ int tulip_poll(struct napi_struct *napi, |
| 338 | skb->head, temp); |
| 339 | } |
| 340 | #endif |
| 341 | - |
| 342 | +#ifdef CONFIG_TULIP_PCI |
| 343 | pci_unmap_single(tp->pdev, tp->rx_buffers[entry].mapping, |
| 344 | PKT_BUF_SZ, PCI_DMA_FROMDEVICE); |
| 345 | +#endif |
| 346 | |
| 347 | tp->rx_buffers[entry].skb = NULL; |
| 348 | tp->rx_buffers[entry].mapping = 0; |
| 349 | @@ -591,10 +597,12 @@ irqreturn_t tulip_interrupt(int irq, voi |
| 350 | if (tp->tx_buffers[entry].skb == NULL) { |
| 351 | /* test because dummy frames not mapped */ |
| 352 | if (tp->tx_buffers[entry].mapping) |
| 353 | +#ifdef CONFIG_TULIP_PCI |
| 354 | pci_unmap_single(tp->pdev, |
| 355 | tp->tx_buffers[entry].mapping, |
| 356 | sizeof(tp->setup_frame), |
| 357 | PCI_DMA_TODEVICE); |
| 358 | +#endif |
| 359 | continue; |
| 360 | } |
| 361 | |
| 362 | @@ -622,10 +630,11 @@ irqreturn_t tulip_interrupt(int irq, voi |
| 363 | dev->stats.collisions += (status >> 3) & 15; |
| 364 | dev->stats.tx_packets++; |
| 365 | } |
| 366 | - |
| 367 | +#ifdef CONFIG_TULIP_PCI |
| 368 | pci_unmap_single(tp->pdev, tp->tx_buffers[entry].mapping, |
| 369 | tp->tx_buffers[entry].skb->len, |
| 370 | PCI_DMA_TODEVICE); |
| 371 | +#endif |
| 372 | |
| 373 | /* Free the original skb. */ |
| 374 | dev_kfree_skb_irq(tp->tx_buffers[entry].skb); |
| 375 | --- a/drivers/net/ethernet/dec/tulip/Kconfig |
| 376 | +++ b/drivers/net/ethernet/dec/tulip/Kconfig |
| 377 | @@ -40,8 +40,12 @@ config DE2104X_DSL |
| 378 | Default is 0, and range is 0 to 31. |
| 379 | |
| 380 | config TULIP |
| 381 | + tristate |
| 382 | + |
| 383 | +config TULIP_PCI |
| 384 | tristate "DECchip Tulip (dc2114x) PCI support" |
| 385 | depends on PCI |
| 386 | + select TULIP |
| 387 | select CRC32 |
| 388 | ---help--- |
| 389 | This driver is developed for the SMC EtherPower series Ethernet |
| 390 | @@ -58,7 +62,7 @@ config TULIP |
| 391 | |
| 392 | config TULIP_MWI |
| 393 | bool "New bus configuration (EXPERIMENTAL)" |
| 394 | - depends on TULIP && EXPERIMENTAL |
| 395 | + depends on TULIP_PCI && EXPERIMENTAL |
| 396 | ---help--- |
| 397 | This configures your Tulip card specifically for the card and |
| 398 | system cache line size type you are using. |
| 399 | @@ -69,7 +73,7 @@ config TULIP_MWI |
| 400 | |
| 401 | config TULIP_MMIO |
| 402 | bool "Use PCI shared mem for NIC registers" |
| 403 | - depends on TULIP |
| 404 | + depends on TULIP_PCI |
| 405 | ---help--- |
| 406 | Use PCI shared memory for the NIC registers, rather than going through |
| 407 | the Tulip's PIO (programmed I/O ports). Faster, but could produce |
| 408 | |