speedtch minidrivers.h, NONE, 1.1 speedtch2.c, 1.4, 1.5 speedtch2.h, 1.3, 1.4 usbatm2.c, 1.4, 1.5

Duncan Sands duncan at infradead.org
Fri Jan 21 09:49:33 EST 2005


Update of /home/cvs/speedtch
In directory phoenix.infradead.org:/tmp/cvs-serv21621

Modified Files:
	speedtch2.c speedtch2.h usbatm2.c 
Added Files:
	minidrivers.h 
Log Message:
The core is looking good.  The drivers themselves are rather ill...


--- NEW FILE minidrivers.h ---
/******************************************************************************
 *  minidrivers.h - mini driver list
 *
 *  Copyright (C) 2001, Alcatel
 *  Copyright (C) 2003, Duncan Sands, SolNegro, Josep Comas
 *  Copyright (C) 2004, David Woodhouse
 *
 *  This program is free software; you can redistribute it and/or modify it
 *  under the terms of the GNU General Public License as published by the Free
 *  Software Foundation; either version 2 of the License, or (at your option)
 *  any later version.
 *
 *  This program is distributed in the hope that it will be useful, but WITHOUT
 *  ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 *  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
 *  more details.
 *
 *  You should have received a copy of the GNU General Public License along with
 *  this program; if not, write to the Free Software Foundation, Inc., 59
 *  Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 *
 ******************************************************************************/

#ifndef	_MINIDRIVER_H_
#define	_MINIDRIVER_H_

#ifdef	CONFIG_USB_CXACRU
#include "cxacru2.h"
#define HAVE_HARDWARE
#endif

#ifdef	CONFIG_USB_SPEEDTOUCH
#include "speedtch2.h"
#define HAVE_HARDWARE
#endif

#ifndef HAVE_HARDWARE
#error You need to configure some hardware for this driver
#endif

static const struct usb_device_id products [] = {
#ifdef	CONFIG_USB_CXACRU
{
	USB_DEVICE(0x0572, 0xcafe),	/* V = Conexant				P = ADSL modem (Euphrates project)	*/
	.driver_info = (unsigned long) &cxacru_driver,
},
{
	USB_DEVICE(0x0572, 0xcb00),	/* V = Conexant				P = ADSL modem (Hasbani project)	*/
	.driver_info = (unsigned long) &cxacru_driver,
},
{
	USB_DEVICE(0x0572, 0xcb01),	/* V = Conexant				P = ADSL modem				*/
	.driver_info = (unsigned long) &cxacru_driver,
},
{
	USB_DEVICE(0x0572, 0xcb06),	/* V = Conexant				P = ADSL modem				*/
	.driver_info = (unsigned long) &cxacru_driver,
},
{
	USB_DEVICE(0x08e3, 0x0100),	/* V = Olitec				P = ADSL modem version 2		*/
	.driver_info = (unsigned long) &cxacru_driver,
},
{
	USB_DEVICE(0x08e3, 0x0102),	/* V = Olitec				P = ADSL modem version 3		*/
	.driver_info = (unsigned long) &cxacru_driver,
},
{
	USB_DEVICE(0x0eb0, 0x3457),	/* V = Trust/Amigo Technology Co.	P = AMX-CA86U				*/
	.driver_info = (unsigned long) &cxacru_driver,
},
{
	USB_DEVICE(0x1803, 0x5510),	/* V = Zoom				P = 5510				*/
	.driver_info = (unsigned long) &cxacru_driver,
},
{
	USB_DEVICE(0x0675, 0x0200),	/* V = Draytek				P = Vigor 318				*/
	.driver_info = (unsigned long) &cxacru_driver,
},
{
	USB_DEVICE(0x0586, 0x330a),	/* V = Zyxel				P = 630-C1 aka OMNI ADSL USB modem	*/
	.driver_info = (unsigned long) &cxacru_driver,
},
#endif

#ifdef	CONFIG_USB_SPEEDTOUCH
{
	USB_DEVICE(0x06b9, 0x4061),
	.driver_info = (unsigned long) &speedtch_driver
},
#endif
	{}	/* END */
};

