Auto merge with /home/aegl/GIT/linus
[powerpc.git] / drivers / usb / atm / usbatm.c
index e134e27..bb1db19 100644 (file)
@@ -298,7 +298,6 @@ static void usbatm_extract_cells(struct usbatm_data *instance,
        struct usbatm_vcc_data *cached_vcc = NULL;
        struct atm_vcc *vcc;
        struct sk_buff *sarb;
-       struct usbatm_vcc_data *vcc_data;
        unsigned int stride = instance->rx_channel.stride;
        int vci, cached_vci = 0;
        short vpi, cached_vpi = 0;
@@ -311,18 +310,20 @@ static void usbatm_extract_cells(struct usbatm_data *instance,
 
                vdbg("%s: vpi %hd, vci %d, pti %d", __func__, vpi, vci, pti);
 
-               if (cached_vcc && (vci == cached_vci) && (vpi == cached_vpi))
-                       vcc_data = cached_vcc;
-               else if ((vcc_data = usbatm_find_vcc(instance, vpi, vci))) {
-                       cached_vcc = vcc_data;
+               if ((vci != cached_vci) || (vpi != cached_vpi)) {
                        cached_vpi = vpi;
                        cached_vci = vci;
-               } else {
-                       atm_dbg(instance, "%s: unknown vpi/vci (%hd/%d)!\n", __func__, vpi, vci);
-                       continue;
+
+                       cached_vcc = usbatm_find_vcc(instance, vpi, vci);
+
+                       if (!cached_vcc)
+                               atm_dbg(instance, "%s: unknown vpi/vci (%hd/%d)!\n", __func__, vpi, vci);
                }
 
-               vcc = vcc_data->vcc;
+               if (!cached_vcc)
+                       continue;
+
+               vcc = cached_vcc->vcc;
 
                /* OAM F5 end-to-end */
                if (pti == ATM_PTI_E2EF5) {
@@ -331,7 +332,7 @@ static void usbatm_extract_cells(struct usbatm_data *instance,
                        continue;
                }
 
-               sarb = vcc_data->sarb;
+               sarb = cached_vcc->sarb;
 
                if (sarb->tail + ATM_CELL_PAYLOAD > sarb->end) {
                        atm_dbg(instance, "%s: buffer overrun (sarb->len %u, vcc: 0x%p)!\n",
@@ -959,15 +960,12 @@ int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,
                        intf->altsetting->desc.bInterfaceNumber);
 
        /* instance init */
-       instance = kmalloc(sizeof(*instance) + sizeof(struct urb *) * (num_rcv_urbs + num_snd_urbs),
-                          GFP_KERNEL);
+       instance = kcalloc(1, sizeof(*instance) + sizeof(struct urb *) * (num_rcv_urbs + num_snd_urbs), GFP_KERNEL);
        if (!instance) {
                dev_dbg(dev, "%s: no memory for instance data!\n", __func__);
                return -ENOMEM;
        }
 
-       memset(instance, 0, sizeof(*instance));
-
        /* public fields */
 
        instance->driver = driver;
@@ -1050,6 +1048,8 @@ int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,
                        goto fail_unbind;
                }
 
+               instance->urbs[i] = urb;
+
                buffer = kmalloc(channel->buf_size, GFP_KERNEL);
                if (!buffer) {
                        dev_dbg(dev, "%s: no memory for buffer %d!\n", __func__, i);
@@ -1077,7 +1077,6 @@ int usbatm_usb_probe(struct usb_interface *intf, const struct usb_device_id *id,
 
                vdbg("%s: alloced buffer 0x%p buf size %u urb 0x%p",
                     __func__, urb->transfer_buffer, urb->transfer_buffer_length, urb);
-               instance->urbs[i] = urb;
        }
 
        if (need_heavy && driver->heavy_init) {