* eps, maxP is set by epautoconfig() called
                         * by gadget layer
                         */
-                       hwep->ep.maxpacket = (unsigned short)~0;
+                       usb_ep_set_maxpacket_limit(&hwep->ep, (unsigned short)~0);
 
                        INIT_LIST_HEAD(&hwep->qh.queue);
                        hwep->qh.ptr = dma_pool_alloc(ci->qh_pool, GFP_KERNEL,
                                else
                                        ci->ep0in = hwep;
 
-                               hwep->ep.maxpacket = CTRL_PAYLOAD_MAX;
+                               usb_ep_set_maxpacket_limit(&hwep->ep, CTRL_PAYLOAD_MAX);
                                continue;
                        }
 
 
                dev_vdbg(dwc->dev, "initializing %s\n", dep->name);
 
                if (epnum == 0 || epnum == 1) {
-                       dep->endpoint.maxpacket = 512;
+                       usb_ep_set_maxpacket_limit(&dep->endpoint, 512);
                        dep->endpoint.maxburst = 1;
                        dep->endpoint.ops = &dwc3_gadget_ep0_ops;
                        if (!epnum)
                } else {
                        int             ret;
 
-                       dep->endpoint.maxpacket = 1024;
+                       usb_ep_set_maxpacket_limit(&dep->endpoint, 1024);
                        dep->endpoint.max_streams = 15;
                        dep->endpoint.ops = &dwc3_gadget_ep_ops;
                        list_add_tail(&dep->endpoint.ep_list,
 
        ep->ep.ops = &udc_ep_ops;
        INIT_LIST_HEAD(&ep->queue);
 
-       ep->ep.maxpacket = (u16) ~0;
+       usb_ep_set_maxpacket_limit(&ep->ep,(u16) ~0);
        /* set NAK */
        tmp = readl(&ep->regs->ctl);
        tmp |= AMD_BIT(UDC_EPCTL_SNAK);
        }
        /* EP0 max packet */
        if (dev->gadget.speed == USB_SPEED_FULL) {
-               dev->ep[UDC_EP0IN_IX].ep.maxpacket = UDC_FS_EP0IN_MAX_PKT_SIZE;
-               dev->ep[UDC_EP0OUT_IX].ep.maxpacket =
-                                               UDC_FS_EP0OUT_MAX_PKT_SIZE;
+               usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IX].ep,
+                                          UDC_FS_EP0IN_MAX_PKT_SIZE);
+               usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IX].ep,
+                                          UDC_FS_EP0OUT_MAX_PKT_SIZE);
        } else if (dev->gadget.speed == USB_SPEED_HIGH) {
-               dev->ep[UDC_EP0IN_IX].ep.maxpacket = UDC_EP0IN_MAX_PKT_SIZE;
-               dev->ep[UDC_EP0OUT_IX].ep.maxpacket = UDC_EP0OUT_MAX_PKT_SIZE;
+               usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IX].ep,
+                                          UDC_EP0IN_MAX_PKT_SIZE);
+               usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IX].ep,
+                                          UDC_EP0OUT_MAX_PKT_SIZE);
        }
 
        /*
 
                ep->ep.desc = NULL;
                ep->stopped = 0;
                ep->fifo_bank = 0;
-               ep->ep.maxpacket = ep->maxpacket;
+               usb_ep_set_maxpacket_limit(&ep->ep, ep->maxpacket);
                ep->creg = (void __iomem *) udc->udp_baseaddr + AT91_UDP_CSR(i);
                /* initialize one queue per endpoint */
                INIT_LIST_HEAD(&ep->queue);
 
        /* newer chips have more FIFO memory than rm9200 */
        if (cpu_is_at91sam9260() || cpu_is_at91sam9g20()) {
-               udc->ep[0].maxpacket = 64;
-               udc->ep[3].maxpacket = 64;
-               udc->ep[4].maxpacket = 512;
-               udc->ep[5].maxpacket = 512;
+               usb_ep_set_maxpacket_limit(&udc->ep[0], 64);
+               usb_ep_set_maxpacket_limit(&udc->ep[3], 64);
+               usb_ep_set_maxpacket_limit(&udc->ep[4], 512);
+               usb_ep_set_maxpacket_limit(&udc->ep[5], 512);
        } else if (cpu_is_at91sam9261() || cpu_is_at91sam9g10()) {
-               udc->ep[3].maxpacket = 64;
+               usb_ep_set_maxpacket_limit(&udc->ep[3], 64);
        } else if (cpu_is_at91sam9263()) {
-               udc->ep[0].maxpacket = 64;
-               udc->ep[3].maxpacket = 64;
+               usb_ep_set_maxpacket_limit(&udc->ep[0], 64);
+               usb_ep_set_maxpacket_limit(&udc->ep[3], 64);
        }
 
        udc->udp_baseaddr = ioremap(res->start, resource_size(res));
 
                ep->dma_regs = udc->regs + USBA_DMA_BASE(i);
                ep->fifo = udc->fifo + USBA_FIFO_BASE(i);
                ep->ep.ops = &usba_ep_ops;