#endif	/* _MINIDRIVER_H_ */

Index: speedtch2.c
===================================================================
RCS file: /home/cvs/speedtch/speedtch2.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- speedtch2.c	21 Jan 2005 12:46:31 -0000	1.4
+++ speedtch2.c	21 Jan 2005 14:49:29 -0000	1.5
@@ -92,7 +92,7 @@
 #define hex2int(c) ( (c >= '0') && (c <= '9') ? (c - '0') : ((c & 0xf) + 9) )
 
 struct speedtch_instance_data {
-	struct usbatm_data usbatm;
+	struct usbatm_data *usbatm;
 
 	/* Status */
 	struct urb *int_urb;
@@ -121,10 +121,10 @@
 **  ATM  **
 **********/
 
-int speedtch_atm_init(struct usbatm_data *usbatm_data, struct atm_dev *atm_dev)
+int speedtch_atm_start(struct usbatm_data *usbatm, struct atm_dev *atm_dev)
 {
-	struct speedtch_instance_data *instance = usbatm_data->driver_data;
-	struct usb_device *usb_dev = usbatm_data->usb_dev;
+	struct speedtch_instance_data *instance = usbatm->driver_data;
+	struct usb_device *usb_dev = usbatm->usb_dev;
 	int i;
 	unsigned char mac_str[13];
 
@@ -145,6 +145,26 @@
 	return 0;
 }
 
+void speedtch_atm_stop(struct usbatm_data *usbatm, struct atm_dev *atm_dev)
+{
+	struct speedtch_instance_data *instance = usbatm->driver_data;
+
+	dbg("speedtch_usb_unbind entered");
+
+	if (instance->int_urb) {
+		struct urb *int_urb = instance->int_urb;
+		instance->int_urb = NULL;
+		wmb();
+		usb_unlink_urb(int_urb);
+		usb_free_urb(int_urb);
+	}
+
+	instance->int_data[0] = 1;
+	del_timer_sync(&instance->poll_timer);
+	wmb();
+	flush_scheduled_work();
+}
+
 
 /***************
 **  firmware  **
@@ -204,7 +224,7 @@
 static int speedtch_set_swbuff(struct speedtch_instance_data *instance,
 			       int state)
 {
-	struct usb_device *dev = instance->usbatm.usb_dev;
+	struct usb_device *dev = instance->usbatm->usb_dev;
 	int ret;
 
 	ret = usb_control_msg(dev, usb_sndctrlpipe(dev, 0),
@@ -222,7 +242,7 @@
 
 static void speedtch_test_sequence(struct speedtch_instance_data *instance)
 {
-	struct usb_device *dev = instance->usbatm.usb_dev;
+	struct usb_device *dev = instance->usbatm->usb_dev;
 	unsigned char buf[10];
 	int ret;
 
@@ -263,7 +283,7 @@
 
 static int speedtch_start_synchro(struct speedtch_instance_data *instance)
 {
-	struct usb_device *dev = instance->usbatm.usb_dev;
+	struct usb_device *dev = instance->usbatm->usb_dev;
 	unsigned char buf[2];
 	int ret;
 
@@ -338,7 +358,7 @@
 static int speedtch_get_status(struct speedtch_instance_data *instance,
 			       unsigned char *buf)
 {
-	struct usb_device *dev = instance->usbatm.usb_dev;
+	struct usb_device *dev = instance->usbatm->usb_dev;
 	int ret;
 
 	memset(buf, 0, TOTAL);
@@ -402,28 +422,28 @@
 
 	switch (buf[OFFSET_7]) {
 	case 0:
-		if (instance->usbatm.atm_dev->signal != ATM_PHY_SIG_LOST) {
-			instance->usbatm.atm_dev->signal = ATM_PHY_SIG_LOST;
+		if (instance->usbatm->atm_dev->signal != ATM_PHY_SIG_LOST) {
+			instance->usbatm->atm_dev->signal = ATM_PHY_SIG_LOST;
 			printk(KERN_NOTICE "ADSL line is down\n");
 		}
 		break;
 
 	case 0x08:
-		if (instance->usbatm.atm_dev->signal != ATM_PHY_SIG_UNKNOWN) {
-			instance->usbatm.atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
+		if (instance->usbatm->atm_dev->signal != ATM_PHY_SIG_UNKNOWN) {
+			instance->usbatm->atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
 			printk(KERN_NOTICE "ADSL line is blocked?\n");
 		}
 		break;
 
 	case 0x10:
-		if (instance->usbatm.atm_dev->signal != ATM_PHY_SIG_LOST) {
-			instance->usbatm.atm_dev->signal = ATM_PHY_SIG_LOST;
+		if (instance->usbatm->atm_dev->signal != ATM_PHY_SIG_LOST) {
+			instance->usbatm->atm_dev->signal = ATM_PHY_SIG_LOST;
 			printk(KERN_NOTICE "ADSL line is synchronising\n");
 		}
 		break;
 
 	case 0x20:
-		if (instance->usbatm.atm_dev->signal != ATM_PHY_SIG_FOUND) {
+		if (instance->usbatm->atm_dev->signal != ATM_PHY_SIG_FOUND) {
 			int down_speed = buf[OFFSET_b] | (buf[OFFSET_b + 1] << 8)
 				| (buf[OFFSET_b + 2] << 16) | (buf[OFFSET_b + 3] << 24);
 			int up_speed = buf[OFFSET_b + 4] | (buf[OFFSET_b + 5] << 8)
@@ -434,8 +454,8 @@
 				down_speed >>= 16;
 				up_speed >>= 16;
 			}
-			instance->usbatm.atm_dev->link_rate = down_speed * 1000 / 424;
-			instance->usbatm.atm_dev->signal = ATM_PHY_SIG_FOUND;
+			instance->usbatm->atm_dev->link_rate = down_speed * 1000 / 424;
+			instance->usbatm->atm_dev->signal = ATM_PHY_SIG_FOUND;
 
 			printk(KERN_NOTICE
 			       "ADSL line is up (%d Kib/s down | %d Kib/s up)\n",
@@ -444,8 +464,8 @@
 		break;
 
 	default:
-		if (instance->usbatm.atm_dev->signal != ATM_PHY_SIG_UNKNOWN) {
-			instance->usbatm.atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
+		if (instance->usbatm->atm_dev->signal != ATM_PHY_SIG_UNKNOWN) {
+			instance->usbatm->atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
 			printk(KERN_NOTICE "Unknown line state %02x\n", buf[OFFSET_7]);
 		}
 		break;
@@ -466,7 +486,7 @@
 				     const struct firmware *fw2)
 {
 	unsigned char *buffer;
-	struct usb_device *usb_dev = instance->usbatm.usb_dev;
+	struct usb_device *usb_dev = instance->usbatm->usb_dev;
 	struct usb_interface *intf;
 	int actual_length;
 	int ret;
@@ -603,29 +623,29 @@
 				  const struct firmware **fw_p)
 {
 	char buf[24];
-	const u16 bcdDevice = instance->usbatm.usb_dev->descriptor.bcdDevice;
+	const u16 bcdDevice = instance->usbatm->usb_dev->descriptor.bcdDevice;
 	const u8 major_revision = bcdDevice >> 8;
 	const u8 minor_revision = bcdDevice & 0xff;
 
 	sprintf(buf, "speedtch-%d.bin.%x.%02x", phase, major_revision, minor_revision);
 	dbg("speedtch_find_firmware: looking for %s", buf);
 
-	if (request_firmware(fw_p, buf, &instance->usbatm.usb_dev->dev)) {
+	if (request_firmware(fw_p, buf, &instance->usbatm->usb_dev->dev)) {
 		sprintf(buf, "speedtch-%d.bin.%x", phase, major_revision);
 		dbg("speedtch_find_firmware: looking for %s", buf);
 
-		if (request_firmware(fw_p, buf, &instance->usbatm.usb_dev->dev)) {
+		if (request_firmware(fw_p, buf, &instance->usbatm->usb_dev->dev)) {
 			sprintf(buf, "speedtch-%d.bin", phase);
 			dbg("speedtch_find_firmware: looking for %s", buf);
 
-			if (request_firmware(fw_p, buf, &instance->usbatm.usb_dev->dev)) {
-				dev_warn(&instance->usbatm.usb_dev->dev, "no stage %d firmware found!", phase);
+			if (request_firmware(fw_p, buf, &instance->usbatm->usb_dev->dev)) {
+				dev_warn(&instance->usbatm->usb_dev->dev, "no stage %d firmware found!", phase);
 				return -ENOENT;
 			}
 		}
 	}
 
-	dev_info(&instance->usbatm.usb_dev->dev, "found stage %d firmware %s\n", phase, buf);
+	dev_info(&instance->usbatm->usb_dev->dev, "found stage %d firmware %s\n", phase, buf);
 
 	return 0;
 }
@@ -693,6 +713,7 @@
 	if ((ret = usb_set_interface(dev, 2, 0)) < 0)
 		goto fail;
 
+	instance->usbatm = usbatm;
 	usbatm->driver_data = instance;
 
 	return 0;
@@ -702,23 +723,3 @@
 
 	return -ENOMEM;
 }
-
-void speedtch_unbind(struct usbatm_data *usbatm, struct usb_interface *intf)
-{
-	struct speedtch_instance_data *instance = usbatm->driver_data;
-
-	dbg("speedtch_usb_unbind entered");
-
-	if (instance->int_urb) {
-		struct urb *int_urb = instance->int_urb;
-		instance->int_urb = NULL;
-		wmb();
-		usb_unlink_urb(int_urb);
-		usb_free_urb(int_urb);
-	}
-
-	instance->int_data[0] = 1;
-	del_timer_sync(&instance->poll_timer);
-	wmb();
-	flush_scheduled_work();
-}

Index: speedtch2.h
===================================================================
RCS file: /home/cvs/speedtch/speedtch2.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- speedtch2.h	21 Jan 2005 12:46:31 -0000	1.3
+++ speedtch2.h	21 Jan 2005 14:49:29 -0000	1.4
@@ -28,17 +28,20 @@
 #include "usbatm.h"
 
 int speedtch_bind(struct usbatm_data *usbatm, struct usb_interface *intf);
-void speedtch_unbind(struct usbatm_data *usbatm, struct usb_interface *intf);
 int speedtch_load_firmware(struct usbatm_data *usbatm, struct usb_interface *intf);
-int speedtch_atm_init(struct usbatm_data *usbatm_data, struct atm_dev *atm_dev);
+int speedtch_atm_start(struct usbatm_data *usbatm_data, struct atm_dev *atm_dev);
+void speedtch_atm_stop(struct usbatm_data *usbatm_data, struct atm_dev *atm_dev);
 
 static const struct usbatm_driver speedtch_driver = {
 	.driver_name	= "speedtch",
 	.bind		= speedtch_bind,
-	.unbind		= speedtch_unbind,
 #ifdef	CONFIG_FW_LOADER
 	.heavy_init	= speedtch_load_firmware,
 #endif
+
+	.atm_start	= speedtch_atm_start,
+	.atm_stop	= speedtch_atm_stop,
+
 	.in = 7, .out = 7
 };
 

Index: usbatm2.c
===================================================================
RCS file: /home/cvs/speedtch/usbatm2.c,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- usbatm2.c	21 Jan 2005 12:46:31 -0000	1.4
+++ usbatm2.c	21 Jan 2005 14:49:29 -0000	1.5
@@ -22,7 +22,7 @@
  ******************************************************************************/
 
 /*
- *  Written by Johan Verrept, maintained by Duncan Sands (duncan.sands at free.fr)
+ *  Written by Johan Verrept, Duncan Sands (duncan.sands at free.fr) and David Woodhouse
  *
  *  1.7+:	- See the check-in logs
  *
@@ -97,7 +97,7 @@
 #endif
 
 #define DRIVER_AUTHOR	"Johan Verrept, Duncan Sands <duncan.sands at free.fr>"
-#define DRIVER_VERSION	"1.8"
+#define DRIVER_VERSION	"1.9"
 #define DRIVER_DESC	"Generic USB ATM/DSL I/O, version " DRIVER_VERSION
 
 static const char driver_name[] = "usbatm";
@@ -744,14 +744,14 @@
 	return err;
 }
 
+
 /********************
 **  bean counting  **
 ********************/
 
 static void udsl_destroy_instance(struct kref *kref)
 {
-	struct usbatm_data *instance =
-	    container_of(kref, struct usbatm_data, refcount);
+	struct usbatm_data *instance = container_of(kref, struct usbatm_data, refcount);
 
 	tasklet_kill(&instance->receive_tasklet);
 	tasklet_kill(&instance->send_tasklet);
@@ -769,6 +769,7 @@
 	kref_put(&instance->refcount, udsl_destroy_instance);
 }
 
+
 /**********
 **  ATM  **
 **********/
@@ -778,7 +779,7 @@
 	struct usbatm_data *instance = dev->dev_data;
 
 	dev->dev_data = NULL;
-	udsl_put_instance(instance);
+	udsl_put_instance(instance);	/* taken in usbatm_atm_init */
 }
 
 static int udsl_atm_proc_read(struct atm_dev *atm_dev, loff_t * pos, char *page)
