Re: [PATCH] hid2hci: Remove usb_find_busses and usb_find_devices calls

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Thu, Jul 30, 2009 at 13:07, Mario
Limonciello<mario_limonciello@xxxxxxxx> wrote:
> As a follow up to the thread titled "[PATCH 1/2] hid2hci: iterate libusb
> devices twice", I've redone that patch to remove the hacks that were
> added to work around the bug that has a kernel solution.
>
> This patch removes the calls to usb_find_busses and usb_find_devices and
> instead stuffs the necessary bits into a single usb_device so that the
> other libusb calls work later on.

I first want to try to get libusb or maybe libusb1 fixed properly
before we go that road. Adding Daniel to Cc:.

That problem will re-appear again for other users, and if possible, it
should be solved where it is caused. For now we are just "slow" and
let libusb do very silly things if used from udev -- but it works.

If there will be no fix, we are prepared to do something like you
sent, or to drop libusb entirely and just use something like the
attached thing.

Thanks,
Kay
/*
 * Copyright (C) 2009 Kay Sievers <kay.sievers@xxxxxxxx>
 *
 * 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:
 */

#include <stdio.h>
#include <string.h>
#include <time.h>
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <linux/usbdevice_fs.h>
#include <linux/usb/ch9.h>

#include "usb.h"

struct usb_dev_handle {
	int fd;
	int intf;
};

struct usb_dev_handle *usb_open_from_devnode(const char *filename)
{
	struct usb_dev_handle *handle;

	handle = calloc(1, sizeof(struct usb_dev_handle));
	if (handle == NULL)
		return NULL;

	handle->fd = open(filename, O_RDWR);
	if (handle->fd < 0) {
		free(handle);
		return NULL;
	}
	return handle;
}

int usb_close(struct usb_dev_handle *dev)
{
	if (dev == NULL)
		return 0;
	close(dev->fd);
	free(dev);
	return 0;
}

int usb_claim_interface(struct usb_dev_handle *dev, int interface)
{
	int ret;

	ret = ioctl(dev->fd, USBDEVFS_CLAIMINTERFACE, &interface);
	if (ret < 0)
		return ret;
	dev->intf = interface;
	return 0;
}

int usb_control_msg(struct usb_dev_handle *dev, int requesttype, int request,
		    int value, int idx, char *bytes, int size, int timeout)
{
	struct usbdevfs_ctrltransfer ctrl = {
		.bRequestType = requesttype,
		.bRequest = request,
		.wValue = value,
		.wIndex = idx,
		.wLength = size,
		.data = bytes,
		.timeout = timeout,
	};
	return ioctl(dev->fd, USBDEVFS_CONTROL, &ctrl);
}

int usb_detach_kernel_driver_np(struct usb_dev_handle *dev, int interface)
{
	struct usbdevfs_ioctl command = {
		.ifno = interface,
		.ioctl_code = USBDEVFS_DISCONNECT,
	};
	return ioctl(dev->fd, USBDEVFS_IOCTL, &command);
}

[Index of Archives]     [Linux Kernel]     [Linux DVB]     [Asterisk Internet PBX]     [DCCP]     [Netdev]     [X.org]     [Util Linux NG]     [Fedora Women]     [ALSA Devel]     [Linux USB]

  Powered by Linux