Merge tag 'binfmt-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb...
[deliverable/linux.git] / drivers / usb / serial / io_edgeport.c
index f3007ecdd1b47b1d438ecde4fdcd15be47dc714a..11c05ce2f35f8cd8ffe1ea46b0f6b0fed83e5064 100644 (file)
@@ -2849,14 +2849,16 @@ static int edge_startup(struct usb_serial *serial)
                                /* not set up yet, so do it now */
                                edge_serial->interrupt_read_urb =
                                                usb_alloc_urb(0, GFP_KERNEL);
-                               if (!edge_serial->interrupt_read_urb)
-                                       return -ENOMEM;
+                               if (!edge_serial->interrupt_read_urb) {
+                                       response = -ENOMEM;
+                                       break;
+                               }
 
                                edge_serial->interrupt_in_buffer =
                                        kmalloc(buffer_size, GFP_KERNEL);
                                if (!edge_serial->interrupt_in_buffer) {
-                                       usb_free_urb(edge_serial->interrupt_read_urb);
-                                       return -ENOMEM;
+                                       response = -ENOMEM;
+                                       break;
                                }
                                edge_serial->interrupt_in_endpoint =
                                                endpoint->bEndpointAddress;
@@ -2884,14 +2886,16 @@ static int edge_startup(struct usb_serial *serial)
                                /* not set up yet, so do it now */
                                edge_serial->read_urb =
                                                usb_alloc_urb(0, GFP_KERNEL);
-                               if (!edge_serial->read_urb)
-                                       return -ENOMEM;
+                               if (!edge_serial->read_urb) {
+                                       response = -ENOMEM;
+                                       break;
+                               }
 
                                edge_serial->bulk_in_buffer =
                                        kmalloc(buffer_size, GFP_KERNEL);
                                if (!edge_serial->bulk_in_buffer) {
-                                       usb_free_urb(edge_serial->read_urb);
-                                       return -ENOMEM;
+                                       response = -ENOMEM;
+                                       break;
                                }
                                edge_serial->bulk_in_endpoint =
                                                endpoint->bEndpointAddress;
@@ -2917,9 +2921,22 @@ static int edge_startup(struct usb_serial *serial)
                        }
                }
 
-               if (!interrupt_in_found || !bulk_in_found || !bulk_out_found) {
-                       dev_err(ddev, "Error - the proper endpoints were not found!\n");
-                       return -ENODEV;
+               if (response || !interrupt_in_found || !bulk_in_found ||
+                                                       !bulk_out_found) {
+                       if (!response) {
+                               dev_err(ddev, "expected endpoints not found\n");
+                               response = -ENODEV;
+                       }
+
+                       usb_free_urb(edge_serial->interrupt_read_urb);
+                       kfree(edge_serial->interrupt_in_buffer);
+
+                       usb_free_urb(edge_serial->read_urb);
+                       kfree(edge_serial->bulk_in_buffer);
+
+                       kfree(edge_serial);
+
+                       return response;
                }
 
                /* start interrupt read for this edgeport this interrupt will
@@ -2942,16 +2959,9 @@ static void edge_disconnect(struct usb_serial *serial)
 {
        struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
 
-       /* stop reads and writes on all ports */
-       /* free up our endpoint stuff */
        if (edge_serial->is_epic) {
                usb_kill_urb(edge_serial->interrupt_read_urb);
-               usb_free_urb(edge_serial->interrupt_read_urb);
-               kfree(edge_serial->interrupt_in_buffer);
-
                usb_kill_urb(edge_serial->read_urb);
-               usb_free_urb(edge_serial->read_urb);
-               kfree(edge_serial->bulk_in_buffer);
        }
 }
 
@@ -2964,6 +2974,16 @@ static void edge_release(struct usb_serial *serial)
 {
        struct edgeport_serial *edge_serial = usb_get_serial_data(serial);
 
+       if (edge_serial->is_epic) {
+               usb_kill_urb(edge_serial->interrupt_read_urb);
+               usb_free_urb(edge_serial->interrupt_read_urb);
+               kfree(edge_serial->interrupt_in_buffer);
+
+               usb_kill_urb(edge_serial->read_urb);
+               usb_free_urb(edge_serial->read_urb);
+               kfree(edge_serial->bulk_in_buffer);
+       }
+
        kfree(edge_serial);
 }
 
This page took 0.027811 seconds and 5 git commands to generate.