net: usb: Add support for PID 0x9034

Embedded rmnet driver currently supports PID 0x9048.
Add support to handle multiple PIDs (i.e. 0x9034).

Change-Id: I39e1e46953c4817181fe1d76241627e530e7cd84
Signed-off-by: Hemant Kumar <hemantk@codeaurora.org>
diff --git a/drivers/net/usb/rmnet_usb_data.c b/drivers/net/usb/rmnet_usb_data.c
index fa0cd82..ffdfce1 100644
--- a/drivers/net/usb/rmnet_usb_data.c
+++ b/drivers/net/usb/rmnet_usb_data.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011, Code Aurora Forum. All rights reserved.
+/* Copyright (c) 2011-2012, Code Aurora Forum. All rights reserved.
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License version 2 and
@@ -22,9 +22,6 @@
 #define RMNET_DATA_LEN			2000
 #define HEADROOM_FOR_QOS		8
 
-#define FIRST_RMNET_USB_INTERFACE	5
-#define NUM_EMBEDDED_RMNET_IFACE	4
-
 static int	data_msg_dbg_mask;
 
 enum {
@@ -419,9 +416,10 @@
 {
 	struct usbnet		*unet;
 	struct usb_device	*udev;
-	int			iface_num;
-	int			last_rmnet_iface_num;
-	int			status = -ENODEV;
+	struct driver_info	*info;
+	unsigned int		iface_num;
+	static int		first_rmnet_iface_num = -EINVAL;
+	int			status = 0;
 
 	udev = interface_to_usbdev(iface);
 	iface_num = iface->cur_altsetting->desc.bInterfaceNumber;
@@ -432,38 +430,37 @@
 		goto out;
 	}
 
-	last_rmnet_iface_num = (FIRST_RMNET_USB_INTERFACE +
-		 NUM_EMBEDDED_RMNET_IFACE - 1);
+	info = (struct driver_info *)prod->driver_info;
+	if (!test_bit(iface_num, &info->data))
+		return -ENODEV;
 
-	if (iface_num >= FIRST_RMNET_USB_INTERFACE &&
-		iface_num <= last_rmnet_iface_num) {
-		status = usbnet_probe(iface, prod);
-		if (status < 0) {
-			dev_err(&udev->dev, "usbnet_probe failed %d\n",
-				status);
-			goto out;
-		}
-		unet = usb_get_intfdata(iface);
-
-		/*set rmnet operation mode to eth by default*/
-		set_bit(RMNET_MODE_LLP_ETH, &unet->data[0]);
-
-		/*update net device*/
-		rmnet_usb_setup(unet->net);
-
-		/*create /sys/class/net/rmnet_usbx/dbg_mask*/
-		status = device_create_file(&unet->net->dev,
-				&dev_attr_dbg_mask);
-		if (status)
-			goto out;
-
-		/*save control device intstance */
-		unet->data[1] = (unsigned long)ctrl_dev	\
-		[iface_num - FIRST_RMNET_USB_INTERFACE];
-
-		status = rmnet_usb_ctrl_probe(iface, unet->status,
-			(struct rmnet_ctrl_dev *)unet->data[1]);
+	status = usbnet_probe(iface, prod);
+	if (status < 0) {
+		dev_err(&udev->dev, "usbnet_probe failed %d\n", status);
+		goto out;
 	}
+	unet = usb_get_intfdata(iface);
+
+	/*set rmnet operation mode to eth by default*/
+	set_bit(RMNET_MODE_LLP_ETH, &unet->data[0]);
+
+	/*update net device*/
+	rmnet_usb_setup(unet->net);
+
+	/*create /sys/class/net/rmnet_usbx/dbg_mask*/
+	status = device_create_file(&unet->net->dev, &dev_attr_dbg_mask);
+	if (status)
+		goto out;
+
+	if (first_rmnet_iface_num == -EINVAL)
+		first_rmnet_iface_num = iface_num;
+
+	/*save control device intstance */
+	unet->data[1] = (unsigned long)ctrl_dev	\
+			[iface_num - first_rmnet_iface_num];
+
+	status = rmnet_usb_ctrl_probe(iface, unet->status,
+		(struct rmnet_ctrl_dev *)unet->data[1]);
 out:
 	return status;
 }
