diff --git a/ReadMe.txt b/ReadMe.txt index b9343cc..4307fdb 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -54,6 +54,12 @@ Set the rx copybreak value in bytes. # ethtool --set-tunable eth0 rx-copybreak 256 + Get the current tx copybreak value in bytes. + # ethtool --get-tunable eth0 tx-copybreak + + Set the tx copybreak value in bytes. + # ethtool --set-tunable eth0 tx-copybreak 256 + - Flow control Queries the specified Ethernet device for pause parameter information. diff --git a/compatibility.h b/compatibility.h index 370cb34..41af830 100644 --- a/compatibility.h +++ b/compatibility.h @@ -63,6 +63,7 @@ #define MDIO_EEE_2_5GT 0x0001 /* 2.5GT EEE cap */ #define MDIO_EEE_5GT 0x0002 /* 5GT EEE cap */ +#if LINUX_VERSION_CODE < KERNEL_VERSION(5,3,10) #if LINUX_VERSION_CODE < KERNEL_VERSION(5,2,0) #if LINUX_VERSION_CODE < KERNEL_VERSION(5,1,0) #define MDIO_AN_10GBT_CTRL_ADV2_5G 0x0080 /* Advertise 2.5GBASE-T */ @@ -597,6 +598,11 @@ // return PCI_DEVID(dev->bus->number, dev->devfn); // } #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,2,0) */ + static inline bool skb_queue_empty_lockless(const struct sk_buff_head *list) + { + return READ_ONCE(list->next) == (const struct sk_buff *) list; + } +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,3,10) */ #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,4,0) */ #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,6,0) */ static inline void tcp_v6_gso_csum_prep(struct sk_buff *skb) @@ -658,6 +664,8 @@ enum rtl_cmd { RTLTOOL_USB_INFO, RTL_ENABLE_USB_DIAG, RTL_DISABLE_USB_DIAG, + RTLTOOL_PHY_OCP_READ, + RTLTOOL_PHY_OCP_WRITE, RTLTOOL_INVALID }; diff --git a/r8152.c b/r8152.c index 9512720..aa0ca81 100644 --- a/r8152.c +++ b/r8152.c @@ -35,13 +35,10 @@ #if LINUX_VERSION_CODE >= KERNEL_VERSION(6,4,10) #include #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(6,4,10) */ -#if LINUX_VERSION_CODE >= KERNEL_VERSION(6,16,0) -#include -#endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(6,16,0) */ /* Version Information */ #define DRIVER_SUFFIX -#define DRIVER_VERSION "v2.20.1"DRIVER_SUFFIX" (2025/05/13)" +#define DRIVER_VERSION "v2.21.4"DRIVER_SUFFIX" (2025/10/28)" #define DRIVER_AUTHOR "Realtek nic sw " #define DRIVER_DESC "Realtek RTL8152/RTL8153 Based USB Ethernet Adapters" #define MODULENAME "r8152" @@ -619,6 +616,7 @@ /* bit 2 ~ 3: LMP timer */ #define LPM_TIMER_MASK 0x0c #define LPM_TIMER_500MS 0x04 /* 500 ms */ +#define LPM_TIMER_1MS 0x08 /* 1 ms */ #define LPM_TIMER_500US 0x0c /* 500 us */ #define ROK_EXIT_LPM 0x02 @@ -800,6 +798,7 @@ enum rtl_register_content { #define RTL8152_RX_MAX_PENDING 4096 #define RTL8152_RXFG_HEADSZ 256 +#define RTL8152_TXFG_HEADSZ 256 #define INTR_LINK 0x0004 @@ -821,7 +820,7 @@ enum rtl_register_content { #define mtu_to_size(m) ((m) + VLAN_ETH_HLEN + ETH_FCS_LEN) #define size_to_mtu(s) ((s) - VLAN_ETH_HLEN - ETH_FCS_LEN) -#define RTL_MAX_SG_NUM 16 +#define RTL_MAX_SG_NUM (MAX_SKB_FRAGS + 1) /* rtl8152 flags */ enum rtl8152_flags { @@ -1053,6 +1052,8 @@ struct r8152 { void (*vlan_put_tag)(struct r8152 *tp, void *desc, struct sk_buff *skb); #endif /* LINUX_VERSION_CODE < KERNEL_VERSION(3,10,0) */ + u64 tx_submit, tx_back; + atomic_t rx_count; bool eee_en; @@ -1063,7 +1064,7 @@ struct r8152 { u32 coalesce; u32 advertising; u32 rx_buf_sz; - u32 rx_copybreak; + u32 rx_copybreak, tx_copybreak; u32 rx_pending; u32 fc_pause_on, fc_pause_off; u32 rx_agg_free_ref; @@ -2103,17 +2104,17 @@ static int rtl8152_set_speed(struct r8152 *tp, u8 autoneg, u32 speed, u8 duplex, u32 advertising); -static int __rtl8152_set_mac_address(struct net_device *netdev, void *p, +static int __rtl8152_set_mac_address(struct net_device *netdev, + struct sockaddr_storage *addr, bool in_resume) { struct r8152 *tp = netdev_priv(netdev); - struct sockaddr *addr = p; int ret = -EADDRNOTAVAIL; if (unlikely(tp->rtk_enable_diag)) return -EBUSY; - if (!is_valid_ether_addr(addr->sa_data)) + if (!is_valid_ether_addr(addr->__data)) goto out1; if (!in_resume) { @@ -2124,10 +2125,10 @@ static int __rtl8152_set_mac_address(struct net_device *netdev, void *p, mutex_lock(&tp->control); - eth_hw_addr_set(netdev, addr->sa_data); + eth_hw_addr_set(netdev, addr->__data); ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_CONFIG); - pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, addr->sa_data); + pla_ocp_write(tp, PLA_IDR, BYTE_EN_SIX_BYTES, 8, addr->__data); ocp_write_byte(tp, MCU_TYPE_PLA, PLA_CRWECR, CRWECR_NORAML); mutex_unlock(&tp->control); @@ -2145,7 +2146,7 @@ static int rtl8152_set_mac_address(struct net_device *netdev, void *p) static int rtl_mapt_read(struct r8152 *tp, char *mac_obj_name, acpi_object_type mac_obj_type, int mac_strlen, - struct sockaddr *sa) + struct sockaddr_storage *ss) { struct acpi_buffer buffer = { ACPI_ALLOCATE_BUFFER, NULL }; union acpi_object *obj; @@ -2181,9 +2182,9 @@ static int rtl_mapt_read(struct r8152 *tp, char *mac_obj_name, goto amacout; } - memcpy(sa->sa_data, buf, sizeof(buf)); + memcpy(ss->__data, buf, sizeof(buf)); netif_info(tp, probe, tp->netdev, - "Using pass-thru MAC addr %pM\n", sa->sa_data); + "Using pass-thru MAC addr %pM\n", ss->__data); amacout: kfree(obj); @@ -2194,20 +2195,21 @@ amacout: * host system provided MAC address. * Examples of this are Dell TB15 and Dell WD15 docks */ -static int vendor_mac_passthru_addr_read(struct r8152 *tp, struct sockaddr *sa) +static int vendor_mac_passthru_addr_read(struct r8152 *tp, + struct sockaddr_storage *ss) { int ret = -EOPNOTSUPP; if (tp->dell_macpassthru) ret = rtl_mapt_read(tp, "\\_SB.AMAC", ACPI_TYPE_BUFFER, 0x17, - sa); + ss); else if (tp->lenovo_macpassthru) - ret = rtl_mapt_read(tp, "\\MACA", ACPI_TYPE_STRING, 0x16, sa); + ret = rtl_mapt_read(tp, "\\MACA", ACPI_TYPE_STRING, 0x16, ss); return ret; } -static int rtl_hw_ether_addr(struct r8152 *tp, struct sockaddr *sa) +static int rtl_hw_ether_addr(struct r8152 *tp, struct sockaddr_storage *ss) { u32 ocp_data = 0; int ret; @@ -2223,12 +2225,12 @@ static int rtl_hw_ether_addr(struct r8152 *tp, struct sockaddr *sa) goto out; if (ocp_data & BIT(0)) - return usb_ocp_read(tp, 0xcf08, 8, sa->sa_data); + return usb_ocp_read(tp, 0xcf08, 8, ss->__data); ocp_data |= BIT(0); } - ret = pla_ocp_read(tp, PLA_BACKUP, 8, sa->sa_data); + ret = pla_ocp_read(tp, PLA_BACKUP, 8, ss->__data); if (ret < 0) goto out; @@ -2238,7 +2240,7 @@ static int rtl_hw_ether_addr(struct r8152 *tp, struct sockaddr *sa) * ethernet address from USB 0xcf08 rather than PLA_BACKUP. */ ret = usb_ocp_write(tp, 0xcf08, BYTE_EN_SIX_BYTES, 8, - sa->sa_data); + ss->__data); if (ret < 0) goto out; @@ -2251,36 +2253,37 @@ out: return ret; } -static int determine_ethernet_addr(struct r8152 *tp, struct sockaddr *sa) +static int determine_ethernet_addr(struct r8152 *tp, + struct sockaddr_storage *ss) { struct net_device *dev = tp->netdev; int ret; - sa->sa_family = dev->type; + ss->ss_family = dev->type; - ret = eth_platform_get_mac_address(&tp->udev->dev, sa->sa_data); + ret = eth_platform_get_mac_address(&tp->udev->dev, ss->__data); if (ret < 0) { if (tp->version == RTL_VER_01) { - ret = pla_ocp_read(tp, PLA_IDR, 8, sa->sa_data); + ret = pla_ocp_read(tp, PLA_IDR, 8, ss->__data); } else { /* if device doesn't support MAC pass through this will * be expected to be non-zero */ - ret = vendor_mac_passthru_addr_read(tp, sa); + ret = vendor_mac_passthru_addr_read(tp, ss); if (ret < 0) - ret = rtl_hw_ether_addr(tp, sa); + ret = rtl_hw_ether_addr(tp, ss); } } if (ret < 0) { netif_err(tp, probe, dev, "Get ether addr fail\n"); - } else if (!is_valid_ether_addr(sa->sa_data)) { + } else if (!is_valid_ether_addr(ss->__data)) { netif_err(tp, probe, dev, "Invalid ether addr %pM\n", - sa->sa_data); + ss->__data); eth_hw_addr_random(dev); - ether_addr_copy(sa->sa_data, dev->dev_addr); + ether_addr_copy(ss->__data, dev->dev_addr); netif_info(tp, probe, dev, "Random ether addr %pM\n", - sa->sa_data); + ss->__data); return 0; } @@ -2290,17 +2293,17 @@ static int determine_ethernet_addr(struct r8152 *tp, struct sockaddr *sa) static int set_ethernet_addr(struct r8152 *tp, bool in_resume) { struct net_device *dev = tp->netdev; - struct sockaddr sa; + struct sockaddr_storage ss; int ret; - ret = determine_ethernet_addr(tp, &sa); + ret = determine_ethernet_addr(tp, &ss); if (ret < 0) return ret; if (tp->version == RTL_VER_01) - eth_hw_addr_set(dev, sa.sa_data); + eth_hw_addr_set(dev, ss.__data); else - ret = __rtl8152_set_mac_address(dev, &sa, in_resume); + ret = __rtl8152_set_mac_address(dev, &ss, in_resume); return ret; } @@ -2423,6 +2426,8 @@ static void write_bulk_callback(struct urb *urb) usb_autopm_put_interface_async(tp->intf); + tp->tx_back++; + if (!netif_carrier_ok(netdev)) return; @@ -2432,7 +2437,7 @@ static void write_bulk_callback(struct urb *urb) if (test_bit(RTL8152_UNPLUG, &tp->flags)) return; - if (!skb_queue_empty(&tp->tx_queue)) + if (!skb_queue_empty_lockless(&tp->tx_queue)) tasklet_schedule(&tp->tx_tl); } @@ -2483,6 +2488,8 @@ static void write_bulk_sg_callback(struct urb *urb) usb_autopm_put_interface_async(tp->intf); + tp->tx_back++; + if (!netif_carrier_ok(netdev)) return; @@ -2492,7 +2499,7 @@ static void write_bulk_sg_callback(struct urb *urb) if (test_bit(RTL8152_UNPLUG, &tp->flags)) return; - if (!skb_queue_empty(&tp->tx_queue)) + if (!skb_queue_empty_lockless(&tp->tx_queue)) tasklet_schedule(&tp->tx_tl); } @@ -2724,6 +2731,9 @@ static int alloc_all_mem(struct r8152 *tp) tp->intr_buff, INTBUFSIZE, intr_callback, tp, tp->intr_interval); + tp->tx_back = 0; + tp->tx_submit = 0; + return 0; err1: @@ -2752,6 +2762,15 @@ static struct tx_agg *r8152_get_tx_agg(struct r8152 *tp) return agg; } +static void rtl_drop_tx_skb(struct r8152 *tp, struct sk_buff *skb) +{ + struct net_device_stats *stats; + + stats = rtl8152_get_stats(tp->netdev); + stats->tx_dropped++; + dev_kfree_skb_any(skb); +} + /* r8152_csum_workaround() * The hw limits the value of the transport offset. When the offset is out of * range, calculate the checksum by sw. @@ -2779,20 +2798,20 @@ static void r8152_csum_workaround(struct r8152 *tp, struct sk_buff *skb, skb_queue_splice(&seg_list, list); netdev_completed_queue(tp->netdev, - skb_shinfo(skb)->gso_segs ?: 1, skb->len); - dev_kfree_skb(skb); + skb_shinfo(skb)->gso_segs ?: 1, + skb->len); + dev_kfree_skb_any(skb); } else if (skb->ip_summed == CHECKSUM_PARTIAL) { if (skb_checksum_help(skb) < 0) goto drop; __skb_queue_head(list, skb); } else { - struct net_device_stats *stats; - drop: - stats = rtl8152_get_stats(tp->netdev); - stats->tx_dropped++; - dev_kfree_skb(skb); + netdev_completed_queue(tp->netdev, + skb_shinfo(skb)->gso_segs ?: 1, + skb->len); + rtl_drop_tx_skb(tp, skb); } } @@ -3122,14 +3141,11 @@ static int r8152_tx_agg_fill(struct r8152 *tp, struct tx_agg *agg) len = skb->len; if (skb_copy_bits(skb, 0, tx_data, len) < 0) { - struct net_device_stats *stats = &netdev->stats; - netdev_completed_queue(netdev, skb_shinfo(skb)->gso_segs ?: 1, len); - stats->tx_dropped++; - dev_kfree_skb_any(skb); tx_data -= tp->tx_desc.size; + rtl_drop_tx_skb(tp, skb); continue; } @@ -3171,11 +3187,152 @@ static int r8152_tx_agg_fill(struct r8152 *tp, struct tx_agg *agg) ret = usb_submit_urb(agg->urb, GFP_ATOMIC); if (ret < 0) usb_autopm_put_interface_async(tp->intf); + else + tp->tx_submit++; out_tx_fill: - if (ret < 0) - netdev_completed_queue(netdev, agg->skb_num, agg->skb_bytes); + if (ret < 0) { + struct net_device_stats *stats; + stats = rtl8152_get_stats(netdev); + stats->tx_dropped += agg->skb_num; + netdev_completed_queue(netdev, agg->skb_num, agg->skb_bytes); + } + + return ret; +} + +static int rtl_cal_sg_number(struct sk_buff *skb, unsigned int recursion_level) +{ + struct sk_buff *frag_iter; + int number = 0; + + if (unlikely(recursion_level >= 24)) + return -EMSGSIZE; + + if (skb_headlen(skb)) + number++; + + number += skb_shinfo(skb)->nr_frags; + + skb_walk_frags(skb, frag_iter) { + int ret; + + ret = rtl_cal_sg_number(frag_iter, recursion_level + 1); + if (ret < 0) + return ret; + + number += ret; + } + + return number; +} + +static int rtl_cal_sg_size(struct r8152 *tp, struct sk_buff *skb, + int num, int *len, unsigned int recursion_level) +{ + struct sk_buff *frag_iter; + int i; + + WARN_ON(!num); + + if (unlikely(recursion_level >= 24)) + return -EMSGSIZE; + + if (recursion_level) { + *len += skb_headlen(skb); + if (--num <= 0) + goto out; + } else { + *len = 0; + } + + for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) { + *len += skb_frag_size(&skb_shinfo(skb)->frags[i]); + if (--num <= 0) + goto out; + } + + skb_walk_frags(skb, frag_iter) { + num = rtl_cal_sg_size(tp, frag_iter, num, len, + recursion_level + 1); + if (num <= 0) + break; + } + +out: + return num; +} + +static int rtl_skb_check(struct r8152 *tp, struct sk_buff **pskb, int headroom) +{ + int sg_num, size, eat, nhead, ret, avg_sg; + struct sk_buff *skb = *pskb; + + ret = rtl_cal_sg_number(skb, 0); + if (ret < 0) + goto out; + + sg_num = ret; + avg_sg = min_t(int, (skb->len + tp->tx_copybreak - 1) / tp->tx_copybreak, + RTL_MAX_SG_NUM); + + nhead = headroom - skb_headroom(skb); + + if (skb_header_cloned(skb) || nhead > 0) { + if (avg_sg == 1) { + struct sk_buff *tx_skb; + + tx_skb = skb_copy_expand(skb, headroom, 0, GFP_ATOMIC); + if (!tx_skb) { + ret = -ENOMEM; + goto out; + } + dev_consume_skb_any(skb); + + *pskb = skb = tx_skb; + + ret = 0; + goto out; + } else if (avg_sg >= sg_num) { + ret = pskb_expand_head(skb, nhead > 0 ? nhead : 0, 128, + GFP_ATOMIC); + goto out; + } + } else if (avg_sg >= sg_num) { + ret = 0; + goto out; + } else if (avg_sg == 1) { + ret = skb_linearize(skb); + goto out; + } + + ret = rtl_cal_sg_size(tp, skb, sg_num - avg_sg, &size, 0); + if (ret < 0) + goto out; + + WARN_ON(ret); + + netif_dbg(tp, tx_queued, tp->netdev, + "rtl_skb_check: len=%d, sg_num=%d -> %d, pull size=%d\n", + skb->len, sg_num, avg_sg, size); + + /* Although __pskb_pull_tail() may call pskb_expand_head(), the field + * of nhead is always filled by 0. I call pskb_expand_head() before + * __pskb_pull_tail() to avoid calling it again later if I need to + * expand the room of head. + */ + eat = (skb->tail + size) - skb->end; + if (skb_header_cloned(skb) || nhead > 0 || eat > 0) { + ret = pskb_expand_head(skb, nhead > 0 ? nhead : 0, + eat > 0 ? eat + 128 : 0, GFP_ATOMIC); + if (ret < 0) + goto out; + } + + ret = __pskb_pull_tail(skb, size) ? 0 : -ENOMEM; + +out: return ret; } @@ -3193,17 +3350,17 @@ static int r8152_tx_agg_sg_fill(struct r8152 *tp, struct tx_agg *agg) spin_unlock(&tx_queue->lock); sg = agg->head; - max_sg_num = (agg_buf_sz / sizeof(*sg)) - 1; - max_sg_num = min_t(int, RTL_MAX_SG_NUM, max_sg_num); + max_sg_num = min_t(int, PAGE_SIZE, agg_buf_sz) / sizeof(*sg) - 1; + WARN_ON_ONCE(RTL_MAX_SG_NUM * 2 > max_sg_num); sg_init_table(sg, max_sg_num + 1); agg->skb_num = 0; agg->skb_len = 0; agg->skb_bytes = 0; - for (sg_num = 0; sg_num < max_sg_num;) { + for (sg_num = 0; sg_num < RTL_MAX_SG_NUM;) { struct sk_buff *skb; - int num_sgs, headroom; unsigned int len; + int num_sgs; union { struct tx_desc v1; struct tx_desc_v2 v2; @@ -3213,31 +3370,21 @@ static int r8152_tx_agg_sg_fill(struct r8152 *tp, struct tx_agg *agg) if (!skb) break; - headroom = skb_headroom(skb) - padding - tp->tx_desc.size; - - if (skb_header_cloned(skb) || headroom < 0) { - struct sk_buff *tx_skb; - - headroom = padding + tp->tx_desc.size; - tx_skb = skb_copy_expand(skb, headroom, 0, GFP_ATOMIC); - if (!tx_skb) { - __skb_queue_head(&skb_head, skb); - break; - } - dev_kfree_skb_any(skb); - skb = tx_skb; - headroom = skb_headroom(skb) - headroom; + if (rtl_skb_check(tp, &skb, padding + tp->tx_desc.size) < 0) { + netif_err(tp, tx_err, netdev, + "rtl_skb_check fail. skb: %p, len: %d," + "headroom: %d, nr_frags: %d\n", + skb, skb->len, skb_headroom(skb), + skb_shinfo(skb)->nr_frags); + netdev_completed_queue(netdev, + skb_shinfo(skb)->gso_segs ?: 1, + skb->len); + rtl_drop_tx_skb(tp, skb); + continue; } - /* calculate the fragment numbers for skb */ - num_sgs = 1 + skb_shinfo(skb)->nr_frags; len = skb->len; - if ((num_sgs + sg_num) > max_sg_num) { - __skb_queue_head(&skb_head, skb); - break; - } - if (rtl_tx_csum(tp, &tx_desc, skb, len)) { r8152_csum_workaround(tp, skb, &skb_head); continue; @@ -3245,23 +3392,31 @@ static int r8152_tx_agg_sg_fill(struct r8152 *tp, struct tx_agg *agg) tp->tx_desc.vlan_tag(tp, &tx_desc, skb); - WARN_ON(padding < 0); - /* use skb_headroom for tx desc */ - skb->cb[0] = padding + tp->tx_desc.size; +// skb->cb[0] = padding + tp->tx_desc.size; memcpy(skb_push(skb, tp->tx_desc.size), &tx_desc, tp->tx_desc.size); if (padding) memset(skb_push(skb, padding), 0, padding); num_sgs = skb_to_sgvec_nomark(skb, sg, 0, skb->len); - if (num_sgs < 0) { + if (unlikely(num_sgs < 0)) { netif_err(tp, tx_err, netdev, - "skb_to_sgvec fail %d\n", num_sgs); - __skb_queue_head(&skb_head, skb); - break; + "skb_to_sgvec fail %d, sg_num=%d\n", + num_sgs, sg_num); + netdev_completed_queue(netdev, + skb_shinfo(skb)->gso_segs ?: 1, + len); + rtl_drop_tx_skb(tp, skb); + WARN_ON_ONCE(1); + continue; } + WARN_ON_ONCE(num_sgs > RTL_MAX_SG_NUM); + netif_dbg(tp, tx_queued, netdev, + "sg_num=%d, skb len=%u, num_sgs=%d\n", + sg_num, len, num_sgs); + sg += num_sgs; __skb_queue_tail(&agg->tx_skb, skb); @@ -3276,20 +3431,13 @@ static int r8152_tx_agg_sg_fill(struct r8152 *tp, struct tx_agg *agg) } if (!skb_queue_empty(&skb_head)) { + WARN_ON_ONCE(!sg_num); spin_lock(&tx_queue->lock); skb_queue_splice(&skb_head, tx_queue); spin_unlock(&tx_queue->lock); } - netif_tx_lock(netdev); - - if (netif_queue_stopped(netdev) && - skb_queue_len(&tp->tx_queue) < tp->tx_qlen) - netif_wake_queue(netdev); - - netif_tx_unlock(netdev); - - if (sg_num == 0) { + if (unlikely(sg_num == 0)) { unsigned long flags; spin_lock_irqsave(&tp->tx_lock, flags); @@ -3300,6 +3448,14 @@ static int r8152_tx_agg_sg_fill(struct r8152 *tp, struct tx_agg *agg) goto out_tx_fill; } + netif_tx_lock(netdev); + + if (netif_queue_stopped(netdev) && + skb_queue_len(&tp->tx_queue) < tp->tx_qlen) + netif_wake_queue(netdev); + + netif_tx_unlock(netdev); + ret = usb_autopm_get_interface_async(tp->intf); if (ret < 0) goto out_tx_fill; @@ -3316,12 +3472,14 @@ static int r8152_tx_agg_sg_fill(struct r8152 *tp, struct tx_agg *agg) ret = usb_submit_urb(agg->urb, GFP_ATOMIC); if (ret < 0) usb_autopm_put_interface_async(tp->intf); + else + tp->tx_submit++; out_tx_fill: if (ret < 0) { netdev_completed_queue(netdev, agg->skb_num, agg->skb_bytes); while (!skb_queue_empty(&agg->tx_skb)) - dev_kfree_skb_any(__skb_dequeue(&agg->tx_skb)); + rtl_drop_tx_skb(tp, __skb_dequeue(&agg->tx_skb)); } return ret; @@ -3439,7 +3597,7 @@ static int rx_bottom(struct r8152 *tp, int budget) int ret = 0, work_done = 0; struct napi_struct *napi = &tp->napi; - if (!skb_queue_empty(&tp->rx_queue)) { + if (!skb_queue_empty_lockless(&tp->rx_queue)) { while (work_done < budget) { struct sk_buff *skb = __skb_dequeue(&tp->rx_queue); struct net_device *netdev = tp->netdev; @@ -3537,7 +3695,7 @@ static int rx_bottom(struct r8152 *tp, int budget) len = pkt_len; rx_data += tp->rx_desc.size; - if (!agg_free || tp->rx_copybreak > len) + if (!agg_free || tp->rx_copybreak >= len) use_frags = false; else use_frags = true; @@ -3656,13 +3814,13 @@ out1: static void tx_bottom(struct r8152 *tp) { - int res; + int res, i; - do { + for (i = 0; i < RTL8152_MAX_TX; i++) { struct net_device *netdev = tp->netdev; struct tx_agg *agg; - if (skb_queue_empty(&tp->tx_queue)) + if (skb_queue_empty_lockless(&tp->tx_queue)) break; agg = r8152_get_tx_agg(tp); @@ -3674,13 +3832,11 @@ static void tx_bottom(struct r8152 *tp) else res = r8152_tx_agg_fill(tp, agg); - if (!res) - continue; - if (res == -ENODEV) { rtl_set_unplug(tp); netif_device_detach(netdev); - } else { + break; + } else if (res < 0) { struct net_device_stats *stats = &netdev->stats; unsigned long flags; @@ -3691,8 +3847,9 @@ static void tx_bottom(struct r8152 *tp) spin_lock_irqsave(&tp->tx_lock, flags); list_add_tail(&agg->list, &tp->tx_free); spin_unlock_irqrestore(&tp->tx_lock, flags); + break; } - } while (res == 0); + } } #if LINUX_VERSION_CODE < KERNEL_VERSION(5,9,0) @@ -3811,11 +3968,9 @@ int r8152_submit_rx(struct r8152 *tp, struct rx_agg *agg, gfp_t mem_flags) static void rtl_drop_queued_tx(struct r8152 *tp) { - struct net_device_stats *stats = rtl8152_get_stats(tp->netdev); struct sk_buff_head skb_head, *tx_queue = &tp->tx_queue; - struct sk_buff *skb; - if (skb_queue_empty(tx_queue)) + if (skb_queue_empty_lockless(tx_queue)) return; __skb_queue_head_init(&skb_head); @@ -3823,10 +3978,8 @@ static void rtl_drop_queued_tx(struct r8152 *tp) skb_queue_splice_init(tx_queue, &skb_head); spin_unlock_bh(&tx_queue->lock); - while ((skb = __skb_dequeue(&skb_head))) { - dev_kfree_skb(skb); - stats->tx_dropped++; - } + while (!skb_queue_empty(&skb_head)) + rtl_drop_tx_skb(tp, __skb_dequeue(&skb_head)); } #if LINUX_VERSION_CODE < KERNEL_VERSION(5,6,0) @@ -3840,7 +3993,9 @@ static void rtl8152_tx_timeout(struct net_device *netdev, unsigned int txqueue) int i; #endif - netif_warn(tp, tx_err, netdev, "Tx timeout\n"); + netif_warn(tp, tx_err, netdev, + "Tx timeout: back/submit = %llu/%llu, tx queue = %d\n", + tp->tx_back, tp->tx_submit, skb_queue_len(&tp->tx_queue)); #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,29) for (i = 0; i < RTL8152_MAX_TX; i++) @@ -3932,7 +4087,7 @@ out: /* to do */ netif_wake_queue(netdev); } -static inline bool rtl_gso_check(struct net_device *dev, struct sk_buff *skb) +static bool rtl_gso_check(struct net_device *dev, struct sk_buff *skb) { struct r8152 *tp = netdev_priv(dev); @@ -7255,6 +7410,122 @@ static void rtl_fw_ver_erase(struct r8152 *tp) } } +static int rtl_fc_pause_pkt_en(struct r8152 *tp) +{ + int ret, ratio, temp; + u16 speed, num_pause_pkts; + u32 ocp_data; + + switch (tp->version) { + case RTL_VER_09: + case RTL_VER_14: + /* enable fc timer and set timer to 1 second. */ + ret = ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, + CTRL_TIMER_EN | (1000 / 8)); + if (ret < 0) + break; + + ocp_data = tp->version == RTL_VER_09 ? FLOW_CTRL_PATCH_OPT : + FLOW_CTRL_PATCH_2; + ret = ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, + (u16)ocp_data); + if (ret < 0) + break; + + ret = ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, + FC_PATCH_TASK); + break; + case RTL_VER_12: + case RTL_VER_13: + case RTL_VER_15: + ret = ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); + if (ret < 0) + break; + + ret = ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_CPCR, + FLOW_CTRL_EN); + if (ret < 0) + break; + + /* enable fc timer and set timer to 600 ms. */ + ret = ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, + CTRL_TIMER_EN | (600 / 8)); + if (ret < 0) + break; + + ret = ocp_read_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL, + &ocp_data); + if (ret < 0) + break; + + if (!(ocp_data & DACK_DET_EN)) { + ret = ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, + FLOW_CTRL_PATCH_2); + if (ret < 0) + break; + } + + ret = ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, + FC_PATCH_TASK); + break; + case RTL_VER_16: + case RTL_VER_17: + ret = ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); + if (ret < 0) + break; + + speed = rtl8152_get_speed(tp); + num_pause_pkts = 0xa; + ratio = 10000; + + if (!(speed & LINK_STATUS)) { + dev_dbg(&tp->intf->dev, "No link\n"); + goto no_link; + } else if (speed & _10bps) + ratio /= 10; + else if (speed & _100bps) + ratio /= 100; + else if (speed & _1000bps) + ratio /= 1000; + else if (speed & _2500bps) + ratio /= 2500; + else if (speed & _5000bps) + ratio /= 5000; + else if (speed & _10000bps) + ratio /= 10000; + else { + dev_dbg(&tp->intf->dev, "Unknown link speed\n"); + goto no_link; + } + + temp = ratio; + while (temp > 1) { + temp >>= 1; + num_pause_pkts--; + } + + /* Round up if it is more than halfway to the next power of 2. + * Floating-point is avoided by rewriting ratio > 1.5 * 2^num_pause_pkts + * as 2 * ratio > 3 * 2^num_pause_pkts */ + if (2 * ratio > 3 * (1 << num_pause_pkts)) + num_pause_pkts--; + +no_link: + ret = ocp_word_w0w1(tp, MCU_TYPE_PLA, 0xe61e, 0xf0 | BIT(3), + num_pause_pkts << 4); + if (ret < 0) + break; + + ret = ocp_word_set_bits(tp, MCU_TYPE_PLA, 0xe61e, BIT(3)); + break; + default: + ret = 0; + break; + } + + return ret < 0 ? ret : 0; +} + static void r8153_firmware(struct r8152 *tp) { u32 ocp_data; @@ -8116,7 +8387,7 @@ static void r8153_firmware(struct r8152 *tp) 0x08, 0xe0, 0x0e, 0xe0, 0x11, 0xe0, 0x24, 0xe0, 0x2b, 0xe0, 0x33, 0xe0, - 0x3a, 0xe0, 0x3c, 0xe0, + 0x3a, 0xe0, 0x5b, 0xe0, 0x1e, 0xc3, 0x70, 0x61, 0x12, 0x48, 0x70, 0x89, 0x02, 0xc3, 0x00, 0xbb, @@ -8145,63 +8416,180 @@ static void r8153_firmware(struct r8152 *tp) 0xe0, 0xef, 0x04, 0xc5, 0x02, 0xc4, 0x00, 0xbc, 0x76, 0x3c, 0x1e, 0xfc, - 0x02, 0xc6, 0x00, 0xbe, - 0x00, 0x00, 0x02, 0xc6, - 0x00, 0xbe, 0x00, 0x00 }; - static u8 pla_patch_d[] = { - 0x03, 0xe0, 0x16, 0xe0, - 0x30, 0xe0, 0x12, 0xc2, - 0x40, 0x73, 0xb0, 0x49, - 0x08, 0xf0, 0xb8, 0x49, - 0x06, 0xf0, 0xb8, 0x48, - 0x40, 0x9b, 0x0b, 0xc2, - 0x40, 0x76, 0x05, 0xe0, - 0x02, 0x61, 0x02, 0xc3, - 0x00, 0xbb, 0x54, 0x08, - 0x02, 0xc3, 0x00, 0xbb, - 0x64, 0x08, 0x98, 0xd3, - 0x1e, 0xfc, 0xfe, 0xc0, - 0x02, 0x62, 0xa0, 0x48, - 0x02, 0x8a, 0x00, 0x72, - 0xa0, 0x49, 0x11, 0xf0, - 0x13, 0xc1, 0x20, 0x62, - 0x2e, 0x21, 0x2f, 0x25, - 0x00, 0x71, 0x9f, 0x24, - 0x0a, 0x40, 0x09, 0xf0, - 0x00, 0x71, 0x18, 0x48, - 0xa0, 0x49, 0x03, 0xf1, - 0x9f, 0x48, 0x02, 0xe0, - 0x1f, 0x48, 0x00, 0x99, - 0x02, 0xc2, 0x00, 0xba, - 0xac, 0x0c, 0x08, 0xe9, - 0x36, 0xc0, 0x00, 0x61, + 0x1c, 0xc6, 0xc0, 0x61, + 0x04, 0x11, 0x15, 0xf1, + 0x19, 0xc6, 0xc0, 0x61, 0x9c, 0x20, 0x9c, 0x24, - 0x33, 0xc0, 0x07, 0x11, - 0x05, 0xf1, 0x00, 0x61, - 0x17, 0x48, 0x00, 0x89, - 0x0d, 0xe0, 0x04, 0x11, - 0x0b, 0xf1, 0x00, 0x61, - 0x97, 0x49, 0x08, 0xf0, - 0x97, 0x48, 0x00, 0x89, - 0x23, 0xc0, 0x0e, 0xe8, - 0x12, 0x48, 0x81, 0x1b, - 0x15, 0xe8, 0x1f, 0xc0, - 0x00, 0x61, 0x67, 0x11, - 0x04, 0xf0, 0x02, 0xc0, - 0x00, 0xb8, 0x42, 0x09, - 0x02, 0xc0, 0x00, 0xb8, - 0x90, 0x08, 0x13, 0xc4, - 0x84, 0x98, 0x00, 0x1b, + 0x09, 0x11, 0x0f, 0xf1, + 0x14, 0xc6, 0x01, 0x19, + 0xc0, 0x89, 0x13, 0xc1, + 0x13, 0xc6, 0x24, 0x9e, + 0x00, 0x1e, 0x26, 0x8e, + 0x26, 0x76, 0xef, 0x49, + 0xfe, 0xf1, 0x22, 0x76, + 0x08, 0xc1, 0x22, 0x9e, + 0x07, 0xc6, 0x02, 0xc1, + 0x00, 0xb9, 0x90, 0x06, + 0x18, 0xb4, 0x4a, 0xb4, + 0x90, 0xcc, 0x80, 0xd4, + 0x08, 0xdc, 0x10, 0xe8, + 0xfc, 0xc6, 0xc0, 0x67, + 0xf0, 0x49, 0x13, 0xf0, + 0xf0, 0x48, 0xc0, 0x8f, + 0xc2, 0x77, 0xf7, 0xc4, + 0xf7, 0xc6, 0x84, 0x9e, + 0x82, 0x9f, 0x8c, 0x1e, + 0x86, 0x8e, 0x86, 0x76, + 0xef, 0x49, 0xfe, 0xf1, + 0xfb, 0x49, 0x05, 0xf0, + 0x07, 0xc6, 0xc0, 0x64, + 0x40, 0x48, 0xc0, 0x8c, + 0x02, 0xc6, 0x00, 0xbe, + 0x22, 0x2c, 0x6c, 0xb4 }; + static u8 pla_patch_d[] = { + 0x04, 0xe0, 0x17, 0xe0, + 0x31, 0xe0, 0x18, 0xe1, + 0x12, 0xc2, 0x40, 0x73, + 0xb0, 0x49, 0x08, 0xf0, + 0xb8, 0x49, 0x06, 0xf0, + 0xb8, 0x48, 0x40, 0x9b, + 0x0b, 0xc2, 0x40, 0x76, + 0x05, 0xe0, 0x02, 0x61, + 0x02, 0xc3, 0x00, 0xbb, + 0x54, 0x08, 0x02, 0xc3, + 0x00, 0xbb, 0x64, 0x08, + 0x98, 0xd3, 0x1e, 0xfc, + 0xfe, 0xc0, 0x02, 0x62, + 0xa0, 0x48, 0x02, 0x8a, + 0x00, 0x72, 0xa0, 0x49, + 0x11, 0xf0, 0x13, 0xc1, + 0x20, 0x62, 0x2e, 0x21, + 0x2f, 0x25, 0x00, 0x71, + 0x9f, 0x24, 0x0a, 0x40, + 0x09, 0xf0, 0x00, 0x71, + 0x18, 0x48, 0xa0, 0x49, + 0x03, 0xf1, 0x9f, 0x48, + 0x02, 0xe0, 0x1f, 0x48, + 0x00, 0x99, 0x02, 0xc2, + 0x00, 0xba, 0xac, 0x0c, + 0x08, 0xe9, 0x18, 0x89, + 0x74, 0xc0, 0xcd, 0xe8, + 0x80, 0x76, 0x00, 0x1d, + 0x6e, 0xc3, 0x66, 0x62, + 0xa0, 0x49, 0x06, 0xf0, + 0x64, 0xc0, 0x02, 0x71, + 0x60, 0x99, 0x62, 0xc1, + 0x03, 0xe0, 0x5f, 0xc0, + 0x60, 0xc1, 0x02, 0x99, + 0x00, 0x61, 0x0f, 0x1b, + 0x59, 0x41, 0x03, 0x13, + 0x18, 0xf1, 0xe4, 0x49, + 0x20, 0xf1, 0xe5, 0x49, + 0x1e, 0xf0, 0x59, 0xc6, + 0xd8, 0x73, 0xb7, 0x49, + 0x08, 0xf0, 0x01, 0x0b, + 0x80, 0x13, 0x03, 0xf0, + 0xd8, 0x8b, 0x03, 0xe0, + 0x3f, 0x48, 0xd8, 0x9b, + 0x51, 0xc0, 0x10, 0x1a, + 0x84, 0x1b, 0xb1, 0xe8, + 0x4b, 0xc2, 0x40, 0x63, + 0x30, 0x48, 0x0a, 0xe0, + 0xe5, 0x49, 0x09, 0xf0, + 0x47, 0xc0, 0x00, 0x1a, + 0x84, 0x1b, 0xa7, 0xe8, + 0x41, 0xc2, 0x40, 0x63, + 0xb0, 0x48, 0x40, 0x8b, + 0x67, 0x11, 0x3f, 0xf1, + 0x69, 0x33, 0x32, 0xc0, + 0x28, 0x40, 0xd2, 0xf1, + 0x33, 0xc0, 0x00, 0x19, + 0x81, 0x1b, 0x99, 0xe8, + 0x30, 0xc0, 0x04, 0x1a, + 0x84, 0x1b, 0x95, 0xe8, + 0x8a, 0xe8, 0xa3, 0x49, + 0xfe, 0xf0, 0x2a, 0xc0, + 0x86, 0xe8, 0xa1, 0x48, + 0x84, 0x1b, 0x8d, 0xe8, + 0x00, 0x1d, 0x69, 0x33, + 0x00, 0x1e, 0x01, 0x06, + 0xff, 0x18, 0x30, 0x40, + 0xfd, 0xf1, 0x1f, 0xc0, + 0x00, 0x76, 0x2e, 0x40, + 0xf7, 0xf1, 0x21, 0x48, + 0x19, 0xc0, 0x84, 0x1b, + 0x7e, 0xe8, 0x74, 0x08, + 0x72, 0xe8, 0xa1, 0x49, + 0xfd, 0xf0, 0x11, 0xc0, + 0x00, 0x1a, 0x84, 0x1b, + 0x76, 0xe8, 0x6b, 0xe8, + 0xa5, 0x49, 0xfe, 0xf0, + 0x09, 0xc0, 0x01, 0x19, + 0x81, 0x1b, 0x6f, 0xe8, + 0x5a, 0xe0, 0xb8, 0x0b, + 0x50, 0xe8, 0x83, 0x00, + 0x82, 0x00, 0x20, 0xb4, + 0x10, 0xd8, 0x84, 0xd4, + 0x88, 0xd3, 0x10, 0xe0, + 0x00, 0xd8, 0x24, 0xd4, + 0xf9, 0xc0, 0x57, 0xe8, + 0x48, 0x33, 0xf3, 0xc0, + 0x00, 0x61, 0x6a, 0xc0, + 0x47, 0x11, 0x03, 0xf0, + 0x57, 0x11, 0x05, 0xf1, + 0x00, 0x61, 0x17, 0x48, + 0x00, 0x89, 0x41, 0xe0, + 0x9c, 0x20, 0x9c, 0x24, + 0xd0, 0x49, 0x09, 0xf0, + 0x04, 0x11, 0x07, 0xf1, + 0x00, 0x61, 0x97, 0x49, + 0x38, 0xf0, 0x97, 0x48, + 0x00, 0x89, 0x2b, 0xe0, + 0x00, 0x11, 0x05, 0xf1, + 0x00, 0x61, 0x92, 0x48, + 0x00, 0x89, 0x2f, 0xe0, + 0x06, 0x11, 0x05, 0xf1, + 0x00, 0x61, 0x11, 0x48, + 0x00, 0x89, 0x29, 0xe0, + 0x05, 0x11, 0x0f, 0xf1, + 0x00, 0x61, 0x93, 0x49, + 0x1a, 0xf1, 0x91, 0x49, + 0x0a, 0xf0, 0x91, 0x48, + 0x00, 0x89, 0x0f, 0xe0, + 0xc6, 0xc0, 0x00, 0x61, + 0x98, 0x20, 0x98, 0x24, + 0x25, 0x11, 0x80, 0xff, + 0xfa, 0xef, 0x17, 0xf1, + 0x38, 0xc0, 0x1f, 0xe8, + 0x95, 0x49, 0x13, 0xf0, + 0xf4, 0xef, 0x11, 0xf1, + 0x31, 0xc0, 0x00, 0x61, + 0x92, 0x49, 0x0d, 0xf1, + 0x12, 0x48, 0x00, 0x89, + 0x29, 0xc0, 0x00, 0x19, + 0x00, 0x89, 0x27, 0xc0, + 0x01, 0x89, 0x23, 0xc0, + 0x0e, 0xe8, 0x12, 0x48, + 0x81, 0x1b, 0x15, 0xe8, + 0xae, 0xc3, 0x66, 0x62, + 0xa0, 0x49, 0x04, 0xf0, + 0x64, 0x71, 0xa3, 0xc0, + 0x02, 0x99, 0x02, 0xc0, + 0x00, 0xb8, 0x42, 0x08, + 0x13, 0xc4, 0x84, 0x98, + 0x00, 0x1b, 0x86, 0x8b, + 0x86, 0x73, 0xbf, 0x49, + 0xfe, 0xf1, 0x80, 0x71, + 0x82, 0x72, 0x80, 0xff, + 0x09, 0xc4, 0x84, 0x98, + 0x80, 0x99, 0x82, 0x9a, 0x86, 0x8b, 0x86, 0x73, 0xbf, 0x49, 0xfe, 0xf1, - 0x80, 0x71, 0x82, 0x72, - 0x80, 0xff, 0x09, 0xc4, - 0x84, 0x98, 0x80, 0x99, - 0x82, 0x9a, 0x86, 0x8b, - 0x86, 0x73, 0xbf, 0x49, - 0xfe, 0xf1, 0x80, 0xff, - 0x08, 0xea, 0x30, 0xd4, - 0x50, 0xe8, 0x8a, 0xd3 }; + 0x80, 0xff, 0x08, 0xea, + 0x30, 0xd4, 0x10, 0xc0, + 0x12, 0xe8, 0x8a, 0xd3, + 0x00, 0xd8, 0x02, 0xc1, + 0x00, 0xb9, 0x42, 0x09 }; rtl_pre_ram_code(tp, 0x8146, 0x7003, true); sram_write(tp, 0xb820, 0x0290); @@ -8232,13 +8620,13 @@ static void r8153_firmware(struct r8152 *tp) ocp_write_word(tp, MCU_TYPE_USB, 0xfc2e, 0x1236); ocp_write_word(tp, MCU_TYPE_USB, 0xfc30, 0x0606); ocp_write_word(tp, MCU_TYPE_USB, 0xfc32, 0x3C74); - ocp_write_word(tp, MCU_TYPE_USB, 0xfc34, 0x0000); - ocp_write_word(tp, MCU_TYPE_USB, 0xfc36, 0x0000); + ocp_write_word(tp, MCU_TYPE_USB, 0xfc34, 0x068e); + ocp_write_word(tp, MCU_TYPE_USB, 0xfc36, 0x2b56); ret = ocp_read_byte(tp, MCU_TYPE_USB, USB_CSTMR, &ocp_data); if (ocp_data & FORCE_SUPER) - ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x003f); + ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x00fd); else - ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x003e); + ocp_write_word(tp, MCU_TYPE_USB, USB_BP_EN, 0x00fc); rtl_clear_bp(tp, MCU_TYPE_PLA); @@ -8248,12 +8636,12 @@ static void r8153_firmware(struct r8152 *tp) ocp_write_word(tp, MCU_TYPE_PLA, 0xfc28, 0x0852); ocp_write_word(tp, MCU_TYPE_PLA, 0xfc2a, 0x0c92); ocp_write_word(tp, MCU_TYPE_PLA, 0xfc2c, 0x088c); - ocp_write_word(tp, MCU_TYPE_PLA, 0xfc2e, 0x0000); + ocp_write_word(tp, MCU_TYPE_PLA, 0xfc2e, 0x087a); ocp_write_word(tp, MCU_TYPE_PLA, 0xfc30, 0x0000); ocp_write_word(tp, MCU_TYPE_PLA, 0xfc32, 0x0000); ocp_write_word(tp, MCU_TYPE_PLA, 0xfc34, 0x0000); ocp_write_word(tp, MCU_TYPE_PLA, 0xfc36, 0x0000); - ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x0007); + ocp_write_word(tp, MCU_TYPE_PLA, PLA_BP_EN, 0x000f); ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_USB2PHY, USB2PHY_L1 | USB2PHY_SUSPEND); @@ -8690,10 +9078,6 @@ static void r8153b_firmware(struct r8152 *tp) if (rtl_check_fw_ver_ok(tp, USB_FW_USB_VER, new_ver)) { rtl_clear_bp(tp, MCU_TYPE_USB); - /* enable fc timer and set timer to 1 second. */ - ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, - CTRL_TIMER_EN | (1000 / 8)); - generic_ocp_write(tp, 0xe600, 0xff, sizeof(usb_patch2_b), usb_patch2_b, MCU_TYPE_USB); @@ -8748,10 +9132,7 @@ static void r8153b_firmware(struct r8152 *tp) BIT(0)); } - ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, - FLOW_CTRL_PATCH_OPT); - - ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); + rtl_fc_pause_pkt_en(tp); ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_FIX_EN1, FW_IP_RESET_EN); @@ -8977,10 +9358,6 @@ static void r8153b_firmware(struct r8152 *tp) if (rtl_check_fw_ver_ok(tp, USB_FW_USB_VER, new_ver)) { rtl_clear_bp(tp, MCU_TYPE_USB); - /* enable fc timer and set timer to 1 second. */ - ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, - CTRL_TIMER_EN | (1000 / 8)); - generic_ocp_write(tp, 0xe600, 0xff, sizeof(usb_patch3_a), usb_patch3_a, MCU_TYPE_USB); @@ -9008,10 +9385,7 @@ static void r8153b_firmware(struct r8152 *tp) new_ver); } - ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, - FLOW_CTRL_PATCH_2); - - ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); + rtl_fc_pause_pkt_en(tp); rtl_reset_ocp_base(tp); } @@ -11336,7 +11710,8 @@ static bool rtl_speed_down(struct r8152 *tp) ret = true; r = r8152_mdio_set_bit(tp, MII_BMCR, BMCR_PDOWN); if (r < 0) - goto out1; + netif_err(tp, drv, tp->netdev, + "failed to set BMCR\n"); goto out1; default: break; @@ -12554,7 +12929,8 @@ static int rtk_disable_diag(struct r8152 *tp) rtl_reset_ocp_base(tp); if (tp->support_2500full || tp->support_5000full || tp->support_10gfull) - r8156_mdio_force_mode(tp); + if (r8156_mdio_force_mode(tp) < 0) + netif_err(tp, drv, tp->netdev, "failed to set force mode\n"); netif_info(tp, drv, tp->netdev, "disable rtk diag %d\n", tp->rtk_enable_diag); @@ -12947,22 +13323,24 @@ static int r8153_init(struct r8152 *tp) if (ret < 0) goto out; - if (tp->version == RTL_VER_04 && tp->udev->speed < USB_SPEED_SUPER) - ret = ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_LPM_CTRL, - FIFO_EMPTY_1FB | ROK_EXIT_LPM | - LPM_TIMER_500MS); - else - ret = ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_LPM_CTRL, - FIFO_EMPTY_1FB | ROK_EXIT_LPM | - LPM_TIMER_500US); + ocp_data = FIFO_EMPTY_1FB | ROK_EXIT_LPM; + ocp_data |= (tp->udev->speed < USB_SPEED_SUPER) ? LPM_TIMER_1MS : + LPM_TIMER_500US; + ret = ocp_byte_set_bits(tp, MCU_TYPE_USB, USB_LPM_CTRL, (u8)ocp_data); if (ret < 0) goto out; - ret = ocp_word_w0w1(tp, MCU_TYPE_USB, USB_AFE_CTRL2, SEN_VAL_MASK, - SEN_VAL_NORMAL | SEL_RXIDLE); + ret = ocp_write_byte(tp, MCU_TYPE_USB, 0xcbd2, ocp_data); if (ret < 0) goto out; + if (tp->version == RTL_VER_04 || tp->version == RTL_VER_05) { + ret = ocp_word_w0w1(tp, MCU_TYPE_USB, USB_AFE_CTRL2, + SEN_VAL_MASK, SEN_VAL_NORMAL | SEL_RXIDLE); + if (ret < 0) + goto out; + } + ret = ocp_write_word(tp, MCU_TYPE_USB, USB_CONNECT_TIMER, 0x0001); if (ret < 0) goto out; @@ -18573,19 +18951,19 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x00, 0x18, 0x38, 0xb4, 0x10, 0x80, 0x38, 0xb4, 0x00, 0x18, - 0x38, 0xb4, 0x1d, 0x80, + 0x38, 0xb4, 0x63, 0x86, 0x38, 0xb4, 0x00, 0x18, - 0x38, 0xb4, 0x3b, 0x80, + 0x38, 0xb4, 0x81, 0x86, 0x38, 0xb4, 0x00, 0x18, - 0x38, 0xb4, 0x87, 0x80, + 0x38, 0xb4, 0xcd, 0x86, 0x38, 0xb4, 0x00, 0x18, - 0x38, 0xb4, 0x8e, 0x80, + 0x38, 0xb4, 0xd4, 0x86, 0x38, 0xb4, 0x00, 0x18, - 0x38, 0xb4, 0x9d, 0x80, + 0x38, 0xb4, 0xe3, 0x86, 0x38, 0xb4, 0x00, 0x18, - 0x38, 0xb4, 0xb7, 0x80, + 0x38, 0xb4, 0x44, 0x89, 0x38, 0xb4, 0x00, 0x18, - 0x38, 0xb4, 0xc4, 0x80, + 0x38, 0xb4, 0x51, 0x89, 0x38, 0xb4, 0xbc, 0xd1, 0x38, 0xb4, 0x40, 0xd0, 0x38, 0xb4, 0x00, 0x10, @@ -18594,16 +18972,1628 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0xba, 0x5f, 0x38, 0xb4, 0x00, 0xd7, 0x38, 0xb4, 0x3d, 0x27, - 0x38, 0xb4, 0x1b, 0x80, - 0x38, 0xb4, 0x00, 0x18, - 0x38, 0xb4, 0xd1, 0x07, - 0x38, 0xb4, 0x00, 0x18, - 0x38, 0xb4, 0x0e, 0x08, + 0x38, 0xb4, 0x56, 0x80, 0x38, 0xb4, 0x00, 0xd7, 0x38, 0xb4, 0xc9, 0x37, - 0x38, 0xb4, 0x32, 0x80, + 0x38, 0xb4, 0x2e, 0x80, 0x38, 0xb4, 0xa9, 0x33, - 0x38, 0xb4, 0x2a, 0x80, + 0x38, 0xb4, 0x26, 0x80, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x99, 0x60, + 0x38, 0xb4, 0xb7, 0xd1, + 0x38, 0xb4, 0x5c, 0xd0, + 0x38, 0xb4, 0x13, 0xf0, + 0x38, 0xb4, 0xb7, 0xd1, + 0x38, 0xb4, 0x5c, 0xd0, + 0x38, 0xb4, 0x10, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x99, 0x60, + 0x38, 0xb4, 0xb7, 0xd1, + 0x38, 0xb4, 0x5c, 0xd0, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0xb7, 0xd1, + 0x38, 0xb4, 0x5c, 0xd0, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x99, 0x60, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x5d, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x5d, 0xd0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0x4a, 0x80, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0x42, 0x80, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x99, 0x60, + 0x38, 0xb4, 0xbf, 0xd1, + 0x38, 0xb4, 0x6d, 0xd0, + 0x38, 0xb4, 0x13, 0xf0, + 0x38, 0xb4, 0xe5, 0xd1, + 0x38, 0xb4, 0x6d, 0xd0, + 0x38, 0xb4, 0x10, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x99, 0x60, + 0x38, 0xb4, 0xec, 0xd1, + 0x38, 0xb4, 0x6d, 0xd0, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0xbf, 0xd1, + 0x38, 0xb4, 0x6d, 0xd0, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x99, 0x60, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x6e, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x6e, 0xd0, + 0x38, 0xb4, 0x03, 0xd7, + 0x38, 0xb4, 0x90, 0x60, + 0x38, 0xb4, 0x1a, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x08, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x31, 0xcd, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xa9, 0x2f, + 0x38, 0xb4, 0x61, 0x80, + 0x38, 0xb4, 0xc9, 0x33, + 0x38, 0xb4, 0x64, 0x80, + 0x38, 0xb4, 0x17, 0x61, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x41, 0xd1, + 0x38, 0xb4, 0x43, 0xd0, + 0x38, 0xb4, 0x09, 0xf0, + 0x38, 0xb4, 0x21, 0xd1, + 0x38, 0xb4, 0x43, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x22, 0xd1, + 0x38, 0xb4, 0x42, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x81, 0xd1, + 0x38, 0xb4, 0x43, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xba, 0x5f, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0xda, 0x80, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcb, 0x6c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x67, 0x6d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0xa0, 0x81, + 0x38, 0xb4, 0x12, 0x83, + 0x38, 0xb4, 0x80, 0x84, + 0x38, 0xb4, 0x86, 0x0c, + 0x38, 0xb4, 0x80, 0x06, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x02, 0x87, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x07, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x03, 0xd7, + 0x38, 0xb4, 0x90, 0x60, + 0x38, 0xb4, 0x1a, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x06, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x39, 0xcd, + 0x38, 0xb4, 0x04, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x01, 0x0c, + 0x38, 0xb4, 0x07, 0x8d, + 0x38, 0xb4, 0xc3, 0x0c, + 0x38, 0xb4, 0x40, 0x0b, + 0x38, 0xb4, 0x07, 0x8d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x10, 0xa8, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0xa0, 0x0c, + 0x38, 0xb4, 0x80, 0x04, + 0x38, 0xb4, 0x84, 0xa6, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0xa7, 0x5f, + 0x38, 0xb4, 0x20, 0xb9, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xb4, 0x7f, + 0x38, 0xb4, 0x10, 0x88, + 0x38, 0xb4, 0x20, 0x99, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xe5, 0x60, + 0x38, 0xb4, 0x94, 0x5f, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0xa7, 0x5f, + 0x38, 0xb4, 0xf0, 0xff, + 0x38, 0xb4, 0x20, 0xb8, + 0x38, 0xb4, 0x10, 0xa8, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xa5, 0x7f, + 0x38, 0xb4, 0x20, 0x98, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x69, 0x5f, + 0x38, 0xb4, 0x10, 0xf0, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x80, 0xae, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x6d, 0x2b, + 0x38, 0xb4, 0x84, 0x81, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x06, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x32, 0xcd, + 0x38, 0xb4, 0x01, 0xd7, + 0x38, 0xb4, 0x91, 0x61, + 0x38, 0xb4, 0x04, 0xa5, + 0x38, 0xb4, 0x3a, 0xcd, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x67, 0x60, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x01, 0xd7, + 0x38, 0xb4, 0x3a, 0x5f, + 0x38, 0xb4, 0x04, 0x85, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x39, 0x27, + 0x38, 0xb4, 0x7a, 0x81, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0x61, 0x60, + 0x38, 0xb4, 0x00, 0x18, + 0x38, 0xb4, 0x6c, 0x81, + 0x38, 0xb4, 0x93, 0xd1, + 0x38, 0xb4, 0x47, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x7a, 0x5f, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x29, 0x5f, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x0f, 0x0c, + 0x38, 0xb4, 0x01, 0x0b, + 0x38, 0xb4, 0x3f, 0x0c, + 0x38, 0xb4, 0x08, 0x0c, + 0x38, 0xb4, 0xc0, 0x8b, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0x9f, 0x40, + 0x38, 0xb4, 0x62, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x20, 0xa4, + 0x38, 0xb4, 0x93, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x7a, 0x5f, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x29, 0x5f, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xe8, 0x00, 0xa0, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x01, 0x0c, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x20, 0x84, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x12, 0x83, + 0x38, 0xb4, 0x80, 0x84, + 0x38, 0xb4, 0x04, 0x86, + 0x38, 0xb4, 0x19, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x80, 0x40, + 0x38, 0xb4, 0x20, 0xbb, + 0x38, 0xb4, 0x00, 0x18, + 0x38, 0xb4, 0x07, 0x85, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0x80, 0xa4, + 0x38, 0xb4, 0x04, 0xa6, + 0x38, 0xb4, 0x93, 0xd1, + 0x38, 0xb4, 0x47, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x7a, 0x5f, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x29, 0x5f, + 0x38, 0xb4, 0x00, 0x18, + 0x38, 0xb4, 0x4f, 0x81, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x02, 0x83, + 0x38, 0xb4, 0x80, 0x84, + 0x38, 0xb4, 0x04, 0x86, + 0x38, 0xb4, 0x05, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x20, 0xbb, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0x80, 0xa4, + 0x38, 0xb4, 0x04, 0xa6, + 0x38, 0xb4, 0x00, 0x18, + 0x38, 0xb4, 0x07, 0x85, + 0x38, 0xb4, 0x05, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x04, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x2b, + 0x38, 0xb4, 0x84, 0x81, + 0x38, 0xb4, 0x6d, 0xf0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x01, 0x0c, + 0x38, 0xb4, 0x3f, 0x0c, + 0x38, 0xb4, 0x08, 0x0d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x10, 0xa8, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0xa0, 0x0c, + 0x38, 0xb4, 0x80, 0x04, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0x60, 0x09, + 0x38, 0xb4, 0xa4, 0x60, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7d, 0x40, + 0x38, 0xb4, 0x04, 0x86, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x04, 0xa6, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x40, 0xa3, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcd, 0x37, + 0x38, 0xb4, 0xb4, 0x81, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0xa7, 0x5f, + 0x38, 0xb4, 0x20, 0xb9, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xb4, 0x7f, + 0x38, 0xb4, 0x10, 0x88, + 0x38, 0xb4, 0x20, 0x99, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xe5, 0x60, + 0x38, 0xb4, 0x94, 0x5f, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0xa7, 0x5f, + 0x38, 0xb4, 0xf0, 0xff, + 0x38, 0xb4, 0x20, 0xb8, + 0x38, 0xb4, 0x10, 0xa8, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xa5, 0x7f, + 0x38, 0xb4, 0x20, 0x98, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x59, 0x2d, + 0x38, 0xb4, 0x07, 0x85, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x8c, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0xe3, 0x81, + 0x38, 0xb4, 0xe4, 0x60, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0xbd, 0x40, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0xec, 0x81, + 0x38, 0xb4, 0xa4, 0x60, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7d, 0x40, + 0x38, 0xb4, 0x02, 0xa2, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x02, 0x82, + 0x38, 0xb4, 0x20, 0xa4, + 0x38, 0xb4, 0x00, 0x18, + 0x38, 0xb4, 0x1d, 0x86, + 0x38, 0xb4, 0x10, 0x88, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xbb, 0x5f, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x5a, 0xd0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x0f, 0x0c, + 0x38, 0xb4, 0x04, 0x0b, + 0x38, 0xb4, 0x3f, 0x0c, + 0x38, 0xb4, 0x21, 0x0c, + 0x38, 0xb4, 0x07, 0x8d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x40, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x10, 0xa1, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xef, 0x1c, + 0x38, 0xb4, 0x10, 0x81, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0x04, 0xa3, + 0x38, 0xb4, 0x40, 0xa4, + 0x38, 0xb4, 0xc0, 0xa8, + 0x38, 0xb4, 0x10, 0x88, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x5d, 0x40, + 0x38, 0xb4, 0x08, 0xa3, + 0x38, 0xb4, 0xfc, 0x0c, + 0x38, 0xb4, 0x24, 0x02, + 0x38, 0xb4, 0xa0, 0x0c, + 0x38, 0xb4, 0x80, 0x04, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x40, 0xa3, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcd, 0x37, + 0x38, 0xb4, 0x31, 0x82, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x62, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xba, 0x5f, + 0x38, 0xb4, 0x40, 0x88, + 0x38, 0xb4, 0xc4, 0xd1, + 0x38, 0xb4, 0x45, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xba, 0x5f, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x27, 0x61, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x3b, 0x5f, + 0x38, 0xb4, 0xc0, 0x88, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x50, 0x83, + 0x38, 0xb4, 0xa0, 0x84, + 0x38, 0xb4, 0xad, 0xff, + 0x38, 0xb4, 0x20, 0xb9, + 0x38, 0xb4, 0x33, 0xcd, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xb4, 0x7f, + 0x38, 0xb4, 0x20, 0x99, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0x65, 0x60, + 0x38, 0xb4, 0x94, 0x5f, + 0x38, 0xb4, 0xee, 0xff, + 0x38, 0xb4, 0x20, 0xb8, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xa5, 0x7f, + 0x38, 0xb4, 0x20, 0x98, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x08, 0xa1, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xef, 0x1c, + 0x38, 0xb4, 0x08, 0x81, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0xbd, 0x60, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0x3f, 0x41, + 0x38, 0xb4, 0x00, 0x41, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0xfd, 0x0c, + 0x38, 0xb4, 0x01, 0x02, + 0x38, 0xb4, 0x05, 0xf0, + 0x38, 0xb4, 0xfc, 0x0c, + 0x38, 0xb4, 0xbc, 0x02, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0xfc, 0xa2, + 0x38, 0xb4, 0x04, 0xa3, + 0x38, 0xb4, 0x80, 0x88, + 0x38, 0xb4, 0xc0, 0x0c, + 0x38, 0xb4, 0x40, 0x04, + 0x38, 0xb4, 0x34, 0xcd, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7d, 0x40, + 0x38, 0xb4, 0x5b, 0x40, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0xfd, 0x60, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0xbf, 0x40, + 0x38, 0xb4, 0x80, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x15, 0x1d, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x8c, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x9d, 0x40, + 0x38, 0xb4, 0x0f, 0x8b, + 0x38, 0xb4, 0x38, 0x8c, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x0f, 0x0c, + 0x38, 0xb4, 0x07, 0x0b, + 0x38, 0xb4, 0x38, 0xac, + 0x38, 0xb4, 0x38, 0x0c, + 0x38, 0xb4, 0x10, 0x0d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x10, 0xa8, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7d, 0x60, + 0x38, 0xb4, 0xa0, 0xa4, + 0x38, 0xb4, 0x04, 0xa6, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0x9f, 0x82, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x49, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x9f, 0xd1, + 0x38, 0xb4, 0x49, 0xd0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x3d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0x14, 0x6a, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x9a, 0x40, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x88, 0x49, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf5, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdd, 0xff, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x0f, 0x8b, + 0x38, 0xb4, 0x38, 0x8c, + 0x38, 0xb4, 0x38, 0x8d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0xd8, 0x82, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0xd5, 0x82, + 0x38, 0xb4, 0xf4, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0xb7, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0xc6, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x3d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xf4, 0x62, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x5a, 0x40, + 0x38, 0xb4, 0x1a, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf7, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdf, 0xff, + 0x38, 0xb4, 0x03, 0x84, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x9c, 0x62, + 0x38, 0xb4, 0xfb, 0xff, + 0x38, 0xb4, 0x03, 0x84, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0x96, 0x60, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x9c, 0x61, + 0x38, 0xb4, 0xfa, 0xff, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x28, 0x41, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0xb0, 0x60, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x80, 0xae, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x00, 0x18, + 0x38, 0xb4, 0x31, 0x84, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x5a, 0xd0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x0f, 0x0c, + 0x38, 0xb4, 0x04, 0x0b, + 0x38, 0xb4, 0x3f, 0x0c, + 0x38, 0xb4, 0x21, 0x0c, + 0x38, 0xb4, 0x07, 0x8d, + 0x38, 0xb4, 0xc3, 0x0c, + 0x38, 0xb4, 0x40, 0x0b, + 0x38, 0xb4, 0x3f, 0x0c, + 0x38, 0xb4, 0x24, 0x0c, + 0x38, 0xb4, 0x07, 0x8d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x40, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x10, 0xa1, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xef, 0x1c, + 0x38, 0xb4, 0x10, 0x81, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0x04, 0xa3, + 0x38, 0xb4, 0x40, 0xa4, + 0x38, 0xb4, 0xc0, 0xa8, + 0x38, 0xb4, 0x10, 0x88, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xe8, 0x00, 0xa0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x5d, 0x40, + 0x38, 0xb4, 0x08, 0xa3, + 0x38, 0xb4, 0xfc, 0x0c, + 0x38, 0xb4, 0x24, 0x02, + 0x38, 0xb4, 0xa0, 0x0c, + 0x38, 0xb4, 0x80, 0x04, + 0x38, 0xb4, 0x04, 0x86, + 0x38, 0xb4, 0x35, 0xcd, + 0x38, 0xb4, 0x62, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xba, 0x5f, + 0x38, 0xb4, 0x40, 0x88, + 0x38, 0xb4, 0xc4, 0xd1, + 0x38, 0xb4, 0x45, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xba, 0x5f, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x27, 0x61, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x3b, 0x5f, + 0x38, 0xb4, 0xc0, 0x88, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x50, 0x83, + 0x38, 0xb4, 0xa0, 0x84, + 0x38, 0xb4, 0xae, 0xff, + 0x38, 0xb4, 0x80, 0xbb, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xb4, 0x5f, + 0x38, 0xb4, 0x20, 0xb9, + 0x38, 0xb4, 0x36, 0xcd, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xb4, 0x7f, + 0x38, 0xb4, 0x20, 0x99, + 0x38, 0xb4, 0x80, 0x9b, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0x65, 0x60, + 0x38, 0xb4, 0x94, 0x5f, + 0x38, 0xb4, 0xe8, 0xff, + 0x38, 0xb4, 0x20, 0xb8, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xa5, 0x7f, + 0x38, 0xb4, 0x20, 0x98, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x08, 0xa1, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xef, 0x1c, + 0x38, 0xb4, 0x08, 0x81, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0xbd, 0x60, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0x3f, 0x41, + 0x38, 0xb4, 0x00, 0x41, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0xfd, 0x0c, + 0x38, 0xb4, 0x01, 0x02, + 0x38, 0xb4, 0x05, 0xf0, + 0x38, 0xb4, 0xfc, 0x0c, + 0x38, 0xb4, 0xbc, 0x02, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0xfc, 0xa2, + 0x38, 0xb4, 0x04, 0xa3, + 0x38, 0xb4, 0x80, 0x88, + 0x38, 0xb4, 0xc0, 0x0c, + 0x38, 0xb4, 0x40, 0x04, + 0x38, 0xb4, 0x37, 0xcd, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7d, 0x40, + 0x38, 0xb4, 0x5b, 0x40, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0xfd, 0x60, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0xbf, 0x40, + 0x38, 0xb4, 0x80, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x15, 0x1d, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x8c, + 0x38, 0xb4, 0xc0, 0x0c, + 0x38, 0xb4, 0x00, 0x0b, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0xbd, 0x40, + 0x38, 0xb4, 0x0f, 0x8b, + 0x38, 0xb4, 0x38, 0x8c, + 0x38, 0xb4, 0x3f, 0x8c, + 0x38, 0xb4, 0x05, 0xf0, + 0x38, 0xb4, 0x0f, 0x0c, + 0x38, 0xb4, 0x07, 0x0b, + 0x38, 0xb4, 0x38, 0xac, + 0x38, 0xb4, 0x3f, 0xac, + 0x38, 0xb4, 0x38, 0x0c, + 0x38, 0xb4, 0x10, 0x0d, + 0x38, 0xb4, 0x38, 0x0c, + 0x38, 0xb4, 0x10, 0x0d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x10, 0xa8, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7d, 0x60, + 0x38, 0xb4, 0xa0, 0xa4, + 0x38, 0xb4, 0x04, 0xa6, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0xd0, 0x83, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0xcd, 0x83, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x3d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x9a, 0x40, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x48, 0x40, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf5, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdd, 0xff, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x0f, 0x8b, + 0x38, 0xb4, 0x38, 0x8c, + 0x38, 0xb4, 0x38, 0x8d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0x09, 0x84, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0x06, 0x84, + 0x38, 0xb4, 0x3d, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x89, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x3d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x9a, 0x40, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x48, 0x40, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf5, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdd, 0xff, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x01, 0x0d, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x01, 0x0b, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x01, 0x0d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x80, 0xa1, + 0x38, 0xb4, 0x38, 0xcd, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0x65, 0x84, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0x5d, 0x84, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x13, 0xf0, + 0x38, 0xb4, 0x00, 0xd1, + 0x38, 0xb4, 0x49, 0xd0, + 0x38, 0xb4, 0x10, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0xb7, 0xd1, + 0x38, 0xb4, 0x49, 0xd0, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x00, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x3b, 0xd1, + 0x38, 0xb4, 0x55, 0xd0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x3d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0xa0, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x5b, 0x40, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf7, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0xa0, 0x81, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdf, 0xff, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x5d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0xa0, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x9a, 0x40, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x48, 0x40, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf5, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0xa0, 0x81, + 0x38, 0xb4, 0x12, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdc, 0xff, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x0f, 0x0c, + 0x38, 0xb4, 0x02, 0x0b, + 0x38, 0xb4, 0x38, 0x0c, + 0x38, 0xb4, 0x10, 0x0c, + 0x38, 0xb4, 0x3f, 0x0c, + 0x38, 0xb4, 0x12, 0x0c, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0xd8, 0x84, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0xd0, 0x84, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x13, 0xf0, + 0x38, 0xb4, 0x00, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x10, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x00, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x6b, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x5d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0xa0, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xba, 0x40, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x6a, 0x40, + 0x38, 0xb4, 0x03, 0x84, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf4, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0xa0, 0x81, + 0x38, 0xb4, 0x12, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdb, 0xff, + 0x38, 0xb4, 0xa0, 0x81, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x80, 0xa4, + 0x38, 0xb4, 0x20, 0x84, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0x17, 0x85, + 0x38, 0xb4, 0xe4, 0x60, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xa7, 0x40, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7d, 0x40, + 0x38, 0xb4, 0x04, 0x86, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x04, 0xa6, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc7, 0x60, + 0x38, 0xb4, 0x02, 0xa6, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x02, 0xa7, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x40, 0xa3, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x03, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x01, 0x0c, + 0x38, 0xb4, 0x3f, 0x0c, + 0x38, 0xb4, 0x08, 0x0d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x6d, 0x64, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0x58, 0x85, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0x4e, 0x85, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc7, 0x40, + 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xe8, 0x00, 0xa0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x60, + 0x38, 0xb4, 0x00, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x1a, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x49, 0xd0, + 0x38, 0xb4, 0x17, 0xf0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc7, 0x40, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x60, + 0x38, 0xb4, 0x00, 0xd1, + 0x38, 0xb4, 0x49, 0xd0, + 0x38, 0xb4, 0x10, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x0d, 0xf0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc7, 0x40, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x60, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x7a, 0x5f, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x29, 0x5f, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x0f, 0x0c, + 0x38, 0xb4, 0x01, 0x0b, + 0x38, 0xb4, 0x3f, 0x0c, + 0x38, 0xb4, 0x08, 0x0c, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0x9c, 0x85, + 0x38, 0xb4, 0x24, 0x62, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x47, 0x41, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x9d, 0x40, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x3b, 0x61, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0x1f, 0x41, + 0x38, 0xb4, 0xe0, 0x40, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0x9f, 0x40, + 0x38, 0xb4, 0x62, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0xa7, 0x85, + 0x38, 0xb4, 0xe4, 0x60, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xa7, 0x40, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7d, 0x40, + 0x38, 0xb4, 0x02, 0xa2, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x02, 0x82, + 0x38, 0xb4, 0x20, 0xa4, + 0x38, 0xb4, 0x3b, 0xcd, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xad, 0x65, + 0x38, 0xb4, 0xc7, 0x43, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0xc2, 0x85, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0xba, 0x85, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x24, 0xf0, + 0x38, 0xb4, 0x3d, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x21, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0xc6, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x1c, 0xf0, + 0x38, 0xb4, 0x5c, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x19, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x11, 0xf0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0xd5, 0x85, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0xd2, 0x85, + 0x38, 0xb4, 0xe5, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x09, 0xf0, + 0x38, 0xb4, 0x91, 0xd1, + 0x38, 0xb4, 0x4d, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4d, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x6b, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x7a, 0x5f, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x2c, 0x5f, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xe7, 0x40, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x01, 0x0d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x02, 0x0d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x3c, 0xcd, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x4d, 0x64, + 0x38, 0xb4, 0xc7, 0x43, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0x08, 0x86, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0x00, 0x86, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x19, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x16, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x11, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x0e, 0xf0, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x40, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x09, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x49, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x7a, 0x5f, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x2d, 0x5f, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x0f, 0x0c, + 0x38, 0xb4, 0x02, 0x0b, + 0x38, 0xb4, 0x38, 0x0c, + 0x38, 0xb4, 0x10, 0x0c, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x80, 0xa1, + 0x38, 0xb4, 0x3d, 0xcd, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0x5f, 0x86, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0x55, 0x86, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0x4b, 0x86, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc7, 0x40, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x60, + 0x38, 0xb4, 0x1f, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x1a, 0xf0, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x17, 0xf0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc7, 0x40, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x60, + 0x38, 0xb4, 0x1f, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x10, 0xf0, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x0d, 0xf0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc7, 0x40, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0x98, 0x60, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x4c, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x00, 0x18, + 0x38, 0xb4, 0x04, 0x0e, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0x78, 0x86, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0x70, 0x86, 0x38, 0xb4, 0x05, 0xd7, 0x38, 0xb4, 0x84, 0x40, 0x38, 0xb4, 0xf4, 0xd1, @@ -18631,7 +20621,7 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0xcc, 0x14, 0x38, 0xb4, 0x00, 0xd7, 0x38, 0xb4, 0x59, 0x2b, - 0x38, 0xb4, 0x3f, 0x80, + 0x38, 0xb4, 0x85, 0x86, 0x38, 0xb4, 0x03, 0xf0, 0x38, 0xb4, 0x00, 0x18, 0x38, 0xb4, 0x8f, 0x11, @@ -18690,9 +20680,9 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x03, 0x95, 0x38, 0xb4, 0x00, 0xd7, 0x38, 0xb4, 0xc9, 0x37, - 0x38, 0xb4, 0x83, 0x80, + 0x38, 0xb4, 0xc9, 0x86, 0x38, 0xb4, 0xa9, 0x33, - 0x38, 0xb4, 0x7f, 0x80, + 0x38, 0xb4, 0xc5, 0x86, 0x38, 0xb4, 0x78, 0xd1, 0x38, 0xb4, 0x4b, 0xd0, 0x38, 0xb4, 0x00, 0x18, @@ -18718,31 +20708,616 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x00, 0x10, 0x38, 0xb4, 0x0b, 0x1d, 0x38, 0xb4, 0x00, 0x10, - 0x38, 0xb4, 0xad, 0x80, + 0x38, 0xb4, 0x3a, 0x89, 0x38, 0xb4, 0x00, 0x18, 0x38, 0xb4, 0xf2, 0x01, 0x38, 0xb4, 0x00, 0x10, 0x38, 0xb4, 0x0b, 0x1d, 0x38, 0xb4, 0x00, 0x10, - 0x38, 0xb4, 0xad, 0x80, + 0x38, 0xb4, 0x3a, 0x89, 0x38, 0xb4, 0x00, 0x18, 0x38, 0xb4, 0xf9, 0x01, 0x38, 0xb4, 0x69, 0x29, - 0x38, 0xb4, 0xa3, 0x80, + 0x38, 0xb4, 0xe9, 0x86, 0x38, 0xb4, 0x00, 0xd7, 0x38, 0xb4, 0x6b, 0x60, 0x38, 0xb4, 0x01, 0xd7, 0x38, 0xb4, 0xb4, 0x60, 0x38, 0xb4, 0x00, 0x10, - 0x38, 0xb4, 0xad, 0x80, + 0x38, 0xb4, 0x3a, 0x89, 0x38, 0xb4, 0x00, 0x18, 0x38, 0xb4, 0x51, 0x05, 0x38, 0xb4, 0x96, 0xd1, 0x38, 0xb4, 0x4d, 0xd0, 0x38, 0xb4, 0x00, 0x10, - 0x38, 0xb4, 0xad, 0x80, + 0x38, 0xb4, 0x3a, 0x89, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xba, 0x5f, + 0x38, 0xb4, 0x02, 0x88, + 0x38, 0xb4, 0x22, 0xcd, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x5a, 0xd0, + 0x38, 0xb4, 0x01, 0xa5, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x01, 0xd7, + 0x38, 0xb4, 0xbd, 0x5f, + 0x38, 0xb4, 0x01, 0x85, + 0x38, 0xb4, 0x02, 0xa5, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x02, 0xd7, + 0x38, 0xb4, 0xbe, 0x5f, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x03, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x02, 0x85, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x80, 0x8a, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x0c, 0xd4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xc8, 0x1c, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0x8f, 0x42, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x1d, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x1b, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x19, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x17, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x15, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x13, 0xf0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x02, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x02, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x01, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x01, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x01, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x01, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x40, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x10, 0xa1, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xef, 0x1c, + 0x38, 0xb4, 0x10, 0x81, + 0x38, 0xb4, 0x00, 0x10, + 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xe8, 0x00, 0xa0, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0x04, 0xa3, + 0x38, 0xb4, 0x40, 0xa4, + 0x38, 0xb4, 0xc0, 0xa8, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0xcf, 0x40, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x8d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0xa0, 0x0c, + 0x38, 0xb4, 0x80, 0x04, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0xb7, 0x05, + 0x38, 0xb4, 0xa4, 0x60, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7d, 0x40, + 0x38, 0xb4, 0x08, 0xa3, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x08, 0x83, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x60, 0x0c, + 0x38, 0xb4, 0x40, 0x03, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x23, 0xcd, + 0x38, 0xb4, 0x62, 0xd1, + 0x38, 0xb4, 0x48, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xba, 0x5f, + 0x38, 0xb4, 0x40, 0x88, + 0x38, 0xb4, 0xc4, 0xd1, + 0x38, 0xb4, 0x45, 0xd0, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xba, 0x5f, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x27, 0x63, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x3b, 0x5f, + 0x38, 0xb4, 0xc0, 0x88, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x58, 0x83, + 0x38, 0xb4, 0x08, 0x83, + 0x38, 0xb4, 0xa0, 0x84, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x60, 0x83, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0x7d, 0x2f, + 0x38, 0xb4, 0xf7, 0x86, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x5a, 0xd0, + 0x38, 0xb4, 0x01, 0xa5, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x01, 0xd7, + 0x38, 0xb4, 0xbd, 0x5f, + 0x38, 0xb4, 0x01, 0x85, + 0x38, 0xb4, 0x8b, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xb4, 0x5f, + 0x38, 0xb4, 0x20, 0xb9, + 0x38, 0xb4, 0x24, 0xcd, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xb4, 0x7f, + 0x38, 0xb4, 0x20, 0x99, + 0x38, 0xb4, 0x20, 0x9a, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0x65, 0x60, + 0x38, 0xb4, 0x94, 0x5f, + 0x38, 0xb4, 0xd9, 0xff, + 0x38, 0xb4, 0x20, 0xb8, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x1f, 0xd7, + 0x38, 0xb4, 0xa5, 0x7f, + 0x38, 0xb4, 0x20, 0x98, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x08, 0xa1, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xef, 0x1c, + 0x38, 0xb4, 0x08, 0x81, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0xb8, 0x87, + 0x38, 0xb4, 0x44, 0x61, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0xbd, 0x60, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0x7f, 0x41, + 0x38, 0xb4, 0x40, 0x41, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0xfc, 0x82, + 0x38, 0xb4, 0x01, 0xa2, + 0x38, 0xb4, 0x07, 0xf0, + 0x38, 0xb4, 0xfc, 0xa2, + 0x38, 0xb4, 0x05, 0xf0, + 0x38, 0xb4, 0xfc, 0x0c, + 0x38, 0xb4, 0xbc, 0x02, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0xfc, 0xa2, + 0x38, 0xb4, 0x04, 0xa3, + 0x38, 0xb4, 0x80, 0x88, + 0x38, 0xb4, 0xc0, 0x0c, + 0x38, 0xb4, 0x40, 0x04, + 0x38, 0xb4, 0x25, 0xcd, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0xd7, 0x87, + 0x38, 0xb4, 0x24, 0x62, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x5d, 0x60, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x3b, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0xd7, 0x87, + 0x38, 0xb4, 0xeb, 0x60, + 0x38, 0xb4, 0x07, 0xd7, + 0x38, 0xb4, 0xbf, 0x40, + 0x38, 0xb4, 0x80, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x15, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x06, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x8c, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x03, 0x0d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0xf9, 0x87, + 0x38, 0xb4, 0xc4, 0x60, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x9d, 0x40, + 0x38, 0xb4, 0x0f, 0x8b, + 0x38, 0xb4, 0x38, 0x8c, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x07, 0xab, + 0x38, 0xb4, 0x38, 0xac, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x03, 0x0d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x10, 0xa8, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0x07, 0x88, + 0x38, 0xb4, 0x64, 0x60, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7d, 0x60, + 0x38, 0xb4, 0xa0, 0xa4, + 0x38, 0xb4, 0x05, 0xa6, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x49, 0xd0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0x19, 0x88, + 0x38, 0xb4, 0x64, 0x61, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x3d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x9a, 0x40, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x46, 0x40, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf5, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdd, 0xff, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x0f, 0x8b, + 0x38, 0xb4, 0x38, 0x8c, + 0x38, 0xb4, 0x38, 0x8d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x26, 0xcd, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0xd1, 0x63, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0x58, 0x88, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0x55, 0x88, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0x4d, 0x88, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x84, 0x60, + 0x38, 0xb4, 0x8a, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x4c, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x11, 0xf0, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x84, 0x60, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x0c, 0xf0, + 0x38, 0xb4, 0x5c, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x09, 0xf0, + 0x38, 0xb4, 0xc6, 0xd1, + 0x38, 0xb4, 0x4b, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0xb7, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0xc4, 0xd1, + 0x38, 0xb4, 0x46, 0xd0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0x6b, 0x88, + 0x38, 0xb4, 0x64, 0x61, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x3d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0x20, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x9a, 0x40, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x48, 0x40, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf5, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0x20, 0x81, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdd, 0xff, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x07, 0x0c, + 0x38, 0xb4, 0x01, 0x0d, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xcf, 0x60, + 0x38, 0xb4, 0xf1, 0x60, + 0x38, 0xb4, 0x13, 0x61, + 0x38, 0xb4, 0x35, 0x61, + 0x38, 0xb4, 0x57, 0x61, + 0x38, 0xb4, 0x0b, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x0a, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x08, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x04, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x08, 0xce, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xe7, 0x1c, + 0x38, 0xb4, 0x80, 0xa1, + 0x38, 0xb4, 0x27, 0xcd, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x31, 0x63, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0xb9, 0x88, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0xb1, 0x88, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x84, 0x60, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x11, 0xf0, + 0x38, 0xb4, 0x3d, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x0e, 0xf0, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x84, 0x60, + 0x38, 0xb4, 0xb7, 0xd1, + 0x38, 0xb4, 0x49, 0xd0, + 0x38, 0xb4, 0x09, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x49, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x28, 0xd1, + 0x38, 0xb4, 0x44, 0xd0, + 0x38, 0xb4, 0x3b, 0xd1, + 0x38, 0xb4, 0x55, 0xd0, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0xce, 0x88, + 0x38, 0xb4, 0x64, 0x61, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x3d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0xa0, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x5b, 0x40, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf7, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0xa0, 0x81, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdf, 0xff, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x69, 0x29, + 0x38, 0xb4, 0x40, 0x07, + 0x38, 0xb4, 0x84, 0x61, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x5d, 0x41, + 0x38, 0xb4, 0x0a, 0xa0, + 0x38, 0xb4, 0xa0, 0xa1, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x7b, 0x40, + 0x38, 0xb4, 0x10, 0x83, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x10, 0xa3, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0x03, 0xa4, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0x9a, 0x40, + 0x38, 0xb4, 0x06, 0xd7, + 0x38, 0xb4, 0x48, 0x40, + 0x38, 0xb4, 0x14, 0xf0, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x55, 0x60, + 0x38, 0xb4, 0xf5, 0xff, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x47, 0x1d, + 0x38, 0xb4, 0x0a, 0x80, + 0x38, 0xb4, 0xa0, 0x81, + 0x38, 0xb4, 0x12, 0x83, + 0x38, 0xb4, 0x80, 0xa3, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0xd2, 0x1c, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x2b, 0x1d, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x77, 0x5f, + 0x38, 0xb4, 0x80, 0x83, + 0x38, 0xb4, 0x00, 0x10, + 0x38, 0xb4, 0x50, 0x1d, + 0x38, 0xb4, 0xdc, 0xff, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x0f, 0x0c, + 0x38, 0xb4, 0x02, 0x0b, + 0x38, 0xb4, 0x38, 0x0c, + 0x38, 0xb4, 0x10, 0x0c, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x28, 0xcd, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0x31, 0x63, + 0x38, 0xb4, 0x00, 0xd7, + 0x38, 0xb4, 0xc9, 0x37, + 0x38, 0xb4, 0x33, 0x89, + 0x38, 0xb4, 0xa9, 0x33, + 0x38, 0xb4, 0x2b, 0x89, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x84, 0x60, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x11, 0xf0, + 0x38, 0xb4, 0x3d, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x0e, 0xf0, + 0x38, 0xb4, 0x05, 0xd7, + 0x38, 0xb4, 0x84, 0x60, + 0x38, 0xb4, 0x7a, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x09, 0xf0, + 0x38, 0xb4, 0x3d, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x06, 0xf0, + 0x38, 0xb4, 0x99, 0xd1, + 0x38, 0xb4, 0x4a, 0xd0, + 0x38, 0xb4, 0x03, 0xf0, + 0x38, 0xb4, 0x28, 0xd1, + 0x38, 0xb4, 0x44, 0xd0, 0x38, 0xb4, 0x00, 0x18, - 0x38, 0xb4, 0x4d, 0x05, + 0x38, 0xb4, 0x76, 0x07, 0x38, 0xb4, 0x08, 0xd2, 0x38, 0xb4, 0x09, 0x0c, 0x38, 0xb4, 0x01, 0x13, @@ -18751,6 +21326,8 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x01, 0xd7, 0x38, 0xb4, 0xa3, 0x5f, 0x38, 0xb4, 0x02, 0xb3, + 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xe8, 0x00, 0xa0, 0x38, 0xb4, 0x00, 0xd2, 0x38, 0xb4, 0x00, 0x08, 0x38, 0xb4, 0x05, 0xd7, @@ -18766,8 +21343,25 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0xba, 0x5f, 0x38, 0xb4, 0x00, 0x18, 0x38, 0xb4, 0x0a, 0x14, + 0x38, 0xb4, 0x10, 0x89, + 0x38, 0xb4, 0x04, 0xd7, + 0x38, 0xb4, 0xa8, 0x61, + 0x38, 0xb4, 0x80, 0x84, + 0x38, 0xb4, 0x04, 0x86, + 0x38, 0xb4, 0x02, 0x83, + 0x38, 0xb4, 0xa0, 0x81, + 0x38, 0xb4, 0x03, 0xd7, + 0x38, 0xb4, 0x12, 0x41, + 0x38, 0xb4, 0x03, 0x0c, + 0x38, 0xb4, 0x02, 0x15, + 0x38, 0xb4, 0x90, 0xa9, + 0x38, 0xb4, 0x03, 0x95, + 0x38, 0xb4, 0x04, 0xb9, + 0x38, 0xb4, 0x02, 0xf0, + 0x38, 0xb4, 0x00, 0x00, + 0x38, 0xb4, 0x00, 0x08, 0x36, 0xb4, 0x0e, 0xa1, - 0x38, 0xb4, 0xff, 0xff, + 0x38, 0xb4, 0xe8, 0x1d, 0x36, 0xb4, 0x0c, 0xa1, 0x38, 0xb4, 0x52, 0x13, 0x36, 0xb4, 0x0a, 0xa1, @@ -18783,14 +21377,14 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x36, 0xb4, 0x00, 0xa1, 0x38, 0xb4, 0xce, 0x07, 0x36, 0xb4, 0x10, 0xa1, - 0x38, 0xb4, 0x7f, 0x00, + 0x38, 0xb4, 0xff, 0x00, 0x6c, 0xe8, 0x00, 0xa0, 0x36, 0xb4, 0x16, 0xa0, 0x38, 0xb4, 0x20, 0x00, 0x36, 0xb4, 0x12, 0xa0, 0x38, 0xb4, 0xf8, 0x1f, 0x36, 0xb4, 0x14, 0xa0, - 0x38, 0xb4, 0xce, 0xd1, + 0x38, 0xb4, 0x00, 0x00, 0x38, 0xb4, 0x00, 0x00, 0x38, 0xb4, 0x00, 0x00, 0x38, 0xb4, 0x00, 0x00, @@ -18799,9 +21393,9 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x00, 0x00, 0x38, 0xb4, 0x00, 0x00, 0x36, 0xb4, 0x64, 0xa1, - 0x38, 0xb4, 0xfc, 0x07, - 0x36, 0xb4, 0x66, 0xa1, 0x38, 0xb4, 0x3d, 0x14, + 0x36, 0xb4, 0x66, 0xa1, + 0x38, 0xb4, 0xd7, 0x14, 0x36, 0xb4, 0x68, 0xa1, 0x38, 0xb4, 0xff, 0x3f, 0x36, 0xb4, 0x6a, 0xa1, @@ -18822,20 +21416,22 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x36, 0xb4, 0x7e, 0xb8, 0x38, 0xb4, 0x89, 0xaf, 0x38, 0xb4, 0xaf, 0xac, - 0x38, 0xb4, 0xe4, 0x89, + 0x38, 0xb4, 0xe8, 0x89, 0x38, 0xb4, 0x89, 0xaf, - 0x38, 0xb4, 0xaf, 0xec, - 0x38, 0xb4, 0x04, 0x8a, + 0x38, 0xb4, 0xaf, 0xf0, + 0x38, 0xb4, 0x08, 0x8a, 0x38, 0xb4, 0x8a, 0xaf, - 0x38, 0xb4, 0xaf, 0x2e, - 0x38, 0xb4, 0x4a, 0x8a, + 0x38, 0xb4, 0xaf, 0x32, + 0x38, 0xb4, 0x4e, 0x8a, 0x38, 0xb4, 0x8d, 0xaf, - 0x38, 0xb4, 0xaf, 0x31, - 0x38, 0xb4, 0xc6, 0x8d, + 0x38, 0xb4, 0xaf, 0x44, + 0x38, 0xb4, 0xe9, 0x8d, 0x38, 0xb4, 0x55, 0x1f, 0x38, 0xb4, 0x8f, 0xe1, 0x38, 0xb4, 0xa1, 0xe3, - 0x38, 0xb4, 0x07, 0x00, + 0x38, 0xb4, 0x0b, 0x00, + 0x38, 0xb4, 0x8f, 0xee, + 0x38, 0xb4, 0x00, 0xd7, 0x38, 0xb4, 0x86, 0xee, 0x38, 0xb4, 0x00, 0xe9, 0x38, 0xb4, 0x4f, 0xaf, @@ -18859,9 +21455,9 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x11, 0x0d, 0x38, 0xb4, 0x8f, 0xe5, 0x38, 0xb4, 0x13, 0xe3, - 0x38, 0xb4, 0xca, 0xae, + 0x38, 0xb4, 0xc6, 0xae, 0x38, 0xb4, 0x8d, 0x02, - 0x38, 0xb4, 0xd3, 0xd1, + 0x38, 0xb4, 0xd3, 0xfb, 0x38, 0xb4, 0xaf, 0x01, 0x38, 0xb4, 0xd1, 0x40, 0x38, 0xb4, 0x7a, 0xbf, @@ -18877,7 +21473,7 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0xaf, 0xa9, 0x38, 0xb4, 0x2c, 0x68, 0x38, 0xb4, 0x8e, 0xbf, - 0x38, 0xb4, 0x02, 0x41, + 0x38, 0xb4, 0x02, 0x6b, 0x38, 0xb4, 0x44, 0x7d, 0x38, 0xb4, 0x8f, 0xe5, 0x38, 0xb4, 0xbf, 0xec, @@ -18892,7 +21488,7 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x13, 0x1b, 0x38, 0xb4, 0x2f, 0xad, 0x38, 0xb4, 0xbf, 0x06, - 0x38, 0xb4, 0x41, 0x8e, + 0x38, 0xb4, 0x6b, 0x8e, 0x38, 0xb4, 0x7c, 0x02, 0x38, 0xb4, 0xd1, 0xf9, 0x38, 0xb4, 0xaf, 0x01, @@ -18900,13 +21496,11 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x88, 0xee, 0x38, 0xb4, 0x00, 0x86, 0x38, 0xb4, 0x8f, 0xe0, - 0xff, 0xff, 0xff, 0xff, - 0x6c, 0xe8, 0x00, 0xa0, 0x38, 0xb4, 0xad, 0xeb, 0x38, 0xb4, 0x0b, 0x20, 0x38, 0xb4, 0x8f, 0xe1, 0x38, 0xb4, 0xbf, 0xec, - 0x38, 0xb4, 0x41, 0x8e, + 0x38, 0xb4, 0x6b, 0x8e, 0x38, 0xb4, 0x7d, 0x02, 0x38, 0xb4, 0xae, 0x25, 0x38, 0xb4, 0xee, 0x04, @@ -18918,26 +21512,26 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0xea, 0x8f, 0x38, 0xb4, 0x00, 0xa0, 0x38, 0xb4, 0x02, 0x05, - 0x38, 0xb4, 0xf0, 0x8a, + 0x38, 0xb4, 0xf4, 0x8a, 0x38, 0xb4, 0x1e, 0xae, 0x38, 0xb4, 0x01, 0xa0, 0x38, 0xb4, 0x02, 0x05, - 0x38, 0xb4, 0x9f, 0x8b, + 0x38, 0xb4, 0xa3, 0x8b, 0x38, 0xb4, 0x16, 0xae, 0x38, 0xb4, 0x02, 0xa0, 0x38, 0xb4, 0x02, 0x05, - 0x38, 0xb4, 0x0f, 0x8c, + 0x38, 0xb4, 0x13, 0x8c, 0x38, 0xb4, 0x0e, 0xae, 0x38, 0xb4, 0x03, 0xa0, 0x38, 0xb4, 0x02, 0x05, - 0x38, 0xb4, 0x95, 0x8c, + 0x38, 0xb4, 0x9f, 0x8c, 0x38, 0xb4, 0x06, 0xae, 0x38, 0xb4, 0x04, 0xa0, 0x38, 0xb4, 0x02, 0x03, - 0x38, 0xb4, 0x08, 0x8d, + 0x38, 0xb4, 0x1b, 0x8d, 0x38, 0xb4, 0x63, 0xaf, 0x38, 0xb4, 0x02, 0x89, - 0x38, 0xb4, 0x7f, 0x8a, + 0x38, 0xb4, 0x83, 0x8a, 0x38, 0xb4, 0x63, 0xaf, 0x38, 0xb4, 0xf8, 0x81, 0x38, 0xb4, 0x49, 0xef, @@ -18967,7 +21561,7 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x02, 0x94, 0x38, 0xb4, 0xf9, 0x7c, 0x38, 0xb4, 0x8e, 0xbf, - 0x38, 0xb4, 0x02, 0x44, + 0x38, 0xb4, 0x02, 0x6e, 0x38, 0xb4, 0xf9, 0x7c, 0x38, 0xb4, 0x7a, 0xbf, 0x38, 0xb4, 0x02, 0xa6, @@ -18982,10 +21576,10 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x02, 0xac, 0x38, 0xb4, 0xf9, 0x7c, 0x38, 0xb4, 0x8e, 0xbf, - 0x38, 0xb4, 0x02, 0x47, + 0x38, 0xb4, 0x02, 0x71, 0x38, 0xb4, 0xf9, 0x7c, 0x38, 0xb4, 0x8e, 0xbf, - 0x38, 0xb4, 0x02, 0x4a, + 0x38, 0xb4, 0x02, 0x74, 0x38, 0xb4, 0xf9, 0x7c, 0x38, 0xb4, 0x63, 0x02, 0x38, 0xb4, 0xee, 0x8e, @@ -19003,7 +21597,7 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0xac, 0x15, 0x38, 0xb4, 0x03, 0x21, 0x38, 0xb4, 0x8b, 0xaf, - 0x38, 0xb4, 0xee, 0x70, + 0x38, 0xb4, 0xee, 0x74, 0x38, 0xb4, 0x88, 0x88, 0x38, 0xb4, 0xee, 0x00, 0x38, 0xb4, 0x8a, 0x88, @@ -19070,7 +21664,7 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x88, 0xee, 0x38, 0xb4, 0x00, 0x8b, 0x38, 0xb4, 0x8e, 0xbf, - 0x38, 0xb4, 0x02, 0x44, + 0x38, 0xb4, 0x02, 0x6e, 0x38, 0xb4, 0x02, 0x7d, 0x38, 0xb4, 0x63, 0x02, 0x38, 0xb4, 0xee, 0xcd, @@ -19123,9 +21717,9 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x02, 0xea, 0x38, 0xb4, 0x0b, 0xae, 0x38, 0xb4, 0x8c, 0x02, - 0x38, 0xb4, 0xae, 0x2e, + 0x38, 0xb4, 0xae, 0x32, 0x38, 0xb4, 0x02, 0x06, - 0x38, 0xb4, 0xfe, 0x8b, + 0x38, 0xb4, 0x02, 0x8c, 0x38, 0xb4, 0x70, 0x02, 0x38, 0xb4, 0xfe, 0xde, 0x38, 0xb4, 0x96, 0xef, @@ -19152,22 +21746,25 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0xa1, 0x7c, 0x38, 0xb4, 0x50, 0xad, 0x38, 0xb4, 0x02, 0x03, - 0x38, 0xb4, 0x2e, 0x8c, + 0x38, 0xb4, 0x32, 0x8c, 0x38, 0xb4, 0xfe, 0xff, 0x38, 0xb4, 0x04, 0xfc, 0x38, 0xb4, 0xfa, 0xf8, 0x38, 0xb4, 0x69, 0xef, - 0x38, 0xb4, 0xbf, 0xfb, + 0x38, 0xb4, 0xe0, 0xfb, + 0x38, 0xb4, 0xd6, 0x8f, + 0x38, 0xb4, 0x20, 0xac, + 0x38, 0xb4, 0xbf, 0x55, 0x38, 0xb4, 0xf3, 0x7b, 0x38, 0xb4, 0x7d, 0x02, 0x38, 0xb4, 0xac, 0x44, 0x38, 0xb4, 0x4c, 0x28, 0x38, 0xb4, 0x64, 0x02, 0x38, 0xb4, 0xbf, 0x1c, - 0x38, 0xb4, 0x47, 0x8e, + 0x38, 0xb4, 0x71, 0x8e, 0x38, 0xb4, 0x7d, 0x02, 0x38, 0xb4, 0xbf, 0x02, - 0x38, 0xb4, 0x4a, 0x8e, + 0x38, 0xb4, 0x74, 0x8e, 0x38, 0xb4, 0x7d, 0x02, 0x38, 0xb4, 0xd1, 0x02, 0x38, 0xb4, 0xb1, 0x43, @@ -19210,161 +21807,179 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0xfa, 0xf9, 0x38, 0xb4, 0xef, 0xfb, 0x38, 0xb4, 0xfb, 0x79, + 0x38, 0xb4, 0x7b, 0xbf, + 0x38, 0xb4, 0x02, 0xf3, + 0x38, 0xb4, 0x44, 0x7d, + 0x38, 0xb4, 0x28, 0xac, + 0x38, 0xb4, 0xbf, 0x2b, + 0x38, 0xb4, 0x94, 0x7a, + 0x38, 0xb4, 0x7d, 0x02, + 0x38, 0xb4, 0xef, 0x44, + 0x38, 0xb4, 0xbf, 0x21, + 0x38, 0xb4, 0xb8, 0x7a, + 0x38, 0xb4, 0x7d, 0x02, + 0x38, 0xb4, 0x1f, 0x44, + 0x38, 0xb4, 0x9e, 0x21, + 0x38, 0xb4, 0xe0, 0x19, + 0x38, 0xb4, 0xe9, 0x8f, + 0x38, 0xb4, 0x8f, 0xe1, + 0x38, 0xb4, 0xef, 0xe8, + 0x38, 0xb4, 0x1f, 0x64, + 0x38, 0xb4, 0xe1, 0x00, + 0x38, 0xb4, 0xe4, 0x8f, + 0x38, 0xb4, 0x74, 0xef, + 0x38, 0xb4, 0x7c, 0x02, + 0x38, 0xb4, 0xad, 0xa1, + 0x38, 0xb4, 0x3d, 0x50, + 0x38, 0xb4, 0x8f, 0xee, + 0x38, 0xb4, 0x01, 0xe7, 0x38, 0xb4, 0x7a, 0xbf, 0x38, 0xb4, 0x02, 0x94, - 0x38, 0xb4, 0x44, 0x7d, - 0x38, 0xb4, 0x21, 0xef, + 0x38, 0xb4, 0xf9, 0x7c, 0x38, 0xb4, 0x7a, 0xbf, - 0x38, 0xb4, 0x02, 0xb8, - 0x38, 0xb4, 0x44, 0x7d, - 0x38, 0xb4, 0x21, 0x1f, - 0x38, 0xb4, 0x19, 0x9e, + 0x38, 0xb4, 0x02, 0xa6, + 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xe8, 0x00, 0xa0, + 0x38, 0xb4, 0xf9, 0x7c, + 0x38, 0xb4, 0x7a, 0xbf, + 0x38, 0xb4, 0x02, 0xa3, + 0x38, 0xb4, 0xf9, 0x7c, + 0x38, 0xb4, 0x7a, 0xbf, + 0x38, 0xb4, 0x02, 0xa9, + 0x38, 0xb4, 0xf9, 0x7c, + 0x38, 0xb4, 0x7a, 0xbf, + 0x38, 0xb4, 0x02, 0xac, + 0x38, 0xb4, 0x02, 0x7d, + 0x38, 0xb4, 0x8e, 0xbf, + 0x38, 0xb4, 0x02, 0x71, + 0x38, 0xb4, 0xf9, 0x7c, + 0x38, 0xb4, 0x8e, 0xbf, + 0x38, 0xb4, 0x02, 0x74, + 0x38, 0xb4, 0xf9, 0x7c, + 0x38, 0xb4, 0x7c, 0x02, + 0x38, 0xb4, 0xef, 0x86, + 0x38, 0xb4, 0xe4, 0x47, + 0x38, 0xb4, 0xe9, 0x8f, + 0x38, 0xb4, 0x8f, 0xe5, + 0x38, 0xb4, 0xee, 0xe8, + 0x38, 0xb4, 0xea, 0x8f, + 0x38, 0xb4, 0xff, 0x04, + 0x38, 0xb4, 0x97, 0xef, + 0x38, 0xb4, 0xfe, 0xff, + 0x38, 0xb4, 0xfc, 0xfd, + 0x38, 0xb4, 0xf8, 0x04, + 0x38, 0xb4, 0xfb, 0xfa, 0x38, 0xb4, 0x8f, 0xe0, 0x38, 0xb4, 0xe1, 0xe9, 0x38, 0xb4, 0xe8, 0x8f, 0x38, 0xb4, 0x64, 0xef, 0x38, 0xb4, 0x00, 0x1f, 0x38, 0xb4, 0x8f, 0xe1, - 0x38, 0xb4, 0xef, 0xe4, + 0x38, 0xb4, 0xef, 0xe5, 0x38, 0xb4, 0x02, 0x74, 0x38, 0xb4, 0xa1, 0x7c, 0x38, 0xb4, 0x50, 0xad, - 0x38, 0xb4, 0xee, 0x3d, - 0x38, 0xb4, 0xe7, 0x8f, - 0x38, 0xb4, 0xbf, 0x01, - 0x38, 0xb4, 0x94, 0x7a, - 0x38, 0xb4, 0x7c, 0x02, - 0x38, 0xb4, 0xbf, 0xf9, - 0x38, 0xb4, 0xa6, 0x7a, - 0x38, 0xb4, 0x7c, 0x02, - 0x38, 0xb4, 0xbf, 0xf9, - 0x38, 0xb4, 0xa3, 0x7a, - 0x38, 0xb4, 0x7c, 0x02, - 0x38, 0xb4, 0xbf, 0xf9, - 0x38, 0xb4, 0xa9, 0x7a, - 0x38, 0xb4, 0x7c, 0x02, - 0x38, 0xb4, 0xbf, 0xf9, - 0x38, 0xb4, 0xac, 0x7a, - 0x38, 0xb4, 0x7d, 0x02, - 0x38, 0xb4, 0xbf, 0x02, - 0x38, 0xb4, 0x47, 0x8e, - 0x38, 0xb4, 0x7c, 0x02, - 0x38, 0xb4, 0xbf, 0xf9, - 0x38, 0xb4, 0x4a, 0x8e, - 0x38, 0xb4, 0x7c, 0x02, - 0x38, 0xb4, 0x02, 0xf9, - 0x38, 0xb4, 0x86, 0x7c, - 0x38, 0xb4, 0x47, 0xef, - 0x38, 0xb4, 0x8f, 0xe4, - 0x38, 0xb4, 0xe5, 0xe9, - 0x38, 0xb4, 0xe8, 0x8f, - 0x38, 0xb4, 0x8f, 0xee, - 0x38, 0xb4, 0x04, 0xea, - 0x38, 0xb4, 0xef, 0xff, - 0x38, 0xb4, 0xff, 0x97, - 0x38, 0xb4, 0xfd, 0xfe, + 0x38, 0xb4, 0x02, 0x0d, + 0x38, 0xb4, 0x8e, 0x63, + 0x38, 0xb4, 0x8c, 0x02, + 0x38, 0xb4, 0xee, 0x02, + 0x38, 0xb4, 0xea, 0x8f, + 0x38, 0xb4, 0x02, 0x01, + 0x38, 0xb4, 0xde, 0x70, + 0x38, 0xb4, 0xfe, 0xff, 0x38, 0xb4, 0x04, 0xfc, - 0x38, 0xb4, 0xfa, 0xf8, - 0x38, 0xb4, 0xe0, 0xfb, - 0x38, 0xb4, 0xe9, 0x8f, + 0x38, 0xb4, 0x8f, 0xe3, + 0x38, 0xb4, 0xa3, 0xd7, + 0x38, 0xb4, 0x0a, 0x00, + 0x38, 0xb4, 0x87, 0xe3, + 0x38, 0xb4, 0xe7, 0x75, + 0x38, 0xb4, 0xd8, 0x8f, + 0x38, 0xb4, 0x8f, 0xee, + 0x38, 0xb4, 0x01, 0xd7, + 0x38, 0xb4, 0x8f, 0xe3, + 0x38, 0xb4, 0xe7, 0xd8, + 0x38, 0xb4, 0x75, 0x87, + 0x38, 0xb4, 0x8f, 0xe4, + 0x38, 0xb4, 0xe5, 0xe1, + 0x38, 0xb4, 0xe2, 0x8f, + 0x38, 0xb4, 0x8f, 0xbf, + 0x38, 0xb4, 0xef, 0xd9, + 0x38, 0xb4, 0x0c, 0x32, + 0x38, 0xb4, 0x1a, 0x31, + 0x38, 0xb4, 0xdc, 0x93, + 0x38, 0xb4, 0xdd, 0x19, + 0x38, 0xb4, 0x7f, 0x02, + 0x38, 0xb4, 0xac, 0xa9, + 0x38, 0xb4, 0x18, 0x2a, + 0x38, 0xb4, 0x8f, 0xe0, + 0x38, 0xb4, 0xe1, 0xe1, + 0x38, 0xb4, 0xe2, 0x8f, + 0x38, 0xb4, 0x74, 0xef, + 0x38, 0xb4, 0x87, 0xe1, + 0x38, 0xb4, 0x1f, 0x75, + 0x38, 0xb4, 0xef, 0x00, + 0x38, 0xb4, 0xe1, 0x64, + 0x38, 0xb4, 0xd8, 0x8f, + 0x38, 0xb4, 0x87, 0xe5, + 0x38, 0xb4, 0xaf, 0x75, + 0x38, 0xb4, 0x72, 0x4d, + 0x38, 0xb4, 0x7b, 0xbf, + 0x38, 0xb4, 0xef, 0x3c, + 0x38, 0xb4, 0x4b, 0x32, + 0x38, 0xb4, 0x1a, 0x03, + 0x38, 0xb4, 0x02, 0x93, + 0x38, 0xb4, 0x44, 0x7d, + 0x38, 0xb4, 0x64, 0xef, 0x38, 0xb4, 0x8f, 0xe1, - 0x38, 0xb4, 0xef, 0xe8, - 0x38, 0xb4, 0x1f, 0x64, - 0x38, 0xb4, 0xe1, 0x00, - 0x38, 0xb4, 0xe5, 0x8f, + 0x38, 0xb4, 0x1f, 0xff, + 0x38, 0xb4, 0xef, 0x00, + 0x38, 0xb4, 0x1b, 0x74, + 0x38, 0xb4, 0xac, 0x67, + 0x38, 0xb4, 0xce, 0x4f, + 0x38, 0xb4, 0x8f, 0xe0, + 0x38, 0xb4, 0xe1, 0xfd, + 0x38, 0xb4, 0xfe, 0x8f, + 0x38, 0xb4, 0x64, 0xef, + 0x38, 0xb4, 0x8f, 0xe0, + 0x38, 0xb4, 0xe1, 0xe1, + 0x38, 0xb4, 0xe2, 0x8f, 0x38, 0xb4, 0x74, 0xef, 0x38, 0xb4, 0x7c, 0x02, - 0x38, 0xb4, 0xad, 0xa1, - 0x38, 0xb4, 0x0d, 0x50, - 0x38, 0xb4, 0x63, 0x02, - 0x38, 0xb4, 0x02, 0x8e, - 0x38, 0xb4, 0xfe, 0x8b, - 0x38, 0xb4, 0x8f, 0xee, - 0x38, 0xb4, 0x01, 0xea, - 0x38, 0xb4, 0x70, 0x02, - 0x38, 0xb4, 0xff, 0xde, - 0x38, 0xb4, 0xfc, 0xfe, - 0x38, 0xb4, 0xe3, 0x04, - 0x38, 0xb4, 0xd8, 0x8f, - 0x38, 0xb4, 0x87, 0xe7, - 0x38, 0xb4, 0xe4, 0x75, - 0x38, 0xb4, 0xe1, 0x8f, - 0x38, 0xb4, 0x8f, 0xe5, - 0x38, 0xb4, 0xbf, 0xe2, - 0x38, 0xb4, 0xd9, 0x8f, - 0x38, 0xb4, 0x32, 0xef, - 0x38, 0xb4, 0x31, 0x0c, - 0x38, 0xb4, 0x93, 0x1a, - 0x38, 0xb4, 0x19, 0xdc, - 0x38, 0xb4, 0x02, 0xdd, - 0x38, 0xb4, 0xa9, 0x7f, - 0x38, 0xb4, 0x2a, 0xac, - 0x38, 0xb4, 0xe0, 0x18, - 0x38, 0xb4, 0xe1, 0x8f, - 0x38, 0xb4, 0x8f, 0xe1, - 0x38, 0xb4, 0xef, 0xe2, - 0x38, 0xb4, 0xe1, 0x74, - 0x38, 0xb4, 0x75, 0x87, - 0x38, 0xb4, 0x00, 0x1f, - 0x38, 0xb4, 0x64, 0xef, - 0x38, 0xb4, 0x8f, 0xe1, - 0x38, 0xb4, 0xe5, 0xd8, - 0x38, 0xb4, 0x75, 0x87, - 0x38, 0xb4, 0x4d, 0xaf, - 0x38, 0xb4, 0xbf, 0x72, - 0x38, 0xb4, 0x3c, 0x7b, - 0x38, 0xb4, 0x32, 0xef, - 0x38, 0xb4, 0x03, 0x4b, - 0x38, 0xb4, 0x93, 0x1a, - 0x38, 0xb4, 0x7d, 0x02, - 0x38, 0xb4, 0xef, 0x44, + 0x38, 0xb4, 0xac, 0x53, + 0x38, 0xb4, 0x02, 0x50, + 0x38, 0xb4, 0xb6, 0xae, + 0x38, 0xb4, 0x87, 0xe1, + 0x38, 0xb4, 0x1f, 0x75, + 0x38, 0xb4, 0xef, 0x00, 0x38, 0xb4, 0xe1, 0x64, - 0x38, 0xb4, 0xff, 0x8f, - 0x38, 0xb4, 0x00, 0x1f, - 0x38, 0xb4, 0x74, 0xef, - 0x38, 0xb4, 0x67, 0x1b, - 0x38, 0xb4, 0x4f, 0xac, - 0x38, 0xb4, 0xe0, 0xce, - 0x38, 0xb4, 0xfd, 0x8f, - 0x38, 0xb4, 0x8f, 0xe1, - 0x38, 0xb4, 0xef, 0xfe, - 0x38, 0xb4, 0xe0, 0x64, - 0x38, 0xb4, 0xe1, 0x8f, - 0x38, 0xb4, 0x8f, 0xe1, - 0x38, 0xb4, 0xef, 0xe2, - 0x38, 0xb4, 0x02, 0x74, - 0x38, 0xb4, 0x53, 0x7c, - 0x38, 0xb4, 0x50, 0xac, - 0x38, 0xb4, 0xae, 0x02, - 0x38, 0xb4, 0xe1, 0xb6, - 0x38, 0xb4, 0x75, 0x87, - 0x38, 0xb4, 0x00, 0x1f, - 0x38, 0xb4, 0x64, 0xef, - 0x38, 0xb4, 0x8f, 0xe1, - 0x38, 0xb4, 0xef, 0xfc, - 0x38, 0xb4, 0x1c, 0x71, - 0x38, 0xb4, 0x0d, 0x67, - 0x38, 0xb4, 0xef, 0x67, - 0x38, 0xb4, 0xe5, 0x46, - 0x38, 0xb4, 0x75, 0x87, - 0x38, 0xb4, 0x32, 0xef, - 0x38, 0xb4, 0x01, 0xd1, - 0x38, 0xb4, 0x00, 0xa3, - 0x38, 0xb4, 0xae, 0x02, - 0x38, 0xb4, 0x0c, 0x05, - 0x38, 0xb4, 0x83, 0x11, - 0x38, 0xb4, 0xf6, 0xae, - 0x38, 0xb4, 0x8f, 0xe0, - 0x38, 0xb4, 0x1e, 0xe3, - 0x38, 0xb4, 0xe5, 0x10, + 0x38, 0xb4, 0xfc, 0x8f, + 0x38, 0xb4, 0x71, 0xef, + 0x38, 0xb4, 0x67, 0x1c, + 0x38, 0xb4, 0x67, 0x0d, + 0x38, 0xb4, 0x46, 0xef, + 0x38, 0xb4, 0x87, 0xe5, + 0x38, 0xb4, 0xef, 0x75, + 0x38, 0xb4, 0xd1, 0x32, + 0x38, 0xb4, 0xa3, 0x01, + 0x38, 0xb4, 0x02, 0x00, + 0x38, 0xb4, 0x05, 0xae, + 0x38, 0xb4, 0x11, 0x0c, + 0x38, 0xb4, 0xae, 0x83, + 0x38, 0xb4, 0xe0, 0xf6, 0x38, 0xb4, 0xe3, 0x8f, - 0x38, 0xb4, 0x89, 0xae, - 0x38, 0xb4, 0x87, 0xe2, - 0x38, 0xb4, 0xe6, 0x75, - 0x38, 0xb4, 0xd8, 0x8f, - 0x38, 0xb4, 0x22, 0x1f, - 0x38, 0xb4, 0x4d, 0xaf, - 0x38, 0xb4, 0xf8, 0x42, + 0x38, 0xb4, 0x10, 0x1e, + 0x38, 0xb4, 0x8f, 0xe5, + 0x38, 0xb4, 0xae, 0xe3, + 0x38, 0xb4, 0xbf, 0x89, + 0x38, 0xb4, 0xf3, 0x7b, + 0x38, 0xb4, 0x7d, 0x02, + 0x38, 0xb4, 0xe5, 0x44, + 0x38, 0xb4, 0xd6, 0x8f, + 0x38, 0xb4, 0x28, 0xad, + 0x38, 0xb4, 0xaf, 0x03, + 0x38, 0xb4, 0x6b, 0x60, + 0x38, 0xb4, 0x60, 0xaf, + 0x38, 0xb4, 0xf8, 0xa0, 0x38, 0xb4, 0xef, 0xf9, 0x38, 0xb4, 0xfa, 0x59, 0x38, 0xb4, 0xbf, 0xfb, @@ -19374,9 +21989,9 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x49, 0x11, 0x38, 0xb4, 0x1a, 0x04, 0x38, 0xb4, 0xd7, 0x91, - 0x38, 0xb4, 0xf3, 0x8d, + 0x38, 0xb4, 0x1d, 0x8e, 0x38, 0xb4, 0x8e, 0xd6, - 0x38, 0xb4, 0x02, 0x23, + 0x38, 0xb4, 0x02, 0x4d, 0x38, 0xb4, 0xaa, 0x72, 0x38, 0xb4, 0xfe, 0xff, 0x38, 0xb4, 0x95, 0xef, @@ -19388,32 +22003,30 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x8e, 0x75, 0x38, 0xb4, 0x75, 0x26, 0x38, 0xb4, 0x00, 0x41, - 0x38, 0xb4, 0x26, 0x8e, + 0x38, 0xb4, 0x50, 0x8e, 0x38, 0xb4, 0x8e, 0x02, - 0x38, 0xb4, 0x04, 0x23, + 0x38, 0xb4, 0x04, 0x4d, 0x38, 0xb4, 0x9d, 0x75, 0x38, 0xb4, 0x75, 0x26, 0x38, 0xb4, 0x00, 0x47, - 0x38, 0xb4, 0x32, 0x8e, + 0x38, 0xb4, 0x5c, 0x8e, 0x38, 0xb4, 0x8e, 0x02, - 0x38, 0xb4, 0x04, 0x2f, - 0x38, 0xb4, 0x2c, 0x8e, + 0x38, 0xb4, 0x04, 0x59, + 0x38, 0xb4, 0x56, 0x8e, 0x38, 0xb4, 0x8e, 0x26, - 0x38, 0xb4, 0x00, 0x29, - 0x38, 0xb4, 0x3e, 0x8e, + 0x38, 0xb4, 0x00, 0x53, + 0x38, 0xb4, 0x68, 0x8e, 0x38, 0xb4, 0x8e, 0x02, - 0x38, 0xb4, 0x04, 0x3b, - 0x38, 0xb4, 0x38, 0x8e, + 0x38, 0xb4, 0x04, 0x65, + 0x38, 0xb4, 0x62, 0x8e, 0x38, 0xb4, 0x8e, 0x26, - 0x38, 0xb4, 0xfe, 0x35, + 0x38, 0xb4, 0xfe, 0x5f, 0x38, 0xb4, 0x96, 0xad, 0x38, 0xb4, 0xad, 0xdc, 0x38, 0xb4, 0xba, 0x96, 0x38, 0xb4, 0x96, 0xad, 0x38, 0xb4, 0xad, 0x98, 0x38, 0xb4, 0x76, 0x96, - 0xff, 0xff, 0xff, 0xff, - 0x6c, 0xe8, 0x00, 0xa0, 0x38, 0xb4, 0x98, 0xad, 0x38, 0xb4, 0xad, 0x54, 0x38, 0xb4, 0x76, 0x98, @@ -19444,7 +22057,7 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x36, 0xb4, 0x8a, 0xb8, 0x38, 0xb4, 0x6b, 0x4d, 0x36, 0xb4, 0x8c, 0xb8, - 0x38, 0xb4, 0x40, 0x4d, + 0x38, 0xb4, 0x62, 0x60, 0x36, 0xb4, 0x38, 0xb8, 0x38, 0xb4, 0xff, 0x00, 0x6c, 0xe8, 0x00, 0xb0, @@ -19737,6 +22350,8 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0xe4, 0x08, 0x38, 0xb4, 0xf5, 0x8f, 0x38, 0xb4, 0x8f, 0xe5, + 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xe8, 0x00, 0xa0, 0x38, 0xb4, 0xae, 0xf6, 0x38, 0xb4, 0xe0, 0x06, 0x38, 0xb4, 0xf5, 0x8f, @@ -19924,8 +22539,6 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x31, 0xef, 0x38, 0xb4, 0x6e, 0xbf, 0x38, 0xb4, 0x02, 0x06, - 0xff, 0xff, 0xff, 0xff, - 0x6c, 0xe8, 0x00, 0xa0, 0x38, 0xb4, 0xb6, 0x76, 0x38, 0xb4, 0x64, 0xef, 0x38, 0xb4, 0x6e, 0xbf, @@ -20249,6 +22862,8 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x38, 0xb4, 0x00, 0x12, 0x36, 0xb4, 0xf9, 0x8f, 0x38, 0xb4, 0x00, 0x12, + 0xff, 0xff, 0xff, 0xff, + 0x6c, 0xe8, 0x00, 0xa0, 0x36, 0xb4, 0xfb, 0x8f, 0x38, 0xb4, 0x00, 0x12, 0x36, 0xb4, 0xfd, 0x8f, @@ -20277,7 +22892,7 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x36, 0xb4, 0x23, 0x80, 0x38, 0xb4, 0x00, 0x00, 0x36, 0xb4, 0x1e, 0x80, - 0x38, 0xb4, 0x13, 0x00, + 0x38, 0xb4, 0x20, 0x00, 0x6c, 0xe8, 0x00, 0xb0, /* dataram patch */ 0x92, 0xb8, 0x00, 0x00, 0x8e, 0xb8, 0x7c, 0xc0, @@ -20343,10 +22958,151 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) 0x90, 0xb8, 0xb0, 0x80, 0x90, 0xb8, 0xb0, 0x50, 0x90, 0xb8, 0x90, 0x20, + 0x8e, 0xb8, 0x10, 0xc1, + 0x90, 0xb8, 0xf4, 0xe8, + 0x90, 0xb8, 0xf4, 0xf4, + 0x8e, 0xb8, 0x4e, 0xc1, + 0x90, 0xb8, 0xef, 0x26, + 0x90, 0xb8, 0xef, 0xef, + 0x8e, 0xb8, 0x74, 0xc3, + 0x90, 0xb8, 0xfa, 0x00, + 0x90, 0xb8, 0x8c, 0x00, + 0x90, 0xb8, 0xd2, 0x03, + 0x90, 0xb8, 0x73, 0x03, + 0x90, 0xb8, 0xb9, 0x03, + 0x90, 0xb8, 0x06, 0x00, + 0x90, 0xb8, 0x13, 0x00, + 0x90, 0xb8, 0xfe, 0x03, + 0x90, 0xb8, 0xde, 0x03, + 0x90, 0xb8, 0x08, 0x00, + 0x90, 0xb8, 0x08, 0x00, + 0x90, 0xb8, 0x0d, 0x00, + 0x90, 0xb8, 0xf3, 0x03, + 0x90, 0xb8, 0x10, 0x00, + 0x90, 0xb8, 0x0a, 0x00, + 0x90, 0xb8, 0x0e, 0x00, + 0x90, 0xb8, 0xf5, 0x03, + 0x90, 0xb8, 0x01, 0x00, + 0x90, 0xb8, 0xff, 0x03, + 0x90, 0xb8, 0x00, 0x00, + 0x90, 0xb8, 0x05, 0x00, + 0x90, 0xb8, 0x0a, 0x00, + 0x90, 0xb8, 0xf3, 0x03, + 0x90, 0xb8, 0x03, 0x00, + 0x90, 0xb8, 0xf1, 0x03, + 0x90, 0xb8, 0x03, 0x00, + 0x90, 0xb8, 0x0c, 0x00, + 0x90, 0xb8, 0x0e, 0x00, + 0x90, 0xb8, 0xfa, 0x03, + 0x90, 0xb8, 0x07, 0x00, + 0x90, 0xb8, 0x08, 0x00, + 0x90, 0xb8, 0x10, 0x00, + 0x90, 0xb8, 0xee, 0x03, + 0x90, 0xb8, 0x0e, 0x00, + 0x90, 0xb8, 0xf6, 0x03, + 0x90, 0xb8, 0x07, 0x00, + 0x90, 0xb8, 0xfc, 0x03, + 0x90, 0xb8, 0x0b, 0x00, + 0x90, 0xb8, 0xfb, 0x03, + 0x90, 0xb8, 0x0f, 0x00, + 0x90, 0xb8, 0xf6, 0x03, + 0x90, 0xb8, 0x16, 0x00, + 0x90, 0xb8, 0xf9, 0x03, + 0x90, 0xb8, 0xff, 0x03, + 0x90, 0xb8, 0xff, 0x03, + 0x90, 0xb8, 0x07, 0x00, + 0x90, 0xb8, 0xfd, 0x03, + 0x90, 0xb8, 0x0d, 0x00, + 0x90, 0xb8, 0xfe, 0x03, + 0x90, 0xb8, 0x03, 0x00, + 0x90, 0xb8, 0xf1, 0x03, + 0x90, 0xb8, 0x0b, 0x00, + 0x90, 0xb8, 0x00, 0x00, + 0x90, 0xb8, 0x12, 0x00, + 0x90, 0xb8, 0xfd, 0x03, + 0x90, 0xb8, 0xfc, 0x03, + 0x90, 0xb8, 0x04, 0x00, + 0x90, 0xb8, 0x0f, 0x00, + 0x90, 0xb8, 0xef, 0x03, + 0x90, 0xb8, 0xf9, 0x03, + 0x90, 0xb8, 0x0d, 0x00, + 0x90, 0xb8, 0x02, 0x00, + 0x90, 0xb8, 0x0c, 0x00, + 0x90, 0xb8, 0x03, 0x00, + 0x90, 0xb8, 0x69, 0x00, + 0x90, 0xb8, 0x64, 0x00, + 0x90, 0xb8, 0x4f, 0x00, + 0x90, 0xb8, 0x1e, 0x00, + 0x90, 0xb8, 0xed, 0x03, + 0x90, 0xb8, 0xdc, 0x03, + 0x90, 0xb8, 0xbc, 0x03, + 0x90, 0xb8, 0xd1, 0x03, + 0x90, 0xb8, 0xc5, 0x03, + 0x90, 0xb8, 0xe4, 0x03, + 0x90, 0xb8, 0xea, 0x03, + 0x90, 0xb8, 0xff, 0x03, + 0x90, 0xb8, 0xfa, 0x03, + 0x90, 0xb8, 0x07, 0x00, + 0x90, 0xb8, 0xff, 0x03, + 0x90, 0xb8, 0xe5, 0x03, + 0x90, 0xb8, 0xfa, 0x03, + 0x90, 0xb8, 0xf1, 0x03, + 0x90, 0xb8, 0xf8, 0x03, + 0x90, 0xb8, 0xef, 0x03, + 0x90, 0xb8, 0x07, 0x00, + 0x90, 0xb8, 0x02, 0x00, + 0x90, 0xb8, 0x16, 0x00, + 0x90, 0xb8, 0x01, 0x00, + 0x90, 0xb8, 0x0a, 0x00, + 0x90, 0xb8, 0xf6, 0x03, + 0x90, 0xb8, 0x00, 0x00, + 0x90, 0xb8, 0xf7, 0x03, + 0x90, 0xb8, 0x04, 0x00, + 0x90, 0xb8, 0x02, 0x00, + 0x90, 0xb8, 0x10, 0x00, + 0x90, 0xb8, 0x04, 0x00, + 0x90, 0xb8, 0xfd, 0x03, + 0x90, 0xb8, 0xf2, 0x03, + 0x90, 0xb8, 0xee, 0x03, + 0x90, 0xb8, 0xfa, 0x03, + 0x90, 0xb8, 0xf1, 0x03, + 0x90, 0xb8, 0xfe, 0x03, + 0x90, 0xb8, 0xfb, 0x03, + 0x90, 0xb8, 0x08, 0x00, + 0x90, 0xb8, 0xee, 0x03, + 0x90, 0xb8, 0x0f, 0x00, + 0x90, 0xb8, 0xf0, 0x03, + 0x90, 0xb8, 0x0f, 0x00, + 0x90, 0xb8, 0xf3, 0x03, + 0x90, 0xb8, 0x04, 0x00, + 0x90, 0xb8, 0xf3, 0x03, + 0x90, 0xb8, 0x03, 0x00, + 0x90, 0xb8, 0xf5, 0x03, + 0x90, 0xb8, 0xfe, 0x03, + 0x90, 0xb8, 0xf5, 0x03, + 0x90, 0xb8, 0x08, 0x00, + 0x90, 0xb8, 0xf7, 0x03, + 0x90, 0xb8, 0x0a, 0x00, + 0x90, 0xb8, 0xf9, 0x03, + 0x90, 0xb8, 0x00, 0x00, + 0x90, 0xb8, 0xfb, 0x03, + 0x90, 0xb8, 0x0c, 0x00, + 0x90, 0xb8, 0xec, 0x03, + 0x90, 0xb8, 0xfb, 0x03, + 0x90, 0xb8, 0xee, 0x03, + 0x90, 0xb8, 0x0e, 0x00, + 0x90, 0xb8, 0xf5, 0x03, + 0x90, 0xb8, 0x07, 0x00, + 0x8e, 0xb8, 0x28, 0xc1, + 0x90, 0xb8, 0xf0, 0xf0, + 0x90, 0xb8, 0xeb, 0xf0, + 0x8e, 0xb8, 0x66, 0xc1, + 0x90, 0xb8, 0xea, 0xea, + 0x90, 0xb8, 0x0e, 0xea, 0x20, 0xb8, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff}; - code_ver = 0x0013; + code_ver = 0x0020; ret = sram_read(tp, SRAM_GPHY_FW_VER, &fw_version); if (ret < 0) goto out; @@ -20425,7 +23181,7 @@ static int rtl_ram_code_speed_up(struct r8152 *tp, bool wait) if (sram_read(tp, SRAM_GPHY_FW_VER, &fw_version) < 0) goto out; - else if (fw_version != code_ver) + else if (fw_version < code_ver) dev_err(&tp->intf->dev, "ram code version is wrong %04x(%04x\n", fw_version, code_ver); @@ -25156,6 +27912,13 @@ static void r8159_hw_phy_cfg(struct r8152 *tp) ocp_reg_w0w1(tp, 0xae4e, 0x000f, 0x0001); sram2_write_w0w1(tp, 0x82ce, 0xf000, 0x4000); + // % 5G shift sel, default = '04' + // 10G shift sel, default = '03' + sram2_write_w0w1(tp, 0x83a5, 0xff00, 0x0400); + sram2_write_w0w1(tp, 0x83a6, 0xff00, 0x0400); + sram2_write_w0w1(tp, 0x83a7, 0xff00, 0x0400); + sram2_write_w0w1(tp, 0x83a8, 0xff00, 0x0400); + /* XG INRX parameter */ // RC coefficients sram2_write(tp, 0x84ac, 0x0000); @@ -25189,6 +27952,14 @@ static void r8159_hw_phy_cfg(struct r8152 *tp) sram2_write_w0w1(tp, 0x8217, 0x3f00, 0x2a00); sram_write_w0w1(tp, 0x81b1, 0xff00, 0x0b00); sram2_write_w0w1(tp, 0x8fed, 0xff00, 0x4e00); + // Slave about EC mu of datamode AAGC and DAC BG + sram2_write_w0w1(tp, 0x88ac, 0xff00, 0x2300); + // improve UBE + ocp_reg_set_bits(tp, 0xbf0c, 0x7 << 11); + // close Sparse NEC, improve connect 5EUU calble performace + sram2_clr_bits(tp, 0x88de, 0xff00); + // 5G slave compatibility issue (will include in v10) + sram2_write(tp, 0x80b4, 0x5195); /* XG Test Mode */ // xgtstm_map_tbl for mdi_cap_sel @@ -25452,6 +28223,19 @@ out: return (ret < 0) ? ret : 0; } +static int r8156b_u2phy_backup(struct r8152 *tp) +{ + static u8 u2phy_backup[] = { + 0x00, 0x00, 0x1b, 0x18, + 0x99, 0xcd, 0x6c, 0x61, + 0x01, 0x81, 0xfc, 0x08, + 0x00, 0x11, 0x9b, 0x15, + 0x00, 0x0a, 0x00, 0x00 }; + + return generic_ocp_write(tp, 0xd3cc, 0x3c, sizeof(u2phy_backup), + u2phy_backup, MCU_TYPE_USB); +} + static int r8156b_init(struct r8152 *tp) { u32 ocp_data; @@ -25537,6 +28321,10 @@ static int r8156b_init(struct r8152 *tp) if (ret < 0) goto out; + ret = r8156b_u2phy_backup(tp); + if (ret < 0) + goto out; + ret = r8153b_power_cut_en(tp, false); if (ret < 0) goto out; @@ -25561,34 +28349,7 @@ static int r8156b_init(struct r8152 *tp) usb_enable_lpm(tp->udev); - ret = ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); - if (ret < 0) - goto out; - - ret = ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_CPCR, FLOW_CTRL_EN); - if (ret < 0) - goto out; - - /* enable fc timer and set timer to 600 ms. */ - ret = ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, - CTRL_TIMER_EN | (600 / 8)); - if (ret < 0) - goto out; - - ret = ocp_read_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL, &ocp_data); - if (ret < 0) - goto out; - - if (!(ocp_data & DACK_DET_EN)) - ret = ocp_word_w0w1(tp, MCU_TYPE_USB, USB_FW_CTRL, AUTO_SPEEDUP, - FLOW_CTRL_PATCH_2); - else - ret = ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, - AUTO_SPEEDUP); - if (ret < 0) - goto out; - - ret = ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); + ret = rtl_fc_pause_pkt_en(tp); if (ret < 0) goto out; @@ -25645,7 +28406,7 @@ static int r8157_init(struct r8152 *tp) if (test_bit(RTL8152_UNPLUG, &tp->flags)) return -ENODEV; - rtl_set_dbg_info_init(tp, 0x9); + rtl_set_dbg_info_init(tp, 0x1); ret = ocp_byte_set_bits(tp, MCU_TYPE_USB, 0xcffe, BIT(3)); if (ret < 0) @@ -25664,10 +28425,6 @@ static int r8157_init(struct r8152 *tp) if (ret < 0) goto out; - ret = ocp_word_set_bits(tp, MCU_TYPE_USB, USB_U2P3_CTRL, RX_DETECT8); - if (ret < 0) - goto out; - ret = r8153b_u1u2en(tp, false); if (ret < 0) goto out; @@ -25764,34 +28521,7 @@ static int r8157_init(struct r8152 *tp) usb_disable_lpm(tp->udev); usb_disable_ltm(tp->udev); - ret = ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); - if (ret < 0) - goto out; - - ret = ocp_word_set_bits(tp, MCU_TYPE_PLA, PLA_CPCR, FLOW_CTRL_EN); - if (ret < 0) - goto out; - - /* enable fc timer and set timer to 600 ms. */ - ret = ocp_write_word(tp, MCU_TYPE_USB, USB_FC_TIMER, - CTRL_TIMER_EN | (600 / 8)); - if (ret < 0) - goto out; - - ret = ocp_read_word(tp, MCU_TYPE_PLA, PLA_POL_GPIO_CTRL, &ocp_data); - if (ret < 0) - goto out; - - if (!(ocp_data & DACK_DET_EN)) - ret = ocp_word_w0w1(tp, MCU_TYPE_USB, USB_FW_CTRL, AUTO_SPEEDUP, - FLOW_CTRL_PATCH_2); - else - ret = ocp_word_clr_bits(tp, MCU_TYPE_USB, USB_FW_CTRL, - AUTO_SPEEDUP); - if (ret < 0) - goto out; - - ret = ocp_word_set_bits(tp, MCU_TYPE_USB, USB_FW_TASK, FC_PATCH_TASK); + ret = rtl_fc_pause_pkt_en(tp); if (ret < 0) goto out; @@ -25937,15 +28667,7 @@ static int r8159_init(struct r8152 *tp) if (ret < 0) goto out; - ret = ocp_word_clr_bits(tp, MCU_TYPE_PLA, PLA_RCR, SLOT_EN); - if (ret < 0) - goto out; - - ret = ocp_word_w0w1(tp, MCU_TYPE_PLA, 0xe61e, 0xf0 | BIT(3), 0x9 << 4); - if (ret < 0) - goto out; - - ret = ocp_word_set_bits(tp, MCU_TYPE_PLA, 0xe61e, BIT(3)); + ret = rtl_fc_pause_pkt_en(tp); if (ret < 0) goto out; @@ -26233,22 +28955,21 @@ static int rtl8152_post_reset(struct usb_interface *intf) { struct r8152 *tp = usb_get_intfdata(intf); struct net_device *netdev; - struct sockaddr sa; + struct sockaddr_storage ss; if (!tp) return 0; /* reset the MAC address in case of policy change */ - if (determine_ethernet_addr(tp, &sa) >= 0) { + if (determine_ethernet_addr(tp, &ss) >= 0) { rtnl_lock(); #if LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0) - dev_set_mac_address(tp->netdev, &sa); + dev_set_mac_address(tp->netdev, (struct sockaddr *)&ss); #elif LINUX_VERSION_CODE < KERNEL_VERSION(6,16,0) - dev_set_mac_address(tp->netdev, &sa, NULL); -#else /* >= 6.16: __kernel_sockaddr_storage API change */ - dev_set_mac_address(tp->netdev, - (struct __kernel_sockaddr_storage *)&sa, NULL); -#endif + dev_set_mac_address(tp->netdev, (struct sockaddr *)&ss, NULL); +#else + dev_set_mac_address(tp->netdev, &ss, NULL); +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(5,0,0) */ rtnl_unlock(); } @@ -26295,7 +29016,7 @@ static bool delay_autosuspend(struct r8152 *tp) */ if (!sw_linking && tp->rtl_ops.in_nway(tp)) return true; - else if (!skb_queue_empty(&tp->tx_queue)) + else if (!skb_queue_empty_lockless(&tp->tx_queue)) return true; else return false; @@ -27090,6 +29811,8 @@ static const char rtl8152_gstrings[][ETH_GSTRING_LEN] = { "rx_multicast", "tx_aborted", "tx_underrun", + "tx_submit", + "tx_back", }; #if LINUX_VERSION_CODE < KERNEL_VERSION(2,6,33) @@ -27147,6 +29870,8 @@ static void rtl8152_get_ethtool_stats(struct net_device *dev, data[10] = le32_to_cpu(tally.rx_multicast); data[11] = le16_to_cpu(tally.tx_aborted); data[12] = le16_to_cpu(tally.tx_underrun); + data[13] = tp->tx_submit; + data[14] = tp->tx_back; } static void rtl8152_get_strings(struct net_device *dev, u32 stringset, u8 *data) @@ -27535,6 +30260,9 @@ static int rtl8152_get_tunable(struct net_device *netdev, case ETHTOOL_RX_COPYBREAK: *(u32 *)d = tp->rx_copybreak; break; + case ETHTOOL_TX_COPYBREAK: + *(u32 *)d = tp->tx_copybreak; + break; default: return -EOPNOTSUPP; } @@ -27547,6 +30275,7 @@ static int rtl8152_set_tunable(struct net_device *netdev, const void *d) { struct r8152 *tp = netdev_priv(netdev); + int ret = 0; u32 val; switch (tunable->id) { @@ -27555,12 +30284,15 @@ static int rtl8152_set_tunable(struct net_device *netdev, if (val < ETH_ZLEN) { netif_err(tp, rx_err, netdev, "Invalid rx copy break value\n"); - return -EINVAL; + ret = -EINVAL; + break; } if (tp->rx_copybreak != val) { if (netdev->flags & IFF_UP) { - mutex_lock(&tp->control); + ret = mutex_lock_interruptible(&tp->control); + if (ret < 0) + break; napi_disable(&tp->napi); tp->rx_copybreak = val; napi_enable(&tp->napi); @@ -27570,11 +30302,29 @@ static int rtl8152_set_tunable(struct net_device *netdev, } } break; + case ETHTOOL_TX_COPYBREAK: + val = *(u32 *)d; + if (val < ETH_ZLEN) { + netif_err(tp, tx_err, netdev, + "Invalid tx copy break value\n"); + ret = -EINVAL; + break; + } + + if (tp->tx_copybreak != val) { + ret = mutex_lock_interruptible(&tp->control); + if (ret < 0) + break; + tp->tx_copybreak = val; + mutex_unlock(&tp->control); + } + break; default: - return -EOPNOTSUPP; + ret = -EOPNOTSUPP; + break; } - return 0; + return ret; } #endif /* LINUX_VERSION_CODE >= KERNEL_VERSION(3,18,0) */ @@ -27778,14 +30528,14 @@ static int rtltool_ioctl(struct r8152 *tp, struct ifreq *ifr) switch (my_cmd.cmd) { case RTLTOOL_PLA_OCP_READ_DWORD: - pla_ocp_read(tp, (u16)my_cmd.offset, sizeof(ocp_data), - &ocp_data); + ret = pla_ocp_read(tp, (u16)my_cmd.offset, sizeof(ocp_data), + &ocp_data); + if (ret < 0) + break; my_cmd.data = __le32_to_cpu(ocp_data); - if (copy_to_user(myptr, &my_cmd, sizeof(my_cmd))) { + if (copy_to_user(myptr, &my_cmd, sizeof(my_cmd))) ret = -EFAULT; - break; - } break; case RTLTOOL_PLA_OCP_WRITE_DWORD: @@ -27794,30 +30544,29 @@ static int rtltool_ioctl(struct r8152 *tp, struct ifreq *ifr) "rtk diag isn't enable\n"); ocp_data = __cpu_to_le32(my_cmd.data); - pla_ocp_write(tp, (u16)my_cmd.offset, (u16)my_cmd.byteen, - sizeof(ocp_data), &ocp_data); + ret = pla_ocp_write(tp, (u16)my_cmd.offset, (u16)my_cmd.byteen, + sizeof(ocp_data), &ocp_data); break; case RTLTOOL_USB_OCP_READ_DWORD: - usb_ocp_read(tp, (u16)my_cmd.offset, sizeof(ocp_data), - &ocp_data); + ret = usb_ocp_read(tp, (u16)my_cmd.offset, sizeof(ocp_data), + &ocp_data); + if (ret < 0) + break; my_cmd.data = __le32_to_cpu(ocp_data); - if (copy_to_user(myptr, &my_cmd, sizeof(my_cmd))) { + if (copy_to_user(myptr, &my_cmd, sizeof(my_cmd))) ret = -EFAULT; - break; - } break; - case RTLTOOL_USB_OCP_WRITE_DWORD: if (!tp->rtk_enable_diag && net_ratelimit()) netif_warn(tp, drv, netdev, "rtk diag isn't enable\n"); ocp_data = __cpu_to_le32(my_cmd.data); - usb_ocp_write(tp, (u16)my_cmd.offset, (u16)my_cmd.byteen, - sizeof(ocp_data), &ocp_data); + ret = usb_ocp_write(tp, (u16)my_cmd.offset, (u16)my_cmd.byteen, + sizeof(ocp_data), &ocp_data); break; case RTLTOOL_PLA_OCP_READ: @@ -27827,7 +30576,11 @@ static int rtltool_ioctl(struct r8152 *tp, struct ifreq *ifr) break; } - pla_ocp_read(tp, (u16)my_cmd.offset, my_cmd.data, buffer); + ret = pla_ocp_read(tp, (u16)my_cmd.offset, my_cmd.data, buffer); + if (ret < 0) { + kfree(buffer); + break; + } if (copy_to_user(my_cmd.buf, buffer, my_cmd.data)) ret = -EFAULT; @@ -27852,8 +30605,8 @@ static int rtltool_ioctl(struct r8152 *tp, struct ifreq *ifr) break; } - pla_ocp_write(tp, (u16)my_cmd.offset, (u16)my_cmd.byteen, - my_cmd.data, buffer); + ret = pla_ocp_write(tp, (u16)my_cmd.offset, (u16)my_cmd.byteen, + my_cmd.data, buffer); kfree(buffer); break; @@ -27864,7 +30617,11 @@ static int rtltool_ioctl(struct r8152 *tp, struct ifreq *ifr) break; } - usb_ocp_read(tp, (u16)my_cmd.offset, my_cmd.data, buffer); + ret = usb_ocp_read(tp, (u16)my_cmd.offset, my_cmd.data, buffer); + if (ret < 0) { + kfree(buffer); + break; + } if (copy_to_user(my_cmd.buf, buffer, my_cmd.data)) ret = -EFAULT; @@ -27889,11 +30646,39 @@ static int rtltool_ioctl(struct r8152 *tp, struct ifreq *ifr) break; } - usb_ocp_write(tp, (u16)my_cmd.offset, (u16)my_cmd.byteen, - my_cmd.data, buffer); + ret = usb_ocp_write(tp, (u16)my_cmd.offset, (u16)my_cmd.byteen, + my_cmd.data, buffer); kfree(buffer); break; + case RTLTOOL_PHY_OCP_READ: + if (!tp->rtk_enable_diag) { + netif_err(tp, drv, netdev, "rtk diag isn't enable\n"); + ret = -EPERM; + break; + } + + ocp_data = 0; + ret = ocp_reg_read(tp, (u16)my_cmd.offset, (u16 *)&ocp_data); + if (ret < 0) + break; + my_cmd.data = __le32_to_cpu(ocp_data); + + if (copy_to_user(myptr, &my_cmd, sizeof(my_cmd))) + ret = -EFAULT; + break; + + case RTLTOOL_PHY_OCP_WRITE: + if (!tp->rtk_enable_diag) { + netif_err(tp, drv, netdev, "rtk diag isn't enable\n"); + ret = -EPERM; + break; + } + + ocp_data = __cpu_to_le32(my_cmd.data); + ret = ocp_reg_write(tp, (u16)my_cmd.offset, (u16)ocp_data); + break; + case RTLTOOL_USB_INFO: uinfo = (struct usb_device_info *)&my_cmd.nic_info; udev = tp->udev; @@ -27901,12 +30686,13 @@ static int rtltool_ioctl(struct r8152 *tp, struct ifreq *ifr) uinfo->idProduct = __le16_to_cpu(udev->descriptor.idProduct); uinfo->bcdDevice = __le16_to_cpu(udev->descriptor.bcdDevice); strscpy(uinfo->devpath, udev->devpath, sizeof(udev->devpath)); - pla_ocp_read(tp, PLA_IDR, sizeof(uinfo->dev_addr), - uinfo->dev_addr); + ret = pla_ocp_read(tp, PLA_IDR, sizeof(uinfo->dev_addr), + uinfo->dev_addr); + if (ret < 0) + break; if (copy_to_user(myptr, &my_cmd, sizeof(my_cmd))) ret = -EFAULT; - break; case RTL_ENABLE_USB_DIAG: @@ -27936,7 +30722,7 @@ static int rtltool_ioctl(struct r8152 *tp, struct ifreq *ifr) break; } - return ret; + return ret < 0 ? ret : 0; } #if LINUX_VERSION_CODE >= KERNEL_VERSION(5,15,0) @@ -28814,11 +31600,14 @@ static ssize_t ocp_store(struct device *dev, struct device_attribute *attr, int num, ret; u32 ocp_data; u16 type; + bool phy_rw = false; if (!strncmp(buf, "pla ", 4)) type = MCU_TYPE_PLA; else if (!strncmp(buf, "usb ", 4)) type = MCU_TYPE_USB; + else if (!strncmp(buf, "phy ", 4)) + phy_rw = true; else return -EINVAL; @@ -28827,7 +31616,10 @@ static ssize_t ocp_store(struct device *dev, struct device_attribute *attr, num = sscanf(strchr(buf, ' '), "%x %x %x %x\n", &v1, &v2, &v3, &v4); - if (num > 1) { + if (phy_rw) { + if (num > 0 && (v1 & 1)) + return -EINVAL; + } else if (num > 1) { if ((v1 == 2 && (v2 & 1)) || (v1 == 4 && (v2 & 3)) || (type == MCU_TYPE_PLA && @@ -28843,14 +31635,32 @@ static ssize_t ocp_store(struct device *dev, struct device_attribute *attr, if (ret < 0) goto put; - switch(num) { + switch (num) { + case 1: + if (phy_rw) { + ret = ocp_reg_read(tp, (u16)v1, (u16 *)&ocp_data); + if (ret < 0) + break; + netif_info(tp, drv, netdev, + "PHY read word %#0hx = %#0hx\n", v1, + ocp_data); + } else + ret = -EINVAL; + break; case 2: + if (phy_rw) { + netif_info(tp, drv, netdev, + "PHY write word %#0hx = %#0hx\n", v1, v2); + ret = ocp_reg_write(tp, (u16)v1, (u16)v2); + break; + } + switch (v1) { case 1: ret = ocp_read_byte(tp, type, v2, &ocp_data); if (ret < 0) break; - netif_info(tp, drv, netdev, "%s read byte %x = %x\n", + netif_info(tp, drv, netdev, "%s read byte %#0hx = %#0hhx\n", type ? "PLA" : "USB", v2, ocp_data); break; @@ -28858,7 +31668,7 @@ static ssize_t ocp_store(struct device *dev, struct device_attribute *attr, ret = ocp_read_word(tp, type, v2, &ocp_data); if (ret < 0) break; - netif_info(tp, drv, netdev, "%s read word %x = %x\n", + netif_info(tp, drv, netdev, "%s read word %#0hx = %#0hx\n", type ? "PLA" : "USB", v2, ocp_data); break; @@ -28866,7 +31676,7 @@ static ssize_t ocp_store(struct device *dev, struct device_attribute *attr, ret = ocp_read_dword(tp, type, v2, &ocp_data); if (ret < 0) break; - netif_info(tp, drv, netdev, "%s read dword %x = %x\n", + netif_info(tp, drv, netdev, "%s read dword %#0hx = %#0x\n", type ? "PLA" : "USB", v2, ocp_data); break; @@ -28876,19 +31686,24 @@ static ssize_t ocp_store(struct device *dev, struct device_attribute *attr, } break; case 3: + if (phy_rw) { + ret = -EINVAL; + break; + } + switch (v1) { case 1: - netif_info(tp, drv, netdev, "%s write byte %x = %x\n", + netif_info(tp, drv, netdev, "%s write byte %#0hx = %#0hhx\n", type ? "PLA" : "USB", v2, v3); ret = ocp_write_byte(tp, type, v2, v3); break; case 2: - netif_info(tp, drv, netdev, "%s write word %x = %x\n", + netif_info(tp, drv, netdev, "%s write word %#0hx = %#0hx\n", type ? "PLA" : "USB", v2, v3); ret = ocp_write_word(tp, type, v2, v3); break; case 4: - netif_info(tp, drv, netdev, "%s write dword %x = %x\n", + netif_info(tp, drv, netdev, "%s write dword %#0hx = %#0x\n", type ? "PLA" : "USB", v2, v3); ret = ocp_write_dword(tp, type, v2, v3); break; @@ -28898,7 +31713,6 @@ static ssize_t ocp_store(struct device *dev, struct device_attribute *attr, } break; case 4: - case 1: default: ret = -EINVAL; break; @@ -28926,8 +31740,12 @@ static struct attribute *rtk_attrs[] = { /* hexdump -e '"%04_ax\t" 16/1 "%02X " "\n"' pla */ static ssize_t pla_read(struct file *fp, struct kobject *kobj, - struct bin_attribute *attr, char *buf, loff_t offset, - size_t size) +#if LINUX_VERSION_CODE < KERNEL_VERSION(6,16,0) + struct bin_attribute *attr, +#else + const struct bin_attribute *attr, +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(6,16,0) */ + char *buf, loff_t offset, size_t size) { struct device *dev = kobj_to_dev(kobj); struct net_device *netdev = to_net_dev(dev); @@ -28968,7 +31786,11 @@ put: static BIN_ATTR_RO(pla, ATTR_PLA_SIZE); +#if LINUX_VERSION_CODE < KERNEL_VERSION(6,16,0) static struct bin_attribute *rtk_bin_attrs[] = { +#else +static const struct bin_attribute *rtk_bin_attrs[] = { +#endif /* LINUX_VERSION_CODE < KERNEL_VERSION(6,16,0) */ &bin_attr_pla, NULL }; @@ -28981,6 +31803,58 @@ static struct attribute_group rtk_dbg_grp = { #endif /* RTL8152_DEBUG */ +static ssize_t temperature_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct net_device *netdev = to_net_dev(dev); + struct r8152 *tp = netdev_priv(netdev); + int ret, temp; + u16 data; + + switch (tp->version) { + case RTL_VER_13: + case RTL_VER_15: + break; + default: + strcpy(buf, "Not Support\n"); + return strlen(buf); + } + + ret = usb_autopm_get_interface(tp->intf); + if (ret < 0) + return ret; + + ret = mutex_lock_interruptible(&tp->control); + if (ret < 0) + goto put; + + ret = ocp_reg_read(tp, 0xbd84, &data); + rtl_reset_ocp_base(tp); + + mutex_unlock(&tp->control); + + if (ret < 0) + goto put; + + data &= 0x3ff; + if (data > 512) + temp = ((int)data - 1024) / 2; + else + temp = data / 2; + + sprintf(buf, "%d \u2103 (%d \u2109)\n", temp, temp * 9 / 5 + 32); + +put: + usb_autopm_put_interface(tp->intf); + + if (ret < 0) + return ret; + else + return strlen(buf); +} + +static DEVICE_ATTR_RO(temperature); + static ssize_t rx_copybreak_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -29032,6 +31906,51 @@ static ssize_t rx_copybreak_store(struct device *dev, static DEVICE_ATTR_RW(rx_copybreak); +static ssize_t tx_copybreak_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct net_device *netdev = to_net_dev(dev); + struct r8152 *tp = netdev_priv(netdev); + + sprintf(buf, "%u\n", tp->tx_copybreak); + + return strlen(buf); +} + +static ssize_t tx_copybreak_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + struct net_device *netdev = to_net_dev(dev); + struct r8152 *tp = netdev_priv(netdev); + u32 tx_copybreak; + + if (sscanf(buf, "%u\n", &tx_copybreak) != 1) + return -EINVAL; + + if (tx_copybreak < ETH_ZLEN) + return -EINVAL; + + if (test_bit(RTL8152_UNPLUG, &tp->flags)) + return -ENODEV; + + if (tp->tx_copybreak != tx_copybreak) { + int ret; + + ret = mutex_lock_interruptible(&tp->control); + if (ret < 0) + return ret; + + tp->tx_copybreak = tx_copybreak; + + mutex_unlock(&tp->control); + } + + return count; +} + +static DEVICE_ATTR_RW(tx_copybreak); + static ssize_t fc_pause_on_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -29250,7 +32169,9 @@ static ssize_t sg_en_store(struct device *dev, struct device_attribute *attr, static DEVICE_ATTR_RW(sg_en); static struct attribute *rtk_adv_attrs[] = { + &dev_attr_temperature.attr, &dev_attr_rx_copybreak.attr, + &dev_attr_tx_copybreak.attr, &dev_attr_sg_en.attr, &dev_attr_fc_pause_on.attr, &dev_attr_fc_pause_off.attr, @@ -29523,6 +32444,7 @@ static int rtl8152_probe(struct usb_interface *intf, tp->duplex = DUPLEX_FULL; tp->rx_copybreak = RTL8152_RXFG_HEADSZ; + tp->tx_copybreak = RTL8152_TXFG_HEADSZ; tp->rx_pending = 10 * RTL8152_MAX_RX; intf->needs_remote_wakeup = 1;