@@ -822,16 +823,10 @@
 			break;
 		}
 
-		if (instance->usb_dev->state == USB_STATE_NOTATTACHED)
+		if (instance->bound)
+			strcat(page, ", ready\n");
+		else
 			strcat(page, ", disconnected\n");
-		else {
-			if (instance->status == UDSL_LOADED_FIRMWARE)
-				strcat(page, ", firmware loaded\n");
-			else if (instance->status == UDSL_LOADING_FIRMWARE)
-				strcat(page, ", firmware loading\n");
-			else
-				strcat(page, ", no firmware\n");
-		}
 
 		return strlen(page);
 	}
@@ -846,7 +841,6 @@
 	unsigned int max_pdu;
 	int vci = vcc->vci;
 	short vpi = vcc->vpi;
-	int err;
 
 	dbg("udsl_atm_open: vpi %hd, vci %d", vpi, vci);
 
@@ -862,12 +856,6 @@
 		return -EINVAL;
 	}
 
-	if (instance->firmware_wait &&
-	    (err = instance->firmware_wait(instance)) < 0) {
-		dbg("udsl_atm_open: firmware not loaded (%d)!", err);
-		return err;
-	}
-
 	down(&instance->serialize);	/* vs self, udsl_atm_close */
 
 	if (udsl_find_vcc(instance, vpi, vci)) {
@@ -971,37 +959,52 @@
 	struct atm_dev *atm_dev;
 	int ret;
 
+	down(&instance->serialize);
+
+	if (!instance->bound) {
+		dbg("usbatm_atm_init: device disconnected!");
+		ret = -ENODEV;
+		goto fail;
+	}
+
 	/* ATM init */
 	atm_dev = atm_dev_register(instance->driver->driver_name, &udsl_atm_devops, -1, NULL);
 	if (!atm_dev) {
 		dbg("usbatm_atm_init: failed to register ATM device!");
-		return -1;
+		ret = -1;
+		goto fail;
 	}
 
-	instance->atm_dev->ci_range.vpi_bits = ATM_CI_MAX;
-	instance->atm_dev->ci_range.vci_bits = ATM_CI_MAX;
-	instance->atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
+	udsl_get_instance(instance);	/* dropped in udsl_atm_dev_close */
+
+	atm_dev->ci_range.vpi_bits = ATM_CI_MAX;
+	atm_dev->ci_range.vci_bits = ATM_CI_MAX;
+	atm_dev->signal = ATM_PHY_SIG_UNKNOWN;
 
 	/* temp init ATM device, set to 128kbit */
-	instance->atm_dev->link_rate = 128 * 1000 / 424;
+	atm_dev->link_rate = 128 * 1000 / 424;
 
-	instance->atm_dev = atm_dev;
+	atm_dev = atm_dev;
 
-	if (instance->driver->atm_init && ((ret = instance->driver->atm_init(instance, atm_dev)) < 0))
-		goto fail_free;
+	if (instance->driver->atm_start && ((ret = instance->driver->atm_start(instance, atm_dev)) < 0))
+		goto fail_close;
 
-	udsl_get_instance(instance);	/* one for ATM */
+	instance->atm_dev = atm_dev;
 
 	/* ready for ATM callbacks */
 	wmb();
-	instance->atm_dev->dev_data = instance;
+	atm_dev->dev_data = instance;
+
+	up(&instance->serialize);
 
 	return 0;
 
- fail_free:
-	shutdown_atm_dev(atm_dev); //QQ is this the right thing to use?
-	kfree(atm_dev); //QQ should we be doing this?
-	instance->atm_dev = NULL; //QQ likewise
+ fail_close:
+	shutdown_atm_dev(atm_dev); /* udsl_atm_dev_close will eventually be called */
+
+ fail:
+	up(&instance->serialize);
+
 	return ret;
 }
 
