diff options
| -rw-r--r-- | arch/blackfin/mach-bf518/boards/ezbrd.c | 44 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf518/boards/tcm-bf518.c | 24 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf527/boards/cm_bf527.c | 24 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf527/boards/ezbrd.c | 24 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf527/boards/ezkit.c | 24 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf527/boards/tll6527m.c | 24 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf537/boards/cm_bf537e.c | 24 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf537/boards/cm_bf537u.c | 24 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf537/boards/minotaur.c | 24 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf537/boards/pnav10.c | 24 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf537/boards/stamp.c | 24 | ||||
| -rw-r--r-- | arch/blackfin/mach-bf537/boards/tcm_bf537.c | 24 | ||||
| -rw-r--r-- | drivers/net/Kconfig | 8 | ||||
| -rw-r--r-- | drivers/net/bfin_mac.c | 145 | ||||
| -rw-r--r-- | drivers/net/bfin_mac.h | 2 | ||||
| -rw-r--r-- | include/linux/bfin_mac.h | 29 |
16 files changed, 421 insertions, 71 deletions
diff --git a/arch/blackfin/mach-bf518/boards/ezbrd.c b/arch/blackfin/mach-bf518/boards/ezbrd.c index f95e6096719b..b894c8abe7ec 100644 --- a/arch/blackfin/mach-bf518/boards/ezbrd.c +++ b/arch/blackfin/mach-bf518/boards/ezbrd.c | |||
| @@ -87,13 +87,55 @@ static struct platform_device rtc_device = { | |||
| 87 | #endif | 87 | #endif |
| 88 | 88 | ||
| 89 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 89 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 90 | #include <linux/bfin_mac.h> | ||
| 91 | static const unsigned short bfin_mac_peripherals[] = { | ||
| 92 | P_MII0_ETxD0, | ||
| 93 | P_MII0_ETxD1, | ||
| 94 | P_MII0_ETxEN, | ||
| 95 | P_MII0_ERxD0, | ||
| 96 | P_MII0_ERxD1, | ||
| 97 | P_MII0_TxCLK, | ||
| 98 | P_MII0_PHYINT, | ||
| 99 | P_MII0_CRS, | ||
| 100 | P_MII0_MDC, | ||
| 101 | P_MII0_MDIO, | ||
| 102 | 0 | ||
| 103 | }; | ||
| 104 | |||
| 105 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 106 | { | ||
| 107 | .addr = 1, | ||
| 108 | .irq = IRQ_MAC_PHYINT, | ||
| 109 | }, | ||
| 110 | { | ||
| 111 | .addr = 2, | ||
| 112 | .irq = IRQ_MAC_PHYINT, | ||
| 113 | }, | ||
| 114 | { | ||
| 115 | .addr = 3, | ||
| 116 | .irq = IRQ_MAC_PHYINT, | ||
| 117 | }, | ||
| 118 | }; | ||
| 119 | |||
| 120 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 121 | .phydev_number = 3, | ||
| 122 | .phydev_data = bfin_phydev_data, | ||
| 123 | .phy_mode = PHY_INTERFACE_MODE_MII, | ||
| 124 | .mac_peripherals = bfin_mac_peripherals, | ||
| 125 | }; | ||
| 126 | |||
| 90 | static struct platform_device bfin_mii_bus = { | 127 | static struct platform_device bfin_mii_bus = { |
| 91 | .name = "bfin_mii_bus", | 128 | .name = "bfin_mii_bus", |
| 129 | .dev = { | ||
| 130 | .platform_data = &bfin_mii_bus_data, | ||
| 131 | } | ||
| 92 | }; | 132 | }; |
| 93 | 133 | ||
| 94 | static struct platform_device bfin_mac_device = { | 134 | static struct platform_device bfin_mac_device = { |
| 95 | .name = "bfin_mac", | 135 | .name = "bfin_mac", |
| 96 | .dev.platform_data = &bfin_mii_bus, | 136 | .dev = { |
| 137 | .platform_data = &bfin_mii_bus, | ||
| 138 | } | ||
| 97 | }; | 139 | }; |
| 98 | 140 | ||
| 99 | #if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE) | 141 | #if defined(CONFIG_NET_DSA_KSZ8893M) || defined(CONFIG_NET_DSA_KSZ8893M_MODULE) |
diff --git a/arch/blackfin/mach-bf518/boards/tcm-bf518.c b/arch/blackfin/mach-bf518/boards/tcm-bf518.c index bead810a6546..e6ce1d7c523a 100644 --- a/arch/blackfin/mach-bf518/boards/tcm-bf518.c +++ b/arch/blackfin/mach-bf518/boards/tcm-bf518.c | |||
| @@ -81,13 +81,35 @@ static struct platform_device rtc_device = { | |||
| 81 | #endif | 81 | #endif |
| 82 | 82 | ||
| 83 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 83 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 84 | #include <linux/bfin_mac.h> | ||
| 85 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
| 86 | |||
| 87 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 88 | { | ||
| 89 | .addr = 1, | ||
| 90 | .irq = IRQ_MAC_PHYINT, | ||
| 91 | }, | ||
| 92 | }; | ||
| 93 | |||
| 94 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 95 | .phydev_number = 1, | ||
| 96 | .phydev_data = bfin_phydev_data, | ||
| 97 | .phy_mode = PHY_INTERFACE_MODE_MII, | ||
| 98 | .mac_peripherals = bfin_mac_peripherals, | ||
| 99 | }; | ||
| 100 | |||
| 84 | static struct platform_device bfin_mii_bus = { | 101 | static struct platform_device bfin_mii_bus = { |
| 85 | .name = "bfin_mii_bus", | 102 | .name = "bfin_mii_bus", |
| 103 | .dev = { | ||
| 104 | .platform_data = &bfin_mii_bus_data, | ||
| 105 | } | ||
| 86 | }; | 106 | }; |
| 87 | 107 | ||
| 88 | static struct platform_device bfin_mac_device = { | 108 | static struct platform_device bfin_mac_device = { |
| 89 | .name = "bfin_mac", | 109 | .name = "bfin_mac", |
| 90 | .dev.platform_data = &bfin_mii_bus, | 110 | .dev = { |
| 111 | .platform_data = &bfin_mii_bus, | ||
| 112 | } | ||
| 91 | }; | 113 | }; |
| 92 | #endif | 114 | #endif |
| 93 | 115 | ||
diff --git a/arch/blackfin/mach-bf527/boards/cm_bf527.c b/arch/blackfin/mach-bf527/boards/cm_bf527.c index 38037c7e125a..2c31af7a320a 100644 --- a/arch/blackfin/mach-bf527/boards/cm_bf527.c +++ b/arch/blackfin/mach-bf527/boards/cm_bf527.c | |||
| @@ -273,13 +273,35 @@ static struct platform_device dm9000_device = { | |||
| 273 | #endif | 273 | #endif |
| 274 | 274 | ||
| 275 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 275 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 276 | #include <linux/bfin_mac.h> | ||
| 277 | static const unsigned short bfin_mac_peripherals[] = P_RMII0; | ||
| 278 | |||
| 279 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 280 | { | ||
| 281 | .addr = 1, | ||
| 282 | .irq = IRQ_MAC_PHYINT, | ||
| 283 | }, | ||
| 284 | }; | ||
| 285 | |||
| 286 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 287 | .phydev_number = 1, | ||
| 288 | .phydev_data = bfin_phydev_data, | ||
| 289 | .phy_mode = PHY_INTERFACE_MODE_RMII, | ||
| 290 | .mac_peripherals = bfin_mac_peripherals, | ||
| 291 | }; | ||
| 292 | |||
| 276 | static struct platform_device bfin_mii_bus = { | 293 | static struct platform_device bfin_mii_bus = { |
| 277 | .name = "bfin_mii_bus", | 294 | .name = "bfin_mii_bus", |
| 295 | .dev = { | ||
| 296 | .platform_data = &bfin_mii_bus_data, | ||
| 297 | } | ||
| 278 | }; | 298 | }; |
| 279 | 299 | ||
| 280 | static struct platform_device bfin_mac_device = { | 300 | static struct platform_device bfin_mac_device = { |
| 281 | .name = "bfin_mac", | 301 | .name = "bfin_mac", |
| 282 | .dev.platform_data = &bfin_mii_bus, | 302 | .dev = { |
| 303 | .platform_data = &bfin_mii_bus, | ||
| 304 | } | ||
| 283 | }; | 305 | }; |
| 284 | #endif | 306 | #endif |
| 285 | 307 | ||
diff --git a/arch/blackfin/mach-bf527/boards/ezbrd.c b/arch/blackfin/mach-bf527/boards/ezbrd.c index 6cc64a1e78b9..9a736a850c5c 100644 --- a/arch/blackfin/mach-bf527/boards/ezbrd.c +++ b/arch/blackfin/mach-bf527/boards/ezbrd.c | |||
| @@ -193,13 +193,35 @@ static struct platform_device rtc_device = { | |||
| 193 | 193 | ||
| 194 | 194 | ||
| 195 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 195 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 196 | #include <linux/bfin_mac.h> | ||
| 197 | static const unsigned short bfin_mac_peripherals[] = P_RMII0; | ||
| 198 | |||
| 199 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 200 | { | ||
| 201 | .addr = 1, | ||
| 202 | .irq = IRQ_MAC_PHYINT, | ||
| 203 | }, | ||
| 204 | }; | ||
| 205 | |||
| 206 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 207 | .phydev_number = 1, | ||
| 208 | .phydev_data = bfin_phydev_data, | ||
| 209 | .phy_mode = PHY_INTERFACE_MODE_RMII, | ||
| 210 | .mac_peripherals = bfin_mac_peripherals, | ||
| 211 | }; | ||
| 212 | |||
| 196 | static struct platform_device bfin_mii_bus = { | 213 | static struct platform_device bfin_mii_bus = { |
| 197 | .name = "bfin_mii_bus", | 214 | .name = "bfin_mii_bus", |
| 215 | .dev = { | ||
| 216 | .platform_data = &bfin_mii_bus_data, | ||
| 217 | } | ||
| 198 | }; | 218 | }; |
| 199 | 219 | ||
| 200 | static struct platform_device bfin_mac_device = { | 220 | static struct platform_device bfin_mac_device = { |
| 201 | .name = "bfin_mac", | 221 | .name = "bfin_mac", |
| 202 | .dev.platform_data = &bfin_mii_bus, | 222 | .dev = { |
| 223 | .platform_data = &bfin_mii_bus, | ||
| 224 | } | ||
| 203 | }; | 225 | }; |
| 204 | #endif | 226 | #endif |
| 205 | 227 | ||
diff --git a/arch/blackfin/mach-bf527/boards/ezkit.c b/arch/blackfin/mach-bf527/boards/ezkit.c index df82723fb504..9222bc00bbd3 100644 --- a/arch/blackfin/mach-bf527/boards/ezkit.c +++ b/arch/blackfin/mach-bf527/boards/ezkit.c | |||
| @@ -366,13 +366,35 @@ static struct platform_device dm9000_device = { | |||
| 366 | #endif | 366 | #endif |
| 367 | 367 | ||
| 368 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 368 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 369 | #include <linux/bfin_mac.h> | ||
| 370 | static const unsigned short bfin_mac_peripherals[] = P_RMII0; | ||
| 371 | |||
| 372 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 373 | { | ||
| 374 | .addr = 1, | ||
| 375 | .irq = IRQ_MAC_PHYINT, | ||
| 376 | }, | ||
| 377 | }; | ||
| 378 | |||
| 379 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 380 | .phydev_number = 1, | ||
| 381 | .phydev_data = bfin_phydev_data, | ||
| 382 | .phy_mode = PHY_INTERFACE_MODE_RMII, | ||
| 383 | .mac_peripherals = bfin_mac_peripherals, | ||
| 384 | }; | ||
| 385 | |||
| 369 | static struct platform_device bfin_mii_bus = { | 386 | static struct platform_device bfin_mii_bus = { |
| 370 | .name = "bfin_mii_bus", | 387 | .name = "bfin_mii_bus", |
| 388 | .dev = { | ||
| 389 | .platform_data = &bfin_mii_bus_data, | ||
| 390 | } | ||
| 371 | }; | 391 | }; |
| 372 | 392 | ||
| 373 | static struct platform_device bfin_mac_device = { | 393 | static struct platform_device bfin_mac_device = { |
| 374 | .name = "bfin_mac", | 394 | .name = "bfin_mac", |
| 375 | .dev.platform_data = &bfin_mii_bus, | 395 | .dev = { |
| 396 | .platform_data = &bfin_mii_bus, | ||
| 397 | } | ||
| 376 | }; | 398 | }; |
| 377 | #endif | 399 | #endif |
| 378 | 400 | ||
diff --git a/arch/blackfin/mach-bf527/boards/tll6527m.c b/arch/blackfin/mach-bf527/boards/tll6527m.c index ae4130e97c01..9ec575729e2c 100644 --- a/arch/blackfin/mach-bf527/boards/tll6527m.c +++ b/arch/blackfin/mach-bf527/boards/tll6527m.c | |||
| @@ -257,13 +257,35 @@ static struct platform_device rtc_device = { | |||
| 257 | #endif | 257 | #endif |
| 258 | 258 | ||
| 259 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 259 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 260 | #include <linux/bfin_mac.h> | ||
| 261 | static const unsigned short bfin_mac_peripherals[] = P_RMII0; | ||
| 262 | |||
| 263 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 264 | { | ||
| 265 | .addr = 1, | ||
| 266 | .irq = IRQ_MAC_PHYINT, | ||
| 267 | }, | ||
| 268 | }; | ||
| 269 | |||
| 270 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 271 | .phydev_number = 1, | ||
| 272 | .phydev_data = bfin_phydev_data, | ||
| 273 | .phy_mode = PHY_INTERFACE_MODE_RMII, | ||
| 274 | .mac_peripherals = bfin_mac_peripherals, | ||
| 275 | }; | ||
| 276 | |||
| 260 | static struct platform_device bfin_mii_bus = { | 277 | static struct platform_device bfin_mii_bus = { |
| 261 | .name = "bfin_mii_bus", | 278 | .name = "bfin_mii_bus", |
| 279 | .dev = { | ||
| 280 | .platform_data = &bfin_mii_bus_data, | ||
| 281 | } | ||
| 262 | }; | 282 | }; |
| 263 | 283 | ||
| 264 | static struct platform_device bfin_mac_device = { | 284 | static struct platform_device bfin_mac_device = { |
| 265 | .name = "bfin_mac", | 285 | .name = "bfin_mac", |
| 266 | .dev.platform_data = &bfin_mii_bus, | 286 | .dev = { |
| 287 | .platform_data = &bfin_mii_bus, | ||
| 288 | } | ||
| 267 | }; | 289 | }; |
| 268 | #endif | 290 | #endif |
| 269 | 291 | ||
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537e.c b/arch/blackfin/mach-bf537/boards/cm_bf537e.c index e2e7be40ef44..836698c4ee54 100644 --- a/arch/blackfin/mach-bf537/boards/cm_bf537e.c +++ b/arch/blackfin/mach-bf537/boards/cm_bf537e.c | |||
| @@ -597,13 +597,35 @@ static struct platform_device bfin_sport1_uart_device = { | |||
| 597 | #endif | 597 | #endif |
| 598 | 598 | ||
| 599 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 599 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 600 | #include <linux/bfin_mac.h> | ||
| 601 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
| 602 | |||
| 603 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 604 | { | ||
| 605 | .addr = 1, | ||
| 606 | .irq = IRQ_MAC_PHYINT, | ||
| 607 | }, | ||
| 608 | }; | ||
| 609 | |||
| 610 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 611 | .phydev_number = 1, | ||
| 612 | .phydev_data = bfin_phydev_data, | ||
| 613 | .phy_mode = PHY_INTERFACE_MODE_MII, | ||
| 614 | .mac_peripherals = bfin_mac_peripherals, | ||
| 615 | }; | ||
| 616 | |||
| 600 | static struct platform_device bfin_mii_bus = { | 617 | static struct platform_device bfin_mii_bus = { |
| 601 | .name = "bfin_mii_bus", | 618 | .name = "bfin_mii_bus", |
| 619 | .dev = { | ||
| 620 | .platform_data = &bfin_mii_bus_data, | ||
| 621 | } | ||
| 602 | }; | 622 | }; |
| 603 | 623 | ||
| 604 | static struct platform_device bfin_mac_device = { | 624 | static struct platform_device bfin_mac_device = { |
| 605 | .name = "bfin_mac", | 625 | .name = "bfin_mac", |
| 606 | .dev.platform_data = &bfin_mii_bus, | 626 | .dev = { |
| 627 | .platform_data = &bfin_mii_bus, | ||
| 628 | } | ||
| 607 | }; | 629 | }; |
| 608 | #endif | 630 | #endif |
| 609 | 631 | ||
diff --git a/arch/blackfin/mach-bf537/boards/cm_bf537u.c b/arch/blackfin/mach-bf537/boards/cm_bf537u.c index 752c833f7ca8..2a85670273cb 100644 --- a/arch/blackfin/mach-bf537/boards/cm_bf537u.c +++ b/arch/blackfin/mach-bf537/boards/cm_bf537u.c | |||
| @@ -562,13 +562,35 @@ static struct platform_device bfin_sport1_uart_device = { | |||
| 562 | #endif | 562 | #endif |
| 563 | 563 | ||
| 564 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 564 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 565 | #include <linux/bfin_mac.h> | ||
| 566 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
| 567 | |||
| 568 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 569 | { | ||
| 570 | .addr = 1, | ||
| 571 | .irq = IRQ_MAC_PHYINT, | ||
| 572 | }, | ||
| 573 | }; | ||
| 574 | |||
| 575 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 576 | .phydev_number = 1, | ||
| 577 | .phydev_data = bfin_phydev_data, | ||
| 578 | .phy_mode = PHY_INTERFACE_MODE_MII, | ||
| 579 | .mac_peripherals = bfin_mac_peripherals, | ||
| 580 | }; | ||
| 581 | |||
| 565 | static struct platform_device bfin_mii_bus = { | 582 | static struct platform_device bfin_mii_bus = { |
| 566 | .name = "bfin_mii_bus", | 583 | .name = "bfin_mii_bus", |
| 584 | .dev = { | ||
| 585 | .platform_data = &bfin_mii_bus_data, | ||
| 586 | } | ||
| 567 | }; | 587 | }; |
| 568 | 588 | ||
| 569 | static struct platform_device bfin_mac_device = { | 589 | static struct platform_device bfin_mac_device = { |
| 570 | .name = "bfin_mac", | 590 | .name = "bfin_mac", |
| 571 | .dev.platform_data = &bfin_mii_bus, | 591 | .dev = { |
| 592 | .platform_data = &bfin_mii_bus, | ||
| 593 | } | ||
| 572 | }; | 594 | }; |
| 573 | #endif | 595 | #endif |
| 574 | 596 | ||
diff --git a/arch/blackfin/mach-bf537/boards/minotaur.c b/arch/blackfin/mach-bf537/boards/minotaur.c index 05d45994480e..49800518412c 100644 --- a/arch/blackfin/mach-bf537/boards/minotaur.c +++ b/arch/blackfin/mach-bf537/boards/minotaur.c | |||
| @@ -68,13 +68,35 @@ static struct platform_device rtc_device = { | |||
| 68 | #endif | 68 | #endif |
| 69 | 69 | ||
| 70 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 70 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 71 | #include <linux/bfin_mac.h> | ||
| 72 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
| 73 | |||
| 74 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 75 | { | ||
| 76 | .addr = 1, | ||
| 77 | .irq = IRQ_MAC_PHYINT, | ||
| 78 | }, | ||
| 79 | }; | ||
| 80 | |||
| 81 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 82 | .phydev_number = 1, | ||
| 83 | .phydev_data = bfin_phydev_data, | ||
| 84 | .phy_mode = PHY_INTERFACE_MODE_MII, | ||
| 85 | .mac_peripherals = bfin_mac_peripherals, | ||
| 86 | }; | ||
| 87 | |||
| 71 | static struct platform_device bfin_mii_bus = { | 88 | static struct platform_device bfin_mii_bus = { |
| 72 | .name = "bfin_mii_bus", | 89 | .name = "bfin_mii_bus", |
| 90 | .dev = { | ||
| 91 | .platform_data = &bfin_mii_bus_data, | ||
| 92 | } | ||
| 73 | }; | 93 | }; |
| 74 | 94 | ||
| 75 | static struct platform_device bfin_mac_device = { | 95 | static struct platform_device bfin_mac_device = { |
| 76 | .name = "bfin_mac", | 96 | .name = "bfin_mac", |
| 77 | .dev.platform_data = &bfin_mii_bus, | 97 | .dev = { |
| 98 | .platform_data = &bfin_mii_bus, | ||
| 99 | } | ||
| 78 | }; | 100 | }; |
| 79 | #endif | 101 | #endif |
| 80 | 102 | ||
diff --git a/arch/blackfin/mach-bf537/boards/pnav10.c b/arch/blackfin/mach-bf537/boards/pnav10.c index 6b03808800a6..b95807894e25 100644 --- a/arch/blackfin/mach-bf537/boards/pnav10.c +++ b/arch/blackfin/mach-bf537/boards/pnav10.c | |||
| @@ -99,13 +99,35 @@ static struct platform_device smc91x_device = { | |||
| 99 | #endif | 99 | #endif |
| 100 | 100 | ||
| 101 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 101 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 102 | #include <linux/bfin_mac.h> | ||
| 103 | static const unsigned short bfin_mac_peripherals[] = P_RMII0; | ||
| 104 | |||
| 105 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 106 | { | ||
| 107 | .addr = 1, | ||
| 108 | .irq = IRQ_MAC_PHYINT, | ||
| 109 | }, | ||
| 110 | }; | ||
| 111 | |||
| 112 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 113 | .phydev_number = 1, | ||
| 114 | .phydev_data = bfin_phydev_data, | ||
| 115 | .phy_mode = PHY_INTERFACE_MODE_RMII, | ||
| 116 | .mac_peripherals = bfin_mac_peripherals, | ||
| 117 | }; | ||
| 118 | |||
| 102 | static struct platform_device bfin_mii_bus = { | 119 | static struct platform_device bfin_mii_bus = { |
| 103 | .name = "bfin_mii_bus", | 120 | .name = "bfin_mii_bus", |
| 121 | .dev = { | ||
| 122 | .platform_data = &bfin_mii_bus_data, | ||
| 123 | } | ||
| 104 | }; | 124 | }; |
| 105 | 125 | ||
| 106 | static struct platform_device bfin_mac_device = { | 126 | static struct platform_device bfin_mac_device = { |
| 107 | .name = "bfin_mac", | 127 | .name = "bfin_mac", |
| 108 | .dev.platform_data = &bfin_mii_bus, | 128 | .dev = { |
| 129 | .platform_data = &bfin_mii_bus, | ||
| 130 | } | ||
| 109 | }; | 131 | }; |
| 110 | #endif | 132 | #endif |
| 111 | 133 | ||
diff --git a/arch/blackfin/mach-bf537/boards/stamp.c b/arch/blackfin/mach-bf537/boards/stamp.c index cd2c797c8c9f..3aa344ce8e52 100644 --- a/arch/blackfin/mach-bf537/boards/stamp.c +++ b/arch/blackfin/mach-bf537/boards/stamp.c | |||
| @@ -327,13 +327,35 @@ static struct platform_device bfin_can_device = { | |||
| 327 | #endif | 327 | #endif |
| 328 | 328 | ||
| 329 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 329 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 330 | #include <linux/bfin_mac.h> | ||
| 331 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
| 332 | |||
| 333 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 334 | { | ||
| 335 | .addr = 1, | ||
| 336 | .irq = PHY_POLL, /* IRQ_MAC_PHYINT */ | ||
| 337 | }, | ||
| 338 | }; | ||
| 339 | |||
| 340 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 341 | .phydev_number = 1, | ||
| 342 | .phydev_data = bfin_phydev_data, | ||
| 343 | .phy_mode = PHY_INTERFACE_MODE_MII, | ||
| 344 | .mac_peripherals = bfin_mac_peripherals, | ||
| 345 | }; | ||
| 346 | |||
| 330 | static struct platform_device bfin_mii_bus = { | 347 | static struct platform_device bfin_mii_bus = { |
| 331 | .name = "bfin_mii_bus", | 348 | .name = "bfin_mii_bus", |
| 349 | .dev = { | ||
| 350 | .platform_data = &bfin_mii_bus_data, | ||
| 351 | } | ||
| 332 | }; | 352 | }; |
| 333 | 353 | ||
| 334 | static struct platform_device bfin_mac_device = { | 354 | static struct platform_device bfin_mac_device = { |
| 335 | .name = "bfin_mac", | 355 | .name = "bfin_mac", |
| 336 | .dev.platform_data = &bfin_mii_bus, | 356 | .dev = { |
| 357 | .platform_data = &bfin_mii_bus, | ||
| 358 | } | ||
| 337 | }; | 359 | }; |
| 338 | #endif | 360 | #endif |
| 339 | 361 | ||
diff --git a/arch/blackfin/mach-bf537/boards/tcm_bf537.c b/arch/blackfin/mach-bf537/boards/tcm_bf537.c index a4d62b5fc7ba..31498add1a42 100644 --- a/arch/blackfin/mach-bf537/boards/tcm_bf537.c +++ b/arch/blackfin/mach-bf537/boards/tcm_bf537.c | |||
| @@ -564,13 +564,35 @@ static struct platform_device bfin_sport1_uart_device = { | |||
| 564 | #endif | 564 | #endif |
| 565 | 565 | ||
| 566 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) | 566 | #if defined(CONFIG_BFIN_MAC) || defined(CONFIG_BFIN_MAC_MODULE) |
| 567 | #include <linux/bfin_mac.h> | ||
| 568 | static const unsigned short bfin_mac_peripherals[] = P_MII0; | ||
| 569 | |||
| 570 | static struct bfin_phydev_platform_data bfin_phydev_data[] = { | ||
| 571 | { | ||
| 572 | .addr = 1, | ||
| 573 | .irq = IRQ_MAC_PHYINT, | ||
| 574 | }, | ||
| 575 | }; | ||
| 576 | |||
| 577 | static struct bfin_mii_bus_platform_data bfin_mii_bus_data = { | ||
| 578 | .phydev_number = 1, | ||
| 579 | .phydev_data = bfin_phydev_data, | ||
| 580 | .phy_mode = PHY_INTERFACE_MODE_MII, | ||
| 581 | .mac_peripherals = bfin_mac_peripherals, | ||
| 582 | }; | ||
| 583 | |||
| 567 | static struct platform_device bfin_mii_bus = { | 584 | static struct platform_device bfin_mii_bus = { |
| 568 | .name = "bfin_mii_bus", | 585 | .name = "bfin_mii_bus", |
| 586 | .dev = { | ||
| 587 | .platform_data = &bfin_mii_bus_data, | ||
| 588 | } | ||
| 569 | }; | 589 | }; |
| 570 | 590 | ||
| 571 | static struct platform_device bfin_mac_device = { | 591 | static struct platform_device bfin_mac_device = { |
| 572 | .name = "bfin_mac", | 592 | .name = "bfin_mac", |
| 573 | .dev.platform_data = &bfin_mii_bus, | 593 | .dev = { |
| 594 | .platform_data = &bfin_mii_bus, | ||
| 595 | } | ||
| 574 | }; | 596 | }; |
| 575 | #endif | 597 | #endif |
| 576 | 598 | ||
diff --git a/drivers/net/Kconfig b/drivers/net/Kconfig index 77c1fab7d774..c598fe008e37 100644 --- a/drivers/net/Kconfig +++ b/drivers/net/Kconfig | |||
| @@ -883,14 +883,6 @@ config BFIN_RX_DESC_NUM | |||
| 883 | help | 883 | help |
| 884 | Set the number of buffer packets used in driver. | 884 | Set the number of buffer packets used in driver. |
| 885 | 885 | ||
| 886 | config BFIN_MAC_RMII | ||
| 887 | bool "RMII PHY Interface" | ||
| 888 | depends on BFIN_MAC | ||
| 889 | default y if BFIN527_EZKIT | ||
| 890 | default n if BFIN537_STAMP | ||
| 891 | help | ||
| 892 | Use Reduced PHY MII Interface | ||
| 893 | |||
| 894 | config BFIN_MAC_USE_HWSTAMP | 886 | config BFIN_MAC_USE_HWSTAMP |
| 895 | bool "Use IEEE 1588 hwstamp" | 887 | bool "Use IEEE 1588 hwstamp" |
| 896 | depends on BFIN_MAC && BF518 | 888 | depends on BFIN_MAC && BF518 |
diff --git a/drivers/net/bfin_mac.c b/drivers/net/bfin_mac.c index f7233191162b..ce1e5e9d06f6 100644 --- a/drivers/net/bfin_mac.c +++ b/drivers/net/bfin_mac.c | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * Blackfin On-Chip MAC Driver | 2 | * Blackfin On-Chip MAC Driver |
| 3 | * | 3 | * |
| 4 | * Copyright 2004-2007 Analog Devices Inc. | 4 | * Copyright 2004-2010 Analog Devices Inc. |
| 5 | * | 5 | * |
| 6 | * Enter bugs at http://blackfin.uclinux.org/ | 6 | * Enter bugs at http://blackfin.uclinux.org/ |
| 7 | * | 7 | * |
| @@ -23,7 +23,6 @@ | |||
| 23 | #include <linux/device.h> | 23 | #include <linux/device.h> |
| 24 | #include <linux/spinlock.h> | 24 | #include <linux/spinlock.h> |
| 25 | #include <linux/mii.h> | 25 | #include <linux/mii.h> |
| 26 | #include <linux/phy.h> | ||
| 27 | #include <linux/netdevice.h> | 26 | #include <linux/netdevice.h> |
| 28 | #include <linux/etherdevice.h> | 27 | #include <linux/etherdevice.h> |
| 29 | #include <linux/ethtool.h> | 28 | #include <linux/ethtool.h> |
| @@ -76,12 +75,6 @@ static struct net_dma_desc_tx *current_tx_ptr; | |||
| 76 | static struct net_dma_desc_tx *tx_desc; | 75 | static struct net_dma_desc_tx *tx_desc; |
| 77 | static struct net_dma_desc_rx *rx_desc; | 76 | static struct net_dma_desc_rx *rx_desc; |
| 78 | 77 | ||
| 79 | #if defined(CONFIG_BFIN_MAC_RMII) | ||
| 80 | static u16 pin_req[] = P_RMII0; | ||
| 81 | #else | ||
| 82 | static u16 pin_req[] = P_MII0; | ||
| 83 | #endif | ||
| 84 | |||
| 85 | static void desc_list_free(void) | 78 | static void desc_list_free(void) |
| 86 | { | 79 | { |
| 87 | struct net_dma_desc_rx *r; | 80 | struct net_dma_desc_rx *r; |
| @@ -347,23 +340,23 @@ static void bfin_mac_adjust_link(struct net_device *dev) | |||
| 347 | } | 340 | } |
| 348 | 341 | ||
| 349 | if (phydev->speed != lp->old_speed) { | 342 | if (phydev->speed != lp->old_speed) { |
| 350 | #if defined(CONFIG_BFIN_MAC_RMII) | 343 | if (phydev->interface == PHY_INTERFACE_MODE_RMII) { |
| 351 | u32 opmode = bfin_read_EMAC_OPMODE(); | 344 | u32 opmode = bfin_read_EMAC_OPMODE(); |
| 352 | switch (phydev->speed) { | 345 | switch (phydev->speed) { |
| 353 | case 10: | 346 | case 10: |
| 354 | opmode |= RMII_10; | 347 | opmode |= RMII_10; |
| 355 | break; | 348 | break; |
| 356 | case 100: | 349 | case 100: |
| 357 | opmode &= ~(RMII_10); | 350 | opmode &= ~RMII_10; |
| 358 | break; | 351 | break; |
| 359 | default: | 352 | default: |
| 360 | printk(KERN_WARNING | 353 | printk(KERN_WARNING |
| 361 | "%s: Ack! Speed (%d) is not 10/100!\n", | 354 | "%s: Ack! Speed (%d) is not 10/100!\n", |
| 362 | DRV_NAME, phydev->speed); | 355 | DRV_NAME, phydev->speed); |
| 363 | break; | 356 | break; |
| 357 | } | ||
| 358 | bfin_write_EMAC_OPMODE(opmode); | ||
| 364 | } | 359 | } |
| 365 | bfin_write_EMAC_OPMODE(opmode); | ||
| 366 | #endif | ||
| 367 | 360 | ||
| 368 | new_state = 1; | 361 | new_state = 1; |
| 369 | lp->old_speed = phydev->speed; | 362 | lp->old_speed = phydev->speed; |
| @@ -392,7 +385,7 @@ static void bfin_mac_adjust_link(struct net_device *dev) | |||
| 392 | /* MDC = 2.5 MHz */ | 385 | /* MDC = 2.5 MHz */ |
| 393 | #define MDC_CLK 2500000 | 386 | #define MDC_CLK 2500000 |
| 394 | 387 | ||
| 395 | static int mii_probe(struct net_device *dev) | 388 | static int mii_probe(struct net_device *dev, int phy_mode) |
| 396 | { | 389 | { |
| 397 | struct bfin_mac_local *lp = netdev_priv(dev); | 390 | struct bfin_mac_local *lp = netdev_priv(dev); |
| 398 | struct phy_device *phydev = NULL; | 391 | struct phy_device *phydev = NULL; |
| @@ -411,8 +404,8 @@ static int mii_probe(struct net_device *dev) | |||
| 411 | sysctl = (sysctl & ~MDCDIV) | SET_MDCDIV(mdc_div); | 404 | sysctl = (sysctl & ~MDCDIV) | SET_MDCDIV(mdc_div); |
| 412 | bfin_write_EMAC_SYSCTL(sysctl); | 405 | bfin_write_EMAC_SYSCTL(sysctl); |
| 413 | 406 | ||
| 414 | /* search for connect PHY device */ | 407 | /* search for connected PHY device */ |
| 415 | for (i = 0; i < PHY_MAX_ADDR; i++) { | 408 | for (i = 0; i < PHY_MAX_ADDR; ++i) { |
| 416 | struct phy_device *const tmp_phydev = lp->mii_bus->phy_map[i]; | 409 | struct phy_device *const tmp_phydev = lp->mii_bus->phy_map[i]; |
| 417 | 410 | ||
| 418 | if (!tmp_phydev) | 411 | if (!tmp_phydev) |
| @@ -429,13 +422,14 @@ static int mii_probe(struct net_device *dev) | |||
| 429 | return -ENODEV; | 422 | return -ENODEV; |
| 430 | } | 423 | } |
| 431 | 424 | ||
| 432 | #if defined(CONFIG_BFIN_MAC_RMII) | 425 | if (phy_mode != PHY_INTERFACE_MODE_RMII && |
| 433 | phydev = phy_connect(dev, dev_name(&phydev->dev), &bfin_mac_adjust_link, | 426 | phy_mode != PHY_INTERFACE_MODE_MII) { |
| 434 | 0, PHY_INTERFACE_MODE_RMII); | 427 | printk(KERN_INFO "%s: Invalid phy interface mode\n", dev->name); |
| 435 | #else | 428 | return -EINVAL; |
| 429 | } | ||
| 430 | |||
| 436 | phydev = phy_connect(dev, dev_name(&phydev->dev), &bfin_mac_adjust_link, | 431 | phydev = phy_connect(dev, dev_name(&phydev->dev), &bfin_mac_adjust_link, |
| 437 | 0, PHY_INTERFACE_MODE_MII); | 432 | 0, phy_mode); |
| 438 | #endif | ||
| 439 | 433 | ||
| 440 | if (IS_ERR(phydev)) { | 434 | if (IS_ERR(phydev)) { |
| 441 | printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); | 435 | printk(KERN_ERR "%s: Could not attach to PHY\n", dev->name); |
| @@ -570,6 +564,8 @@ static const struct ethtool_ops bfin_mac_ethtool_ops = { | |||
| 570 | /**************************************************************************/ | 564 | /**************************************************************************/ |
| 571 | void setup_system_regs(struct net_device *dev) | 565 | void setup_system_regs(struct net_device *dev) |
| 572 | { | 566 | { |
| 567 | struct bfin_mac_local *lp = netdev_priv(dev); | ||
| 568 | int i; | ||
| 573 | unsigned short sysctl; | 569 | unsigned short sysctl; |
| 574 | 570 | ||
| 575 | /* | 571 | /* |
| @@ -577,6 +573,15 @@ void setup_system_regs(struct net_device *dev) | |||
| 577 | * Configure checksum support and rcve frame word alignment | 573 | * Configure checksum support and rcve frame word alignment |
| 578 | */ | 574 | */ |
| 579 | sysctl = bfin_read_EMAC_SYSCTL(); | 575 | sysctl = bfin_read_EMAC_SYSCTL(); |
| 576 | /* | ||
| 577 | * check if interrupt is requested for any PHY, | ||
| 578 | * enable PHY interrupt only if needed | ||
| 579 | */ | ||
| 580 | for (i = 0; i < PHY_MAX_ADDR; ++i) | ||
| 581 | if (lp->mii_bus->irq[i] != PHY_POLL) | ||
| 582 | break; | ||
| 583 | if (i < PHY_MAX_ADDR) | ||
| 584 | sysctl |= PHYIE; | ||
| 580 | sysctl |= RXDWA; | 585 | sysctl |= RXDWA; |
| 581 | #if defined(BFIN_MAC_CSUM_OFFLOAD) | 586 | #if defined(BFIN_MAC_CSUM_OFFLOAD) |
| 582 | sysctl |= RXCKS; | 587 | sysctl |= RXCKS; |
| @@ -1203,7 +1208,7 @@ static void bfin_mac_disable(void) | |||
| 1203 | /* | 1208 | /* |
| 1204 | * Enable Interrupts, Receive, and Transmit | 1209 | * Enable Interrupts, Receive, and Transmit |
| 1205 | */ | 1210 | */ |
| 1206 | static int bfin_mac_enable(void) | 1211 | static int bfin_mac_enable(struct phy_device *phydev) |
| 1207 | { | 1212 | { |
| 1208 | int ret; | 1213 | int ret; |
| 1209 | u32 opmode; | 1214 | u32 opmode; |
| @@ -1233,12 +1238,13 @@ static int bfin_mac_enable(void) | |||
| 1233 | opmode |= DRO | DC | PSF; | 1238 | opmode |= DRO | DC | PSF; |
| 1234 | opmode |= RE; | 1239 | opmode |= RE; |
| 1235 | 1240 | ||
| 1236 | #if defined(CONFIG_BFIN_MAC_RMII) | 1241 | if (phydev->interface == PHY_INTERFACE_MODE_RMII) { |
| 1237 | opmode |= RMII; /* For Now only 100MBit are supported */ | 1242 | opmode |= RMII; /* For Now only 100MBit are supported */ |
| 1238 | #if (defined(CONFIG_BF537) || defined(CONFIG_BF536)) && CONFIG_BF_REV_0_2 | 1243 | #if (defined(CONFIG_BF537) || defined(CONFIG_BF536)) && CONFIG_BF_REV_0_2 |
| 1239 | opmode |= TE; | 1244 | opmode |= TE; |
| 1240 | #endif | ||
| 1241 | #endif | 1245 | #endif |
| 1246 | } | ||
| 1247 | |||
| 1242 | /* Turn on the EMAC rx */ | 1248 | /* Turn on the EMAC rx */ |
| 1243 | bfin_write_EMAC_OPMODE(opmode); | 1249 | bfin_write_EMAC_OPMODE(opmode); |
| 1244 | 1250 | ||
| @@ -1270,7 +1276,7 @@ static void bfin_mac_timeout(struct net_device *dev) | |||
| 1270 | if (netif_queue_stopped(lp->ndev)) | 1276 | if (netif_queue_stopped(lp->ndev)) |
| 1271 | netif_wake_queue(lp->ndev); | 1277 | netif_wake_queue(lp->ndev); |
| 1272 | 1278 | ||
| 1273 | bfin_mac_enable(); | 1279 | bfin_mac_enable(lp->phydev); |
| 1274 | 1280 | ||
| 1275 | /* We can accept TX packets again */ | 1281 | /* We can accept TX packets again */ |
| 1276 | dev->trans_start = jiffies; /* prevent tx timeout */ | 1282 | dev->trans_start = jiffies; /* prevent tx timeout */ |
| @@ -1342,11 +1348,19 @@ static void bfin_mac_set_multicast_list(struct net_device *dev) | |||
| 1342 | 1348 | ||
| 1343 | static int bfin_mac_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) | 1349 | static int bfin_mac_ioctl(struct net_device *netdev, struct ifreq *ifr, int cmd) |
| 1344 | { | 1350 | { |
| 1351 | struct bfin_mac_local *lp = netdev_priv(netdev); | ||
| 1352 | |||
| 1353 | if (!netif_running(netdev)) | ||
| 1354 | return -EINVAL; | ||
| 1355 | |||
| 1345 | switch (cmd) { | 1356 | switch (cmd) { |
| 1346 | case SIOCSHWTSTAMP: | 1357 | case SIOCSHWTSTAMP: |
| 1347 | return bfin_mac_hwtstamp_ioctl(netdev, ifr, cmd); | 1358 | return bfin_mac_hwtstamp_ioctl(netdev, ifr, cmd); |
| 1348 | default: | 1359 | default: |
| 1349 | return -EOPNOTSUPP; | 1360 | if (lp->phydev) |
| 1361 | return phy_mii_ioctl(lp->phydev, ifr, cmd); | ||
| 1362 | else | ||
| 1363 | return -EOPNOTSUPP; | ||
| 1350 | } | 1364 | } |
| 1351 | } | 1365 | } |
| 1352 | 1366 | ||
| @@ -1394,7 +1408,7 @@ static int bfin_mac_open(struct net_device *dev) | |||
| 1394 | setup_mac_addr(dev->dev_addr); | 1408 | setup_mac_addr(dev->dev_addr); |
| 1395 | 1409 | ||
| 1396 | bfin_mac_disable(); | 1410 | bfin_mac_disable(); |
| 1397 | ret = bfin_mac_enable(); | 1411 | ret = bfin_mac_enable(lp->phydev); |
| 1398 | if (ret) | 1412 | if (ret) |
| 1399 | return ret; | 1413 | return ret; |
| 1400 | pr_debug("hardware init finished\n"); | 1414 | pr_debug("hardware init finished\n"); |
| @@ -1450,6 +1464,7 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev) | |||
| 1450 | struct net_device *ndev; | 1464 | struct net_device *ndev; |
| 1451 | struct bfin_mac_local *lp; | 1465 | struct bfin_mac_local *lp; |
| 1452 | struct platform_device *pd; | 1466 | struct platform_device *pd; |
| 1467 | struct bfin_mii_bus_platform_data *mii_bus_data; | ||
| 1453 | int rc; | 1468 | int rc; |
| 1454 | 1469 | ||
| 1455 | ndev = alloc_etherdev(sizeof(struct bfin_mac_local)); | 1470 | ndev = alloc_etherdev(sizeof(struct bfin_mac_local)); |
| @@ -1501,11 +1516,12 @@ static int __devinit bfin_mac_probe(struct platform_device *pdev) | |||
| 1501 | if (!lp->mii_bus) { | 1516 | if (!lp->mii_bus) { |
| 1502 | dev_err(&pdev->dev, "Cannot get mii_bus!\n"); | 1517 | dev_err(&pdev->dev, "Cannot get mii_bus!\n"); |
| 1503 | rc = -ENODEV; | 1518 | rc = -ENODEV; |
| 1504 | goto out_err_mii_bus_probe; | 1519 | goto out_err_probe_mac; |
| 1505 | } | 1520 | } |
| 1506 | lp->mii_bus->priv = ndev; | 1521 | lp->mii_bus->priv = ndev; |
| 1522 | mii_bus_data = pd->dev.platform_data; | ||
| 1507 | 1523 | ||
| 1508 | rc = mii_probe(ndev); | 1524 | rc = mii_probe(ndev, mii_bus_data->phy_mode); |
| 1509 | if (rc) { | 1525 | if (rc) { |
| 1510 | dev_err(&pdev->dev, "MII Probe failed!\n"); | 1526 | dev_err(&pdev->dev, "MII Probe failed!\n"); |
| 1511 | goto out_err_mii_probe; | 1527 | goto out_err_mii_probe; |
| @@ -1552,8 +1568,6 @@ out_err_request_irq: | |||
| 1552 | out_err_mii_probe: | 1568 | out_err_mii_probe: |
| 1553 | mdiobus_unregister(lp->mii_bus); | 1569 | mdiobus_unregister(lp->mii_bus); |
| 1554 | mdiobus_free(lp->mii_bus); | 1570 | mdiobus_free(lp->mii_bus); |
| 1555 | out_err_mii_bus_probe: | ||
| 1556 | peripheral_free_list(pin_req); | ||
| 1557 | out_err_probe_mac: | 1571 | out_err_probe_mac: |
| 1558 | platform_set_drvdata(pdev, NULL); | 1572 | platform_set_drvdata(pdev, NULL); |
| 1559 | free_netdev(ndev); | 1573 | free_netdev(ndev); |
| @@ -1576,8 +1590,6 @@ static int __devexit bfin_mac_remove(struct platform_device *pdev) | |||
| 1576 | 1590 | ||
| 1577 | free_netdev(ndev); | 1591 | free_netdev(ndev); |
| 1578 | 1592 | ||
| 1579 | peripheral_free_list(pin_req); | ||
| 1580 | |||
| 1581 | return 0; | 1593 | return 0; |
| 1582 | } | 1594 | } |
| 1583 | 1595 | ||
| @@ -1623,12 +1635,21 @@ static int bfin_mac_resume(struct platform_device *pdev) | |||
| 1623 | static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) | 1635 | static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) |
| 1624 | { | 1636 | { |
| 1625 | struct mii_bus *miibus; | 1637 | struct mii_bus *miibus; |
| 1638 | struct bfin_mii_bus_platform_data *mii_bus_pd; | ||
| 1639 | const unsigned short *pin_req; | ||
| 1626 | int rc, i; | 1640 | int rc, i; |
| 1627 | 1641 | ||
| 1642 | mii_bus_pd = dev_get_platdata(&pdev->dev); | ||
| 1643 | if (!mii_bus_pd) { | ||
| 1644 | dev_err(&pdev->dev, "No peripherals in platform data!\n"); | ||
| 1645 | return -EINVAL; | ||
| 1646 | } | ||
| 1647 | |||
| 1628 | /* | 1648 | /* |
| 1629 | * We are setting up a network card, | 1649 | * We are setting up a network card, |
| 1630 | * so set the GPIO pins to Ethernet mode | 1650 | * so set the GPIO pins to Ethernet mode |
| 1631 | */ | 1651 | */ |
| 1652 | pin_req = mii_bus_pd->mac_peripherals; | ||
| 1632 | rc = peripheral_request_list(pin_req, DRV_NAME); | 1653 | rc = peripheral_request_list(pin_req, DRV_NAME); |
| 1633 | if (rc) { | 1654 | if (rc) { |
| 1634 | dev_err(&pdev->dev, "Requesting peripherals failed!\n"); | 1655 | dev_err(&pdev->dev, "Requesting peripherals failed!\n"); |
| @@ -1645,13 +1666,30 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) | |||
| 1645 | 1666 | ||
| 1646 | miibus->parent = &pdev->dev; | 1667 | miibus->parent = &pdev->dev; |
| 1647 | miibus->name = "bfin_mii_bus"; | 1668 | miibus->name = "bfin_mii_bus"; |
| 1669 | miibus->phy_mask = mii_bus_pd->phy_mask; | ||
| 1670 | |||
| 1648 | snprintf(miibus->id, MII_BUS_ID_SIZE, "0"); | 1671 | snprintf(miibus->id, MII_BUS_ID_SIZE, "0"); |
| 1649 | miibus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); | 1672 | miibus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL); |
| 1650 | if (miibus->irq == NULL) | 1673 | if (!miibus->irq) |
| 1651 | goto out_err_alloc; | 1674 | goto out_err_irq_alloc; |
| 1652 | for (i = 0; i < PHY_MAX_ADDR; ++i) | 1675 | |
| 1676 | for (i = rc; i < PHY_MAX_ADDR; ++i) | ||
| 1653 | miibus->irq[i] = PHY_POLL; | 1677 | miibus->irq[i] = PHY_POLL; |
| 1654 | 1678 | ||
| 1679 | rc = clamp(mii_bus_pd->phydev_number, 0, PHY_MAX_ADDR); | ||
| 1680 | if (rc != mii_bus_pd->phydev_number) | ||
| 1681 | dev_err(&pdev->dev, "Invalid number (%i) of phydevs\n", | ||
| 1682 | mii_bus_pd->phydev_number); | ||
| 1683 | for (i = 0; i < rc; ++i) { | ||
| 1684 | unsigned short phyaddr = mii_bus_pd->phydev_data[i].addr; | ||
| 1685 | if (phyaddr < PHY_MAX_ADDR) | ||
| 1686 | miibus->irq[phyaddr] = mii_bus_pd->phydev_data[i].irq; | ||
| 1687 | else | ||
| 1688 | dev_err(&pdev->dev, | ||
| 1689 | "Invalid PHY address %i for phydev %i\n", | ||
| 1690 | phyaddr, i); | ||
| 1691 | } | ||
| 1692 | |||
| 1655 | rc = mdiobus_register(miibus); | 1693 | rc = mdiobus_register(miibus); |
| 1656 | if (rc) { | 1694 | if (rc) { |
| 1657 | dev_err(&pdev->dev, "Cannot register MDIO bus!\n"); | 1695 | dev_err(&pdev->dev, "Cannot register MDIO bus!\n"); |
| @@ -1663,6 +1701,7 @@ static int __devinit bfin_mii_bus_probe(struct platform_device *pdev) | |||
| 1663 | 1701 | ||
| 1664 | out_err_mdiobus_register: | 1702 | out_err_mdiobus_register: |
| 1665 | kfree(miibus->irq); | 1703 | kfree(miibus->irq); |
| 1704 | out_err_irq_alloc: | ||
| 1666 | mdiobus_free(miibus); | 1705 | mdiobus_free(miibus); |
| 1667 | out_err_alloc: | 1706 | out_err_alloc: |
| 1668 | peripheral_free_list(pin_req); | 1707 | peripheral_free_list(pin_req); |
| @@ -1673,11 +1712,15 @@ out_err_alloc: | |||
| 1673 | static int __devexit bfin_mii_bus_remove(struct platform_device *pdev) | 1712 | static int __devexit bfin_mii_bus_remove(struct platform_device *pdev) |
| 1674 | { | 1713 | { |
| 1675 | struct mii_bus *miibus = platform_get_drvdata(pdev); | 1714 | struct mii_bus *miibus = platform_get_drvdata(pdev); |
| 1715 | struct bfin_mii_bus_platform_data *mii_bus_pd = | ||
| 1716 | dev_get_platdata(&pdev->dev); | ||
| 1717 | |||
| 1676 | platform_set_drvdata(pdev, NULL); | 1718 | platform_set_drvdata(pdev, NULL); |
| 1677 | mdiobus_unregister(miibus); | 1719 | mdiobus_unregister(miibus); |
| 1678 | kfree(miibus->irq); | 1720 | kfree(miibus->irq); |
| 1679 | mdiobus_free(miibus); | 1721 | mdiobus_free(miibus); |
| 1680 | peripheral_free_list(pin_req); | 1722 | peripheral_free_list(mii_bus_pd->mac_peripherals); |
| 1723 | |||
| 1681 | return 0; | 1724 | return 0; |
| 1682 | } | 1725 | } |
| 1683 | 1726 | ||
diff --git a/drivers/net/bfin_mac.h b/drivers/net/bfin_mac.h index 04e4050df18b..aed68bed2365 100644 --- a/drivers/net/bfin_mac.h +++ b/drivers/net/bfin_mac.h | |||
| @@ -14,6 +14,8 @@ | |||
| 14 | #include <linux/clocksource.h> | 14 | #include <linux/clocksource.h> |
| 15 | #include <linux/timecompare.h> | 15 | #include <linux/timecompare.h> |
| 16 | #include <linux/timer.h> | 16 | #include <linux/timer.h> |
| 17 | #include <linux/etherdevice.h> | ||
| 18 | #include <linux/bfin_mac.h> | ||
| 17 | 19 | ||
| 18 | #define BFIN_MAC_CSUM_OFFLOAD | 20 | #define BFIN_MAC_CSUM_OFFLOAD |
| 19 | 21 | ||
diff --git a/include/linux/bfin_mac.h b/include/linux/bfin_mac.h new file mode 100644 index 000000000000..904dec7d03a1 --- /dev/null +++ b/include/linux/bfin_mac.h | |||
| @@ -0,0 +1,29 @@ | |||
| 1 | /* | ||
| 2 | * Blackfin On-Chip MAC Driver | ||
| 3 | * | ||
| 4 | * Copyright 2004-2010 Analog Devices Inc. | ||
| 5 | * | ||
| 6 | * Enter bugs at http://blackfin.uclinux.org/ | ||
| 7 | * | ||
| 8 | * Licensed under the GPL-2 or later. | ||
| 9 | */ | ||
| 10 | |||
| 11 | #ifndef _LINUX_BFIN_MAC_H_ | ||
| 12 | #define _LINUX_BFIN_MAC_H_ | ||
| 13 | |||
| 14 | #include <linux/phy.h> | ||
| 15 | |||
| 16 | struct bfin_phydev_platform_data { | ||
| 17 | unsigned short addr; | ||
| 18 | int irq; | ||
| 19 | }; | ||
| 20 | |||
| 21 | struct bfin_mii_bus_platform_data { | ||
| 22 | int phydev_number; | ||
| 23 | struct bfin_phydev_platform_data *phydev_data; | ||
| 24 | const unsigned short *mac_peripherals; | ||
| 25 | int phy_mode; | ||
| 26 | unsigned int phy_mask; | ||
| 27 | }; | ||
| 28 | |||
| 29 | #endif | ||
