diff options
| -rw-r--r-- | drivers/net/au1000_eth.c | 103 | ||||
| -rw-r--r-- | drivers/net/au1000_eth.h | 6 |
2 files changed, 61 insertions, 48 deletions
diff --git a/drivers/net/au1000_eth.c b/drivers/net/au1000_eth.c index df3eee11cd95..a2d86cf62760 100644 --- a/drivers/net/au1000_eth.c +++ b/drivers/net/au1000_eth.c | |||
| @@ -357,6 +357,7 @@ static int au1000_mii_probe(struct net_device *dev) | |||
| 357 | { | 357 | { |
| 358 | struct au1000_private *const aup = netdev_priv(dev); | 358 | struct au1000_private *const aup = netdev_priv(dev); |
| 359 | struct phy_device *phydev = NULL; | 359 | struct phy_device *phydev = NULL; |
| 360 | int phy_addr; | ||
| 360 | 361 | ||
| 361 | if (aup->phy_static_config) { | 362 | if (aup->phy_static_config) { |
| 362 | BUG_ON(aup->mac_id < 0 || aup->mac_id > 1); | 363 | BUG_ON(aup->mac_id < 0 || aup->mac_id > 1); |
| @@ -366,42 +367,45 @@ static int au1000_mii_probe(struct net_device *dev) | |||
| 366 | else | 367 | else |
| 367 | netdev_info(dev, "using PHY-less setup\n"); | 368 | netdev_info(dev, "using PHY-less setup\n"); |
| 368 | return 0; | 369 | return 0; |
| 369 | } else { | 370 | } |
| 370 | int phy_addr; | ||
| 371 | |||
| 372 | /* find the first (lowest address) PHY on the current MAC's MII bus */ | ||
| 373 | for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) | ||
| 374 | if (aup->mii_bus->phy_map[phy_addr]) { | ||
| 375 | phydev = aup->mii_bus->phy_map[phy_addr]; | ||
| 376 | if (!aup->phy_search_highest_addr) | ||
| 377 | break; /* break out with first one found */ | ||
| 378 | } | ||
| 379 | |||
| 380 | if (aup->phy1_search_mac0) { | ||
| 381 | /* try harder to find a PHY */ | ||
| 382 | if (!phydev && (aup->mac_id == 1)) { | ||
| 383 | /* no PHY found, maybe we have a dual PHY? */ | ||
| 384 | dev_info(&dev->dev, ": no PHY found on MAC1, " | ||
| 385 | "let's see if it's attached to MAC0...\n"); | ||
| 386 | |||
| 387 | /* find the first (lowest address) non-attached PHY on | ||
| 388 | * the MAC0 MII bus */ | ||
| 389 | for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) { | ||
| 390 | struct phy_device *const tmp_phydev = | ||
| 391 | aup->mii_bus->phy_map[phy_addr]; | ||
| 392 | |||
| 393 | if (aup->mac_id == 1) | ||
| 394 | break; | ||
| 395 | |||
| 396 | if (!tmp_phydev) | ||
| 397 | continue; /* no PHY here... */ | ||
| 398 | 371 | ||
| 399 | if (tmp_phydev->attached_dev) | 372 | /* find the first (lowest address) PHY |
| 400 | continue; /* already claimed by MAC0 */ | 373 | * on the current MAC's MII bus */ |
| 374 | for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) | ||
| 375 | if (aup->mii_bus->phy_map[phy_addr]) { | ||
| 376 | phydev = aup->mii_bus->phy_map[phy_addr]; | ||
| 377 | if (!aup->phy_search_highest_addr) | ||
| 378 | /* break out with first one found */ | ||
| 379 | break; | ||
| 380 | } | ||
| 401 | 381 | ||
| 402 | phydev = tmp_phydev; | 382 | if (aup->phy1_search_mac0) { |
| 403 | break; /* found it */ | 383 | /* try harder to find a PHY */ |
| 404 | } | 384 | if (!phydev && (aup->mac_id == 1)) { |
| 385 | /* no PHY found, maybe we have a dual PHY? */ | ||
| 386 | dev_info(&dev->dev, ": no PHY found on MAC1, " | ||
| 387 | "let's see if it's attached to MAC0...\n"); | ||
| 388 | |||
| 389 | /* find the first (lowest address) non-attached | ||
| 390 | * PHY on the MAC0 MII bus | ||
| 391 | */ | ||
| 392 | for (phy_addr = 0; phy_addr < PHY_MAX_ADDR; phy_addr++) { | ||
| 393 | struct phy_device *const tmp_phydev = | ||
| 394 | aup->mii_bus->phy_map[phy_addr]; | ||
| 395 | |||
| 396 | if (aup->mac_id == 1) | ||
| 397 | break; | ||
| 398 | |||
| 399 | /* no PHY here... */ | ||
| 400 | if (!tmp_phydev) | ||
| 401 | continue; | ||
| 402 | |||
| 403 | /* already claimed by MAC0 */ | ||
| 404 | if (tmp_phydev->attached_dev) | ||
| 405 | continue; | ||
| 406 | |||
| 407 | phydev = tmp_phydev; | ||
| 408 | break; /* found it */ | ||
| 405 | } | 409 | } |
| 406 | } | 410 | } |
| 407 | } | 411 | } |
| @@ -524,11 +528,13 @@ au1000_setup_hw_rings(struct au1000_private *aup, u32 rx_base, u32 tx_base) | |||
| 524 | 528 | ||
| 525 | for (i = 0; i < NUM_RX_DMA; i++) { | 529 | for (i = 0; i < NUM_RX_DMA; i++) { |
| 526 | aup->rx_dma_ring[i] = | 530 | aup->rx_dma_ring[i] = |
| 527 | (volatile struct rx_dma *) (rx_base + sizeof(struct rx_dma)*i); | 531 | (volatile struct rx_dma *) |
| 532 | (rx_base + sizeof(struct rx_dma)*i); | ||
| 528 | } | 533 | } |
| 529 | for (i = 0; i < NUM_TX_DMA; i++) { | 534 | for (i = 0; i < NUM_TX_DMA; i++) { |
| 530 | aup->tx_dma_ring[i] = | 535 | aup->tx_dma_ring[i] = |
| 531 | (volatile struct tx_dma *) (tx_base + sizeof(struct tx_dma)*i); | 536 | (volatile struct tx_dma *) |
| 537 | (tx_base + sizeof(struct tx_dma)*i); | ||
| 532 | } | 538 | } |
| 533 | } | 539 | } |
| 534 | 540 | ||
| @@ -625,6 +631,7 @@ static int au1000_init(struct net_device *dev) | |||
| 625 | aup->mac->mac_addr_low = dev->dev_addr[3]<<24 | dev->dev_addr[2]<<16 | | 631 | aup->mac->mac_addr_low = dev->dev_addr[3]<<24 | dev->dev_addr[2]<<16 | |
| 626 | dev->dev_addr[1]<<8 | dev->dev_addr[0]; | 632 | dev->dev_addr[1]<<8 | dev->dev_addr[0]; |
| 627 | 633 | ||
| 634 | |||
| 628 | for (i = 0; i < NUM_RX_DMA; i++) | 635 | for (i = 0; i < NUM_RX_DMA; i++) |
| 629 | aup->rx_dma_ring[i]->buff_stat |= RX_DMA_ENABLE; | 636 | aup->rx_dma_ring[i]->buff_stat |= RX_DMA_ENABLE; |
| 630 | 637 | ||
| @@ -936,8 +943,7 @@ static void au1000_multicast_list(struct net_device *dev) | |||
| 936 | { | 943 | { |
| 937 | struct au1000_private *aup = netdev_priv(dev); | 944 | struct au1000_private *aup = netdev_priv(dev); |
| 938 | 945 | ||
| 939 | netif_dbg(aup, drv, dev, "au1000_multicast_list: flags=%x\n", dev->flags); | 946 | netif_dbg(aup, drv, dev, "%s: flags=%x\n", __func__, dev->flags); |
| 940 | |||
| 941 | if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ | 947 | if (dev->flags & IFF_PROMISC) { /* Set promiscuous. */ |
| 942 | aup->mac->control |= MAC_PROMISCUOUS; | 948 | aup->mac->control |= MAC_PROMISCUOUS; |
| 943 | } else if ((dev->flags & IFF_ALLMULTI) || | 949 | } else if ((dev->flags & IFF_ALLMULTI) || |
| @@ -1016,13 +1022,15 @@ static int __devinit au1000_probe(struct platform_device *pdev) | |||
| 1016 | goto out; | 1022 | goto out; |
| 1017 | } | 1023 | } |
| 1018 | 1024 | ||
| 1019 | if (!request_mem_region(base->start, resource_size(base), pdev->name)) { | 1025 | if (!request_mem_region(base->start, resource_size(base), |
| 1026 | pdev->name)) { | ||
| 1020 | dev_err(&pdev->dev, "failed to request memory region for base registers\n"); | 1027 | dev_err(&pdev->dev, "failed to request memory region for base registers\n"); |
| 1021 | err = -ENXIO; | 1028 | err = -ENXIO; |
| 1022 | goto out; | 1029 | goto out; |
| 1023 | } | 1030 | } |
| 1024 | 1031 | ||
| 1025 | if (!request_mem_region(macen->start, resource_size(macen), pdev->name)) { | 1032 | if (!request_mem_region(macen->start, resource_size(macen), |
| 1033 | pdev->name)) { | ||
| 1026 | dev_err(&pdev->dev, "failed to request memory region for MAC enable register\n"); | 1034 | dev_err(&pdev->dev, "failed to request memory region for MAC enable register\n"); |
| 1027 | err = -ENXIO; | 1035 | err = -ENXIO; |
| 1028 | goto err_request; | 1036 | goto err_request; |
| @@ -1040,7 +1048,8 @@ static int __devinit au1000_probe(struct platform_device *pdev) | |||
| 1040 | aup = netdev_priv(dev); | 1048 | aup = netdev_priv(dev); |
| 1041 | 1049 | ||
| 1042 | spin_lock_init(&aup->lock); | 1050 | spin_lock_init(&aup->lock); |
| 1043 | aup->msg_enable = (au1000_debug < 4 ? AU1000_DEF_MSG_ENABLE : au1000_debug); | 1051 | aup->msg_enable = (au1000_debug < 4 ? |
| 1052 | AU1000_DEF_MSG_ENABLE : au1000_debug); | ||
| 1044 | 1053 | ||
| 1045 | /* Allocate the data buffers */ | 1054 | /* Allocate the data buffers */ |
| 1046 | /* Snooping works fine with eth on all au1xxx */ | 1055 | /* Snooping works fine with eth on all au1xxx */ |
| @@ -1054,7 +1063,8 @@ static int __devinit au1000_probe(struct platform_device *pdev) | |||
| 1054 | } | 1063 | } |
| 1055 | 1064 | ||
| 1056 | /* aup->mac is the base address of the MAC's registers */ | 1065 | /* aup->mac is the base address of the MAC's registers */ |
| 1057 | aup->mac = (volatile struct mac_reg *)ioremap_nocache(base->start, resource_size(base)); | 1066 | aup->mac = (volatile struct mac_reg *) |
| 1067 | ioremap_nocache(base->start, resource_size(base)); | ||
| 1058 | if (!aup->mac) { | 1068 | if (!aup->mac) { |
| 1059 | dev_err(&pdev->dev, "failed to ioremap MAC registers\n"); | 1069 | dev_err(&pdev->dev, "failed to ioremap MAC registers\n"); |
| 1060 | err = -ENXIO; | 1070 | err = -ENXIO; |
| @@ -1062,7 +1072,8 @@ static int __devinit au1000_probe(struct platform_device *pdev) | |||
| 1062 | } | 1072 | } |
| 1063 | 1073 | ||
| 1064 | /* Setup some variables for quick register address access */ | 1074 | /* Setup some variables for quick register address access */ |
| 1065 | aup->enable = (volatile u32 *)ioremap_nocache(macen->start, resource_size(macen)); | 1075 | aup->enable = (volatile u32 *)ioremap_nocache(macen->start, |
| 1076 | resource_size(macen)); | ||
| 1066 | if (!aup->enable) { | 1077 | if (!aup->enable) { |
| 1067 | dev_err(&pdev->dev, "failed to ioremap MAC enable register\n"); | 1078 | dev_err(&pdev->dev, "failed to ioremap MAC enable register\n"); |
| 1068 | err = -ENXIO; | 1079 | err = -ENXIO; |
| @@ -1083,7 +1094,8 @@ static int __devinit au1000_probe(struct platform_device *pdev) | |||
| 1083 | 1094 | ||
| 1084 | pd = pdev->dev.platform_data; | 1095 | pd = pdev->dev.platform_data; |
| 1085 | if (!pd) { | 1096 | if (!pd) { |
| 1086 | dev_info(&pdev->dev, "no platform_data passed, PHY search on MAC0\n"); | 1097 | dev_info(&pdev->dev, "no platform_data passed," |
| 1098 | " PHY search on MAC0\n"); | ||
| 1087 | aup->phy1_search_mac0 = 1; | 1099 | aup->phy1_search_mac0 = 1; |
| 1088 | } else { | 1100 | } else { |
| 1089 | if (is_valid_ether_addr(pd->mac)) | 1101 | if (is_valid_ether_addr(pd->mac)) |
| @@ -1098,8 +1110,7 @@ static int __devinit au1000_probe(struct platform_device *pdev) | |||
| 1098 | } | 1110 | } |
| 1099 | 1111 | ||
| 1100 | if (aup->phy_busid && aup->phy_busid > 0) { | 1112 | if (aup->phy_busid && aup->phy_busid > 0) { |
| 1101 | dev_err(&pdev->dev, "MAC0-associated PHY attached 2nd MACs MII" | 1113 | dev_err(&pdev->dev, "MAC0-associated PHY attached 2nd MACs MII bus not supported yet\n"); |
| 1102 | "bus not supported yet\n"); | ||
| 1103 | err = -ENODEV; | 1114 | err = -ENODEV; |
| 1104 | goto err_mdiobus_alloc; | 1115 | goto err_mdiobus_alloc; |
| 1105 | } | 1116 | } |
diff --git a/drivers/net/au1000_eth.h b/drivers/net/au1000_eth.h index 44003e4843b8..38c1d8845ac6 100644 --- a/drivers/net/au1000_eth.h +++ b/drivers/net/au1000_eth.h | |||
| @@ -99,7 +99,8 @@ struct au1000_private { | |||
| 99 | 99 | ||
| 100 | int mac_id; | 100 | int mac_id; |
| 101 | 101 | ||
| 102 | int mac_enabled; /* whether MAC is currently enabled and running (req. for mdio) */ | 102 | int mac_enabled; /* whether MAC is currently enabled and running |
| 103 | (req. for mdio) */ | ||
| 103 | 104 | ||
| 104 | int old_link; /* used by au1000_adjust_link */ | 105 | int old_link; /* used by au1000_adjust_link */ |
| 105 | int old_speed; | 106 | int old_speed; |
| @@ -117,7 +118,8 @@ struct au1000_private { | |||
| 117 | int phy_busid; | 118 | int phy_busid; |
| 118 | int phy_irq; | 119 | int phy_irq; |
| 119 | 120 | ||
| 120 | /* These variables are just for quick access to certain regs addresses. */ | 121 | /* These variables are just for quick access |
| 122 | * to certain regs addresses. */ | ||
| 121 | volatile struct mac_reg *mac; /* mac registers */ | 123 | volatile struct mac_reg *mac; /* mac registers */ |
| 122 | volatile u32 *enable; /* address of MAC Enable Register */ | 124 | volatile u32 *enable; /* address of MAC Enable Register */ |
| 123 | 125 | ||
