diff --git a/drivers/net/usb/hso.c b/drivers/net/usb/hso.c
index 387ca43..35221b3 100644
--- a/drivers/net/usb/hso.c
+++ b/drivers/net/usb/hso.c
@@ -72,7 +72,9 @@
 #include <linux/serial_core.h>
 #include <linux/serial.h>
 
-
+#ifndef MOD_PACKAGE_VERSION
+#define MOD_PACKAGE_VERSION		"1.8.0"
+#endif
 #define MOD_AUTHOR			"Option Wireless"
 #define MOD_DESCRIPTION			"USB High Speed Option driver"
 #define MOD_LICENSE			"GPL"
@@ -295,6 +297,10 @@ struct hso_device {
 	struct mutex mutex;
 };
 
+/* Device type */
+#define HSO_DEV_STATIC  	1
+#define HSO_DEV_DYNAMIC 	2
+
 /* Type of interface */
 #define HSO_INTF_MASK		0xFF00
 #define	HSO_INTF_MUX		0x0100
@@ -315,6 +321,7 @@ struct hso_device {
 #define	HSO_PORT_DIAG		0x10
 #define	HSO_PORT_MODEM		0x11
 #define	HSO_PORT_NETWORK	0x12
+#define HSO_PORT_LOADER		0x13
 
 /* Additional device info */
 #define HSO_INFO_MASK		0xFF000000
@@ -409,11 +416,23 @@ static struct hso_device *serial_table[HSO_SERIAL_TTY_MINORS];
 static struct hso_device *network_table[HSO_MAX_NET_DEVICES];
 static spinlock_t serial_table_lock;
 
+struct hso_dev_config {
+	u8 dev_type;
+	s16 num_entries;
+	const s32 *entries;
+};
+
+
 static const s32 default_port_spec[] = {
 	HSO_INTF_MUX | HSO_PORT_NETWORK,
 	HSO_INTF_BULK | HSO_PORT_DIAG,
-	HSO_INTF_BULK | HSO_PORT_MODEM,
-	0
+	HSO_INTF_BULK | HSO_PORT_MODEM
+};
+
+static const struct hso_dev_config default_config = {
+	HSO_DEV_STATIC,
+	sizeof(default_port_spec)/sizeof(default_port_spec[0]),
+	default_port_spec
 };
 
 static const s32 icon321_port_spec[] = {
@@ -421,16 +440,67 @@ static const s32 icon321_port_spec[] = {
 	HSO_INTF_BULK | HSO_PORT_DIAG2,
 	HSO_INTF_BULK | HSO_PORT_MODEM,
 	HSO_INTF_BULK | HSO_PORT_DIAG,
-	0
+};
+
+static const struct hso_dev_config icon321_config = {
+	HSO_DEV_STATIC,
+	sizeof(icon321_port_spec)/sizeof(icon321_port_spec[0]),
+	icon321_port_spec
+};
+
+static const s32 gi65x_1_port_spec[] = {
+	0,
+	0,
+	0,
+	HSO_INTF_BULK | HSO_PORT_MODEM,
+	HSO_INTF_BULK | HSO_PORT_APP,
+	HSO_INTF_BULK | HSO_PORT_DIAG,
+};
+
+static const struct hso_dev_config gi65x_1_config = {
+	HSO_DEV_STATIC,
+	sizeof(gi65x_1_port_spec)/sizeof(gi65x_1_port_spec[0]),
+	gi65x_1_port_spec
+};
+
+static const s32 gi65x_2_port_spec[] = {
+	0,
+	0,
+	0,
+	0,
+	HSO_INTF_BULK | HSO_PORT_MODEM,
+	HSO_INTF_BULK | HSO_PORT_APP,
+	HSO_INTF_BULK | HSO_PORT_DIAG,
+};
+
+
+static const struct hso_dev_config gi65x_2_config = {
+	HSO_DEV_STATIC,
+	sizeof(gi65x_2_port_spec)/sizeof(gi65x_2_port_spec[0]),
+	gi65x_2_port_spec
+};
+
+static const struct hso_dev_config dynamic_config = {
+	HSO_DEV_DYNAMIC,
+	0,
+	NULL
 };
 
 #define default_port_device(vendor, product)	\
 	USB_DEVICE(vendor, product),	\
-		.driver_info = (kernel_ulong_t)default_port_spec
+		.driver_info = (kernel_ulong_t)&default_config
 
 #define icon321_port_device(vendor, product)	\
 	USB_DEVICE(vendor, product),	\
-		.driver_info = (kernel_ulong_t)icon321_port_spec
+		.driver_info = (kernel_ulong_t)&icon321_config
+
+#define dynamic_port_device(vendor, product)	\
+	USB_DEVICE(vendor, product),	\
+		.driver_info = (kernel_ulong_t)&dynamic_config
+
+#define gi65x_port_device(vendor, product, subtype) \
+	USB_DEVICE(vendor, product),	\
+		.driver_info = (kernel_ulong_t)&gi65x_ ##subtype##_config
 
 /* list of devices we support */
 static const struct usb_device_id hso_ids[] = {
@@ -456,38 +526,45 @@ static const struct usb_device_id hso_ids[] = {
 	{icon321_port_device(0x0af0, 0xd013)},	/* Module HSxPA */
 	{icon321_port_device(0x0af0, 0xd031)},	/* Icon-321 */
 	{icon321_port_device(0x0af0, 0xd033)},	/* Icon-322 */
-	{USB_DEVICE(0x0af0, 0x7301)},		/* GE40x */
-	{USB_DEVICE(0x0af0, 0x7361)},		/* GE40x */
-	{USB_DEVICE(0x0af0, 0x7381)},		/* GE40x */
-	{USB_DEVICE(0x0af0, 0x7401)},		/* GI 0401 */
-	{USB_DEVICE(0x0af0, 0x7501)},		/* GTM 382 */
-	{USB_DEVICE(0x0af0, 0x7601)},		/* GE40x */
-	{USB_DEVICE(0x0af0, 0x7701)},
-	{USB_DEVICE(0x0af0, 0x7706)},
-	{USB_DEVICE(0x0af0, 0x7801)},
-	{USB_DEVICE(0x0af0, 0x7901)},
-	{USB_DEVICE(0x0af0, 0x7A01)},
-	{USB_DEVICE(0x0af0, 0x7A05)},
-	{USB_DEVICE(0x0af0, 0x8200)},
-	{USB_DEVICE(0x0af0, 0x8201)},
-	{USB_DEVICE(0x0af0, 0x8300)},
-	{USB_DEVICE(0x0af0, 0x8302)},
-	{USB_DEVICE(0x0af0, 0x8304)},
-	{USB_DEVICE(0x0af0, 0x8400)},
-	{USB_DEVICE(0x0af0, 0x8600)},
-	{USB_DEVICE(0x0af0, 0x8800)},
-	{USB_DEVICE(0x0af0, 0x8900)},
-	{USB_DEVICE(0x0af0, 0x9000)},
-	{USB_DEVICE(0x0af0, 0xd035)},
-	{USB_DEVICE(0x0af0, 0xd055)},
-	{USB_DEVICE(0x0af0, 0xd155)},
-	{USB_DEVICE(0x0af0, 0xd255)},
-	{USB_DEVICE(0x0af0, 0xd057)},
-	{USB_DEVICE(0x0af0, 0xd157)},
-	{USB_DEVICE(0x0af0, 0xd257)},
-	{USB_DEVICE(0x0af0, 0xd357)},
-	{USB_DEVICE(0x0af0, 0xd058)},
-	{USB_DEVICE(0x0af0, 0xc100)},
+	{dynamic_port_device(0x0af0, 0x7301)},          /* GE40x */
+	{dynamic_port_device(0x0af0, 0x7361)},          /* GE40x */
+	{dynamic_port_device(0x0af0, 0x7381)},          /* GE40x */
+	{dynamic_port_device(0x0af0, 0x7401)},          /* GI 0401 */
+	{dynamic_port_device(0x0af0, 0x7501)},          /* GTM 382 */
+	{dynamic_port_device(0x0af0, 0x7601)},          /* GE40x */
+	{dynamic_port_device(0x0af0, 0x7701)},
+	{dynamic_port_device(0x0af0, 0x7706)},
+	{dynamic_port_device(0x0af0, 0x7801)},
+	{dynamic_port_device(0x0af0, 0x7901)},
+	{dynamic_port_device(0x0af0, 0x7A01)},
+	{dynamic_port_device(0x0af0, 0x7A05)},
+	{dynamic_port_device(0x0af0, 0x8006)},
+	{dynamic_port_device(0x0af0, 0x8200)},
+	{dynamic_port_device(0x0af0, 0x8201)},
+	{dynamic_port_device(0x0af0, 0x8300)},
+	{dynamic_port_device(0x0af0, 0x8302)},
+	{dynamic_port_device(0x0af0, 0x8304)},
+	{dynamic_port_device(0x0af0, 0x8400)},
+	{dynamic_port_device(0x0af0, 0x8600)},
+	{dynamic_port_device(0x0af0, 0x8701)},
+	{dynamic_port_device(0x0af0, 0x8800)},
+	{dynamic_port_device(0x0af0, 0x8900)},
+	{dynamic_port_device(0x0af0, 0x9000)},
+	{dynamic_port_device(0x0af0, 0x9100)},
+	{dynamic_port_device(0x0af0, 0x9200)},
+	{dynamic_port_device(0x0af0, 0x9300)},
+	{dynamic_port_device(0x0af0, 0xd035)},
+	{dynamic_port_device(0x0af0, 0xd055)},
+	{dynamic_port_device(0x0af0, 0xd155)},
+	{dynamic_port_device(0x0af0, 0xd255)},
+	{dynamic_port_device(0x0af0, 0xd057)},
+	{dynamic_port_device(0x0af0, 0xd157)},
+	{dynamic_port_device(0x0af0, 0xd257)},
+	{dynamic_port_device(0x0af0, 0xd357)},
+	{dynamic_port_device(0x0af0, 0xd058)},
+	{dynamic_port_device(0x0af0, 0xc100)},
+	{gi65x_port_device(0x0d46, 0x45a9, 1)},
+	{gi65x_port_device(0x0d46, 0x45ad, 2)},
 	{}
 };
 MODULE_DEVICE_TABLE(usb, hso_ids);
@@ -534,6 +611,9 @@ static ssize_t hso_sysfs_show_porttype(struct device *dev,
 	case HSO_PORT_NETWORK:
 		port_name = "Network";
 		break;
+	case HSO_PORT_LOADER:
+		port_name = "Loader";
+		break;
 	default:
 		port_name = "Unknown";
 		break;
@@ -2122,6 +2202,9 @@ static void hso_log_port(struct hso_device *hso_dev)
 	case HSO_PORT_NETWORK:
 		port_type = "Network";
 		break;
+	case HSO_PORT_LOADER:
+		port_type = "Loader";
+		break;
 	default:
 		port_type = "Unknown";
 		break;
@@ -2903,6 +2986,9 @@ static int hso_get_config_data(struct usb_interface *interface)
 	case 0xb:
 		result = HSO_PORT_VOICE;
 		break;
+	case 0xc:
+		result = HSO_PORT_LOADER;
+		break;
 	default:
 		result = 0;
 	}
@@ -2920,23 +3006,35 @@ static int hso_get_config_data(struct usb_interface *interface)
 static int hso_probe(struct usb_interface *interface,
 		     const struct usb_device_id *id)
 {
-	int mux, i, if_num, port_spec;
+	int mux, i, if_num, port_spec=0;
 	unsigned char port_mask;
 	struct hso_device *hso_dev = NULL;
 	struct hso_shared_int *shared_int;
 	struct hso_device *tmp_dev = NULL;
+	const struct hso_dev_config *cnf;
 
 	if_num = interface->altsetting->desc.bInterfaceNumber;
 
-	/* Get the interface/port specification from either driver_info or from
-	 * the device itself */
-	if (id->driver_info)
-		port_spec = ((u32 *)(id->driver_info))[if_num];
-	else
-		port_spec = hso_get_config_data(interface);
+	/* Get the device configuration from driver_info */
+	if(likely(id->driver_info)) {
+		cnf = (struct hso_dev_config *)id->driver_info;
+		switch(cnf->dev_type) {
+		case HSO_DEV_STATIC:
+			if(if_num <= cnf->num_entries)
+				port_spec = (s32)cnf->entries[if_num];
+		break;
+		case HSO_DEV_DYNAMIC:
+			port_spec = hso_get_config_data(interface);
+		break;
+		default:
+			return -ENODEV;
+		break;
+		}
+	} else
+		return -ENODEV;
 
 	if (interface->cur_altsetting->desc.bInterfaceClass != 0xFF) {
-		dev_err(&interface->dev, "Not our interface\n");
+		dev_info(&interface->dev, "Not our interface\n");
 		return -ENODEV;
 	}
 	/* Check if we need to switch to alt interfaces prior to port
@@ -3367,6 +3465,7 @@ module_exit(hso_exit);
 MODULE_AUTHOR(MOD_AUTHOR);
 MODULE_DESCRIPTION(MOD_DESCRIPTION);
 MODULE_LICENSE(MOD_LICENSE);
+MODULE_INFO(PackageVersion, MOD_PACKAGE_VERSION);
 
 /* change the debug level (eg: insmod hso.ko debug=0x04) */
 MODULE_PARM_DESC(debug, "Level of debug [0x01 | 0x02 | 0x04 | 0x08 | 0x10]");