-               ep->ep.maxpacket = ep->fifo_size;
+               usb_ep_set_maxpacket_limit(&ep->ep, ep->fifo_size);
                ep->udc = udc;
                INIT_LIST_HEAD(&ep->queue);
 
                ep->fifo = udc->fifo + USBA_FIFO_BASE(i);
                ep->ep.ops = &usba_ep_ops;
                ep->ep.name = pdata->ep[i].name;
-               ep->fifo_size = ep->ep.maxpacket = pdata->ep[i].fifo_size;
+               ep->fifo_size = pdata->ep[i].fifo_size;
+               usb_ep_set_maxpacket_limit(&ep->ep, ep->fifo_size);
                ep->udc = udc;
                INIT_LIST_HEAD(&ep->queue);
                ep->nr_banks = pdata->ep[i].nr_banks;
 
 
                if (idx < 0)
                        continue;
-               udc->bep[idx].ep.maxpacket = max_pkt;
+               usb_ep_set_maxpacket_limit(&udc->bep[idx].ep, max_pkt);
 
                val = (idx << USBD_CSR_EP_LOG_SHIFT) |
                      (cfg->dir << USBD_CSR_EP_DIR_SHIFT) |
                bep->ep.ops = &bcm63xx_udc_ep_ops;
                list_add_tail(&bep->ep.ep_list, &udc->gadget.ep_list);
                bep->halted = 0;
-               bep->ep.maxpacket = BCM63XX_MAX_CTRL_PKT;
+               usb_ep_set_maxpacket_limit(&bep->ep, BCM63XX_MAX_CTRL_PKT);
                bep->udc = udc;
                bep->ep.desc = NULL;
                INIT_LIST_HEAD(&bep->queue);
 
                list_add_tail(&ep->ep.ep_list, &dum->gadget.ep_list);
                ep->halted = ep->wedged = ep->already_seen =
                                ep->setup_stage = 0;
-               ep->ep.maxpacket = ~0;
+               usb_ep_set_maxpacket_limit(&ep->ep, ~0);
                ep->ep.max_streams = 16;
                ep->last_io = jiffies;
                ep->gadget = &dum->gadget;
 
         * and wants to know the maximum possible, provide the info.
         */
        if (desc->wMaxPacketSize == 0)
-               desc->wMaxPacketSize = cpu_to_le16(ep->maxpacket);
+               desc->wMaxPacketSize = cpu_to_le16(ep->maxpacket_limit);
 
        /* endpoint maxpacket size is an input parameter, except for bulk
         * where it's an output parameter representing the full speed limit.
 
        case USB_ENDPOINT_XFER_ISOC:
                /* ISO:  limit 1023 bytes full speed, 1024 high/super speed */
-               if (ep->maxpacket < max)
+               if (ep->maxpacket_limit < max)
                        return 0;
                if (!gadget_is_dualspeed(gadget) && max > 1023)
                        return 0;
 
        /* report (variable) full speed bulk maxpacket */
        if ((USB_ENDPOINT_XFER_BULK == type) && !ep_comp) {
-               int size = ep->maxpacket;
+               int size = ep->maxpacket_limit;
 
                /* min() doesn't work on bitfields with gcc-3.5 */
                if (size > 64)
 
                INIT_LIST_HEAD(&ep->queue);
                ep->ep.name = fotg210_ep_name[i];
                ep->ep.ops = &fotg210_ep_ops;
+               usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
        }
-       fotg210->ep[0]->ep.maxpacket = 0x40;
+       usb_ep_set_maxpacket_limit(&fotg210->ep[0]->ep, 0x40);
        fotg210->gadget.ep0 = &fotg210->ep[0]->ep;
        INIT_LIST_HEAD(&fotg210->gadget.ep0->ep_list);
 
 
 
        ep->ep.ops = &qe_ep_ops;
        ep->stopped = 1;
-       ep->ep.maxpacket = (unsigned short) ~0;
+       usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
        ep->ep.desc = NULL;
        ep->dir = 0xff;
        ep->epnum = (u8)pipe_num;
 
        /* for ep0: maxP defined in desc
         * for other eps, maxP is set by epautoconfig() called by gadget layer
         */
