Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 5b65c09e authored by Linus Torvalds's avatar Linus Torvalds
Browse files

Merge master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6

* master.kernel.org:/pub/scm/linux/kernel/git/gregkh/usb-2.6:
  OHCI: Fix machine check in ohci_hub_status_data
  USB: Fix up bogus bInterval values in endpoint descriptors
  USB: cxacru: ignore error trying to start ADSL in atm_start
  USB: cxacru: create sysfs attributes in atm_start instead of bind
  USB: cxacru: add Documentation file
  USB: UNUSUAL_DEV: Sync up some reported devices from Ubuntu
  USB: usb gadgets avoid le{16,32}_to_cpup()
  usblp: Don't let suspend to kill ->used
  USB: set default y for CONFIG_USB_DEVICE_CLASS
parents 837525e3 6fd75b19
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -32,6 +32,8 @@ cops.txt
	- info on the COPS LocalTalk Linux driver
cs89x0.txt
	- the Crystal LAN (CS8900/20-based) Ethernet ISA adapter driver
cxacru.txt
	- Conexant AccessRunner USB ADSL Modem
de4x5.txt
	- the Digital EtherWORKS DE4?? and DE5?? PCI Ethernet driver
decnet.txt
+84 −0
Original line number Diff line number Diff line
Firmware is required for this device: http://accessrunner.sourceforge.net/

While it is capable of managing/maintaining the ADSL connection without the
module loaded, the device will sometimes stop responding after unloading the
driver and it is necessary to unplug/remove power to the device to fix this.

Detected devices will appear as ATM devices named "cxacru". In /sys/class/atm/
these are directories named cxacruN where N is the device number. A symlink
named device points to the USB interface device's directory which contains
several sysfs attribute files for retrieving device statistics:

* adsl_controller_version

* adsl_headend
* adsl_headend_environment
	Information about the remote headend.

* downstream_attenuation (dB)
* downstream_bits_per_frame
* downstream_rate (kbps)
* downstream_snr_margin (dB)
	Downstream stats.

* upstream_attenuation (dB)
* upstream_bits_per_frame
* upstream_rate (kbps)
* upstream_snr_margin (dB)
* transmitter_power (dBm/Hz)
	Upstream stats.

* downstream_crc_errors
* downstream_fec_errors
* downstream_hec_errors
* upstream_crc_errors
* upstream_fec_errors
* upstream_hec_errors
	Error counts.

* line_startable
	Indicates that ADSL support on the device
	is/can be enabled, see adsl_start.

* line_status
	"initialising"
	"down"
	"attempting to activate"
	"training"
	"channel analysis"
	"exchange"
	"waiting"
	"up"

	Changes between "down" and "attempting to activate"
	if there is no signal.

* link_status
	"not connected"
	"connected"
	"lost"

* mac_address

* modulation
	"ANSI T1.413"
	"ITU-T G.992.1 (G.DMT)"
	"ITU-T G.992.2 (G.LITE)"

* startup_attempts
	Count of total attempts to initialise ADSL.

To enable/disable ADSL, the following can be written to the adsl_state file:
	"start"
	"stop
	"restart" (stops, waits 1.5s, then starts)
	"poll" (used to resume status polling if it was disabled due to failure)

Changes in adsl/line state are reported via kernel log messages:
	[4942145.150704] ATM dev 0: ADSL state: running
	[4942243.663766] ATM dev 0: ADSL line: down
	[4942249.665075] ATM dev 0: ADSL line: attempting to activate
	[4942253.654954] ATM dev 0: ADSL line: training
	[4942255.666387] ATM dev 0: ADSL line: channel analysis
	[4942259.656262] ATM dev 0: ADSL line: exchange
	[2635357.696901] ATM dev 0: ADSL line: up (8128 kb/s down | 832 kb/s up)
+26 −26
Original line number Diff line number Diff line
@@ -476,8 +476,6 @@ static int cxacru_start_wait_urb(struct urb *urb, struct completion *done,
	add_timer(&timer);
	wait_for_completion(done);
	status = urb->status;
	if (status == -ECONNRESET)
		status = -ETIMEDOUT;
	del_timer_sync(&timer);

	if (actual_length)
@@ -629,10 +627,22 @@ static int cxacru_card_status(struct cxacru_data *instance)
	return 0;
}

static void cxacru_remove_device_files(struct usbatm_data *usbatm_instance,
		struct atm_dev *atm_dev)
{
	struct usb_interface *intf = usbatm_instance->usb_intf;

	#define CXACRU_DEVICE_REMOVE_FILE(_name) \
		device_remove_file(&intf->dev, &dev_attr_##_name);
	CXACRU_ALL_FILES(REMOVE);
	#undef CXACRU_DEVICE_REMOVE_FILE
}

static int cxacru_atm_start(struct usbatm_data *usbatm_instance,
		struct atm_dev *atm_dev)
{
	struct cxacru_data *instance = usbatm_instance->driver_data;
	struct usb_interface *intf = usbatm_instance->usb_intf;
	/*
	struct atm_dev *atm_dev = usbatm_instance->atm_dev;
	*/
@@ -649,14 +659,18 @@ static int cxacru_atm_start(struct usbatm_data *usbatm_instance,
		return ret;
	}

