Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
[linux-2.6-block.git] / drivers / net / usb / r8152.c
index 3eab74c7c55406417b65ba5f80f869fc95c606ea..87f710476217d8a02cc496925d57ac5fcd0021c8 100644 (file)
@@ -59,6 +59,7 @@
 #define PLA_WDT6_CTRL          0xe428
 #define PLA_TCR0               0xe610
 #define PLA_TCR1               0xe612
+#define PLA_MTPS               0xe615
 #define PLA_TXFIFO_CTRL                0xe618
 #define PLA_RSTTALLY           0xe800
 #define PLA_CR                 0xe813
 /* PLA_TCR1 */
 #define VERSION_MASK           0x7cf0
 
+/* PLA_MTPS */
+#define MTPS_JUMBO             (12 * 1024 / 64)
+#define MTPS_DEFAULT           (6 * 1024 / 64)
+
 /* PLA_RSTTALLY */
 #define TALLY_RESET            0x0001
 
@@ -440,8 +445,11 @@ enum rtl_register_content {
 #define BYTE_EN_START_MASK     0x0f
 #define BYTE_EN_END_MASK       0xf0
 
+#define RTL8153_MAX_PACKET     9216 /* 9K */
+#define RTL8153_MAX_MTU                (RTL8153_MAX_PACKET - VLAN_ETH_HLEN - VLAN_HLEN)
 #define RTL8152_RMS            (VLAN_ETH_FRAME_LEN + VLAN_HLEN)
-#define RTL8152_TX_TIMEOUT     (HZ)
+#define RTL8153_RMS            RTL8153_MAX_PACKET
+#define RTL8152_TX_TIMEOUT     (5 * HZ)
 
 /* rtl8152 flags */
 enum rtl8152_flags {
@@ -2521,7 +2529,8 @@ static void r8153_first_init(struct r8152 *tp)
        ocp_data &= ~CPCR_RX_VLAN;
        ocp_write_word(tp, MCU_TYPE_PLA, PLA_CPCR, ocp_data);
 
-       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS);
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8153_RMS);
+       ocp_write_byte(tp, MCU_TYPE_PLA, PLA_MTPS, MTPS_JUMBO);
 
        ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TCR0);
        ocp_data |= TCR0_AUTO_FIFO;
@@ -2571,7 +2580,7 @@ static void r8153_enter_oob(struct r8152 *tp)
                mdelay(1);
        }
 
-       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8152_RMS);
+       ocp_write_word(tp, MCU_TYPE_PLA, PLA_RMS, RTL8153_RMS);
 
        ocp_data = ocp_read_word(tp, MCU_TYPE_PLA, PLA_TEREDO_CFG);
        ocp_data &= ~TEREDO_WAKE_MASK;
@@ -3288,6 +3297,26 @@ out:
        return res;
 }
 
+static int rtl8152_change_mtu(struct net_device *dev, int new_mtu)
+{
+       struct r8152 *tp = netdev_priv(dev);
+
+       switch (tp->version) {
+       case RTL_VER_01:
+       case RTL_VER_02:
+               return eth_change_mtu(dev, new_mtu);
+       default:
+               break;
+       }
+
+       if (new_mtu < 68 || new_mtu > RTL8153_MAX_MTU)
+               return -EINVAL;
+
+       dev->mtu = new_mtu;
+
+       return 0;
+}
+
 static const struct net_device_ops rtl8152_netdev_ops = {
        .ndo_open               = rtl8152_open,
        .ndo_stop               = rtl8152_close,
@@ -3296,8 +3325,7 @@ static const struct net_device_ops rtl8152_netdev_ops = {
        .ndo_tx_timeout         = rtl8152_tx_timeout,
        .ndo_set_rx_mode        = rtl8152_set_rx_mode,
        .ndo_set_mac_address    = rtl8152_set_mac_address,
-
-       .ndo_change_mtu         = eth_change_mtu,
+       .ndo_change_mtu         = rtl8152_change_mtu,
        .ndo_validate_addr      = eth_validate_addr,
 };