r8152: separate USB_RX_EARLY_AGG
authorhayeswang <hayeswang@realtek.com>
Thu, 12 Feb 2015 06:33:46 +0000 (14:33 +0800)
committerDavid S. Miller <davem@davemloft.net>
Thu, 19 Feb 2015 20:08:43 +0000 (15:08 -0500)
Separate USB_RX_EARLY_AGG into USB_RX_EARLY_TIMEOUT and USB_RX_EARLY_SIZE.

Replace r8153_set_rx_agg() with r8153_set_rx_early_timeout() and
r8153_set_rx_early_size().

Set the default timeout value according to the USB speed.

Signed-off-by: Hayes Wang <hayeswang@realtek.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/r8152.c

index 438fc6bcaef15538e9c151c46fce08dc67cec1a5..8a8d3a3b18bddb917d29888f00ac25e6fae3bc76 100644 (file)
 #define USB_TX_AGG             0xd40a
 #define USB_RX_BUF_TH          0xd40c
 #define USB_USB_TIMER          0xd428
-#define USB_RX_EARLY_AGG       0xd42c
+#define USB_RX_EARLY_TIMEOUT   0xd42c
+#define USB_RX_EARLY_SIZE      0xd42e
 #define USB_PM_CTRL_STATUS     0xd432
 #define USB_TX_DMA             0xd434
 #define USB_TOLERANCE          0xd490
 /* USB_MISC_0 */
 #define PCUT_STATUS            0x0001
 
-/* USB_RX_EARLY_AGG */
-#define EARLY_AGG_SUPPER       0x0e832981
-#define EARLY_AGG_HIGH         0x0e837a12
-#define EARLY_AGG_SLOW         0x0e83ffff
+/* USB_RX_EARLY_TIMEOUT */
+#define COALESCE_SUPER          85000U
+#define COALESCE_HIGH          250000U
+#define COALESCE_SLOW          524280U
 
 /* USB_WDT11_CTRL */
 #define TIMER11_EN             0x0001
@@ -606,6 +607,7 @@ struct r8152 {
        u32 saved_wolopts;
        u32 msg_enable;
        u32 tx_qlen;
+       u32 coalesce;
        u16 ocp_base;
        u8 *intr_buff;
        u8 version;
@@ -2142,28 +2144,19 @@ static int rtl8152_enable(struct r8152 *tp)
        return rtl_enable(tp);
 }
 
-static void r8153_set_rx_agg(struct r8152 *tp)
+static void r8153_set_rx_early_timeout(struct r8152 *tp)
 {
-       u8 speed;
+       u32 ocp_data = tp->coalesce / 8;
 
-       speed = rtl8152_get_speed(tp);
-       if (speed & _1000bps) {
-               if (tp->udev->speed == USB_SPEED_SUPER) {
-                       ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH,
-                                       RX_THR_SUPPER);
-                       ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_EARLY_AGG,
-                                       EARLY_AGG_SUPPER);
-               } else {
-                       ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH,
-                                       RX_THR_HIGH);
-                       ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_EARLY_AGG,
-                                       EARLY_AGG_HIGH);
-               }
-       } else {
-               ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_BUF_TH, RX_THR_SLOW);
-               ocp_write_dword(tp, MCU_TYPE_USB, USB_RX_EARLY_AGG,
-                               EARLY_AGG_SLOW);
-       }
+       ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_TIMEOUT, ocp_data);
+}
+
+static void r8153_set_rx_early_size(struct r8152 *tp)
+{
+       u32 mtu = tp->netdev->mtu;
+       u32 ocp_data = (agg_buf_sz - mtu - VLAN_ETH_HLEN - VLAN_HLEN) / 4;
+
+       ocp_write_word(tp, MCU_TYPE_USB, USB_RX_EARLY_SIZE, ocp_data);
 }
 
 static int rtl8153_enable(struct r8152 *tp)
@@ -2173,7 +2166,8 @@ static int rtl8153_enable(struct r8152 *tp)
 
        set_tx_qlen(tp);
        rtl_set_eee_plus(tp);
-       r8153_set_rx_agg(tp);
+       r8153_set_rx_early_timeout(tp);
+       r8153_set_rx_early_size(tp);
 
        return rtl_enable(tp);
 }
@@ -3966,6 +3960,18 @@ static int rtl8152_probe(struct usb_interface *intf,
        tp->mii.reg_num_mask = 0x1f;
        tp->mii.phy_id = R8152_PHY_ID;
 
+       switch (udev->speed) {
+       case USB_SPEED_SUPER:
+               tp->coalesce = COALESCE_SUPER;
+               break;
+       case USB_SPEED_HIGH:
+               tp->coalesce = COALESCE_HIGH;
+               break;
+       default:
+               tp->coalesce = COALESCE_SLOW;
+               break;
+       }
+
        intf->needs_remote_wakeup = 1;
 
        tp->rtl_ops.init(tp);