-       ep->ep.maxpacket = (unsigned short) ~0;
+       usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
 
        /* the queue lists any req for this ep */
        INIT_LIST_HEAD(&ep->queue);
         * for other eps, gadget layer called ep_enable with defined desc
         */
        udc_controller->eps[0].ep.desc = &fsl_ep0_desc;
-       udc_controller->eps[0].ep.maxpacket = USB_MAX_CTRL_PAYLOAD;
+       usb_ep_set_maxpacket_limit(&udc_controller->eps[0].ep,
+                                  USB_MAX_CTRL_PAYLOAD);
 
        /* setup the udc->eps[] for non-control endpoints and link
         * to gadget.ep_list */
 
                INIT_LIST_HEAD(&ep->queue);
                ep->ep.name = fusb300_ep_name[i];
                ep->ep.ops = &fusb300_ep_ops;
-               ep->ep.maxpacket = HS_BULK_MAX_PACKET_SIZE;
+               usb_ep_set_maxpacket_limit(&ep->ep, HS_BULK_MAX_PACKET_SIZE);
        }
-       fusb300->ep[0]->ep.maxpacket = HS_CTL_MAX_PACKET_SIZE;
+       usb_ep_set_maxpacket_limit(&fusb300->ep[0]->ep, HS_CTL_MAX_PACKET_SIZE);
        fusb300->ep[0]->epnum = 0;
        fusb300->gadget.ep0 = &fusb300->ep[0]->ep;
        INIT_LIST_HEAD(&fusb300->gadget.ep0->ep_list);
 
                }
        }
 
-       ep->ep.maxpacket = MAX_FIFO_SIZE;
+       usb_ep_set_maxpacket_limit(&ep->ep, MAX_FIFO_SIZE);
        ep->ep.desc = NULL;
        ep->stopped = 1;
        ep->irqs = 0;
        }
 
        dev->ep[0].reg_mode = NULL;
-       dev->ep[0].ep.maxpacket = MAX_EP0_SIZE;
+       usb_ep_set_maxpacket_limit(&dev->ep[0].ep, MAX_EP0_SIZE);
        list_del_init (&dev->ep[0].ep.ep_list);
 }
 
 
 
                if (i != 0)
                        list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
-               ep->ep.maxpacket = ep->maxpacket;
+               usb_ep_set_maxpacket_limit(&ep->ep, ep->maxpacket);
                INIT_LIST_HEAD(&ep->queue);
                ep->req_pending = 0;
        }
 
                INIT_LIST_HEAD(&ep->queue);
                ep->ep.name = m66592_ep_name[i];
                ep->ep.ops = &m66592_ep_ops;
-               ep->ep.maxpacket = 512;
+               usb_ep_set_maxpacket_limit(&ep->ep, 512);
        }
-       m66592->ep[0].ep.maxpacket = 64;
+       usb_ep_set_maxpacket_limit(&m66592->ep[0].ep, 64);
        m66592->ep[0].pipenum = 0;
        m66592->ep[0].fifoaddr = M66592_CFIFO;
        m66592->ep[0].fifosel = M66592_CFIFOSEL;
 
        ep->ep.name = ep->name;
        ep->ep.ops = &mv_u3d_ep_ops;
        ep->wedge = 0;
-       ep->ep.maxpacket = MV_U3D_EP0_MAX_PKT_SIZE;
+       usb_ep_set_maxpacket_limit(&ep->ep, MV_U3D_EP0_MAX_PKT_SIZE);
        ep->ep_num = 0;
        ep->ep.desc = &mv_u3d_ep0_desc;
        INIT_LIST_HEAD(&ep->queue);
                ep->ep.name = ep->name;
 
                ep->ep.ops = &mv_u3d_ep_ops;
-               ep->ep.maxpacket = (unsigned short) ~0;
+               usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
                ep->ep_num = i / 2;
 
                INIT_LIST_HEAD(&ep->queue);
 
        ep->ep.ops = &mv_ep_ops;
        ep->wedge = 0;
        ep->stopped = 0;
-       ep->ep.maxpacket = EP0_MAX_PKT_SIZE;
+       usb_ep_set_maxpacket_limit(&ep->ep, EP0_MAX_PKT_SIZE);
        ep->ep_num = 0;
        ep->ep.desc = &mv_ep0_desc;
        INIT_LIST_HEAD(&ep->queue);
 
                ep->ep.ops = &mv_ep_ops;
                ep->stopped = 0;