@@ -473,51 +470,58 @@
 	struct usbnet		*unet;
 	struct usb_device	*udev;
 	struct rmnet_ctrl_dev	*dev;
-	int			iface_num;
-	int			last_rmnet_iface_num;
 
 	udev = interface_to_usbdev(intf);
-	iface_num = intf->cur_altsetting->desc.bInterfaceNumber;
 
-	last_rmnet_iface_num = (FIRST_RMNET_USB_INTERFACE +
-			 NUM_EMBEDDED_RMNET_IFACE - 1);
-
-	if (iface_num >= FIRST_RMNET_USB_INTERFACE &&
-		iface_num <= last_rmnet_iface_num) {
-		unet = usb_get_intfdata(intf);
-		if (!unet) {
-			dev_err(&udev->dev, "%s:data device not found\n",
-					__func__);
-			return;
-		}
-		dev = (struct rmnet_ctrl_dev *)unet->data[1];
-		if (!dev) {
-			dev_err(&udev->dev, "%s:ctrl device not found\n",
-					__func__);
-			return;
-		}
-		unet->data[0] = 0;
-		unet->data[1] = 0;
-		rmnet_usb_ctrl_disconnect(dev);
-		device_remove_file(&unet->net->dev, &dev_attr_dbg_mask);
-		usbnet_disconnect(intf);
+	unet = usb_get_intfdata(intf);
+	if (!unet) {
+		dev_err(&udev->dev, "%s:data device not found\n", __func__);
+		return;
 	}
+
+	dev = (struct rmnet_ctrl_dev *)unet->data[1];
+	if (!dev) {
+		dev_err(&udev->dev, "%s:ctrl device not found\n", __func__);
+		return;
+	}
+	unet->data[0] = 0;
+	unet->data[1] = 0;
+	rmnet_usb_ctrl_disconnect(dev);
+	device_remove_file(&unet->net->dev, &dev_attr_dbg_mask);
+	usbnet_disconnect(intf);
 }
 
-static const struct driver_info rmnet_info = {
+/*bit position represents interface number*/
+#define PID9034_IFACE_MASK	0xF0
+#define PID9048_IFACE_MASK	0x1E0
+
+static const struct driver_info rmnet_info_pid9034 = {
 	.description   = "RmNET net device",
 	.bind          = rmnet_usb_bind,
 	.tx_fixup      = rmnet_usb_tx_fixup,
 	.rx_fixup      = rmnet_usb_rx_fixup,
-	.data          = 0,
+	.data          = PID9034_IFACE_MASK,
+};
+
+static const struct driver_info rmnet_info_pid9048 = {
+	.description   = "RmNET net device",
+	.bind          = rmnet_usb_bind,
+	.tx_fixup      = rmnet_usb_tx_fixup,
+	.rx_fixup      = rmnet_usb_rx_fixup,
+	.data          = PID9048_IFACE_MASK,
 };
 
 static const struct usb_device_id vidpids[] = {
 	{
-		USB_DEVICE(0x05c6, 0x9048),	/* MDM9x15*/
-		.driver_info = (unsigned long)&rmnet_info,
+		USB_DEVICE(0x05c6, 0x9034), /* MDM9x15*/
+		.driver_info = (unsigned long)&rmnet_info_pid9034,
 	},
-	{ },
+	{
+		USB_DEVICE(0x05c6, 0x9048), /* MDM9x15*/
+		.driver_info = (unsigned long)&rmnet_info_pid9048,
+	},
+
+	{ }, /* Terminating entry */
 };
 
 MODULE_DEVICE_TABLE(usb, vidpids);