PR/49233: Ben Gergely: Add huawei e353 to u3g

(factor out some common code in the process)
This commit is contained in:
christos 2014-09-24 00:17:13 +00:00
parent a334827b62
commit 3ca86f7ee4
2 changed files with 68 additions and 26 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: u3g.c,v 1.30 2013/09/02 07:39:03 christos Exp $ */
/* $NetBSD: u3g.c,v 1.31 2014/09/24 00:17:13 christos Exp $ */
/*-
* Copyright (c) 2009 The NetBSD Foundation, Inc.
@ -50,7 +50,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: u3g.c,v 1.30 2013/09/02 07:39:03 christos Exp $");
__KERNEL_RCSID(0, "$NetBSD: u3g.c,v 1.31 2014/09/24 00:17:13 christos Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@ -192,6 +192,7 @@ static const struct usb_devno u3g_devs[] = {
{ USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_K3765 },
{ USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_MOBILE },
{ USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E171 },
{ USB_VENDOR_HUAWEI, USB_PRODUCT_HUAWEI_E353 },
/* OEM: Merlin */
{ USB_VENDOR_MERLIN, USB_PRODUCT_MERLIN_V620 },
/* OEM: Novatel */
@ -334,6 +335,16 @@ send_bulkmsg(usbd_device_handle dev, void *cmd, size_t cmdlen)
return (err == USBD_NORMAL_COMPLETION ? UMATCH_HIGHEST : UMATCH_NONE);
}
/* Byte 0..3: Command Block Wrapper (CBW) signature */
static void
set_cbw(unsigned char *cmd)
{
cmd[0] = 0x55;
cmd[1] = 0x53;
cmd[2] = 0x42;
cmd[3] = 0x43;
}
static int
u3g_bulk_scsi_eject(usbd_device_handle dev)
{
@ -341,10 +352,7 @@ u3g_bulk_scsi_eject(usbd_device_handle dev)
memset(cmd, 0, sizeof(cmd));
/* Byte 0..3: Command Block Wrapper (CBW) signature */
cmd[0] = 0x55;
cmd[1] = 0x53;
cmd[2] = 0x42;
cmd[3] = 0x43;
set_cbw(cmd);
/* 4..7: CBW Tag, has to unique, but only a single transfer used. */
cmd[4] = 0x01;
/* 8..11: CBW Transfer Length, no data here */
@ -372,10 +380,7 @@ u3g_bulk_ata_eject(usbd_device_handle dev)
memset(cmd, 0, sizeof(cmd));
/* Byte 0..3: Command Block Wrapper (CBW) signature */
cmd[0] = 0x55;
cmd[1] = 0x53;
cmd[2] = 0x42;
cmd[3] = 0x43;
set_cbw(cmd);
/* 4..7: CBW Tag, has to unique, but only a single transfer used. */
cmd[4] = 0x01;
/* 8..11: CBW Transfer Length, no data here */
@ -455,16 +460,14 @@ u3g_huawei_k3765_reinit(usbd_device_handle dev)
/* magic string adapted from some webpage */
memset(cmd, 0, sizeof(cmd));
cmd[0] = 0x55;
cmd[1] = 0x53;
cmd[2] = 0x42;
cmd[3] = 0x43;
/* Byte 0..3: Command Block Wrapper (CBW) signature */
set_cbw(cmd);
cmd[15]= 0x11;
cmd[16]= 0x06;
return send_bulkmsg(dev, cmd, sizeof(cmd));
}
static int
u3g_huawei_e171_reinit(usbd_device_handle dev)
{
@ -472,10 +475,9 @@ u3g_huawei_e171_reinit(usbd_device_handle dev)
/* magic string adapted from some webpage */
memset(cmd, 0, sizeof(cmd));
cmd[0] = 0x55;
cmd[1] = 0x53;
cmd[2] = 0x42;
cmd[3] = 0x43;
/* Byte 0..3: Command Block Wrapper (CBW) signature */
set_cbw(cmd);
cmd[15]= 0x11;
cmd[16]= 0x06;
cmd[17]= 0x20;
@ -484,6 +486,28 @@ u3g_huawei_e171_reinit(usbd_device_handle dev)
return send_bulkmsg(dev, cmd, sizeof(cmd));
}
static int
u3g_huawei_e353_reinit(usbd_device_handle dev)
{
unsigned char cmd[31];
/* magic string adapted from some webpage */
memset(cmd, 0, sizeof(cmd));
/* Byte 0..3: Command Block Wrapper (CBW) signature */
set_cbw(cmd);
cmd[4] = 0x7f;
cmd[9] = 0x02;
cmd[12] = 0x80;
cmd[14] = 0x0a;
cmd[15] = 0x11;
cmd[16] = 0x06;
cmd[17] = 0x20;
cmd[23] = 0x01;
return send_bulkmsg(dev, cmd, sizeof(cmd));
}
static int
u3g_sierra_reinit(usbd_device_handle dev)
{
@ -508,12 +532,25 @@ static int
u3g_4gsystems_reinit(usbd_device_handle dev)
{
/* magic string adapted from usb_modeswitch database */
static unsigned char cmd[31] = {
0x55, 0x53, 0x42, 0x43, 0x12, 0x34, 0x56, 0x78, 0x80, 0x00,
0x00, 0x00, 0x80, 0x00, 0x06, 0x06, 0xf5, 0x04, 0x02, 0x52,
0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00
};
unsigned char cmd[31];
memset(cmd, 0, sizeof(cmd));
/* Byte 0..3: Command Block Wrapper (CBW) signature */
set_cbw(cmd);
cmd[4] = 0x12;
cmd[5] = 0x34;
cmd[6] = 0x56;
cmd[7] = 0x78;
cmd[8] = 0x80;
cmd[12] = 0x80;
cmd[14] = 0x06;
cmd[15] = 0x06;
cmd[16] = 0xf5;
cmd[17] = 0x04;
cmd[18] = 0x02;
cmd[19] = 0x52;
cmd[20] = 0x70;
return send_bulkmsg(dev, cmd, sizeof(cmd));
}
@ -545,6 +582,9 @@ u3ginit_match(device_t parent, cfdata_t match, void *aux)
case USB_PRODUCT_HUAWEI_E171INIT:
return u3g_huawei_e171_reinit(uaa->device);
break;
case USB_PRODUCT_HUAWEI_E353INIT:
return u3g_huawei_e353_reinit(uaa->device);
break;
default:
return u3g_huawei_reinit(uaa->device);
break;

View File

@ -1,4 +1,4 @@
$NetBSD: usbdevs,v 1.681 2014/09/24 00:11:43 christos Exp $
$NetBSD: usbdevs,v 1.682 2014/09/24 00:17:13 christos Exp $
/*
* Copyright (c) 1998-2004 The NetBSD Foundation, Inc.
@ -1733,7 +1733,9 @@ product HUAWEI K3765 0x1465 Huawei K3765
product HUAWEI E1820 0x14ac Huawei E1820
product HUAWEI E171INIT 0x14fe Huawei E171 USB CD
product HUAWEI E171 0x1506 Huawei E171
product HUAWEI E353 0x1507 Huawei E353
product HUAWEI K3765INIT 0x1520 Huawei K3765 USB CD
product HUAWEI E353INIT 0x1f01 Huawei E353 USB CD
/* Huawei-3Com products */
product HUAWEI3COM RT2573 0x0009 RT2573