-               ep->ep.maxpacket = (unsigned short) ~0;
+               usb_ep_set_maxpacket_limit(&ep->ep, (unsigned short) ~0);
                ep->ep_num = i / 2;
 
                INIT_LIST_HEAD(&ep->queue);
 
        ep->desc = NULL;
        INIT_LIST_HEAD(&ep->queue);
 
-       ep->ep.maxpacket = ~0;
+       usb_ep_set_maxpacket_limit(&ep->ep, ~0);
        ep->ep.ops = &net2272_ep_ops;
 
        /* disable irqs, endpoint */
                        ep->fifo_size = 64;
                net2272_ep_reset(ep);
        }
-       dev->ep[0].ep.maxpacket = 64;
+       usb_ep_set_maxpacket_limit(&dev->ep[0].ep, 64);
 
        dev->gadget.ep0 = &dev->ep[0].ep;
        dev->ep[0].stopped = 0;
 
        ep->desc = NULL;
        INIT_LIST_HEAD (&ep->queue);
 
-       ep->ep.maxpacket = ~0;
+       usb_ep_set_maxpacket_limit(&ep->ep, ~0);
        ep->ep.ops = &net2280_ep_ops;
 
        /* disable the dma, irqs, endpoint... */
                ep->regs = &dev->epregs [tmp];
                ep_reset (dev->regs, ep);
        }
-       dev->ep [0].ep.maxpacket = 64;
-       dev->ep [5].ep.maxpacket = 64;
-       dev->ep [6].ep.maxpacket = 64;
+       usb_ep_set_maxpacket_limit(&dev->ep [0].ep, 64);
+       usb_ep_set_maxpacket_limit(&dev->ep [5].ep, 64);
+       usb_ep_set_maxpacket_limit(&dev->ep [6].ep, 64);
 
        dev->gadget.ep0 = &dev->ep [0].ep;
        dev->ep [0].stopped = 0;
 
 
        ep->ep.name = ep->name;
        ep->ep.ops = &omap_ep_ops;
-       ep->ep.maxpacket = ep->maxpacket = maxp;
+       ep->maxpacket = maxp;
+       usb_ep_set_maxpacket_limit(&ep->ep, ep->maxpacket);
        list_add_tail(&ep->ep.ep_list, &udc->gadget.ep_list);
 
        return buf;
 
                        ep->offset_addr = (UDC_EPINT_OUT_SHIFT + ep->num) *
                                          UDC_EP_REG_SHIFT;
                /* need to set ep->ep.maxpacket and set Default Configuration?*/
-               ep->ep.maxpacket = UDC_BULK_MAX_PKT_SIZE;
+               usb_ep_set_maxpacket_limit(&ep->ep, UDC_BULK_MAX_PKT_SIZE);
                list_add_tail(&ep->ep.ep_list, &dev->gadget.ep_list);
                INIT_LIST_HEAD(&ep->queue);
        }
-       dev->ep[UDC_EP0IN_IDX].ep.maxpacket = UDC_EP0IN_MAX_PKT_SIZE;
-       dev->ep[UDC_EP0OUT_IDX].ep.maxpacket = UDC_EP0OUT_MAX_PKT_SIZE;
+       usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0IN_IDX].ep, UDC_EP0IN_MAX_PKT_SIZE);
+       usb_ep_set_maxpacket_limit(&dev->ep[UDC_EP0OUT_IDX].ep, UDC_EP0OUT_MAX_PKT_SIZE);
 
        /* remove ep0 in and out from the list.  They have own pointer */
        list_del_init(&dev->ep[UDC_EP0IN_IDX].ep.ep_list);
 
                ep->stopped = 0;
                INIT_LIST_HEAD (&ep->queue);
                ep->pio_irqs = 0;
+               usb_ep_set_maxpacket_limit(&ep->ep, ep->ep.maxpacket);
        }
 
        /* the rest was statically initialized, and is read-only */
 
        }
 
        /* USB endpoints init */