	#define CXACRU_DEVICE_CREATE_FILE(_name) \
		ret = device_create_file(&intf->dev, &dev_attr_##_name); \
		if (unlikely(ret)) \
			goto fail_sysfs;
	CXACRU_ALL_FILES(CREATE);
	#undef CXACRU_DEVICE_CREATE_FILE

	/* start ADSL */
	mutex_lock(&instance->adsl_state_serialize);
	ret = cxacru_cm(instance, CM_REQUEST_CHIP_ADSL_LINE_START, NULL, 0, NULL, 0);
	if (ret < 0) {
	if (ret < 0)
		atm_err(usbatm_instance, "cxacru_atm_start: CHIP_ADSL_LINE_START returned %d\n", ret);
		mutex_unlock(&instance->adsl_state_serialize);
		return ret;
	}

	/* Start status polling */
	mutex_lock(&instance->poll_state_serialize);
@@ -680,6 +694,11 @@ static int cxacru_atm_start(struct usbatm_data *usbatm_instance,
	if (start_polling)
		cxacru_poll_status(&instance->poll_work.work);
	return 0;

fail_sysfs:
	usb_err(usbatm_instance, "cxacru_atm_start: device_create_file failed (%d)\n", ret);
	cxacru_remove_device_files(usbatm_instance, atm_dev);
	return ret;
}

static void cxacru_poll_status(struct work_struct *work)
@@ -1065,13 +1084,6 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance,
		goto fail;
	}

	#define CXACRU_DEVICE_CREATE_FILE(_name) \
		ret = device_create_file(&intf->dev, &dev_attr_##_name); \
		if (unlikely(ret)) \
			goto fail_sysfs;
	CXACRU_ALL_FILES(CREATE);
	#undef CXACRU_DEVICE_CREATE_FILE

	usb_fill_int_urb(instance->rcv_urb,
			usb_dev, usb_rcvintpipe(usb_dev, CXACRU_EP_CMD),
			instance->rcv_buf, PAGE_SIZE,
@@ -1092,14 +1104,6 @@ static int cxacru_bind(struct usbatm_data *usbatm_instance,

	return 0;

 fail_sysfs:
	dbg("cxacru_bind: device_create_file failed (%d)\n", ret);

	#define CXACRU_DEVICE_REMOVE_FILE(_name) \
		device_remove_file(&intf->dev, &dev_attr_##_name);
	CXACRU_ALL_FILES(REMOVE);
	#undef CXACRU_DEVICE_REVOVE_FILE

 fail:
	free_page((unsigned long) instance->snd_buf);
	free_page((unsigned long) instance->rcv_buf);
@@ -1146,11 +1150,6 @@ static void cxacru_unbind(struct usbatm_data *usbatm_instance,
	free_page((unsigned long) instance->snd_buf);
	free_page((unsigned long) instance->rcv_buf);

	#define CXACRU_DEVICE_REMOVE_FILE(_name) \
		device_remove_file(&intf->dev, &dev_attr_##_name);
	CXACRU_ALL_FILES(REMOVE);
	#undef CXACRU_DEVICE_REVOVE_FILE

	kfree(instance);

	usbatm_instance->driver_data = NULL;
@@ -1231,6 +1230,7 @@ static struct usbatm_driver cxacru_driver = {
	.heavy_init	= cxacru_heavy_init,
	.unbind		= cxacru_unbind,
	.atm_start	= cxacru_atm_start,
	.atm_stop	= cxacru_remove_device_files,
	.bulk_in	= CXACRU_EP_DATA,
	.bulk_out	= CXACRU_EP_DATA,
	.rx_padding	= 3,
+2 −3
Original line number Diff line number Diff line
@@ -347,11 +347,9 @@ static int handle_bidir (struct usblp *usblp)
	if (usblp->bidir && usblp->used && !usblp->sleeping) {
		usblp->readcount = 0;
		usblp->readurb->dev = usblp->dev;
		if (usb_submit_urb(usblp->readurb, GFP_KERNEL) < 0) {
			usblp->used = 0;
		if (usb_submit_urb(usblp->readurb, GFP_KERNEL) < 0)
			return -EIO;
	}
	}

	return 0;
}
@@ -412,6 +410,7 @@ static int usblp_open(struct inode *inode, struct file *file)
	usblp->readurb->status = 0;

	if (handle_bidir(usblp) < 0) {
		usblp->used = 0;
		file->private_data = NULL;
		retval = -EIO;
	}
+13 −9
Original line number Diff line number Diff line
@@ -40,21 +40,25 @@ config USB_DEVICEFS
config USB_DEVICE_CLASS
	bool "USB device class-devices (DEPRECATED)"
	depends on USB
	default n
	default y
	---help---
	  Userspace access to USB devices is granted by device-nodes exported
	  directly from the usbdev in sysfs. Old versions of the driver
	  core and udev needed additional class devices to export device nodes.

	  These additional devices are difficult to handle in userspace, if
	  information about USB interfaces must be available. One device contains
	  the device node, the other device contains the interface data. Both
	  devices are at the same level in sysfs (siblings) and one can't access
	  the other. The device node created directly by the usbdev is the parent
	  device of the interface and therefore easily accessible from the interface
	  event.

	  This option provides backward compatibility if needed.
	  information about USB interfaces must be available. One device
	  contains the device node, the other device contains the interface
	  data. Both devices are at the same level in sysfs (siblings) and one
	  can't access the other. The device node created directly by the
	  usb device is the parent device of the interface and therefore
	  easily accessible from the interface event.

	  This option provides backward compatibility for libusb device
	  nodes (lsusb) when usbfs is not used, and the following udev rule
	  doesn't exist:
	    SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", \
	    NAME="bus/usb/$env{BUSNUM}/$env{DEVNUM}", MODE="0644"

config USB_DYNAMIC_MINORS
	bool "Dynamic USB minor allocation (EXPERIMENTAL)"
Loading