diff options
| author | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-06-25 09:52:59 +0100 | 
|---|---|---|
| committer | Mark Brown <broonie@opensource.wolfsonmicro.com> | 2012-06-25 09:52:59 +0100 | 
| commit | d1e16c1a61d68692dba346f4a841315343b085f4 (patch) | |
| tree | 249ec07d1489769fe83b4ec507708455cc0c5138 /drivers/usb/serial/option.c | |
| parent | 1573ee81cb9ef24fa5acee6b7442e215e63ede2f (diff) | |
| parent | 6b16351acbd415e66ba16bf7d473ece1574cf0bc (diff) | |
| download | olio-linux-3.10-d1e16c1a61d68692dba346f4a841315343b085f4.tar.xz olio-linux-3.10-d1e16c1a61d68692dba346f4a841315343b085f4.zip  | |
Merge tag 'v3.5-rc4' into for-3.6
Linux 3.5-rc4 contains some bug fixes which overlap with new features.
Diffstat (limited to 'drivers/usb/serial/option.c')
| -rw-r--r-- | drivers/usb/serial/option.c | 92 | 
1 files changed, 45 insertions, 47 deletions
diff --git a/drivers/usb/serial/option.c b/drivers/usb/serial/option.c index 1aae9028cd0..e668a2460bd 100644 --- a/drivers/usb/serial/option.c +++ b/drivers/usb/serial/option.c @@ -47,6 +47,7 @@  /* Function prototypes */  static int  option_probe(struct usb_serial *serial,  			const struct usb_device_id *id); +static void option_release(struct usb_serial *serial);  static int option_send_setup(struct usb_serial_port *port);  static void option_instat_callback(struct urb *urb); @@ -150,6 +151,7 @@ static void option_instat_callback(struct urb *urb);  #define HUAWEI_PRODUCT_E14AC			0x14AC  #define HUAWEI_PRODUCT_K3806			0x14AE  #define HUAWEI_PRODUCT_K4605			0x14C6 +#define HUAWEI_PRODUCT_K5005			0x14C8  #define HUAWEI_PRODUCT_K3770			0x14C9  #define HUAWEI_PRODUCT_K3771			0x14CA  #define HUAWEI_PRODUCT_K4510			0x14CB @@ -425,7 +427,7 @@ static void option_instat_callback(struct urb *urb);  #define SAMSUNG_VENDOR_ID                       0x04e8  #define SAMSUNG_PRODUCT_GT_B3730                0x6889 -/* YUGA products  www.yuga-info.com*/ +/* YUGA products  www.yuga-info.com gavin.kx@qq.com */  #define YUGA_VENDOR_ID				0x257A  #define YUGA_PRODUCT_CEM600			0x1601  #define YUGA_PRODUCT_CEM610			0x1602 @@ -442,6 +444,8 @@ static void option_instat_callback(struct urb *urb);  #define YUGA_PRODUCT_CEU516			0x160C  #define YUGA_PRODUCT_CEU528			0x160D  #define YUGA_PRODUCT_CEU526			0x160F +#define YUGA_PRODUCT_CEU881			0x161F +#define YUGA_PRODUCT_CEU882			0x162F  #define YUGA_PRODUCT_CWM600			0x2601  #define YUGA_PRODUCT_CWM610			0x2602 @@ -457,23 +461,26 @@ static void option_instat_callback(struct urb *urb);  #define YUGA_PRODUCT_CWU518			0x260B  #define YUGA_PRODUCT_CWU516			0x260C  #define YUGA_PRODUCT_CWU528			0x260D +#define YUGA_PRODUCT_CWU581			0x260E  #define YUGA_PRODUCT_CWU526			0x260F +#define YUGA_PRODUCT_CWU582			0x261F +#define YUGA_PRODUCT_CWU583			0x262F -#define YUGA_PRODUCT_CLM600			0x2601 -#define YUGA_PRODUCT_CLM610			0x2602 -#define YUGA_PRODUCT_CLM500			0x2603 -#define YUGA_PRODUCT_CLM510			0x2604 -#define YUGA_PRODUCT_CLM800			0x2605 -#define YUGA_PRODUCT_CLM900			0x2606 +#define YUGA_PRODUCT_CLM600			0x3601 +#define YUGA_PRODUCT_CLM610			0x3602 +#define YUGA_PRODUCT_CLM500			0x3603 +#define YUGA_PRODUCT_CLM510			0x3604 +#define YUGA_PRODUCT_CLM800			0x3605 +#define YUGA_PRODUCT_CLM900			0x3606 -#define YUGA_PRODUCT_CLU718			0x2607 -#define YUGA_PRODUCT_CLU716			0x2608 -#define YUGA_PRODUCT_CLU728			0x2609 -#define YUGA_PRODUCT_CLU726			0x260A -#define YUGA_PRODUCT_CLU518			0x260B -#define YUGA_PRODUCT_CLU516			0x260C -#define YUGA_PRODUCT_CLU528			0x260D -#define YUGA_PRODUCT_CLU526			0x260F +#define YUGA_PRODUCT_CLU718			0x3607 +#define YUGA_PRODUCT_CLU716			0x3608 +#define YUGA_PRODUCT_CLU728			0x3609 +#define YUGA_PRODUCT_CLU726			0x360A +#define YUGA_PRODUCT_CLU518			0x360B +#define YUGA_PRODUCT_CLU516			0x360C +#define YUGA_PRODUCT_CLU528			0x360D +#define YUGA_PRODUCT_CLU526			0x360F  /* Viettel products */  #define VIETTEL_VENDOR_ID			0x2262 @@ -666,6 +673,11 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3806, 0xff, 0xff, 0xff) },  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0xff, 0xff),  		.driver_info = (kernel_ulong_t) &huawei_cdc12_blacklist }, +	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0x01, 0x31) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K4605, 0xff, 0x01, 0x32) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x31) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x32) }, +	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K5005, 0xff, 0x01, 0x33) },  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x31) },  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3770, 0xff, 0x02, 0x32) },  	{ USB_DEVICE_AND_INTERFACE_INFO(HUAWEI_VENDOR_ID, HUAWEI_PRODUCT_K3771, 0xff, 0x02, 0x31) }, @@ -1209,6 +1221,11 @@ static const struct usb_device_id option_ids[] = {  	{ USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU516) },  	{ USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU528) },  	{ USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CLU526) }, +	{ USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU881) }, +	{ USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CEU882) }, +	{ USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU581) }, +	{ USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU582) }, +	{ USB_DEVICE(YUGA_VENDOR_ID, YUGA_PRODUCT_CWU583) },  	{ USB_DEVICE_AND_INTERFACE_INFO(VIETTEL_VENDOR_ID, VIETTEL_PRODUCT_VT1000, 0xff, 0xff, 0xff) },  	{ USB_DEVICE_AND_INTERFACE_INFO(ZD_VENDOR_ID, ZD_PRODUCT_7000, 0xff, 0xff, 0xff) },  	{ USB_DEVICE(LG_VENDOR_ID, LG_PRODUCT_L02C) }, /* docomo L-02C modem */ @@ -1245,7 +1262,7 @@ static struct usb_serial_driver option_1port_device = {  	.ioctl             = usb_wwan_ioctl,  	.attach            = usb_wwan_startup,  	.disconnect        = usb_wwan_disconnect, -	.release           = usb_wwan_release, +	.release           = option_release,  	.read_int_callback = option_instat_callback,  #ifdef CONFIG_PM  	.suspend           = usb_wwan_suspend, @@ -1259,35 +1276,6 @@ static struct usb_serial_driver * const serial_drivers[] = {  static bool debug; -/* per port private data */ - -#define N_IN_URB 4 -#define N_OUT_URB 4 -#define IN_BUFLEN 4096 -#define OUT_BUFLEN 4096 - -struct option_port_private { -	/* Input endpoints and buffer for this port */ -	struct urb *in_urbs[N_IN_URB]; -	u8 *in_buffer[N_IN_URB]; -	/* Output endpoints and buffer for this port */ -	struct urb *out_urbs[N_OUT_URB]; -	u8 *out_buffer[N_OUT_URB]; -	unsigned long out_busy;		/* Bit vector of URBs in use */ -	int opened; -	struct usb_anchor delayed; - -	/* Settings for the port */ -	int rts_state;	/* Handshaking pins (outputs) */ -	int dtr_state; -	int cts_state;	/* Handshaking pins (inputs) */ -	int dsr_state; -	int dcd_state; -	int ri_state; - -	unsigned long tx_start_time[N_OUT_URB]; -}; -  module_usb_serial_driver(serial_drivers, option_ids);  static bool is_blacklisted(const u8 ifnum, enum option_blacklist_reason reason, @@ -1356,12 +1344,22 @@ static int option_probe(struct usb_serial *serial,  	return 0;  } +static void option_release(struct usb_serial *serial) +{ +	struct usb_wwan_intf_private *priv = usb_get_serial_data(serial); + +	usb_wwan_release(serial); + +	kfree(priv); +} +  static void option_instat_callback(struct urb *urb)  {  	int err;  	int status = urb->status;  	struct usb_serial_port *port =  urb->context; -	struct option_port_private *portdata = usb_get_serial_port_data(port); +	struct usb_wwan_port_private *portdata = +					usb_get_serial_port_data(port);  	dbg("%s: urb %p port %p has data %p", __func__, urb, port, portdata); @@ -1421,7 +1419,7 @@ static int option_send_setup(struct usb_serial_port *port)  	struct usb_serial *serial = port->serial;  	struct usb_wwan_intf_private *intfdata =  		(struct usb_wwan_intf_private *) serial->private; -	struct option_port_private *portdata; +	struct usb_wwan_port_private *portdata;  	int ifNum = serial->interface->cur_altsetting->desc.bInterfaceNumber;  	int val = 0;  |