-       for (i = 1; i < NR_USB_ENDPOINTS; i++)
+       for (i = 1; i < NR_USB_ENDPOINTS; i++) {
                list_add_tail(&dev->udc_usb_ep[i].usb_ep.ep_list,
                                &dev->gadget.ep_list);
+               usb_ep_set_maxpacket_limit(&dev->udc_usb_ep[i].usb_ep,
+                                          dev->udc_usb_ep[i].usb_ep.maxpacket);
+       }
 }
 
 /**
 
                INIT_LIST_HEAD(&ep->queue);
                ep->ep.name = r8a66597_ep_name[i];
                ep->ep.ops = &r8a66597_ep_ops;
-               ep->ep.maxpacket = 512;
+               usb_ep_set_maxpacket_limit(&ep->ep, 512);
        }
-       r8a66597->ep[0].ep.maxpacket = 64;
+       usb_ep_set_maxpacket_limit(&r8a66597->ep[0].ep, 64);
        r8a66597->ep[0].pipenum = 0;
        r8a66597->ep[0].fifoaddr = CFIFO;
        r8a66597->ep[0].fifosel = CFIFOSEL;
 
 
        hs_ep->parent = hsotg;
        hs_ep->ep.name = hs_ep->name;
-       hs_ep->ep.maxpacket = epnum ? 1024 : EP0_MPS_LIMIT;
+       usb_ep_set_maxpacket_limit(&hs_ep->ep, epnum ? 1024 : EP0_MPS_LIMIT);
        hs_ep->ep.ops = &s3c_hsotg_ep_ops;
 
        /*
 
 
        hsep->dev = hsudc;
        hsep->ep.name = hsep->name;
-       hsep->ep.maxpacket = epnum ? 512 : 64;
+       usb_ep_set_maxpacket_limit(&hsep->ep, epnum ? 512 : 64);
        hsep->ep.ops = &s3c_hsudc_ep_ops;
        hsep->fifo = hsudc->regs + S3C_BR(epnum);
        hsep->ep.desc = NULL;
 
                ep->ep.desc = NULL;
                ep->halted = 0;
                INIT_LIST_HEAD(&ep->queue);
+               usb_ep_set_maxpacket_limit(&ep->ep, &ep->ep.maxpacket);
        }
 }
 
 
        ep->end_point.name = ep->name;
        INIT_LIST_HEAD(&ep->end_point.ep_list);
        if (!epnum) {
-               ep->end_point.maxpacket = 64;
+               usb_ep_set_maxpacket_limit(&ep->end_point, 64);
                ep->end_point.ops = &musb_g_ep0_ops;
                musb->g.ep0 = &ep->end_point;
        } else {
                if (is_in)
-                       ep->end_point.maxpacket = hw_ep->max_packet_sz_tx;
+                       usb_ep_set_maxpacket_limit(&ep->end_point, hw_ep->max_packet_sz_tx);
                else
-                       ep->end_point.maxpacket = hw_ep->max_packet_sz_rx;
+                       usb_ep_set_maxpacket_limit(&ep->end_point, hw_ep->max_packet_sz_rx);
                ep->end_point.ops = &musb_ep_ops;
                list_add_tail(&ep->end_point.ep_list, &musb->g.ep_list);
        }
 
                /* init DCP */
                if (usbhsg_is_dcp(uep)) {
                        gpriv->gadget.ep0 = &uep->ep;
-                       uep->ep.maxpacket = 64;
+                       usb_ep_set_maxpacket_limit(&uep->ep, 64);
                }
                /* init normal pipe */
                else {
-                       uep->ep.maxpacket = 512;
+                       usb_ep_set_maxpacket_limit(&uep->ep, 512);
                        list_add_tail(&uep->ep.ep_list, &gpriv->gadget.ep_list);
                }
        }
 
  * @maxpacket:The maximum packet size used on this endpoint.  The initial
  *     value can sometimes be reduced (hardware allowing), according to
  *      the endpoint descriptor used to configure the endpoint.
+ * @maxpacket_limit:The maximum packet size value which can be handled by this
+ *     endpoint. It's set once by UDC driver when endpoint is initialized, and
+ *     should not be changed. Should not be confused with maxpacket.
  * @max_streams: The maximum number of streams supported
  *     by this EP (0 - 16, actual number is 2^n)
  * @mult: multiplier, 'mult' value for SS Isoc EPs
        const struct usb_ep_ops *ops;
        struct list_head        ep_list;
        unsigned                maxpacket:16;
+       unsigned                maxpacket_limit:16;
        unsigned                max_streams:16;
        unsigned                mult:2;
        unsigned                maxburst:5;
 
 /*-------------------------------------------------------------------------*/
 
+/**
+ * usb_ep_set_maxpacket_limit - set maximum packet size limit for endpoint
+ * @ep:the endpoint being configured
+ * @maxpacket_limit:value of maximum packet size limit
+ *
+ * This function shoud be used only in UDC drivers to initialize endpoint
+ * (usually in probe function).
+ */
+static inline void usb_ep_set_maxpacket_limit(struct usb_ep *ep,
+                                             unsigned maxpacket_limit)
+{
+       ep->maxpacket_limit = maxpacket_limit;
+       ep->maxpacket = maxpacket_limit;
+}
+
 /**
  * usb_ep_enable - configure endpoint, making it usable
  * @ep:the endpoint being configured.  may not be the endpoint named "ep0".