@@ -1023,7 +1026,7 @@
 		ret = usbatm_atm_init(instance);
 
 	module_put(THIS_MODULE);
-	udsl_put_instance(instance);
+	udsl_put_instance(instance);	/* taken in usbatm_heavy_init */
 
 	return ret;
 }
@@ -1032,7 +1035,7 @@
 {
 	int ret;
 
-	udsl_get_instance(instance);
+	udsl_get_instance(instance);	/* dropped below or in usbatm_do_heavy_init */
 	try_module_get(THIS_MODULE);
 
 	ret = kernel_thread(usbatm_do_heavy_init, instance, CLONE_FS | CLONE_FILES);
@@ -1043,7 +1046,7 @@
 	dbg("usbatm_heavy_init: kernel_thread failed (%d)!", ret);
 
 	module_put(THIS_MODULE);
-	udsl_put_instance(instance);
+	udsl_put_instance(instance);	/* taken above */
 
 	return ret;
 }
@@ -1088,9 +1091,6 @@
 
 	INIT_LIST_HEAD(&instance->vcc_list);
 
-	instance->status = UDSL_NO_FIRMWARE;
-	init_waitqueue_head(&instance->firmware_waiters);
-
 	spin_lock_init(&instance->receive_lock);
 	INIT_LIST_HEAD(&instance->spare_receivers);
 	INIT_LIST_HEAD(&instance->filled_receive_buffers);
