struct usb_interface *uif;
        struct em28xx *dev = NULL;
        int retval = -ENODEV;
-       int i, nr, ifnum;
+       int i, nr, ifnum, isoc_pipe;
 
        udev = usb_get_dev(interface_to_usbdev(interface));
        ifnum = interface->altsetting[0].desc.bInterfaceNumber;
                        ifnum,
                        interface->altsetting[0].desc.bInterfaceClass);
 
-       endpoint = &interface->cur_altsetting->endpoint[1].desc;
+       endpoint = &interface->cur_altsetting->endpoint[0].desc;
 
        /* check if the device has the iso in endpoint at the correct place */
-       if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
-           USB_ENDPOINT_XFER_ISOC) {
-               em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n");
-               em28xx_devused &= ~(1<<nr);
-               return -ENODEV;
-       }
-       if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) {
-               em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n");
-               em28xx_devused &= ~(1<<nr);
-               return -ENODEV;
+       if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
+           USB_ENDPOINT_XFER_ISOC &&
+           (interface->altsetting[1].endpoint[0].desc.wMaxPacketSize == 940))
+       {
+               /* It's a newer em2874/em2875 device */
+               isoc_pipe = 0;
+       } else {
+               isoc_pipe = 1;
+               endpoint = &interface->cur_altsetting->endpoint[1].desc;
+               if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) !=
+                   USB_ENDPOINT_XFER_ISOC) {
+                       em28xx_err(DRIVER_NAME " probing error: endpoint is non-ISO endpoint!\n");
+                       em28xx_devused &= ~(1<<nr);
+                       return -ENODEV;
+               }
+               if ((endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK) == USB_DIR_OUT) {
+                       em28xx_err(DRIVER_NAME " probing error: endpoint is ISO OUT endpoint!\n");
+                       em28xx_devused &= ~(1<<nr);
+                       return -ENODEV;
+               }
        }
 
        if (nr >= EM28XX_MAXBOARDS) {
        }
 
        for (i = 0; i < dev->num_alt ; i++) {
-               u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[1].desc.
+               u16 tmp = le16_to_cpu(uif->altsetting[i].endpoint[isoc_pipe].desc.
                                                        wMaxPacketSize);
                dev->alt_max_pkt_size[i] =
                    (tmp & 0x07ff) * (((tmp & 0x1800) >> 11) + 1);