staging: r8712u: Merging Realtek's latest (v2.6.6). Tx-code refactoring.
authorAli Bahar <ali@internetdog.org>
Sat, 3 Sep 2011 19:14:16 +0000 (03:14 +0800)
committerGreg Kroah-Hartman <gregkh@suse.de>
Wed, 7 Sep 2011 00:00:34 +0000 (17:00 -0700)
Refactor the TX code to prepare for aggregation.

Signed-off-by: Ali Bahar <ali@internetDog.org>
Signed-off-by: Larry Finger <Larry.Finger@lwfinger.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
drivers/staging/rtl8712/rtl8712_xmit.c
drivers/staging/rtl8712/rtl871x_xmit.c
drivers/staging/rtl8712/rtl871x_xmit.h

index 88a15049bc2a78e5215859a9cbe86898e105afe1..c1e478465adf31145335f3a5d3bbb0bda93b5ded 100644 (file)
@@ -423,31 +423,31 @@ int r8712_xmitframe_complete(struct _adapter *padapter,
                if (!pxmitbuf)
                        return false;
        }
-       do {
-               pxmitframe = dequeue_xframe_ex(pxmitpriv, phwxmits, hwentry);
-               if (pxmitframe) {
-                       pxmitframe->pxmitbuf = pxmitbuf;
-                       pxmitframe->pxmit_urb[0] = pxmitbuf->pxmit_urb[0];
-                       pxmitframe->buf_addr = pxmitbuf->pbuf;
-                       if (pxmitframe->frame_tag == DATA_FRAMETAG) {
-                               if (pxmitframe->attrib.priority <= 15)
-                                       res = r8712_xmitframe_coalesce(padapter,
-                                             pxmitframe->pkt, pxmitframe);
-                               /* always return ndis_packet after
-                                *  r8712_xmitframe_coalesce */
-                               r8712_xmit_complete(padapter, pxmitframe);
-                       }
-                       if (res == _SUCCESS)
-                               dump_xframe(padapter, pxmitframe);
-                       else
-                               r8712_free_xmitframe_ex(pxmitpriv, pxmitframe);
-                       xcnt++;
-               } else {
-                       r8712_free_xmitbuf(pxmitpriv, pxmitbuf);
-                       return false;
+       /* 1st frame dequeued */
+       pxmitframe = dequeue_xframe_ex(pxmitpriv, phwxmits, hwentry);
+       /* need to remember the 1st frame */
+       if (pxmitframe != NULL) {
+
+
+               xmitframe_xmitbuf_attach(pxmitframe, pxmitbuf);
+               if (pxmitframe->frame_tag == DATA_FRAMETAG) {
+                       if (pxmitframe->attrib.priority <= 15)
+                               res = r8712_xmitframe_coalesce(padapter,
+                                       pxmitframe->pkt, pxmitframe);
+                       /* always return ndis_packet after
+                        * r8712_xmitframe_coalesce */
+                       r8712_xmit_complete(padapter, pxmitframe);
                }
-               break;
-       } while (0);
+               if (res == _SUCCESS)
+                       dump_xframe(padapter, pxmitframe);
+               else
+                       r8712_free_xmitframe_ex(pxmitpriv, pxmitframe);
+               xcnt++;
+
+       } else { /* pxmitframe == NULL && p2ndxmitframe == NULL */
+               r8712_free_xmitbuf(pxmitpriv, pxmitbuf);
+               return false;
+       }
        return true;
 }
 
index ccf08911f58b7a91a7560e3a1e4935127f748410..073493b30f4d64bbf88a053f3810626e3d61e282 100644 (file)
@@ -1011,6 +1011,19 @@ static void init_hwxmits(struct hw_xmit *phwxmit, sint entry)
        }
 }
 
+void xmitframe_xmitbuf_attach(struct xmit_frame *pxmitframe,
+                       struct xmit_buf *pxmitbuf)
+{
+       /* pxmitbuf attach to pxmitframe */
+       pxmitframe->pxmitbuf = pxmitbuf;
+       /* urb and irp connection */
+       pxmitframe->pxmit_urb[0] = pxmitbuf->pxmit_urb[0];
+       /* buffer addr assoc */
+       pxmitframe->buf_addr = pxmitbuf->pbuf;
+       /* pxmitframe attach to pxmitbuf */
+       pxmitbuf->priv_data = pxmitframe;
+}
+
 /*
  * tx_action == 0 == no frames to transmit
  * tx_action > 0 ==> we have frames to transmit
@@ -1042,9 +1055,7 @@ int r8712_pre_xmit(struct _adapter *padapter, struct xmit_frame *pxmitframe)
        } else { /*dump packet directly*/
                spin_unlock_irqrestore(&pxmitpriv->lock, irqL);
                ret = true;
-               pxmitframe->pxmitbuf = pxmitbuf;
-               pxmitframe->pxmit_urb[0] = pxmitbuf->pxmit_urb[0];
-               pxmitframe->buf_addr = pxmitbuf->pbuf;
+               xmitframe_xmitbuf_attach(pxmitframe, pxmitbuf);
                r8712_xmit_direct(padapter, pxmitframe);
        }
        return ret;
index 63041008f9420e6c21732036a82075a69c2fecd8..81987788917c464d2341564dd5b158bc1208120a 100644 (file)
@@ -135,7 +135,9 @@ struct xmit_buf {
 
        u8 *pallocated_buf;
        u8 *pbuf;
+       void *priv_data;
        struct urb *pxmit_urb[8];
+       u32 aggr_nr;
 };
 
 struct xmit_frame {
@@ -280,6 +282,9 @@ int r8712_xmit_enqueue(struct _adapter *padapter,
 int r8712_xmit_direct(struct _adapter *padapter, struct xmit_frame *pxmitframe);
 void r8712_xmit_bh(void *priv);
 
+void xmitframe_xmitbuf_attach(struct xmit_frame *pxmitframe,
+                       struct xmit_buf *pxmitbuf);
+
 #include "rtl8712_xmit.h"
 
 #endif /*_RTL871X_XMIT_H_*/