@@ -1189,17 +1189,18 @@
 	if (driver->bind && (error = driver->bind(instance, intf)) < 0)
 			goto fail;
 
-	usb_get_dev(dev);
+	instance->bound = 1;
 
 	if (driver->heavy_init)
 		error = usbatm_heavy_init(instance);
 	else
 		error = usbatm_atm_init(instance);
 
-	if (!error)
+	if (!error) {
+		usb_get_dev(dev);
+		udsl_get_instance(instance);	/* dropped in usbatm_disconnect */
 		return 0;
-
-	usb_put_dev(dev);
+	}
 
  fail:
 	for (i = 0; i < num_snd_bufs; i++)
@@ -1233,6 +1234,13 @@
 
 	usb_set_intfdata(intf, NULL);
 
+	down(&instance->serialize);
+	instance->bound = 0;
+	up(&instance->serialize);
+
+	if (instance->atm_dev && instance->driver->atm_stop)
+		instance->driver->atm_stop(instance, instance->atm_dev);
+
 	if (instance->driver->unbind)
 		instance->driver->unbind(instance, intf);
 
@@ -1274,90 +1282,21 @@
 		kfree(instance->send_buffers[i].base);
 
 	/* ATM finalize */
-	shutdown_atm_dev(instance->atm_dev); //QQ what if never initialized?
+	if (instance->atm_dev)
+		shutdown_atm_dev(instance->atm_dev);
 
