2121#include <linux/uaccess.h>
2222#include <linux/bitops.h>
2323#include <linux/poll.h>
24+ #include <linux/skbuff.h>
2425#include <linux/usb.h>
2526#include <linux/usb/cdc.h>
27+ #include <linux/wwan.h>
2628#include <asm/byteorder.h>
2729#include <asm/unaligned.h>
2830#include <linux/usb/cdc-wdm.h>
@@ -55,6 +57,7 @@ MODULE_DEVICE_TABLE (usb, wdm_ids);
5557#define WDM_SUSPENDING 8
5658#define WDM_RESETTING 9
5759#define WDM_OVERFLOW 10
60+ #define WDM_WWAN_IN_USE 11
5861
5962#define WDM_MAX 16
6063
@@ -106,6 +109,9 @@ struct wdm_device {
106109
107110 struct list_head device_list ;
108111 int (* manage_power )(struct usb_interface * , int );
112+
113+ enum wwan_port_type wwanp_type ;
114+ struct wwan_port * wwanp ;
109115};
110116
111117static struct usb_driver wdm_driver ;
@@ -157,6 +163,8 @@ static void wdm_out_callback(struct urb *urb)
157163 wake_up_all (& desc -> wait );
158164}
159165
166+ static void wdm_wwan_rx (struct wdm_device * desc , int length );
167+
160168static void wdm_in_callback (struct urb * urb )
161169{
162170 unsigned long flags ;
@@ -192,6 +200,11 @@ static void wdm_in_callback(struct urb *urb)
192200 }
193201 }
194202
203+ if (test_bit (WDM_WWAN_IN_USE , & desc -> flags )) {
204+ wdm_wwan_rx (desc , length );
205+ goto out ;
206+ }
207+
195208 /*
196209 * only set a new error if there is no previous error.
197210 * Errors are only cleared during read/open
@@ -226,6 +239,7 @@ static void wdm_in_callback(struct urb *urb)
226239 set_bit (WDM_READ , & desc -> flags );
227240 wake_up (& desc -> wait );
228241 }
242+ out :
229243 spin_unlock_irqrestore (& desc -> iuspin , flags );
230244}
231245
@@ -697,6 +711,11 @@ static int wdm_open(struct inode *inode, struct file *file)
697711 goto out ;
698712 file -> private_data = desc ;
699713
714+ if (test_bit (WDM_WWAN_IN_USE , & desc -> flags )) {
715+ rv = - EBUSY ;
716+ goto out ;
717+ }
718+
700719 rv = usb_autopm_get_interface (desc -> intf );
701720 if (rv < 0 ) {
702721 dev_err (& desc -> intf -> dev , "Error autopm - %d\n" , rv );
@@ -792,6 +811,151 @@ static struct usb_class_driver wdm_class = {
792811 .minor_base = WDM_MINOR_BASE ,
793812};
794813
814+ /* --- WWAN framework integration --- */
815+ #ifdef CONFIG_WWAN
816+ static int wdm_wwan_port_start (struct wwan_port * port )
817+ {
818+ struct wdm_device * desc = wwan_port_get_drvdata (port );
819+
820+ /* The interface is both exposed via the WWAN framework and as a
821+ * legacy usbmisc chardev. If chardev is already open, just fail
822+ * to prevent concurrent usage. Otherwise, switch to WWAN mode.
823+ */
824+ mutex_lock (& wdm_mutex );
825+ if (desc -> count ) {
826+ mutex_unlock (& wdm_mutex );
827+ return - EBUSY ;
828+ }
829+ set_bit (WDM_WWAN_IN_USE , & desc -> flags );
830+ mutex_unlock (& wdm_mutex );
831+
832+ desc -> manage_power (desc -> intf , 1 );
833+
834+ /* tx is allowed */
835+ wwan_port_txon (port );
836+
837+ /* Start getting events */
838+ return usb_submit_urb (desc -> validity , GFP_KERNEL );
839+ }
840+
841+ static void wdm_wwan_port_stop (struct wwan_port * port )
842+ {
843+ struct wdm_device * desc = wwan_port_get_drvdata (port );
844+
845+ /* Stop all transfers and disable WWAN mode */
846+ kill_urbs (desc );
847+ desc -> manage_power (desc -> intf , 0 );
848+ clear_bit (WDM_READ , & desc -> flags );
849+ clear_bit (WDM_WWAN_IN_USE , & desc -> flags );
850+ }
851+
852+ static void wdm_wwan_port_tx_complete (struct urb * urb )
853+ {
854+ struct sk_buff * skb = urb -> context ;
855+ struct wdm_device * desc = skb_shinfo (skb )-> destructor_arg ;
856+
857+ usb_autopm_put_interface (desc -> intf );
858+ wwan_port_txon (desc -> wwanp );
859+ kfree_skb (skb );
860+ }
861+
862+ static int wdm_wwan_port_tx (struct wwan_port * port , struct sk_buff * skb )
863+ {
864+ struct wdm_device * desc = wwan_port_get_drvdata (port );
865+ struct usb_interface * intf = desc -> intf ;
866+ struct usb_ctrlrequest * req = desc -> orq ;
867+ int rv ;
868+
869+ rv = usb_autopm_get_interface (intf );
870+ if (rv )
871+ return rv ;
872+
873+ usb_fill_control_urb (
874+ desc -> command ,
875+ interface_to_usbdev (intf ),
876+ usb_sndctrlpipe (interface_to_usbdev (intf ), 0 ),
877+ (unsigned char * )req ,
878+ skb -> data ,
879+ skb -> len ,
880+ wdm_wwan_port_tx_complete ,
881+ skb
882+ );
883+
884+ req -> bRequestType = (USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE );
885+ req -> bRequest = USB_CDC_SEND_ENCAPSULATED_COMMAND ;
886+ req -> wValue = 0 ;
887+ req -> wIndex = desc -> inum ;
888+ req -> wLength = cpu_to_le16 (skb -> len );
889+
890+ skb_shinfo (skb )-> destructor_arg = desc ;
891+
892+ rv = usb_submit_urb (desc -> command , GFP_KERNEL );
893+ if (rv )
894+ usb_autopm_put_interface (intf );
895+ else /* One transfer at a time, stop TX until URB completion */
896+ wwan_port_txoff (port );
897+
898+ return rv ;
899+ }
900+
901+ static struct wwan_port_ops wdm_wwan_port_ops = {
902+ .start = wdm_wwan_port_start ,
903+ .stop = wdm_wwan_port_stop ,
904+ .tx = wdm_wwan_port_tx ,
905+ };
906+
907+ static void wdm_wwan_init (struct wdm_device * desc )
908+ {
909+ struct usb_interface * intf = desc -> intf ;
910+ struct wwan_port * port ;
911+
912+ /* Only register to WWAN core if protocol/type is known */
913+ if (desc -> wwanp_type == WWAN_PORT_UNKNOWN ) {
914+ dev_info (& intf -> dev , "Unknown control protocol\n" );
915+ return ;
916+ }
917+
918+ port = wwan_create_port (& intf -> dev , desc -> wwanp_type , & wdm_wwan_port_ops , desc );
919+ if (IS_ERR (port )) {
920+ dev_err (& intf -> dev , "%s: Unable to create WWAN port\n" ,
921+ dev_name (intf -> usb_dev ));
922+ return ;
923+ }
924+
925+ desc -> wwanp = port ;
926+ }
927+
928+ static void wdm_wwan_deinit (struct wdm_device * desc )
929+ {
930+ if (!desc -> wwanp )
931+ return ;
932+
933+ wwan_remove_port (desc -> wwanp );
934+ desc -> wwanp = NULL ;
935+ }
936+
937+ static void wdm_wwan_rx (struct wdm_device * desc , int length )
938+ {
939+ struct wwan_port * port = desc -> wwanp ;
940+ struct sk_buff * skb ;
941+
942+ /* Forward data to WWAN port */
943+ skb = alloc_skb (length , GFP_ATOMIC );
944+ if (!skb )
945+ return ;
946+
947+ memcpy (skb_put (skb , length ), desc -> inbuf , length );
948+ wwan_port_rx (port , skb );
949+
950+ /* inbuf has been copied, it is safe to check for outstanding data */
951+ schedule_work (& desc -> service_outs_intr );
952+ }
953+ #else /* CONFIG_WWAN */
954+ static void wdm_wwan_init (struct wdm_device * desc ) {}
955+ static void wdm_wwan_deinit (struct wdm_device * desc ) {}
956+ static void wdm_wwan_rx (struct wdm_device * desc , int length ) {}
957+ #endif /* CONFIG_WWAN */
958+
795959/* --- error handling --- */
796960static void wdm_rxwork (struct work_struct * work )
797961{
@@ -836,7 +1000,8 @@ static void service_interrupt_work(struct work_struct *work)
8361000/* --- hotplug --- */
8371001
8381002static int wdm_create (struct usb_interface * intf , struct usb_endpoint_descriptor * ep ,
839- u16 bufsize , int (* manage_power )(struct usb_interface * , int ))
1003+ u16 bufsize , enum wwan_port_type type ,
1004+ int (* manage_power )(struct usb_interface * , int ))
8401005{
8411006 int rv = - ENOMEM ;
8421007 struct wdm_device * desc ;
@@ -853,6 +1018,7 @@ static int wdm_create(struct usb_interface *intf, struct usb_endpoint_descriptor
8531018 /* this will be expanded and needed in hardware endianness */
8541019 desc -> inum = cpu_to_le16 ((u16 )intf -> cur_altsetting -> desc .bInterfaceNumber );
8551020 desc -> intf = intf ;
1021+ desc -> wwanp_type = type ;
8561022 INIT_WORK (& desc -> rxwork , wdm_rxwork );
8571023 INIT_WORK (& desc -> service_outs_intr , service_interrupt_work );
8581024
@@ -933,6 +1099,9 @@ static int wdm_create(struct usb_interface *intf, struct usb_endpoint_descriptor
9331099 goto err ;
9341100 else
9351101 dev_info (& intf -> dev , "%s: USB WDM device\n" , dev_name (intf -> usb_dev ));
1102+
1103+ wdm_wwan_init (desc );
1104+
9361105out :
9371106 return rv ;
9381107err :
@@ -977,7 +1146,7 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
9771146 goto err ;
9781147 ep = & iface -> endpoint [0 ].desc ;
9791148
980- rv = wdm_create (intf , ep , maxcom , & wdm_manage_power );
1149+ rv = wdm_create (intf , ep , maxcom , WWAN_PORT_UNKNOWN , & wdm_manage_power );
9811150
9821151err :
9831152 return rv ;
@@ -988,6 +1157,7 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
9881157 * @intf: usb interface the subdriver will associate with
9891158 * @ep: interrupt endpoint to monitor for notifications
9901159 * @bufsize: maximum message size to support for read/write
1160+ * @type: Type/protocol of the transported data (MBIM, QMI...)
9911161 * @manage_power: call-back invoked during open and release to
9921162 * manage the device's power
9931163 * Create WDM usb class character device and associate it with intf
@@ -1005,12 +1175,12 @@ static int wdm_probe(struct usb_interface *intf, const struct usb_device_id *id)
10051175 */
10061176struct usb_driver * usb_cdc_wdm_register (struct usb_interface * intf ,
10071177 struct usb_endpoint_descriptor * ep ,
1008- int bufsize ,
1178+ int bufsize , enum wwan_port_type type ,
10091179 int (* manage_power )(struct usb_interface * , int ))
10101180{
10111181 int rv ;
10121182
1013- rv = wdm_create (intf , ep , bufsize , manage_power );
1183+ rv = wdm_create (intf , ep , bufsize , type , manage_power );
10141184 if (rv < 0 )
10151185 goto err ;
10161186
@@ -1029,6 +1199,8 @@ static void wdm_disconnect(struct usb_interface *intf)
10291199 desc = wdm_find_device (intf );
10301200 mutex_lock (& wdm_mutex );
10311201
1202+ wdm_wwan_deinit (desc );
1203+
10321204 /* the spinlock makes sure no new urbs are generated in the callbacks */
10331205 spin_lock_irqsave (& desc -> iuspin , flags );
10341206 set_bit (WDM_DISCONNECTING , & desc -> flags );
0 commit comments