Add some ioctl impl to LAN interface

QCA953x LAN is actually switch port and IOCTL cmds are not working.
Add compatible support for some ioctl cmd for LAN so that diags
tool can use it to access PHY registers.

Change-Id: Ie927fa30dfbf69eef039e1ebbf9672ba98f33c28
diff --git a/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c b/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
index a657a3d..0bb0db4 100755
--- a/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
+++ b/drivers/net/ethernet/atheros/ag71xx/ag71xx_main.c
@@ -809,6 +809,36 @@
 	return NETDEV_TX_OK;
 }
 
+static int ag71xx_do_ioctl_switchport(struct net_device *dev, struct ifreq *ifr,
+				      int cmd)
+{
+	struct ag71xx *ag = netdev_priv(dev);
+	struct net_device *netdev = ag->dev;
+	struct mii_ioctl_data *mii_data = if_mii(ifr);
+
+	switch (cmd) {
+	case SIOCGMIIPHY:
+		mii_data->phy_id = netdev->dev_id;
+		/* fall through */
+
+	case SIOCGMIIREG:
+		mii_data->val_out = ag->mii_bus->read(ag->mii_bus, netdev->dev_id,
+						      mii_data->reg_num);
+		if (mii_data->val_out == 0xffff)
+			return -ENODEV;
+
+                break;
+	case SIOCSMIIREG:
+		ag->mii_bus->write(ag->mii_bus, netdev->dev_id, mii_data->reg_num,
+				   mii_data->val_in);
+                break;
+	default:
+		return -EOPNOTSUPP;
+	}
+
+	return 0;
+}
+
 static int ag71xx_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)
 {
 	struct ag71xx *ag = netdev_priv(dev);
@@ -840,9 +870,9 @@
 	case SIOCGMIIREG:
 	case SIOCSMIIREG:
 		if (ag->phy_dev == NULL)
-			break;
-
-		return phy_mii_ioctl(ag->phy_dev, ifr, cmd);
+			return ag71xx_do_ioctl_switchport(dev, ifr, cmd);
+		else
+			return phy_mii_ioctl(ag->phy_dev, ifr, cmd);
 
 	default:
 		break;