-	udsl_put_instance(instance);
+	udsl_put_instance(instance);	/* taken in usbatm_usb_probe */
 }
 
 
-/*******************
-**  mini drivers  **
-*******************/
-
-#ifdef	CONFIG_USB_CXACRU
-#include "cxacru2.h"
-#define HAVE_HARDWARE
-#endif
-
-#ifdef	CONFIG_USB_SPEEDTOUCH
-#include "speedtch2.h"
-#define HAVE_HARDWARE
-#endif
-
-#ifndef HAVE_HARDWARE
-#error You need to configure some hardware for this driver
-#endif
-
-static const struct usb_device_id products [] = {
-#ifdef	CONFIG_USB_CXACRU
-{
-	USB_DEVICE(0x0572, 0xcafe),	/* V = Conexant				P = ADSL modem (Euphrates project)	*/
-	.driver_info = (unsigned long) &cxacru_driver,
-},
-{
-	USB_DEVICE(0x0572, 0xcb00),	/* V = Conexant				P = ADSL modem (Hasbani project)	*/
-	.driver_info = (unsigned long) &cxacru_driver,
-},
-{
-	USB_DEVICE(0x0572, 0xcb01),	/* V = Conexant				P = ADSL modem				*/
-	.driver_info = (unsigned long) &cxacru_driver,
-},
-{
-	USB_DEVICE(0x0572, 0xcb06),	/* V = Conexant				P = ADSL modem				*/
-	.driver_info = (unsigned long) &cxacru_driver,
-},
-{
-	USB_DEVICE(0x08e3, 0x0100),	/* V = Olitec				P = ADSL modem version 2		*/
-	.driver_info = (unsigned long) &cxacru_driver,
-},
-{
-	USB_DEVICE(0x08e3, 0x0102),	/* V = Olitec				P = ADSL modem version 3		*/
-	.driver_info = (unsigned long) &cxacru_driver,
-},
-{
-	USB_DEVICE(0x0eb0, 0x3457),	/* V = Trust/Amigo Technology Co.	P = AMX-CA86U				*/
-	.driver_info = (unsigned long) &cxacru_driver,
-},
-{
-	USB_DEVICE(0x1803, 0x5510),	/* V = Zoom				P = 5510				*/
-	.driver_info = (unsigned long) &cxacru_driver,
-},
-{
-	USB_DEVICE(0x0675, 0x0200),	/* V = Draytek				P = Vigor 318				*/
-	.driver_info = (unsigned long) &cxacru_driver,
-},
-{
-	USB_DEVICE(0x0586, 0x330a),	/* V = Zyxel				P = 630-C1 aka OMNI ADSL USB modem	*/
-	.driver_info = (unsigned long) &cxacru_driver,
-},
-#endif
-
-#ifdef	CONFIG_USB_SPEEDTOUCH
-{
-	USB_DEVICE(0x06b9, 0x4061),
-	.driver_info = (unsigned long) &speedtch_driver
-},
-#endif
-	{}	/* END */
-};
-
-MODULE_DEVICE_TABLE (usb, products);
-
-
 /***********
 **  init  **
 ***********/
 
+#include "minidrivers.h"
+
+MODULE_DEVICE_TABLE (usb, products);
+
 static struct usb_driver usbatm_driver = {
         .owner          = THIS_MODULE,
         .name           = driver_name,




More information about the Usbatm-commits mailing list