/* write fifo */
        if (req->req.buf) {
                if (size > 0)
-                       m66592_write_fifo(m66592, ep->fifoaddr, buf, size);
+                       m66592_write_fifo(m66592, ep, buf, size);
                if ((size == 0) || ((size % ep->ep.maxpacket) != 0))
                        m66592_bset(m66592, M66592_BVAL, ep->fifoctr);
        }
 
        /* write fifo */
        if (req->req.buf) {
-               m66592_write_fifo(m66592, ep->fifoaddr, buf, size);
+               m66592_write_fifo(m66592, ep, buf, size);
                if ((size == 0)
                                || ((size % ep->ep.maxpacket) != 0)
                                || ((bufsize != ep->ep.maxpacket)
 
        iowrite16(val, m66592->reg + offset);
 }
 
+static inline void m66592_mdfy(struct m66592 *m66592, u16 val, u16 pat,
+               unsigned long offset)
+{
+       u16 tmp;
+       tmp = m66592_read(m66592, offset);
+       tmp = tmp & (~pat);
+       tmp = tmp | val;
+       m66592_write(m66592, tmp, offset);
+}
+
+#define m66592_bclr(m66592, val, offset)       \
+                       m66592_mdfy(m66592, 0, val, offset)
+#define m66592_bset(m66592, val, offset)       \
+                       m66592_mdfy(m66592, val, 0, offset)
+
 static inline void m66592_write_fifo(struct m66592 *m66592,
-               unsigned long offset,
+               struct m66592_ep *ep,
                void *buf, unsigned long len)
 {
-       void __iomem *fifoaddr = m66592->reg + offset;
+       void __iomem *fifoaddr = m66592->reg + ep->fifoaddr;
 
        if (m66592->pdata->on_chip) {
                unsigned long count;
                iowrite16_rep(fifoaddr, buf, len);
                if (odd) {
                        unsigned char *p = buf + len*2;
+                       if (m66592->pdata->wr0_shorted_to_wr1)
+                               m66592_bclr(m66592, M66592_MBW_16, ep->fifosel);
                        iowrite8(*p, fifoaddr);
+                       if (m66592->pdata->wr0_shorted_to_wr1)
+                               m66592_bset(m66592, M66592_MBW_16, ep->fifosel);
                }
        }
 }
 
-static inline void m66592_mdfy(struct m66592 *m66592, u16 val, u16 pat,
-               unsigned long offset)
-{
-       u16 tmp;
-       tmp = m66592_read(m66592, offset);
-       tmp = tmp & (~pat);
-       tmp = tmp | val;
-       m66592_write(m66592, tmp, offset);
-}
-
-#define m66592_bclr(m66592, val, offset)       \
-                       m66592_mdfy(m66592, 0, val, offset)
-#define m66592_bset(m66592, val, offset)       \
-                       m66592_mdfy(m66592, val, 0, offset)
-
 #endif /* ifndef __M66592_UDC_H__ */