mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-04 08:46:52 +07:00
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: USB: unusual_devs.h entry for nokia 6233 USB: Fix for typo in ohci-ep93xx.c USB: disable USB_MULTITHREAD_PROBE USB: add vendor/device id for Option GT Max 3.6 cards USB: unusual_devs.h for 0x046b:ff40 USB: make usbhid ignore Imation Disc Stakka USB: rndis_host: fix crash while probing a Nokia S60 mobile USB: asix: Detect internal PHY and enable/use accordingly usbtouchscreen: make ITM screens report BTN_TOUCH as zero when not touched
This commit is contained in:
commit
39470bf24d
@ -72,22 +72,6 @@ config USB_SUSPEND
|
|||||||
|
|
||||||
If you are unsure about this, say N here.
|
If you are unsure about this, say N here.
|
||||||
|
|
||||||
config USB_MULTITHREAD_PROBE
|
|
||||||
bool "USB Multi-threaded probe (EXPERIMENTAL)"
|
|
||||||
depends on USB && EXPERIMENTAL
|
|
||||||
default n
|
|
||||||
help
|
|
||||||
Say Y here if you want the USB core to spawn a new thread for
|
|
||||||
every USB device that is probed. This can cause a small speedup
|
|
||||||
in boot times on systems with a lot of different USB devices.
|
|
||||||
|
|
||||||
This option should be safe to enable, but if any odd probing
|
|
||||||
problems are found, please disable it, or dynamically turn it
|
|
||||||
off in the /sys/module/usbcore/parameters/multithread_probe
|
|
||||||
file
|
|
||||||
|
|
||||||
When in doubt, say N.
|
|
||||||
|
|
||||||
config USB_OTG
|
config USB_OTG
|
||||||
bool
|
bool
|
||||||
depends on USB && EXPERIMENTAL
|
depends on USB && EXPERIMENTAL
|
||||||
|
@ -88,14 +88,7 @@ static DECLARE_WAIT_QUEUE_HEAD(khubd_wait);
|
|||||||
static struct task_struct *khubd_task;
|
static struct task_struct *khubd_task;
|
||||||
|
|
||||||
/* multithreaded probe logic */
|
/* multithreaded probe logic */
|
||||||
static int multithread_probe =
|
static int multithread_probe = 0;
|
||||||
#ifdef CONFIG_USB_MULTITHREAD_PROBE
|
|
||||||
1;
|
|
||||||
#else
|
|
||||||
0;
|
|
||||||
#endif
|
|
||||||
module_param(multithread_probe, bool, S_IRUGO);
|
|
||||||
MODULE_PARM_DESC(multithread_probe, "Run each USB device probe in a new thread");
|
|
||||||
|
|
||||||
/* cycle leds on hubs that aren't blinking for attention */
|
/* cycle leds on hubs that aren't blinking for attention */
|
||||||
static int blinkenlights = 0;
|
static int blinkenlights = 0;
|
||||||
|
@ -169,7 +169,7 @@ static int ohci_hcd_ep93xx_drv_remove(struct platform_device *pdev)
|
|||||||
static int ohci_hcd_ep93xx_drv_suspend(struct platform_device *pdev, pm_message_t state)
|
static int ohci_hcd_ep93xx_drv_suspend(struct platform_device *pdev, pm_message_t state)
|
||||||
{
|
{
|
||||||
struct usb_hcd *hcd = platform_get_drvdata(pdev);
|
struct usb_hcd *hcd = platform_get_drvdata(pdev);
|
||||||
struct ochi_hcd *ohci = hcd_to_ohci(hcd);
|
struct ohci_hcd *ohci = hcd_to_ohci(hcd);
|
||||||
|
|
||||||
if (time_before(jiffies, ohci->next_statechange))
|
if (time_before(jiffies, ohci->next_statechange))
|
||||||
msleep(5);
|
msleep(5);
|
||||||
|
@ -796,6 +796,9 @@ void usbhid_init_reports(struct hid_device *hid)
|
|||||||
#define USB_VENDOR_ID_LOGITECH 0x046d
|
#define USB_VENDOR_ID_LOGITECH 0x046d
|
||||||
#define USB_DEVICE_ID_LOGITECH_USB_RECEIVER 0xc101
|
#define USB_DEVICE_ID_LOGITECH_USB_RECEIVER 0xc101
|
||||||
|
|
||||||
|
#define USB_VENDOR_ID_IMATION 0x0718
|
||||||
|
#define USB_DEVICE_ID_DISC_STAKKA 0xd000
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Alphabetically sorted blacklist by quirk type.
|
* Alphabetically sorted blacklist by quirk type.
|
||||||
*/
|
*/
|
||||||
@ -883,6 +886,7 @@ static const struct hid_blacklist {
|
|||||||
{ USB_VENDOR_ID_GTCO_IPANEL_1, USB_DEVICE_ID_GTCO_10, HID_QUIRK_IGNORE },
|
{ USB_VENDOR_ID_GTCO_IPANEL_1, USB_DEVICE_ID_GTCO_10, HID_QUIRK_IGNORE },
|
||||||
{ USB_VENDOR_ID_GTCO_IPANEL_2, USB_DEVICE_ID_GTCO_8, HID_QUIRK_IGNORE },
|
{ USB_VENDOR_ID_GTCO_IPANEL_2, USB_DEVICE_ID_GTCO_8, HID_QUIRK_IGNORE },
|
||||||
{ USB_VENDOR_ID_GTCO_IPANEL_2, USB_DEVICE_ID_GTCO_d, HID_QUIRK_IGNORE },
|
{ USB_VENDOR_ID_GTCO_IPANEL_2, USB_DEVICE_ID_GTCO_d, HID_QUIRK_IGNORE },
|
||||||
|
{ USB_VENDOR_ID_IMATION, USB_DEVICE_ID_DISC_STAKKA, HID_QUIRK_IGNORE },
|
||||||
{ USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE },
|
{ USB_VENDOR_ID_KBGEAR, USB_DEVICE_ID_KBGEAR_JAMSTUDIO, HID_QUIRK_IGNORE },
|
||||||
{ USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY, HID_QUIRK_IGNORE },
|
{ USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_CASSY, HID_QUIRK_IGNORE },
|
||||||
{ USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY, HID_QUIRK_IGNORE },
|
{ USB_VENDOR_ID_LD, USB_DEVICE_ID_LD_POCKETCASSY, HID_QUIRK_IGNORE },
|
||||||
|
@ -66,7 +66,7 @@ struct usbtouch_device_info {
|
|||||||
|
|
||||||
void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len);
|
void (*process_pkt) (struct usbtouch_usb *usbtouch, unsigned char *pkt, int len);
|
||||||
int (*get_pkt_len) (unsigned char *pkt, int len);
|
int (*get_pkt_len) (unsigned char *pkt, int len);
|
||||||
int (*read_data) (unsigned char *pkt, int *x, int *y, int *touch, int *press);
|
int (*read_data) (struct usbtouch_usb *usbtouch, unsigned char *pkt);
|
||||||
int (*init) (struct usbtouch_usb *usbtouch);
|
int (*init) (struct usbtouch_usb *usbtouch);
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -85,6 +85,9 @@ struct usbtouch_usb {
|
|||||||
struct usbtouch_device_info *type;
|
struct usbtouch_device_info *type;
|
||||||
char name[128];
|
char name[128];
|
||||||
char phys[64];
|
char phys[64];
|
||||||
|
|
||||||
|
int x, y;
|
||||||
|
int touch, press;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -161,14 +164,14 @@ static struct usb_device_id usbtouch_devices[] = {
|
|||||||
#define EGALAX_PKT_TYPE_REPT 0x80
|
#define EGALAX_PKT_TYPE_REPT 0x80
|
||||||
#define EGALAX_PKT_TYPE_DIAG 0x0A
|
#define EGALAX_PKT_TYPE_DIAG 0x0A
|
||||||
|
|
||||||
static int egalax_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
|
static int egalax_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
|
||||||
{
|
{
|
||||||
if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT)
|
if ((pkt[0] & EGALAX_PKT_TYPE_MASK) != EGALAX_PKT_TYPE_REPT)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
*x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F);
|
dev->x = ((pkt[3] & 0x0F) << 7) | (pkt[4] & 0x7F);
|
||||||
*y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F);
|
dev->y = ((pkt[1] & 0x0F) << 7) | (pkt[2] & 0x7F);
|
||||||
*touch = pkt[0] & 0x01;
|
dev->touch = pkt[0] & 0x01;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -195,11 +198,11 @@ static int egalax_get_pkt_len(unsigned char *buf, int len)
|
|||||||
* PanJit Part
|
* PanJit Part
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_USB_TOUCHSCREEN_PANJIT
|
#ifdef CONFIG_USB_TOUCHSCREEN_PANJIT
|
||||||
static int panjit_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
|
static int panjit_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
|
||||||
{
|
{
|
||||||
*x = ((pkt[2] & 0x0F) << 8) | pkt[1];
|
dev->x = ((pkt[2] & 0x0F) << 8) | pkt[1];
|
||||||
*y = ((pkt[4] & 0x0F) << 8) | pkt[3];
|
dev->y = ((pkt[4] & 0x0F) << 8) | pkt[3];
|
||||||
*touch = pkt[0] & 0x01;
|
dev->touch = pkt[0] & 0x01;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -215,11 +218,11 @@ static int panjit_read_data(unsigned char *pkt, int *x, int *y, int *touch, int
|
|||||||
#define MTOUCHUSB_RESET 7
|
#define MTOUCHUSB_RESET 7
|
||||||
#define MTOUCHUSB_REQ_CTRLLR_ID 10
|
#define MTOUCHUSB_REQ_CTRLLR_ID 10
|
||||||
|
|
||||||
static int mtouch_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
|
static int mtouch_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
|
||||||
{
|
{
|
||||||
*x = (pkt[8] << 8) | pkt[7];
|
dev->x = (pkt[8] << 8) | pkt[7];
|
||||||
*y = (pkt[10] << 8) | pkt[9];
|
dev->y = (pkt[10] << 8) | pkt[9];
|
||||||
*touch = (pkt[2] & 0x40) ? 1 : 0;
|
dev->touch = (pkt[2] & 0x40) ? 1 : 0;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -260,14 +263,32 @@ static int mtouch_init(struct usbtouch_usb *usbtouch)
|
|||||||
* ITM Part
|
* ITM Part
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_USB_TOUCHSCREEN_ITM
|
#ifdef CONFIG_USB_TOUCHSCREEN_ITM
|
||||||
static int itm_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
|
static int itm_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
|
||||||
{
|
{
|
||||||
*x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F);
|
int touch;
|
||||||
*y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F);
|
/*
|
||||||
*press = ((pkt[2] & 0x01) << 7) | (pkt[5] & 0x7F);
|
* ITM devices report invalid x/y data if not touched.
|
||||||
*touch = ~pkt[7] & 0x20;
|
* if the screen was touched before but is not touched any more
|
||||||
|
* report touch as 0 with the last valid x/y data once. then stop
|
||||||
|
* reporting data until touched again.
|
||||||
|
*/
|
||||||
|
dev->press = ((pkt[2] & 0x01) << 7) | (pkt[5] & 0x7F);
|
||||||
|
|
||||||
return *touch;
|
touch = ~pkt[7] & 0x20;
|
||||||
|
if (!touch) {
|
||||||
|
if (dev->touch) {
|
||||||
|
dev->touch = 0;
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[3] & 0x7F);
|
||||||
|
dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[4] & 0x7F);
|
||||||
|
dev->touch = touch;
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -276,7 +297,7 @@ static int itm_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *pr
|
|||||||
* eTurboTouch part
|
* eTurboTouch part
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_USB_TOUCHSCREEN_ETURBO
|
#ifdef CONFIG_USB_TOUCHSCREEN_ETURBO
|
||||||
static int eturbo_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
|
static int eturbo_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
|
||||||
{
|
{
|
||||||
unsigned int shift;
|
unsigned int shift;
|
||||||
|
|
||||||
@ -285,9 +306,9 @@ static int eturbo_read_data(unsigned char *pkt, int *x, int *y, int *touch, int
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
shift = (6 - (pkt[0] & 0x03));
|
shift = (6 - (pkt[0] & 0x03));
|
||||||
*x = ((pkt[3] << 7) | pkt[4]) >> shift;
|
dev->x = ((pkt[3] << 7) | pkt[4]) >> shift;
|
||||||
*y = ((pkt[1] << 7) | pkt[2]) >> shift;
|
dev->y = ((pkt[1] << 7) | pkt[2]) >> shift;
|
||||||
*touch = (pkt[0] & 0x10) ? 1 : 0;
|
dev->touch = (pkt[0] & 0x10) ? 1 : 0;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -307,14 +328,14 @@ static int eturbo_get_pkt_len(unsigned char *buf, int len)
|
|||||||
* Gunze part
|
* Gunze part
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_USB_TOUCHSCREEN_GUNZE
|
#ifdef CONFIG_USB_TOUCHSCREEN_GUNZE
|
||||||
static int gunze_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
|
static int gunze_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
|
||||||
{
|
{
|
||||||
if (!(pkt[0] & 0x80) || ((pkt[1] | pkt[2] | pkt[3]) & 0x80))
|
if (!(pkt[0] & 0x80) || ((pkt[1] | pkt[2] | pkt[3]) & 0x80))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
*x = ((pkt[0] & 0x1F) << 7) | (pkt[2] & 0x7F);
|
dev->x = ((pkt[0] & 0x1F) << 7) | (pkt[2] & 0x7F);
|
||||||
*y = ((pkt[1] & 0x1F) << 7) | (pkt[3] & 0x7F);
|
dev->y = ((pkt[1] & 0x1F) << 7) | (pkt[3] & 0x7F);
|
||||||
*touch = pkt[0] & 0x20;
|
dev->touch = pkt[0] & 0x20;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -383,11 +404,11 @@ static int dmc_tsc10_init(struct usbtouch_usb *usbtouch)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int dmc_tsc10_read_data(unsigned char *pkt, int *x, int *y, int *touch, int *press)
|
static int dmc_tsc10_read_data(struct usbtouch_usb *dev, unsigned char *pkt)
|
||||||
{
|
{
|
||||||
*x = ((pkt[2] & 0x03) << 8) | pkt[1];
|
dev->x = ((pkt[2] & 0x03) << 8) | pkt[1];
|
||||||
*y = ((pkt[4] & 0x03) << 8) | pkt[3];
|
dev->y = ((pkt[4] & 0x03) << 8) | pkt[3];
|
||||||
*touch = pkt[0] & 0x01;
|
dev->touch = pkt[0] & 0x01;
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
@ -492,23 +513,22 @@ static struct usbtouch_device_info usbtouch_dev_info[] = {
|
|||||||
static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch,
|
static void usbtouch_process_pkt(struct usbtouch_usb *usbtouch,
|
||||||
unsigned char *pkt, int len)
|
unsigned char *pkt, int len)
|
||||||
{
|
{
|
||||||
int x, y, touch, press;
|
|
||||||
struct usbtouch_device_info *type = usbtouch->type;
|
struct usbtouch_device_info *type = usbtouch->type;
|
||||||
|
|
||||||
if (!type->read_data(pkt, &x, &y, &touch, &press))
|
if (!type->read_data(usbtouch, pkt))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
input_report_key(usbtouch->input, BTN_TOUCH, touch);
|
input_report_key(usbtouch->input, BTN_TOUCH, usbtouch->touch);
|
||||||
|
|
||||||
if (swap_xy) {
|
if (swap_xy) {
|
||||||
input_report_abs(usbtouch->input, ABS_X, y);
|
input_report_abs(usbtouch->input, ABS_X, usbtouch->y);
|
||||||
input_report_abs(usbtouch->input, ABS_Y, x);
|
input_report_abs(usbtouch->input, ABS_Y, usbtouch->x);
|
||||||
} else {
|
} else {
|
||||||
input_report_abs(usbtouch->input, ABS_X, x);
|
input_report_abs(usbtouch->input, ABS_X, usbtouch->x);
|
||||||
input_report_abs(usbtouch->input, ABS_Y, y);
|
input_report_abs(usbtouch->input, ABS_Y, usbtouch->y);
|
||||||
}
|
}
|
||||||
if (type->max_press)
|
if (type->max_press)
|
||||||
input_report_abs(usbtouch->input, ABS_PRESSURE, press);
|
input_report_abs(usbtouch->input, ABS_PRESSURE, usbtouch->press);
|
||||||
input_sync(usbtouch->input);
|
input_sync(usbtouch->input);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -898,7 +898,7 @@ static int ax88772_link_reset(struct usbnet *dev)
|
|||||||
|
|
||||||
static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||||
{
|
{
|
||||||
int ret;
|
int ret, embd_phy;
|
||||||
void *buf;
|
void *buf;
|
||||||
u16 rx_ctl;
|
u16 rx_ctl;
|
||||||
struct asix_data *data = (struct asix_data *)&dev->data;
|
struct asix_data *data = (struct asix_data *)&dev->data;
|
||||||
@ -919,13 +919,15 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||||||
AX_GPIO_RSE | AX_GPIO_GPO_2 | AX_GPIO_GPO2EN, 5)) < 0)
|
AX_GPIO_RSE | AX_GPIO_GPO_2 | AX_GPIO_GPO2EN, 5)) < 0)
|
||||||
goto out2;
|
goto out2;
|
||||||
|
|
||||||
|
/* 0x10 is the phy id of the embedded 10/100 ethernet phy */
|
||||||
|
embd_phy = ((asix_get_phy_addr(dev) & 0x1f) == 0x10 ? 1 : 0);
|
||||||
if ((ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT,
|
if ((ret = asix_write_cmd(dev, AX_CMD_SW_PHY_SELECT,
|
||||||
1, 0, 0, buf)) < 0) {
|
embd_phy, 0, 0, buf)) < 0) {
|
||||||
dbg("Select PHY #1 failed: %d", ret);
|
dbg("Select PHY #1 failed: %d", ret);
|
||||||
goto out2;
|
goto out2;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((ret = asix_sw_reset(dev, AX_SWRESET_IPPD)) < 0)
|
if ((ret = asix_sw_reset(dev, AX_SWRESET_IPPD | AX_SWRESET_PRL)) < 0)
|
||||||
goto out2;
|
goto out2;
|
||||||
|
|
||||||
msleep(150);
|
msleep(150);
|
||||||
@ -933,8 +935,14 @@ static int ax88772_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||||||
goto out2;
|
goto out2;
|
||||||
|
|
||||||
msleep(150);
|
msleep(150);
|
||||||
if ((ret = asix_sw_reset(dev, AX_SWRESET_IPRL | AX_SWRESET_PRL)) < 0)
|
if (embd_phy) {
|
||||||
goto out2;
|
if ((ret = asix_sw_reset(dev, AX_SWRESET_IPRL)) < 0)
|
||||||
|
goto out2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if ((ret = asix_sw_reset(dev, AX_SWRESET_PRTE)) < 0)
|
||||||
|
goto out2;
|
||||||
|
}
|
||||||
|
|
||||||
msleep(150);
|
msleep(150);
|
||||||
rx_ctl = asix_read_rx_ctl(dev);
|
rx_ctl = asix_read_rx_ctl(dev);
|
||||||
|
@ -379,6 +379,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
struct net_device *net = dev->net;
|
struct net_device *net = dev->net;
|
||||||
|
struct cdc_state *info = (void *) &dev->data;
|
||||||
union {
|
union {
|
||||||
void *buf;
|
void *buf;
|
||||||
struct rndis_msg_hdr *header;
|
struct rndis_msg_hdr *header;
|
||||||
@ -397,7 +398,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
retval = usbnet_generic_cdc_bind(dev, intf);
|
retval = usbnet_generic_cdc_bind(dev, intf);
|
||||||
if (retval < 0)
|
if (retval < 0)
|
||||||
goto done;
|
goto fail;
|
||||||
|
|
||||||
net->hard_header_len += sizeof (struct rndis_data_hdr);
|
net->hard_header_len += sizeof (struct rndis_data_hdr);
|
||||||
|
|
||||||
@ -412,10 +413,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||||||
if (unlikely(retval < 0)) {
|
if (unlikely(retval < 0)) {
|
||||||
/* it might not even be an RNDIS device!! */
|
/* it might not even be an RNDIS device!! */
|
||||||
dev_err(&intf->dev, "RNDIS init failed, %d\n", retval);
|
dev_err(&intf->dev, "RNDIS init failed, %d\n", retval);
|
||||||
fail:
|
goto fail_and_release;
|
||||||
usb_driver_release_interface(driver_of(intf),
|
|
||||||
((struct cdc_state *)&(dev->data))->data);
|
|
||||||
goto done;
|
|
||||||
}
|
}
|
||||||
dev->hard_mtu = le32_to_cpu(u.init_c->max_transfer_size);
|
dev->hard_mtu = le32_to_cpu(u.init_c->max_transfer_size);
|
||||||
/* REVISIT: peripheral "alignment" request is ignored ... */
|
/* REVISIT: peripheral "alignment" request is ignored ... */
|
||||||
@ -431,7 +429,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||||||
retval = rndis_command(dev, u.header);
|
retval = rndis_command(dev, u.header);
|
||||||
if (unlikely(retval < 0)) {
|
if (unlikely(retval < 0)) {
|
||||||
dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval);
|
dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval);
|
||||||
goto fail;
|
goto fail_and_release;
|
||||||
}
|
}
|
||||||
tmp = le32_to_cpu(u.get_c->offset);
|
tmp = le32_to_cpu(u.get_c->offset);
|
||||||
if (unlikely((tmp + 8) > (1024 - ETH_ALEN)
|
if (unlikely((tmp + 8) > (1024 - ETH_ALEN)
|
||||||
@ -439,7 +437,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||||||
dev_err(&intf->dev, "rndis ethaddr off %d len %d ?\n",
|
dev_err(&intf->dev, "rndis ethaddr off %d len %d ?\n",
|
||||||
tmp, le32_to_cpu(u.get_c->len));
|
tmp, le32_to_cpu(u.get_c->len));
|
||||||
retval = -EDOM;
|
retval = -EDOM;
|
||||||
goto fail;
|
goto fail_and_release;
|
||||||
}
|
}
|
||||||
memcpy(net->dev_addr, tmp + (char *)&u.get_c->request_id, ETH_ALEN);
|
memcpy(net->dev_addr, tmp + (char *)&u.get_c->request_id, ETH_ALEN);
|
||||||
|
|
||||||
@ -455,11 +453,18 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf)
|
|||||||
retval = rndis_command(dev, u.header);
|
retval = rndis_command(dev, u.header);
|
||||||
if (unlikely(retval < 0)) {
|
if (unlikely(retval < 0)) {
|
||||||
dev_err(&intf->dev, "rndis set packet filter, %d\n", retval);
|
dev_err(&intf->dev, "rndis set packet filter, %d\n", retval);
|
||||||
goto fail;
|
goto fail_and_release;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = 0;
|
retval = 0;
|
||||||
done:
|
|
||||||
|
kfree(u.buf);
|
||||||
|
return retval;
|
||||||
|
|
||||||
|
fail_and_release:
|
||||||
|
usb_set_intfdata(info->data, NULL);
|
||||||
|
usb_driver_release_interface(driver_of(intf), info->data);
|
||||||
|
fail:
|
||||||
kfree(u.buf);
|
kfree(u.buf);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
@ -78,6 +78,7 @@ static int option_send_setup(struct usb_serial_port *port);
|
|||||||
#define OPTION_PRODUCT_FUSION2 0x6300
|
#define OPTION_PRODUCT_FUSION2 0x6300
|
||||||
#define OPTION_PRODUCT_COBRA 0x6500
|
#define OPTION_PRODUCT_COBRA 0x6500
|
||||||
#define OPTION_PRODUCT_COBRA2 0x6600
|
#define OPTION_PRODUCT_COBRA2 0x6600
|
||||||
|
#define OPTION_PRODUCT_GTMAX36 0x6701
|
||||||
#define HUAWEI_PRODUCT_E600 0x1001
|
#define HUAWEI_PRODUCT_E600 0x1001
|
||||||
#define HUAWEI_PRODUCT_E220 0x1003
|
#define HUAWEI_PRODUCT_E220 0x1003
|
||||||
#define AUDIOVOX_PRODUCT_AIRCARD 0x0112
|
#define AUDIOVOX_PRODUCT_AIRCARD 0x0112
|
||||||
@ -90,6 +91,7 @@ static struct usb_device_id option_ids[] = {
|
|||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
|
||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
|
||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
|
||||||
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTMAX36) },
|
||||||
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
|
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
|
||||||
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) },
|
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) },
|
||||||
{ USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
|
{ USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
|
||||||
@ -104,6 +106,7 @@ static struct usb_device_id option_ids1[] = {
|
|||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_FUSION2) },
|
||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA) },
|
||||||
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_COBRA2) },
|
||||||
|
{ USB_DEVICE(OPTION_VENDOR_ID, OPTION_PRODUCT_GTMAX36) },
|
||||||
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
|
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E600) },
|
||||||
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) },
|
{ USB_DEVICE(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_E220) },
|
||||||
{ USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
|
{ USB_DEVICE(AUDIOVOX_VENDOR_ID, AUDIOVOX_PRODUCT_AIRCARD) },
|
||||||
|
@ -197,6 +197,13 @@ UNUSUAL_DEV( 0x0421, 0x047c, 0x0370, 0x0370,
|
|||||||
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
US_FL_MAX_SECTORS_64 ),
|
US_FL_MAX_SECTORS_64 ),
|
||||||
|
|
||||||
|
/* Reported by Manuel Osdoba <manuel.osdoba@tu-ilmenau.de> */
|
||||||
|
UNUSUAL_DEV( 0x0421, 0x0492, 0x0452, 0x0452,
|
||||||
|
"Nokia",
|
||||||
|
"Nokia 6233",
|
||||||
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
|
US_FL_MAX_SECTORS_64 ),
|
||||||
|
|
||||||
/* Reported by Alex Corcoles <alex@corcoles.net> */
|
/* Reported by Alex Corcoles <alex@corcoles.net> */
|
||||||
UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370,
|
UNUSUAL_DEV( 0x0421, 0x0495, 0x0370, 0x0370,
|
||||||
"Nokia",
|
"Nokia",
|
||||||
@ -254,6 +261,18 @@ UNUSUAL_DEV( 0x045a, 0x5210, 0x0101, 0x0101,
|
|||||||
US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0),
|
US_SC_SCSI, US_PR_KARMA, rio_karma_init, 0),
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This virtual floppy is found in Sun equipment (x4600, x4200m2, etc.)
|
||||||
|
* Reported by Pete Zaitcev <zaitcev@redhat.com>
|
||||||
|
* This device chokes on both version of MODE SENSE which we have, so
|
||||||
|
* use_10_for_ms is not effective, and we use US_FL_NO_WP_DETECT.
|
||||||
|
*/
|
||||||
|
UNUSUAL_DEV( 0x046b, 0xff40, 0x0100, 0x0100,
|
||||||
|
"AMI",
|
||||||
|
"Virtual Floppy",
|
||||||
|
US_SC_DEVICE, US_PR_DEVICE, NULL,
|
||||||
|
US_FL_NO_WP_DETECT),
|
||||||
|
|
||||||
/* Patch submitted by Philipp Friedrich <philipp@void.at> */
|
/* Patch submitted by Philipp Friedrich <philipp@void.at> */
|
||||||
UNUSUAL_DEV( 0x0482, 0x0100, 0x0100, 0x0100,
|
UNUSUAL_DEV( 0x0482, 0x0100, 0x0100, 0x0100,
|
||||||
"Kyocera",
|
"Kyocera",
|
||||||
|
Loading…
Reference in New Issue
Block a user