Title: [9121] trunk: blackfin: emac: apply patch from Peter Meerwald <[email protected]>
Revision
9121
Author
sonicz
Date
2010-09-02 07:00:06 -0400 (Thu, 02 Sep 2010)

Log Message

blackfin: emac: apply patch from Peter Meerwald <[email protected]>
after clean up


* support for phy_mask in platform data
* enable PHYIE only when necessary
* probing of PHYs from lo->hi
* sanity check for bfin_mac without platform data
* proper initialization of miibus.irq with PHY_POLL
* range check for PHY address in platform data
* change data type of irq element in platform data to match miibus.irq

Modified Paths

Diff

Modified: trunk/drivers/net/bfin_mac.c (9120 => 9121)


--- trunk/drivers/net/bfin_mac.c	2010-09-01 04:22:45 UTC (rev 9120)
+++ trunk/drivers/net/bfin_mac.c	2010-09-02 11:00:06 UTC (rev 9121)
@@ -403,8 +403,8 @@
 	sysctl = (sysctl & ~MDCDIV) | SET_MDCDIV(mdc_div);
 	bfin_write_EMAC_SYSCTL(sysctl);
 
-	/* search for connect PHY device */
-	for (i = PHY_MAX_ADDR - 1; i >= 0; i--) {
+	/* search for connected PHY device */
+	for (i = 0; i < PHY_MAX_ADDR; ++i) {
 		struct phy_device *const tmp_phydev = lp->mii_bus->phy_map[i];
 
 		if (!tmp_phydev)
@@ -563,6 +563,8 @@
 /**************************************************************************/
 void setup_system_regs(struct net_device *dev)
 {
+	struct bfin_mac_local *lp = netdev_priv(dev);
+	int i;
 	unsigned short sysctl;
 
 	/*
@@ -570,7 +572,17 @@
 	 * Configure checksum support and rcve frame word alignment
 	 */
 	sysctl = bfin_read_EMAC_SYSCTL();
-	sysctl |= PHYIE;
+
+	/*
+	 * check if interrupt is requested for any PHY,
+	 * enable PHY interrupt only if needed
+	 */
+	for (i = 0; i < PHY_MAX_ADDR; ++i)
+		if (lp->mii_bus->irq[i] != PHY_POLL)
+			break;
+	if (i < PHY_MAX_ADDR)
+		sysctl |= PHYIE;
+
 	sysctl |= RXDWA;
 #if defined(BFIN_MAC_CSUM_OFFLOAD)
 	sysctl |= RXCKS;
@@ -1647,6 +1659,11 @@
 
 	if (mii_bus_pd)
 		pin_req = mii_bus_pd->mac_peripherals;
+	else {
+		dev_err(&pdev->dev, "No peripherals in platform data!\n");
+		return -EINVAL;
+	}
+
 	/*
 	 * We are setting up a network card,
 	 * so set the GPIO pins to Ethernet mode
@@ -1669,17 +1686,29 @@
 	miibus->name = "bfin_mii_bus";
 	snprintf(miibus->id, MII_BUS_ID_SIZE, "0");
 	miibus->irq = kmalloc(sizeof(int)*PHY_MAX_ADDR, GFP_KERNEL);
-	if (miibus->irq != NULL &&
-		mii_bus_pd && mii_bus_pd->phydev_number > 0) {
+	if (miibus->irq != NULL) {
 		for (i = 0; i < PHY_MAX_ADDR; ++i)
 			miibus->irq[i] = PHY_POLL;
 
-		if (mii_bus_pd->phydev_number >= PHY_MAX_ADDR)
-			mii_bus_pd->phydev_number = PHY_MAX_ADDR;
-
-		for (i = 0; i < mii_bus_pd->phydev_number; ++i)
-			miibus->irq[mii_bus_pd->phydev_data[i].addr] =
-				mii_bus_pd->phydev_data[i].irq;
+		if (mii_bus_pd) {
+			miibus->phy_mask = mii_bus_pd->phy_mask;
+			if (mii_bus_pd->phydev_number > 0 &&
+				mii_bus_pd->phydev_number <= PHY_MAX_ADDR) {
+				for (i = 0; i < mii_bus_pd->phydev_number; ++i) {
+					unsigned short phyaddr =
+						mii_bus_pd->phydev_data[i].addr;
+					if (phyaddr < PHY_MAX_ADDR)
+						miibus->irq[phyaddr] =
+							mii_bus_pd->phydev_data[i].irq;
+					else
+						dev_err(&pdev->dev,
+							"Invalid PHY address %i for phydev %i\n",
+							phyaddr, i);
+				}
+			} else
+				dev_err(&pdev->dev, "Invalid number (%i) of phydevs\n",
+					mii_bus_pd->phydev_number);
+		}
 	}
 
 	rc = mdiobus_register(miibus);

Modified: trunk/include/linux/bfin_mac.h (9120 => 9121)


--- trunk/include/linux/bfin_mac.h	2010-09-01 04:22:45 UTC (rev 9120)
+++ trunk/include/linux/bfin_mac.h	2010-09-02 11:00:06 UTC (rev 9121)
@@ -14,7 +14,7 @@
 
 struct bfin_phydev_platform_data {
 	unsigned short addr;
-	unsigned short irq;
+	int irq;
 };
 
 struct bfin_mii_bus_platform_data {
@@ -22,6 +22,7 @@
 	struct bfin_phydev_platform_data *phydev_data;
 	const unsigned short *mac_peripherals;
 	int phy_mode;
+	unsigned int phy_mask;
 };
 
 #endif
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to