diff options
Diffstat (limited to 'drivers')
48 files changed, 4466 insertions, 1748 deletions
diff --git a/drivers/net/bnx2.c b/drivers/net/bnx2.c index 34aebc6e7589..8b552c6dd2e7 100644 --- a/drivers/net/bnx2.c +++ b/drivers/net/bnx2.c | |||
@@ -56,8 +56,8 @@ | |||
56 | 56 | ||
57 | #define DRV_MODULE_NAME "bnx2" | 57 | #define DRV_MODULE_NAME "bnx2" |
58 | #define PFX DRV_MODULE_NAME ": " | 58 | #define PFX DRV_MODULE_NAME ": " |
59 | #define DRV_MODULE_VERSION "1.7.2" | 59 | #define DRV_MODULE_VERSION "1.7.3" |
60 | #define DRV_MODULE_RELDATE "January 21, 2008" | 60 | #define DRV_MODULE_RELDATE "January 29, 2008" |
61 | 61 | ||
62 | #define RUN_AT(x) (jiffies + (x)) | 62 | #define RUN_AT(x) (jiffies + (x)) |
63 | 63 | ||
@@ -266,6 +266,18 @@ bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val) | |||
266 | } | 266 | } |
267 | 267 | ||
268 | static void | 268 | static void |
269 | bnx2_shmem_wr(struct bnx2 *bp, u32 offset, u32 val) | ||
270 | { | ||
271 | bnx2_reg_wr_ind(bp, bp->shmem_base + offset, val); | ||
272 | } | ||
273 | |||
274 | static u32 | ||
275 | bnx2_shmem_rd(struct bnx2 *bp, u32 offset) | ||
276 | { | ||
277 | return (bnx2_reg_rd_ind(bp, bp->shmem_base + offset)); | ||
278 | } | ||
279 | |||
280 | static void | ||
269 | bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val) | 281 | bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val) |
270 | { | 282 | { |
271 | offset += cid_addr; | 283 | offset += cid_addr; |
@@ -685,7 +697,7 @@ bnx2_report_fw_link(struct bnx2 *bp) | |||
685 | else | 697 | else |
686 | fw_link_status = BNX2_LINK_STATUS_LINK_DOWN; | 698 | fw_link_status = BNX2_LINK_STATUS_LINK_DOWN; |
687 | 699 | ||
688 | REG_WR_IND(bp, bp->shmem_base + BNX2_LINK_STATUS, fw_link_status); | 700 | bnx2_shmem_wr(bp, BNX2_LINK_STATUS, fw_link_status); |
689 | } | 701 | } |
690 | 702 | ||
691 | static char * | 703 | static char * |
@@ -980,6 +992,42 @@ bnx2_copper_linkup(struct bnx2 *bp) | |||
980 | return 0; | 992 | return 0; |
981 | } | 993 | } |
982 | 994 | ||
995 | static void | ||
996 | bnx2_init_rx_context0(struct bnx2 *bp) | ||
997 | { | ||
998 | u32 val, rx_cid_addr = GET_CID_ADDR(RX_CID); | ||
999 | |||
1000 | val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE; | ||
1001 | val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2; | ||
1002 | val |= 0x02 << 8; | ||
1003 | |||
1004 | if (CHIP_NUM(bp) == CHIP_NUM_5709) { | ||
1005 | u32 lo_water, hi_water; | ||
1006 | |||
1007 | if (bp->flow_ctrl & FLOW_CTRL_TX) | ||
1008 | lo_water = BNX2_L2CTX_LO_WATER_MARK_DEFAULT; | ||
1009 | else | ||
1010 | lo_water = BNX2_L2CTX_LO_WATER_MARK_DIS; | ||
1011 | if (lo_water >= bp->rx_ring_size) | ||
1012 | lo_water = 0; | ||
1013 | |||
1014 | hi_water = bp->rx_ring_size / 4; | ||
1015 | |||
1016 | if (hi_water <= lo_water) | ||
1017 | lo_water = 0; | ||
1018 | |||
1019 | hi_water /= BNX2_L2CTX_HI_WATER_MARK_SCALE; | ||
1020 | lo_water /= BNX2_L2CTX_LO_WATER_MARK_SCALE; | ||
1021 | |||
1022 | if (hi_water > 0xf) | ||
1023 | hi_water = 0xf; | ||
1024 | else if (hi_water == 0) | ||
1025 | lo_water = 0; | ||
1026 | val |= lo_water | (hi_water << BNX2_L2CTX_HI_WATER_MARK_SHIFT); | ||
1027 | } | ||
1028 | bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_CTX_TYPE, val); | ||
1029 | } | ||
1030 | |||
983 | static int | 1031 | static int |
984 | bnx2_set_mac_link(struct bnx2 *bp) | 1032 | bnx2_set_mac_link(struct bnx2 *bp) |
985 | { | 1033 | { |
@@ -1044,6 +1092,9 @@ bnx2_set_mac_link(struct bnx2 *bp) | |||
1044 | /* Acknowledge the interrupt. */ | 1092 | /* Acknowledge the interrupt. */ |
1045 | REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE); | 1093 | REG_WR(bp, BNX2_EMAC_STATUS, BNX2_EMAC_STATUS_LINK_CHANGE); |
1046 | 1094 | ||
1095 | if (CHIP_NUM(bp) == CHIP_NUM_5709) | ||
1096 | bnx2_init_rx_context0(bp); | ||
1097 | |||
1047 | return 0; | 1098 | return 0; |
1048 | } | 1099 | } |
1049 | 1100 | ||
@@ -1378,14 +1429,14 @@ bnx2_setup_remote_phy(struct bnx2 *bp, u8 port) | |||
1378 | 1429 | ||
1379 | if (pause_adv & (ADVERTISE_1000XPAUSE | ADVERTISE_PAUSE_CAP)) | 1430 | if (pause_adv & (ADVERTISE_1000XPAUSE | ADVERTISE_PAUSE_CAP)) |
1380 | speed_arg |= BNX2_NETLINK_SET_LINK_FC_SYM_PAUSE; | 1431 | speed_arg |= BNX2_NETLINK_SET_LINK_FC_SYM_PAUSE; |
1381 | if (pause_adv & (ADVERTISE_1000XPSE_ASYM | ADVERTISE_1000XPSE_ASYM)) | 1432 | if (pause_adv & (ADVERTISE_1000XPSE_ASYM | ADVERTISE_PAUSE_ASYM)) |
1382 | speed_arg |= BNX2_NETLINK_SET_LINK_FC_ASYM_PAUSE; | 1433 | speed_arg |= BNX2_NETLINK_SET_LINK_FC_ASYM_PAUSE; |
1383 | 1434 | ||
1384 | if (port == PORT_TP) | 1435 | if (port == PORT_TP) |
1385 | speed_arg |= BNX2_NETLINK_SET_LINK_PHY_APP_REMOTE | | 1436 | speed_arg |= BNX2_NETLINK_SET_LINK_PHY_APP_REMOTE | |
1386 | BNX2_NETLINK_SET_LINK_ETH_AT_WIRESPEED; | 1437 | BNX2_NETLINK_SET_LINK_ETH_AT_WIRESPEED; |
1387 | 1438 | ||
1388 | REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB_ARG0, speed_arg); | 1439 | bnx2_shmem_wr(bp, BNX2_DRV_MB_ARG0, speed_arg); |
1389 | 1440 | ||
1390 | spin_unlock_bh(&bp->phy_lock); | 1441 | spin_unlock_bh(&bp->phy_lock); |
1391 | bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_CMD_SET_LINK, 0); | 1442 | bnx2_fw_sync(bp, BNX2_DRV_MSG_CODE_CMD_SET_LINK, 0); |
@@ -1530,9 +1581,9 @@ bnx2_set_default_remote_link(struct bnx2 *bp) | |||
1530 | u32 link; | 1581 | u32 link; |
1531 | 1582 | ||
1532 | if (bp->phy_port == PORT_TP) | 1583 | if (bp->phy_port == PORT_TP) |
1533 | link = REG_RD_IND(bp, bp->shmem_base + BNX2_RPHY_COPPER_LINK); | 1584 | link = bnx2_shmem_rd(bp, BNX2_RPHY_COPPER_LINK); |
1534 | else | 1585 | else |
1535 | link = REG_RD_IND(bp, bp->shmem_base + BNX2_RPHY_SERDES_LINK); | 1586 | link = bnx2_shmem_rd(bp, BNX2_RPHY_SERDES_LINK); |
1536 | 1587 | ||
1537 | if (link & BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG) { | 1588 | if (link & BNX2_NETLINK_SET_LINK_ENABLE_AUTONEG) { |
1538 | bp->req_line_speed = 0; | 1589 | bp->req_line_speed = 0; |
@@ -1584,7 +1635,7 @@ bnx2_set_default_link(struct bnx2 *bp) | |||
1584 | 1635 | ||
1585 | bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg; | 1636 | bp->advertising = ETHTOOL_ALL_FIBRE_SPEED | ADVERTISED_Autoneg; |
1586 | 1637 | ||
1587 | reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_CONFIG); | 1638 | reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_CONFIG); |
1588 | reg &= BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK; | 1639 | reg &= BNX2_PORT_HW_CFG_CFG_DFLT_LINK_MASK; |
1589 | if (reg == BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G) { | 1640 | if (reg == BNX2_PORT_HW_CFG_CFG_DFLT_LINK_1G) { |
1590 | bp->autoneg = 0; | 1641 | bp->autoneg = 0; |
@@ -1616,7 +1667,7 @@ bnx2_remote_phy_event(struct bnx2 *bp) | |||
1616 | u8 link_up = bp->link_up; | 1667 | u8 link_up = bp->link_up; |
1617 | u8 old_port; | 1668 | u8 old_port; |
1618 | 1669 | ||
1619 | msg = REG_RD_IND(bp, bp->shmem_base + BNX2_LINK_STATUS); | 1670 | msg = bnx2_shmem_rd(bp, BNX2_LINK_STATUS); |
1620 | 1671 | ||
1621 | if (msg & BNX2_LINK_STATUS_HEART_BEAT_EXPIRED) | 1672 | if (msg & BNX2_LINK_STATUS_HEART_BEAT_EXPIRED) |
1622 | bnx2_send_heart_beat(bp); | 1673 | bnx2_send_heart_beat(bp); |
@@ -1693,7 +1744,7 @@ bnx2_set_remote_link(struct bnx2 *bp) | |||
1693 | { | 1744 | { |
1694 | u32 evt_code; | 1745 | u32 evt_code; |
1695 | 1746 | ||
1696 | evt_code = REG_RD_IND(bp, bp->shmem_base + BNX2_FW_EVT_CODE_MB); | 1747 | evt_code = bnx2_shmem_rd(bp, BNX2_FW_EVT_CODE_MB); |
1697 | switch (evt_code) { | 1748 | switch (evt_code) { |
1698 | case BNX2_FW_EVT_CODE_LINK_EVENT: | 1749 | case BNX2_FW_EVT_CODE_LINK_EVENT: |
1699 | bnx2_remote_phy_event(bp); | 1750 | bnx2_remote_phy_event(bp); |
@@ -1905,14 +1956,13 @@ bnx2_init_5708s_phy(struct bnx2 *bp) | |||
1905 | bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG); | 1956 | bnx2_write_phy(bp, BCM5708S_BLK_ADDR, BCM5708S_BLK_ADDR_DIG); |
1906 | } | 1957 | } |
1907 | 1958 | ||
1908 | val = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_CONFIG) & | 1959 | val = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_CONFIG) & |
1909 | BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK; | 1960 | BNX2_PORT_HW_CFG_CFG_TXCTL3_MASK; |
1910 | 1961 | ||
1911 | if (val) { | 1962 | if (val) { |
1912 | u32 is_backplane; | 1963 | u32 is_backplane; |
1913 | 1964 | ||
1914 | is_backplane = REG_RD_IND(bp, bp->shmem_base + | 1965 | is_backplane = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG); |
1915 | BNX2_SHARED_HW_CFG_CONFIG); | ||
1916 | if (is_backplane & BNX2_SHARED_HW_CFG_PHY_BACKPLANE) { | 1966 | if (is_backplane & BNX2_SHARED_HW_CFG_PHY_BACKPLANE) { |
1917 | bnx2_write_phy(bp, BCM5708S_BLK_ADDR, | 1967 | bnx2_write_phy(bp, BCM5708S_BLK_ADDR, |
1918 | BCM5708S_BLK_ADDR_TX_MISC); | 1968 | BCM5708S_BLK_ADDR_TX_MISC); |
@@ -2111,13 +2161,13 @@ bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int silent) | |||
2111 | bp->fw_wr_seq++; | 2161 | bp->fw_wr_seq++; |
2112 | msg_data |= bp->fw_wr_seq; | 2162 | msg_data |= bp->fw_wr_seq; |
2113 | 2163 | ||
2114 | REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB, msg_data); | 2164 | bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data); |
2115 | 2165 | ||
2116 | /* wait for an acknowledgement. */ | 2166 | /* wait for an acknowledgement. */ |
2117 | for (i = 0; i < (FW_ACK_TIME_OUT_MS / 10); i++) { | 2167 | for (i = 0; i < (FW_ACK_TIME_OUT_MS / 10); i++) { |
2118 | msleep(10); | 2168 | msleep(10); |
2119 | 2169 | ||
2120 | val = REG_RD_IND(bp, bp->shmem_base + BNX2_FW_MB); | 2170 | val = bnx2_shmem_rd(bp, BNX2_FW_MB); |
2121 | 2171 | ||
2122 | if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ)) | 2172 | if ((val & BNX2_FW_MSG_ACK) == (msg_data & BNX2_DRV_MSG_SEQ)) |
2123 | break; | 2173 | break; |
@@ -2134,7 +2184,7 @@ bnx2_fw_sync(struct bnx2 *bp, u32 msg_data, int silent) | |||
2134 | msg_data &= ~BNX2_DRV_MSG_CODE; | 2184 | msg_data &= ~BNX2_DRV_MSG_CODE; |
2135 | msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT; | 2185 | msg_data |= BNX2_DRV_MSG_CODE_FW_TIMEOUT; |
2136 | 2186 | ||
2137 | REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_MB, msg_data); | 2187 | bnx2_shmem_wr(bp, BNX2_DRV_MB, msg_data); |
2138 | 2188 | ||
2139 | return -EBUSY; | 2189 | return -EBUSY; |
2140 | } | 2190 | } |
@@ -2226,7 +2276,7 @@ bnx2_init_context(struct bnx2 *bp) | |||
2226 | 2276 | ||
2227 | /* Zero out the context. */ | 2277 | /* Zero out the context. */ |
2228 | for (offset = 0; offset < PHY_CTX_SIZE; offset += 4) | 2278 | for (offset = 0; offset < PHY_CTX_SIZE; offset += 4) |
2229 | CTX_WR(bp, vcid_addr, offset, 0); | 2279 | bnx2_ctx_wr(bp, vcid_addr, offset, 0); |
2230 | } | 2280 | } |
2231 | } | 2281 | } |
2232 | } | 2282 | } |
@@ -2251,11 +2301,12 @@ bnx2_alloc_bad_rbuf(struct bnx2 *bp) | |||
2251 | good_mbuf_cnt = 0; | 2301 | good_mbuf_cnt = 0; |
2252 | 2302 | ||
2253 | /* Allocate a bunch of mbufs and save the good ones in an array. */ | 2303 | /* Allocate a bunch of mbufs and save the good ones in an array. */ |
2254 | val = REG_RD_IND(bp, BNX2_RBUF_STATUS1); | 2304 | val = bnx2_reg_rd_ind(bp, BNX2_RBUF_STATUS1); |
2255 | while (val & BNX2_RBUF_STATUS1_FREE_COUNT) { | 2305 | while (val & BNX2_RBUF_STATUS1_FREE_COUNT) { |
2256 | REG_WR_IND(bp, BNX2_RBUF_COMMAND, BNX2_RBUF_COMMAND_ALLOC_REQ); | 2306 | bnx2_reg_wr_ind(bp, BNX2_RBUF_COMMAND, |
2307 | BNX2_RBUF_COMMAND_ALLOC_REQ); | ||
2257 | 2308 | ||
2258 | val = REG_RD_IND(bp, BNX2_RBUF_FW_BUF_ALLOC); | 2309 | val = bnx2_reg_rd_ind(bp, BNX2_RBUF_FW_BUF_ALLOC); |
2259 | 2310 | ||
2260 | val &= BNX2_RBUF_FW_BUF_ALLOC_VALUE; | 2311 | val &= BNX2_RBUF_FW_BUF_ALLOC_VALUE; |
2261 | 2312 | ||
@@ -2265,7 +2316,7 @@ bnx2_alloc_bad_rbuf(struct bnx2 *bp) | |||
2265 | good_mbuf_cnt++; | 2316 | good_mbuf_cnt++; |
2266 | } | 2317 | } |
2267 | 2318 | ||
2268 | val = REG_RD_IND(bp, BNX2_RBUF_STATUS1); | 2319 | val = bnx2_reg_rd_ind(bp, BNX2_RBUF_STATUS1); |
2269 | } | 2320 | } |
2270 | 2321 | ||
2271 | /* Free the good ones back to the mbuf pool thus discarding | 2322 | /* Free the good ones back to the mbuf pool thus discarding |
@@ -2276,7 +2327,7 @@ bnx2_alloc_bad_rbuf(struct bnx2 *bp) | |||
2276 | val = good_mbuf[good_mbuf_cnt]; | 2327 | val = good_mbuf[good_mbuf_cnt]; |
2277 | val = (val << 9) | val | 1; | 2328 | val = (val << 9) | val | 1; |
2278 | 2329 | ||
2279 | REG_WR_IND(bp, BNX2_RBUF_FW_BUF_FREE, val); | 2330 | bnx2_reg_wr_ind(bp, BNX2_RBUF_FW_BUF_FREE, val); |
2280 | } | 2331 | } |
2281 | kfree(good_mbuf); | 2332 | kfree(good_mbuf); |
2282 | return 0; | 2333 | return 0; |
@@ -3151,10 +3202,10 @@ load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw) | |||
3151 | int rc; | 3202 | int rc; |
3152 | 3203 | ||
3153 | /* Halt the CPU. */ | 3204 | /* Halt the CPU. */ |
3154 | val = REG_RD_IND(bp, cpu_reg->mode); | 3205 | val = bnx2_reg_rd_ind(bp, cpu_reg->mode); |
3155 | val |= cpu_reg->mode_value_halt; | 3206 | val |= cpu_reg->mode_value_halt; |
3156 | REG_WR_IND(bp, cpu_reg->mode, val); | 3207 | bnx2_reg_wr_ind(bp, cpu_reg->mode, val); |
3157 | REG_WR_IND(bp, cpu_reg->state, cpu_reg->state_value_clear); | 3208 | bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear); |
3158 | 3209 | ||
3159 | /* Load the Text area. */ | 3210 | /* Load the Text area. */ |
3160 | offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base); | 3211 | offset = cpu_reg->spad_base + (fw->text_addr - cpu_reg->mips_view_base); |
@@ -3167,7 +3218,7 @@ load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw) | |||
3167 | return rc; | 3218 | return rc; |
3168 | 3219 | ||
3169 | for (j = 0; j < (fw->text_len / 4); j++, offset += 4) { | 3220 | for (j = 0; j < (fw->text_len / 4); j++, offset += 4) { |
3170 | REG_WR_IND(bp, offset, le32_to_cpu(fw->text[j])); | 3221 | bnx2_reg_wr_ind(bp, offset, le32_to_cpu(fw->text[j])); |
3171 | } | 3222 | } |
3172 | } | 3223 | } |
3173 | 3224 | ||
@@ -3177,7 +3228,7 @@ load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw) | |||
3177 | int j; | 3228 | int j; |
3178 | 3229 | ||
3179 | for (j = 0; j < (fw->data_len / 4); j++, offset += 4) { | 3230 | for (j = 0; j < (fw->data_len / 4); j++, offset += 4) { |
3180 | REG_WR_IND(bp, offset, fw->data[j]); | 3231 | bnx2_reg_wr_ind(bp, offset, fw->data[j]); |
3181 | } | 3232 | } |
3182 | } | 3233 | } |
3183 | 3234 | ||
@@ -3187,7 +3238,7 @@ load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw) | |||
3187 | int j; | 3238 | int j; |
3188 | 3239 | ||
3189 | for (j = 0; j < (fw->sbss_len / 4); j++, offset += 4) { | 3240 | for (j = 0; j < (fw->sbss_len / 4); j++, offset += 4) { |
3190 | REG_WR_IND(bp, offset, 0); | 3241 | bnx2_reg_wr_ind(bp, offset, 0); |
3191 | } | 3242 | } |
3192 | } | 3243 | } |
3193 | 3244 | ||
@@ -3197,7 +3248,7 @@ load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw) | |||
3197 | int j; | 3248 | int j; |
3198 | 3249 | ||
3199 | for (j = 0; j < (fw->bss_len/4); j++, offset += 4) { | 3250 | for (j = 0; j < (fw->bss_len/4); j++, offset += 4) { |
3200 | REG_WR_IND(bp, offset, 0); | 3251 | bnx2_reg_wr_ind(bp, offset, 0); |
3201 | } | 3252 | } |
3202 | } | 3253 | } |
3203 | 3254 | ||
@@ -3208,19 +3259,19 @@ load_cpu_fw(struct bnx2 *bp, struct cpu_reg *cpu_reg, struct fw_info *fw) | |||
3208 | int j; | 3259 | int j; |
3209 | 3260 | ||
3210 | for (j = 0; j < (fw->rodata_len / 4); j++, offset += 4) { | 3261 | for (j = 0; j < (fw->rodata_len / 4); j++, offset += 4) { |
3211 | REG_WR_IND(bp, offset, fw->rodata[j]); | 3262 | bnx2_reg_wr_ind(bp, offset, fw->rodata[j]); |
3212 | } | 3263 | } |
3213 | } | 3264 | } |
3214 | 3265 | ||
3215 | /* Clear the pre-fetch instruction. */ | 3266 | /* Clear the pre-fetch instruction. */ |
3216 | REG_WR_IND(bp, cpu_reg->inst, 0); | 3267 | bnx2_reg_wr_ind(bp, cpu_reg->inst, 0); |
3217 | REG_WR_IND(bp, cpu_reg->pc, fw->start_addr); | 3268 | bnx2_reg_wr_ind(bp, cpu_reg->pc, fw->start_addr); |
3218 | 3269 | ||
3219 | /* Start the CPU. */ | 3270 | /* Start the CPU. */ |
3220 | val = REG_RD_IND(bp, cpu_reg->mode); | 3271 | val = bnx2_reg_rd_ind(bp, cpu_reg->mode); |
3221 | val &= ~cpu_reg->mode_value_halt; | 3272 | val &= ~cpu_reg->mode_value_halt; |
3222 | REG_WR_IND(bp, cpu_reg->state, cpu_reg->state_value_clear); | 3273 | bnx2_reg_wr_ind(bp, cpu_reg->state, cpu_reg->state_value_clear); |
3223 | REG_WR_IND(bp, cpu_reg->mode, val); | 3274 | bnx2_reg_wr_ind(bp, cpu_reg->mode, val); |
3224 | 3275 | ||
3225 | return 0; | 3276 | return 0; |
3226 | } | 3277 | } |
@@ -3833,7 +3884,7 @@ bnx2_init_nvram(struct bnx2 *bp) | |||
3833 | } | 3884 | } |
3834 | 3885 | ||
3835 | get_flash_size: | 3886 | get_flash_size: |
3836 | val = REG_RD_IND(bp, bp->shmem_base + BNX2_SHARED_HW_CFG_CONFIG2); | 3887 | val = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG2); |
3837 | val &= BNX2_SHARED_HW_CFG2_NVM_SIZE_MASK; | 3888 | val &= BNX2_SHARED_HW_CFG2_NVM_SIZE_MASK; |
3838 | if (val) | 3889 | if (val) |
3839 | bp->flash_size = val; | 3890 | bp->flash_size = val; |
@@ -4142,14 +4193,14 @@ bnx2_init_remote_phy(struct bnx2 *bp) | |||
4142 | if (!(bp->phy_flags & BNX2_PHY_FLAG_SERDES)) | 4193 | if (!(bp->phy_flags & BNX2_PHY_FLAG_SERDES)) |
4143 | return; | 4194 | return; |
4144 | 4195 | ||
4145 | val = REG_RD_IND(bp, bp->shmem_base + BNX2_FW_CAP_MB); | 4196 | val = bnx2_shmem_rd(bp, BNX2_FW_CAP_MB); |
4146 | if ((val & BNX2_FW_CAP_SIGNATURE_MASK) != BNX2_FW_CAP_SIGNATURE) | 4197 | if ((val & BNX2_FW_CAP_SIGNATURE_MASK) != BNX2_FW_CAP_SIGNATURE) |
4147 | return; | 4198 | return; |
4148 | 4199 | ||
4149 | if (val & BNX2_FW_CAP_REMOTE_PHY_CAPABLE) { | 4200 | if (val & BNX2_FW_CAP_REMOTE_PHY_CAPABLE) { |
4150 | bp->phy_flags |= BNX2_PHY_FLAG_REMOTE_PHY_CAP; | 4201 | bp->phy_flags |= BNX2_PHY_FLAG_REMOTE_PHY_CAP; |
4151 | 4202 | ||
4152 | val = REG_RD_IND(bp, bp->shmem_base + BNX2_LINK_STATUS); | 4203 | val = bnx2_shmem_rd(bp, BNX2_LINK_STATUS); |
4153 | if (val & BNX2_LINK_STATUS_SERDES_LINK) | 4204 | if (val & BNX2_LINK_STATUS_SERDES_LINK) |
4154 | bp->phy_port = PORT_FIBRE; | 4205 | bp->phy_port = PORT_FIBRE; |
4155 | else | 4206 | else |
@@ -4167,8 +4218,7 @@ bnx2_init_remote_phy(struct bnx2 *bp) | |||
4167 | } | 4218 | } |
4168 | sig = BNX2_DRV_ACK_CAP_SIGNATURE | | 4219 | sig = BNX2_DRV_ACK_CAP_SIGNATURE | |
4169 | BNX2_FW_CAP_REMOTE_PHY_CAPABLE; | 4220 | BNX2_FW_CAP_REMOTE_PHY_CAPABLE; |
4170 | REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_ACK_CAP_MB, | 4221 | bnx2_shmem_wr(bp, BNX2_DRV_ACK_CAP_MB, sig); |
4171 | sig); | ||
4172 | } | 4222 | } |
4173 | } | 4223 | } |
4174 | } | 4224 | } |
@@ -4204,8 +4254,8 @@ bnx2_reset_chip(struct bnx2 *bp, u32 reset_code) | |||
4204 | 4254 | ||
4205 | /* Deposit a driver reset signature so the firmware knows that | 4255 | /* Deposit a driver reset signature so the firmware knows that |
4206 | * this is a soft reset. */ | 4256 | * this is a soft reset. */ |
4207 | REG_WR_IND(bp, bp->shmem_base + BNX2_DRV_RESET_SIGNATURE, | 4257 | bnx2_shmem_wr(bp, BNX2_DRV_RESET_SIGNATURE, |
4208 | BNX2_DRV_RESET_SIGNATURE_MAGIC); | 4258 | BNX2_DRV_RESET_SIGNATURE_MAGIC); |
4209 | 4259 | ||
4210 | /* Do a dummy read to force the chip to complete all current transaction | 4260 | /* Do a dummy read to force the chip to complete all current transaction |
4211 | * before we issue a reset. */ | 4261 | * before we issue a reset. */ |
@@ -4438,18 +4488,21 @@ bnx2_init_chip(struct bnx2 *bp) | |||
4438 | } | 4488 | } |
4439 | 4489 | ||
4440 | if (bp->flags & BNX2_FLAG_USING_MSIX) { | 4490 | if (bp->flags & BNX2_FLAG_USING_MSIX) { |
4491 | u32 base = ((BNX2_TX_VEC - 1) * BNX2_HC_SB_CONFIG_SIZE) + | ||
4492 | BNX2_HC_SB_CONFIG_1; | ||
4493 | |||
4441 | REG_WR(bp, BNX2_HC_MSIX_BIT_VECTOR, | 4494 | REG_WR(bp, BNX2_HC_MSIX_BIT_VECTOR, |
4442 | BNX2_HC_MSIX_BIT_VECTOR_VAL); | 4495 | BNX2_HC_MSIX_BIT_VECTOR_VAL); |
4443 | 4496 | ||
4444 | REG_WR(bp, BNX2_HC_SB_CONFIG_1, | 4497 | REG_WR(bp, base, |
4445 | BNX2_HC_SB_CONFIG_1_TX_TMR_MODE | | 4498 | BNX2_HC_SB_CONFIG_1_TX_TMR_MODE | |
4446 | BNX2_HC_SB_CONFIG_1_ONE_SHOT); | 4499 | BNX2_HC_SB_CONFIG_1_ONE_SHOT); |
4447 | 4500 | ||
4448 | REG_WR(bp, BNX2_HC_TX_QUICK_CONS_TRIP_1, | 4501 | REG_WR(bp, base + BNX2_HC_TX_QUICK_CONS_TRIP_OFF, |
4449 | (bp->tx_quick_cons_trip_int << 16) | | 4502 | (bp->tx_quick_cons_trip_int << 16) | |
4450 | bp->tx_quick_cons_trip); | 4503 | bp->tx_quick_cons_trip); |
4451 | 4504 | ||
4452 | REG_WR(bp, BNX2_HC_TX_TICKS_1, | 4505 | REG_WR(bp, base + BNX2_HC_TX_TICKS_OFF, |
4453 | (bp->tx_ticks_int << 16) | bp->tx_ticks); | 4506 | (bp->tx_ticks_int << 16) | bp->tx_ticks); |
4454 | 4507 | ||
4455 | val |= BNX2_HC_CONFIG_SB_ADDR_INC_128B; | 4508 | val |= BNX2_HC_CONFIG_SB_ADDR_INC_128B; |
@@ -4509,6 +4562,7 @@ static void | |||
4509 | bnx2_init_tx_context(struct bnx2 *bp, u32 cid) | 4562 | bnx2_init_tx_context(struct bnx2 *bp, u32 cid) |
4510 | { | 4563 | { |
4511 | u32 val, offset0, offset1, offset2, offset3; | 4564 | u32 val, offset0, offset1, offset2, offset3; |
4565 | u32 cid_addr = GET_CID_ADDR(cid); | ||
4512 | 4566 | ||
4513 | if (CHIP_NUM(bp) == CHIP_NUM_5709) { | 4567 | if (CHIP_NUM(bp) == CHIP_NUM_5709) { |
4514 | offset0 = BNX2_L2CTX_TYPE_XI; | 4568 | offset0 = BNX2_L2CTX_TYPE_XI; |
@@ -4522,16 +4576,16 @@ bnx2_init_tx_context(struct bnx2 *bp, u32 cid) | |||
4522 | offset3 = BNX2_L2CTX_TBDR_BHADDR_LO; | 4576 | offset3 = BNX2_L2CTX_TBDR_BHADDR_LO; |
4523 | } | 4577 | } |
4524 | val = BNX2_L2CTX_TYPE_TYPE_L2 | BNX2_L2CTX_TYPE_SIZE_L2; | 4578 | val = BNX2_L2CTX_TYPE_TYPE_L2 | BNX2_L2CTX_TYPE_SIZE_L2; |
4525 | CTX_WR(bp, GET_CID_ADDR(cid), offset0, val); | 4579 | bnx2_ctx_wr(bp, cid_addr, offset0, val); |
4526 | 4580 | ||
4527 | val = BNX2_L2CTX_CMD_TYPE_TYPE_L2 | (8 << 16); | 4581 | val = BNX2_L2CTX_CMD_TYPE_TYPE_L2 | (8 << 16); |
4528 | CTX_WR(bp, GET_CID_ADDR(cid), offset1, val); | 4582 | bnx2_ctx_wr(bp, cid_addr, offset1, val); |
4529 | 4583 | ||
4530 | val = (u64) bp->tx_desc_mapping >> 32; | 4584 | val = (u64) bp->tx_desc_mapping >> 32; |
4531 | CTX_WR(bp, GET_CID_ADDR(cid), offset2, val); | 4585 | bnx2_ctx_wr(bp, cid_addr, offset2, val); |
4532 | 4586 | ||
4533 | val = (u64) bp->tx_desc_mapping & 0xffffffff; | 4587 | val = (u64) bp->tx_desc_mapping & 0xffffffff; |
4534 | CTX_WR(bp, GET_CID_ADDR(cid), offset3, val); | 4588 | bnx2_ctx_wr(bp, cid_addr, offset3, val); |
4535 | } | 4589 | } |
4536 | 4590 | ||
4537 | static void | 4591 | static void |
@@ -4601,36 +4655,38 @@ bnx2_init_rx_ring(struct bnx2 *bp) | |||
4601 | bnx2_init_rxbd_rings(bp->rx_desc_ring, bp->rx_desc_mapping, | 4655 | bnx2_init_rxbd_rings(bp->rx_desc_ring, bp->rx_desc_mapping, |
4602 | bp->rx_buf_use_size, bp->rx_max_ring); | 4656 | bp->rx_buf_use_size, bp->rx_max_ring); |
4603 | 4657 | ||
4604 | CTX_WR(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, 0); | 4658 | bnx2_init_rx_context0(bp); |
4659 | |||
4660 | if (CHIP_NUM(bp) == CHIP_NUM_5709) { | ||
4661 | val = REG_RD(bp, BNX2_MQ_MAP_L2_5); | ||
4662 | REG_WR(bp, BNX2_MQ_MAP_L2_5, val | BNX2_MQ_MAP_L2_5_ARM); | ||
4663 | } | ||
4664 | |||
4665 | bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, 0); | ||
4605 | if (bp->rx_pg_ring_size) { | 4666 | if (bp->rx_pg_ring_size) { |
4606 | bnx2_init_rxbd_rings(bp->rx_pg_desc_ring, | 4667 | bnx2_init_rxbd_rings(bp->rx_pg_desc_ring, |
4607 | bp->rx_pg_desc_mapping, | 4668 | bp->rx_pg_desc_mapping, |
4608 | PAGE_SIZE, bp->rx_max_pg_ring); | 4669 | PAGE_SIZE, bp->rx_max_pg_ring); |
4609 | val = (bp->rx_buf_use_size << 16) | PAGE_SIZE; | 4670 | val = (bp->rx_buf_use_size << 16) | PAGE_SIZE; |
4610 | CTX_WR(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, val); | 4671 | bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_PG_BUF_SIZE, val); |
4611 | CTX_WR(bp, rx_cid_addr, BNX2_L2CTX_RBDC_KEY, | 4672 | bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_RBDC_KEY, |
4612 | BNX2_L2CTX_RBDC_JUMBO_KEY); | 4673 | BNX2_L2CTX_RBDC_JUMBO_KEY); |
4613 | 4674 | ||
4614 | val = (u64) bp->rx_pg_desc_mapping[0] >> 32; | 4675 | val = (u64) bp->rx_pg_desc_mapping[0] >> 32; |
4615 | CTX_WR(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_HI, val); | 4676 | bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_HI, val); |
4616 | 4677 | ||
4617 | val = (u64) bp->rx_pg_desc_mapping[0] & 0xffffffff; | 4678 | val = (u64) bp->rx_pg_desc_mapping[0] & 0xffffffff; |
4618 | CTX_WR(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_LO, val); | 4679 | bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_PG_BDHADDR_LO, val); |
4619 | 4680 | ||
4620 | if (CHIP_NUM(bp) == CHIP_NUM_5709) | 4681 | if (CHIP_NUM(bp) == CHIP_NUM_5709) |
4621 | REG_WR(bp, BNX2_MQ_MAP_L2_3, BNX2_MQ_MAP_L2_3_DEFAULT); | 4682 | REG_WR(bp, BNX2_MQ_MAP_L2_3, BNX2_MQ_MAP_L2_3_DEFAULT); |
4622 | } | 4683 | } |
4623 | 4684 | ||
4624 | val = BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_VALUE; | ||
4625 | val |= BNX2_L2CTX_CTX_TYPE_SIZE_L2; | ||
4626 | val |= 0x02 << 8; | ||
4627 | CTX_WR(bp, rx_cid_addr, BNX2_L2CTX_CTX_TYPE, val); | ||
4628 | |||
4629 | val = (u64) bp->rx_desc_mapping[0] >> 32; | 4685 | val = (u64) bp->rx_desc_mapping[0] >> 32; |
4630 | CTX_WR(bp, rx_cid_addr, BNX2_L2CTX_NX_BDHADDR_HI, val); | 4686 | bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_BDHADDR_HI, val); |
4631 | 4687 | ||
4632 | val = (u64) bp->rx_desc_mapping[0] & 0xffffffff; | 4688 | val = (u64) bp->rx_desc_mapping[0] & 0xffffffff; |
4633 | CTX_WR(bp, rx_cid_addr, BNX2_L2CTX_NX_BDHADDR_LO, val); | 4689 | bnx2_ctx_wr(bp, rx_cid_addr, BNX2_L2CTX_NX_BDHADDR_LO, val); |
4634 | 4690 | ||
4635 | ring_prod = prod = bnapi->rx_pg_prod; | 4691 | ring_prod = prod = bnapi->rx_pg_prod; |
4636 | for (i = 0; i < bp->rx_pg_ring_size; i++) { | 4692 | for (i = 0; i < bp->rx_pg_ring_size; i++) { |
@@ -5003,9 +5059,9 @@ bnx2_do_mem_test(struct bnx2 *bp, u32 start, u32 size) | |||
5003 | 5059 | ||
5004 | for (offset = 0; offset < size; offset += 4) { | 5060 | for (offset = 0; offset < size; offset += 4) { |
5005 | 5061 | ||
5006 | REG_WR_IND(bp, start + offset, test_pattern[i]); | 5062 | bnx2_reg_wr_ind(bp, start + offset, test_pattern[i]); |
5007 | 5063 | ||
5008 | if (REG_RD_IND(bp, start + offset) != | 5064 | if (bnx2_reg_rd_ind(bp, start + offset) != |
5009 | test_pattern[i]) { | 5065 | test_pattern[i]) { |
5010 | return -ENODEV; | 5066 | return -ENODEV; |
5011 | } | 5067 | } |
@@ -5315,7 +5371,7 @@ bnx2_5706_serdes_has_link(struct bnx2 *bp) | |||
5315 | bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg); | 5371 | bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg); |
5316 | bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg); | 5372 | bnx2_read_phy(bp, MII_BNX2_MISC_SHADOW, &an_dbg); |
5317 | 5373 | ||
5318 | if (an_dbg & MISC_SHDW_AN_DBG_NOSYNC) | 5374 | if (an_dbg & (MISC_SHDW_AN_DBG_NOSYNC | MISC_SHDW_AN_DBG_RUDI_INVALID)) |
5319 | return 0; | 5375 | return 0; |
5320 | 5376 | ||
5321 | bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS, MII_EXPAND_REG1); | 5377 | bnx2_write_phy(bp, MII_BNX2_DSP_ADDRESS, MII_EXPAND_REG1); |
@@ -5440,7 +5496,8 @@ bnx2_timer(unsigned long data) | |||
5440 | 5496 | ||
5441 | bnx2_send_heart_beat(bp); | 5497 | bnx2_send_heart_beat(bp); |
5442 | 5498 | ||
5443 | bp->stats_blk->stat_FwRxDrop = REG_RD_IND(bp, BNX2_FW_RX_DROP_COUNT); | 5499 | bp->stats_blk->stat_FwRxDrop = |
5500 | bnx2_reg_rd_ind(bp, BNX2_FW_RX_DROP_COUNT); | ||
5444 | 5501 | ||
5445 | /* workaround occasional corrupted counters */ | 5502 | /* workaround occasional corrupted counters */ |
5446 | if (CHIP_NUM(bp) == CHIP_NUM_5708 && bp->stats_ticks) | 5503 | if (CHIP_NUM(bp) == CHIP_NUM_5708 && bp->stats_ticks) |
@@ -7155,20 +7212,20 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
7155 | 7212 | ||
7156 | bnx2_init_nvram(bp); | 7213 | bnx2_init_nvram(bp); |
7157 | 7214 | ||
7158 | reg = REG_RD_IND(bp, BNX2_SHM_HDR_SIGNATURE); | 7215 | reg = bnx2_reg_rd_ind(bp, BNX2_SHM_HDR_SIGNATURE); |
7159 | 7216 | ||
7160 | if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) == | 7217 | if ((reg & BNX2_SHM_HDR_SIGNATURE_SIG_MASK) == |
7161 | BNX2_SHM_HDR_SIGNATURE_SIG) { | 7218 | BNX2_SHM_HDR_SIGNATURE_SIG) { |
7162 | u32 off = PCI_FUNC(pdev->devfn) << 2; | 7219 | u32 off = PCI_FUNC(pdev->devfn) << 2; |
7163 | 7220 | ||
7164 | bp->shmem_base = REG_RD_IND(bp, BNX2_SHM_HDR_ADDR_0 + off); | 7221 | bp->shmem_base = bnx2_reg_rd_ind(bp, BNX2_SHM_HDR_ADDR_0 + off); |
7165 | } else | 7222 | } else |
7166 | bp->shmem_base = HOST_VIEW_SHMEM_BASE; | 7223 | bp->shmem_base = HOST_VIEW_SHMEM_BASE; |
7167 | 7224 | ||
7168 | /* Get the permanent MAC address. First we need to make sure the | 7225 | /* Get the permanent MAC address. First we need to make sure the |
7169 | * firmware is actually running. | 7226 | * firmware is actually running. |
7170 | */ | 7227 | */ |
7171 | reg = REG_RD_IND(bp, bp->shmem_base + BNX2_DEV_INFO_SIGNATURE); | 7228 | reg = bnx2_shmem_rd(bp, BNX2_DEV_INFO_SIGNATURE); |
7172 | 7229 | ||
7173 | if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) != | 7230 | if ((reg & BNX2_DEV_INFO_SIGNATURE_MAGIC_MASK) != |
7174 | BNX2_DEV_INFO_SIGNATURE_MAGIC) { | 7231 | BNX2_DEV_INFO_SIGNATURE_MAGIC) { |
@@ -7177,7 +7234,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
7177 | goto err_out_unmap; | 7234 | goto err_out_unmap; |
7178 | } | 7235 | } |
7179 | 7236 | ||
7180 | reg = REG_RD_IND(bp, bp->shmem_base + BNX2_DEV_INFO_BC_REV); | 7237 | reg = bnx2_shmem_rd(bp, BNX2_DEV_INFO_BC_REV); |
7181 | for (i = 0, j = 0; i < 3; i++) { | 7238 | for (i = 0, j = 0; i < 3; i++) { |
7182 | u8 num, k, skip0; | 7239 | u8 num, k, skip0; |
7183 | 7240 | ||
@@ -7191,7 +7248,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
7191 | if (i != 2) | 7248 | if (i != 2) |
7192 | bp->fw_version[j++] = '.'; | 7249 | bp->fw_version[j++] = '.'; |
7193 | } | 7250 | } |
7194 | reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_FEATURE); | 7251 | reg = bnx2_shmem_rd(bp, BNX2_PORT_FEATURE); |
7195 | if (reg & BNX2_PORT_FEATURE_WOL_ENABLED) | 7252 | if (reg & BNX2_PORT_FEATURE_WOL_ENABLED) |
7196 | bp->wol = 1; | 7253 | bp->wol = 1; |
7197 | 7254 | ||
@@ -7199,34 +7256,33 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
7199 | bp->flags |= BNX2_FLAG_ASF_ENABLE; | 7256 | bp->flags |= BNX2_FLAG_ASF_ENABLE; |
7200 | 7257 | ||
7201 | for (i = 0; i < 30; i++) { | 7258 | for (i = 0; i < 30; i++) { |
7202 | reg = REG_RD_IND(bp, bp->shmem_base + | 7259 | reg = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION); |
7203 | BNX2_BC_STATE_CONDITION); | ||
7204 | if (reg & BNX2_CONDITION_MFW_RUN_MASK) | 7260 | if (reg & BNX2_CONDITION_MFW_RUN_MASK) |
7205 | break; | 7261 | break; |
7206 | msleep(10); | 7262 | msleep(10); |
7207 | } | 7263 | } |
7208 | } | 7264 | } |
7209 | reg = REG_RD_IND(bp, bp->shmem_base + BNX2_BC_STATE_CONDITION); | 7265 | reg = bnx2_shmem_rd(bp, BNX2_BC_STATE_CONDITION); |
7210 | reg &= BNX2_CONDITION_MFW_RUN_MASK; | 7266 | reg &= BNX2_CONDITION_MFW_RUN_MASK; |
7211 | if (reg != BNX2_CONDITION_MFW_RUN_UNKNOWN && | 7267 | if (reg != BNX2_CONDITION_MFW_RUN_UNKNOWN && |
7212 | reg != BNX2_CONDITION_MFW_RUN_NONE) { | 7268 | reg != BNX2_CONDITION_MFW_RUN_NONE) { |
7213 | int i; | 7269 | int i; |
7214 | u32 addr = REG_RD_IND(bp, bp->shmem_base + BNX2_MFW_VER_PTR); | 7270 | u32 addr = bnx2_shmem_rd(bp, BNX2_MFW_VER_PTR); |
7215 | 7271 | ||
7216 | bp->fw_version[j++] = ' '; | 7272 | bp->fw_version[j++] = ' '; |
7217 | for (i = 0; i < 3; i++) { | 7273 | for (i = 0; i < 3; i++) { |
7218 | reg = REG_RD_IND(bp, addr + i * 4); | 7274 | reg = bnx2_reg_rd_ind(bp, addr + i * 4); |
7219 | reg = swab32(reg); | 7275 | reg = swab32(reg); |
7220 | memcpy(&bp->fw_version[j], ®, 4); | 7276 | memcpy(&bp->fw_version[j], ®, 4); |
7221 | j += 4; | 7277 | j += 4; |
7222 | } | 7278 | } |
7223 | } | 7279 | } |
7224 | 7280 | ||
7225 | reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_MAC_UPPER); | 7281 | reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_MAC_UPPER); |
7226 | bp->mac_addr[0] = (u8) (reg >> 8); | 7282 | bp->mac_addr[0] = (u8) (reg >> 8); |
7227 | bp->mac_addr[1] = (u8) reg; | 7283 | bp->mac_addr[1] = (u8) reg; |
7228 | 7284 | ||
7229 | reg = REG_RD_IND(bp, bp->shmem_base + BNX2_PORT_HW_CFG_MAC_LOWER); | 7285 | reg = bnx2_shmem_rd(bp, BNX2_PORT_HW_CFG_MAC_LOWER); |
7230 | bp->mac_addr[2] = (u8) (reg >> 24); | 7286 | bp->mac_addr[2] = (u8) (reg >> 24); |
7231 | bp->mac_addr[3] = (u8) (reg >> 16); | 7287 | bp->mac_addr[3] = (u8) (reg >> 16); |
7232 | bp->mac_addr[4] = (u8) (reg >> 8); | 7288 | bp->mac_addr[4] = (u8) (reg >> 8); |
@@ -7265,8 +7321,7 @@ bnx2_init_board(struct pci_dev *pdev, struct net_device *dev) | |||
7265 | bp->phy_port = PORT_TP; | 7321 | bp->phy_port = PORT_TP; |
7266 | if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { | 7322 | if (bp->phy_flags & BNX2_PHY_FLAG_SERDES) { |
7267 | bp->phy_port = PORT_FIBRE; | 7323 | bp->phy_port = PORT_FIBRE; |
7268 | reg = REG_RD_IND(bp, bp->shmem_base + | 7324 | reg = bnx2_shmem_rd(bp, BNX2_SHARED_HW_CFG_CONFIG); |
7269 | BNX2_SHARED_HW_CFG_CONFIG); | ||
7270 | if (!(reg & BNX2_SHARED_HW_CFG_GIG_LINK_ON_VAUX)) { | 7325 | if (!(reg & BNX2_SHARED_HW_CFG_GIG_LINK_ON_VAUX)) { |
7271 | bp->flags |= BNX2_FLAG_NO_WOL; | 7326 | bp->flags |= BNX2_FLAG_NO_WOL; |
7272 | bp->wol = 0; | 7327 | bp->wol = 0; |
diff --git a/drivers/net/bnx2.h b/drivers/net/bnx2.h index d8e034700c36..3aa0364942e2 100644 --- a/drivers/net/bnx2.h +++ b/drivers/net/bnx2.h | |||
@@ -348,6 +348,12 @@ struct l2_fhdr { | |||
348 | #define BNX2_L2CTX_BD_PRE_READ 0x00000000 | 348 | #define BNX2_L2CTX_BD_PRE_READ 0x00000000 |
349 | #define BNX2_L2CTX_CTX_SIZE 0x00000000 | 349 | #define BNX2_L2CTX_CTX_SIZE 0x00000000 |
350 | #define BNX2_L2CTX_CTX_TYPE 0x00000000 | 350 | #define BNX2_L2CTX_CTX_TYPE 0x00000000 |
351 | #define BNX2_L2CTX_LO_WATER_MARK_DEFAULT 32 | ||
352 | #define BNX2_L2CTX_LO_WATER_MARK_SCALE 4 | ||
353 | #define BNX2_L2CTX_LO_WATER_MARK_DIS 0 | ||
354 | #define BNX2_L2CTX_HI_WATER_MARK_SHIFT 4 | ||
355 | #define BNX2_L2CTX_HI_WATER_MARK_SCALE 16 | ||
356 | #define BNX2_L2CTX_WATER_MARKS_MSK 0x000000ff | ||
351 | #define BNX2_L2CTX_CTX_TYPE_SIZE_L2 ((0x20/20)<<16) | 357 | #define BNX2_L2CTX_CTX_TYPE_SIZE_L2 ((0x20/20)<<16) |
352 | #define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE (0xf<<28) | 358 | #define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE (0xf<<28) |
353 | #define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_UNDEFINED (0<<28) | 359 | #define BNX2_L2CTX_CTX_TYPE_CTX_BD_CHN_TYPE_UNDEFINED (0<<28) |
@@ -4494,6 +4500,9 @@ struct l2_fhdr { | |||
4494 | #define BNX2_MQ_MAP_L2_3_ENA (0x1L<<31) | 4500 | #define BNX2_MQ_MAP_L2_3_ENA (0x1L<<31) |
4495 | #define BNX2_MQ_MAP_L2_3_DEFAULT 0x82004646 | 4501 | #define BNX2_MQ_MAP_L2_3_DEFAULT 0x82004646 |
4496 | 4502 | ||
4503 | #define BNX2_MQ_MAP_L2_5 0x00003d34 | ||
4504 | #define BNX2_MQ_MAP_L2_5_ARM (0x3L<<26) | ||
4505 | |||
4497 | /* | 4506 | /* |
4498 | * tsch_reg definition | 4507 | * tsch_reg definition |
4499 | * offset: 0x4c00 | 4508 | * offset: 0x4c00 |
@@ -5510,6 +5519,15 @@ struct l2_fhdr { | |||
5510 | #define BNX2_HC_PERIODIC_TICKS_8_HC_PERIODIC_TICKS (0xffffL<<0) | 5519 | #define BNX2_HC_PERIODIC_TICKS_8_HC_PERIODIC_TICKS (0xffffL<<0) |
5511 | #define BNX2_HC_PERIODIC_TICKS_8_HC_INT_PERIODIC_TICKS (0xffffL<<16) | 5520 | #define BNX2_HC_PERIODIC_TICKS_8_HC_INT_PERIODIC_TICKS (0xffffL<<16) |
5512 | 5521 | ||
5522 | #define BNX2_HC_SB_CONFIG_SIZE (BNX2_HC_SB_CONFIG_2 - BNX2_HC_SB_CONFIG_1) | ||
5523 | #define BNX2_HC_COMP_PROD_TRIP_OFF (BNX2_HC_COMP_PROD_TRIP_1 - \ | ||
5524 | BNX2_HC_SB_CONFIG_1) | ||
5525 | #define BNX2_HC_COM_TICKS_OFF (BNX2_HC_COM_TICKS_1 - BNX2_HC_SB_CONFIG_1) | ||
5526 | #define BNX2_HC_CMD_TICKS_OFF (BNX2_HC_CMD_TICKS_1 - BNX2_HC_SB_CONFIG_1) | ||
5527 | #define BNX2_HC_TX_QUICK_CONS_TRIP_OFF (BNX2_HC_TX_QUICK_CONS_TRIP_1 - \ | ||
5528 | BNX2_HC_SB_CONFIG_1) | ||
5529 | #define BNX2_HC_TX_TICKS_OFF (BNX2_HC_TX_TICKS_1 - BNX2_HC_SB_CONFIG_1) | ||
5530 | |||
5513 | 5531 | ||
5514 | /* | 5532 | /* |
5515 | * txp_reg definition | 5533 | * txp_reg definition |
@@ -6346,11 +6364,12 @@ struct l2_fhdr { | |||
6346 | #define MII_BNX2_DSP_EXPAND_REG 0x0f00 | 6364 | #define MII_BNX2_DSP_EXPAND_REG 0x0f00 |
6347 | #define MII_EXPAND_REG1 (MII_BNX2_DSP_EXPAND_REG | 1) | 6365 | #define MII_EXPAND_REG1 (MII_BNX2_DSP_EXPAND_REG | 1) |
6348 | #define MII_EXPAND_REG1_RUDI_C 0x20 | 6366 | #define MII_EXPAND_REG1_RUDI_C 0x20 |
6349 | #define MII_EXPAND_SERDES_CTL (MII_BNX2_DSP_EXPAND_REG | 2) | 6367 | #define MII_EXPAND_SERDES_CTL (MII_BNX2_DSP_EXPAND_REG | 3) |
6350 | 6368 | ||
6351 | #define MII_BNX2_MISC_SHADOW 0x1c | 6369 | #define MII_BNX2_MISC_SHADOW 0x1c |
6352 | #define MISC_SHDW_AN_DBG 0x6800 | 6370 | #define MISC_SHDW_AN_DBG 0x6800 |
6353 | #define MISC_SHDW_AN_DBG_NOSYNC 0x0002 | 6371 | #define MISC_SHDW_AN_DBG_NOSYNC 0x0002 |
6372 | #define MISC_SHDW_AN_DBG_RUDI_INVALID 0x0100 | ||
6354 | #define MISC_SHDW_MODE_CTL 0x7c00 | 6373 | #define MISC_SHDW_MODE_CTL 0x7c00 |
6355 | #define MISC_SHDW_MODE_CTL_SIG_DET 0x0010 | 6374 | #define MISC_SHDW_MODE_CTL_SIG_DET 0x0010 |
6356 | 6375 | ||
@@ -6395,7 +6414,7 @@ struct l2_fhdr { | |||
6395 | 6414 | ||
6396 | #define RX_COPY_THRESH 128 | 6415 | #define RX_COPY_THRESH 128 |
6397 | 6416 | ||
6398 | #define BNX2_MISC_ENABLE_DEFAULT 0x7ffffff | 6417 | #define BNX2_MISC_ENABLE_DEFAULT 0x17ffffff |
6399 | 6418 | ||
6400 | #define DMA_READ_CHANS 5 | 6419 | #define DMA_READ_CHANS 5 |
6401 | #define DMA_WRITE_CHANS 3 | 6420 | #define DMA_WRITE_CHANS 3 |
@@ -6795,9 +6814,6 @@ struct bnx2 { | |||
6795 | int irq_nvecs; | 6814 | int irq_nvecs; |
6796 | }; | 6815 | }; |
6797 | 6816 | ||
6798 | static u32 bnx2_reg_rd_ind(struct bnx2 *bp, u32 offset); | ||
6799 | static void bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val); | ||
6800 | |||
6801 | #define REG_RD(bp, offset) \ | 6817 | #define REG_RD(bp, offset) \ |
6802 | readl(bp->regview + offset) | 6818 | readl(bp->regview + offset) |
6803 | 6819 | ||
@@ -6807,19 +6823,6 @@ static void bnx2_reg_wr_ind(struct bnx2 *bp, u32 offset, u32 val); | |||
6807 | #define REG_WR16(bp, offset, val) \ | 6823 | #define REG_WR16(bp, offset, val) \ |
6808 | writew(val, bp->regview + offset) | 6824 | writew(val, bp->regview + offset) |
6809 | 6825 | ||
6810 | #define REG_RD_IND(bp, offset) \ | ||
6811 | bnx2_reg_rd_ind(bp, offset) | ||
6812 | |||
6813 | #define REG_WR_IND(bp, offset, val) \ | ||
6814 | bnx2_reg_wr_ind(bp, offset, val) | ||
6815 | |||
6816 | /* Indirect context access. Unlike the MBQ_WR, these macros will not | ||
6817 | * trigger a chip event. */ | ||
6818 | static void bnx2_ctx_wr(struct bnx2 *bp, u32 cid_addr, u32 offset, u32 val); | ||
6819 | |||
6820 | #define CTX_WR(bp, cid_addr, offset, val) \ | ||
6821 | bnx2_ctx_wr(bp, cid_addr, offset, val) | ||
6822 | |||
6823 | struct cpu_reg { | 6826 | struct cpu_reg { |
6824 | u32 mode; | 6827 | u32 mode; |
6825 | u32 mode_value_halt; | 6828 | u32 mode_value_halt; |
diff --git a/drivers/net/bnx2_fw.h b/drivers/net/bnx2_fw.h index c1ad4dd38c32..3b839d4626fe 100644 --- a/drivers/net/bnx2_fw.h +++ b/drivers/net/bnx2_fw.h | |||
@@ -2168,760 +2168,761 @@ static struct fw_info bnx2_cp_fw_06 = { | |||
2168 | }; | 2168 | }; |
2169 | 2169 | ||
2170 | static u8 bnx2_RXP_b06FwText[] = { | 2170 | static u8 bnx2_RXP_b06FwText[] = { |
2171 | 0xec, 0x5b, 0x6d, 0x6c, 0x5c, 0x57, 0x5a, 0x7e, 0xef, 0x99, 0xb1, 0x3d, | 2171 | 0xec, 0x5b, 0x5d, 0x70, 0x5c, 0xd7, 0x5d, 0xff, 0xdf, 0xb3, 0x2b, 0x69, |
2172 | 0x76, 0x6c, 0xe7, 0xda, 0x99, 0xa6, 0x93, 0xe2, 0x6e, 0x67, 0xec, 0x6b, | 2172 | 0x2d, 0x4b, 0xf2, 0x95, 0xbc, 0x71, 0x56, 0xa9, 0x92, 0xec, 0x5a, 0x57, |
2173 | 0x7b, 0xba, 0x36, 0xe5, 0x3a, 0x4c, 0x5b, 0xaf, 0x18, 0xb6, 0xc3, 0x1d, | 2173 | 0xd2, 0xa6, 0x12, 0xe1, 0xca, 0x6c, 0x12, 0x75, 0xd8, 0x69, 0xb6, 0xbb, |
2174 | 0x27, 0x75, 0x77, 0x83, 0xe4, 0xb6, 0x61, 0x37, 0x82, 0xae, 0xb0, 0x66, | 2174 | 0xb2, 0xa3, 0xb4, 0x66, 0x46, 0x49, 0x0d, 0xcd, 0xb4, 0x65, 0x10, 0xbb, |
2175 | 0x12, 0x51, 0x84, 0x10, 0x21, 0x82, 0xaa, 0x2c, 0x5d, 0x65, 0x34, 0x76, | 2175 | 0x0e, 0xa4, 0x0f, 0x0c, 0xc6, 0x40, 0x26, 0x80, 0xc1, 0xcb, 0x4a, 0x71, |
2176 | 0x53, 0xb7, 0x3b, 0xf1, 0x0c, 0x89, 0x4b, 0xf8, 0xd8, 0x1f, 0xee, 0xd8, | 2176 | 0x94, 0x74, 0xad, 0xdd, 0xda, 0x0a, 0x86, 0x69, 0x61, 0x94, 0xd5, 0x87, |
2177 | 0x4e, 0x0a, 0x9a, 0x78, 0xba, 0xcb, 0x8f, 0x5d, 0x56, 0x4d, 0x63, 0xd2, | 2177 | 0x53, 0x66, 0xad, 0x4d, 0xcb, 0x4b, 0x99, 0xd6, 0xb1, 0xea, 0xb8, 0x26, |
2178 | 0x12, 0xfa, 0x03, 0x89, 0x16, 0x56, 0x50, 0x89, 0x85, 0x86, 0x24, 0xdb, | 2178 | 0x0f, 0x3c, 0xa4, 0x94, 0xce, 0x64, 0x20, 0x33, 0x35, 0xb2, 0x63, 0xfb, |
2179 | 0x14, 0x09, 0x41, 0x77, 0x01, 0x6d, 0xa1, 0x69, 0x2f, 0xcf, 0x73, 0xee, | 2179 | 0x81, 0x8f, 0xc0, 0x4c, 0x49, 0x20, 0x6e, 0x2e, 0xbf, 0xdf, 0xb9, 0xf7, |
2180 | 0xbd, 0xc9, 0xc4, 0x35, 0x6c, 0x7f, 0xf0, 0xf3, 0x1e, 0xc9, 0xba, 0xf7, | 2180 | 0xca, 0x2b, 0x45, 0xd0, 0x3c, 0xf0, 0x78, 0xcf, 0x8c, 0xe6, 0xde, 0x7b, |
2181 | 0x9e, 0xf3, 0x9e, 0xf7, 0xbc, 0xdf, 0x1f, 0x67, 0x92, 0xdf, 0xe8, 0x96, | 2181 | 0xce, 0xff, 0xfc, 0xcf, 0xff, 0xfb, 0xe3, 0xac, 0xfd, 0x3b, 0x1d, 0xd2, |
2182 | 0x2e, 0xf1, 0x47, 0x0f, 0xfe, 0x32, 0x87, 0x9f, 0x3c, 0x72, 0xef, 0x3d, | 2182 | 0x2e, 0xde, 0xe8, 0xc4, 0x5f, 0xea, 0xc8, 0x33, 0x47, 0x47, 0xef, 0x1f, |
2183 | 0xf6, 0x3d, 0xfc, 0x8e, 0xb4, 0x49, 0x94, 0x4f, 0x43, 0xc2, 0x11, 0x8e, | 2183 | 0xbd, 0x9f, 0xdf, 0x21, 0xc3, 0x08, 0xf3, 0x69, 0x48, 0x30, 0x82, 0x11, |
2184 | 0x70, 0x84, 0x23, 0x1c, 0xe1, 0x08, 0x47, 0x38, 0xc2, 0x11, 0x8e, 0x70, | 2184 | 0x8c, 0x60, 0x04, 0x23, 0x18, 0xc1, 0x08, 0x46, 0x30, 0x82, 0x11, 0x8c, |
2185 | 0x84, 0x23, 0x1c, 0xe1, 0x08, 0x47, 0x38, 0xc2, 0x11, 0x8e, 0x70, 0x84, | 2185 | 0x60, 0x04, 0x23, 0x18, 0xc1, 0x08, 0x46, 0x30, 0x82, 0x11, 0x8c, 0x60, |
2186 | 0x23, 0x1c, 0xe1, 0x08, 0x47, 0x38, 0xc2, 0x11, 0x8e, 0x70, 0x84, 0x23, | 2186 | 0x04, 0x23, 0x18, 0xc1, 0x08, 0x46, 0x30, 0x82, 0x11, 0x8c, 0x60, 0x04, |
2187 | 0x1c, 0xe1, 0x08, 0x47, 0x38, 0xc2, 0x11, 0x8e, 0x70, 0x84, 0x23, 0x1c, | 2187 | 0x23, 0x18, 0xc1, 0x08, 0x46, 0x30, 0x82, 0x11, 0x8c, 0x60, 0x04, 0x23, |
2188 | 0xe1, 0x08, 0x47, 0x38, 0xc2, 0x11, 0x8e, 0x70, 0x84, 0x23, 0x1c, 0xe1, | 2188 | 0x18, 0xc1, 0x08, 0x46, 0x30, 0x82, 0x11, 0x8c, 0x60, 0x04, 0x23, 0x18, |
2189 | 0x08, 0x47, 0x38, 0xc2, 0xf1, 0xff, 0x39, 0x22, 0x22, 0x26, 0x9f, 0x3d, | 2189 | 0xc1, 0x08, 0x46, 0x30, 0xfe, 0x3f, 0x47, 0x48, 0xc4, 0xe4, 0xb3, 0xd3, |
2190 | 0xfe, 0x9f, 0xc4, 0x54, 0x56, 0x8e, 0x38, 0x96, 0xc4, 0x22, 0xd9, 0xd5, | 2190 | 0xfb, 0x93, 0x88, 0x4a, 0xc7, 0x8f, 0x66, 0x2d, 0x89, 0x84, 0xd2, 0x97, |
2191 | 0x27, 0x8a, 0x96, 0x48, 0xae, 0x31, 0x96, 0xcc, 0xcb, 0x87, 0x6e, 0x29, | 2191 | 0x9e, 0x2e, 0x58, 0x22, 0x99, 0xfa, 0x70, 0x3c, 0x27, 0x3f, 0x71, 0x8a, |
2192 | 0x1e, 0x15, 0xce, 0xdf, 0x99, 0xbd, 0x7e, 0xf4, 0xdc, 0xfd, 0xa9, 0xf7, | 2192 | 0xd1, 0xb0, 0x70, 0xfe, 0xee, 0xf4, 0xad, 0xe3, 0xe7, 0x1f, 0x4a, 0xbc, |
2193 | 0x96, 0x23, 0x12, 0x33, 0xb3, 0x6f, 0x4c, 0x98, 0x23, 0x12, 0x1b, 0xc0, | 2193 | 0xb3, 0x10, 0x92, 0x88, 0x99, 0x7e, 0x63, 0xd4, 0x1c, 0x94, 0x48, 0x1f, |
2194 | 0x9e, 0xaf, 0x8d, 0xbe, 0xbc, 0x5d, 0x7a, 0x03, 0x5c, 0x22, 0xf5, 0x4a, | 2194 | 0xf6, 0x7c, 0x6d, 0x68, 0x6d, 0x97, 0x74, 0xf9, 0xb8, 0x44, 0x6a, 0xe5, |
2195 | 0xca, 0xde, 0x2b, 0x63, 0xe6, 0x05, 0x89, 0x4a, 0x0e, 0x67, 0x9c, 0x6e, | 2195 | 0x84, 0x7d, 0x40, 0x86, 0xcd, 0x8b, 0x12, 0x96, 0x0c, 0xce, 0x58, 0xa9, |
2196 | 0x88, 0x94, 0x2b, 0x06, 0x71, 0x48, 0xb9, 0x11, 0x93, 0x4b, 0x11, 0x42, | 2196 | 0x8b, 0x94, 0xca, 0x06, 0x71, 0x48, 0xa9, 0x1e, 0x91, 0x2b, 0x21, 0x42, |
2197 | 0x7d, 0xcb, 0x70, 0xaa, 0x1f, 0xb9, 0xb9, 0x28, 0xce, 0xb5, 0xf0, 0xde, | 2197 | 0x7d, 0xcb, 0xc8, 0x56, 0x3e, 0x70, 0x32, 0x61, 0x9c, 0x6b, 0xe1, 0xbd, |
2198 | 0x0c, 0xe6, 0x63, 0xa2, 0xb2, 0xa9, 0x84, 0x13, 0x99, 0x96, 0xc2, 0x92, | 2198 | 0xe1, 0xcf, 0x47, 0x44, 0xa5, 0x13, 0xc9, 0x6c, 0x68, 0x42, 0x6a, 0xf3, |
2199 | 0xeb, 0xce, 0xdb, 0xb7, 0x03, 0x47, 0xbf, 0xcc, 0x5b, 0xde, 0xb7, 0x63, | 2199 | 0x8e, 0x33, 0x63, 0x7f, 0x0c, 0x38, 0x7a, 0x64, 0xc6, 0x72, 0xbf, 0xb3, |
2200 | 0x7f, 0xda, 0x9c, 0x92, 0x1d, 0x98, 0x8b, 0x88, 0xb2, 0xee, 0xc0, 0xdf, | 2200 | 0xf6, 0xc7, 0xcd, 0x71, 0xb9, 0x13, 0x73, 0x21, 0x51, 0xd6, 0x5d, 0xf8, |
2201 | 0x57, 0x0d, 0x67, 0xa5, 0x5b, 0xca, 0x55, 0xc9, 0x39, 0x76, 0x0c, 0xf3, | 2201 | 0x8b, 0x1b, 0xb9, 0xd3, 0x5f, 0x36, 0xb2, 0x8b, 0x1d, 0x52, 0xaa, 0x38, |
2202 | 0x09, 0x99, 0xab, 0x26, 0x0d, 0xe7, 0xa4, 0x21, 0xc5, 0x0c, 0xde, 0x9b, | 2202 | 0x52, 0xb0, 0x25, 0x93, 0xb5, 0x77, 0x60, 0xfd, 0x03, 0xa7, 0xb0, 0xb1, |
2203 | 0xae, 0x38, 0xf6, 0x47, 0xae, 0x63, 0x11, 0xff, 0x92, 0xe1, 0x9c, 0xf9, | 2203 | 0x67, 0xd8, 0xcc, 0x49, 0x8b, 0x64, 0xa2, 0x31, 0xc0, 0xcc, 0x1b, 0xb9, |
2204 | 0xc8, 0x55, 0x96, 0x65, 0x16, 0x84, 0xdf, 0x09, 0x29, 0x37, 0x89, 0x87, | 2204 | 0xb3, 0x7f, 0xdd, 0x21, 0xed, 0xa0, 0x27, 0xc5, 0xef, 0x0f, 0x9c, 0x90, |
2205 | 0xef, 0xc4, 0x73, 0xc9, 0x3d, 0x37, 0x9a, 0x90, 0x6f, 0x34, 0xe3, 0xf2, | 2205 | 0x65, 0x61, 0x9d, 0xe7, 0xe3, 0xbb, 0x41, 0xbc, 0x7c, 0x27, 0xce, 0x2b, |
2206 | 0xf5, 0xa6, 0x29, 0x2f, 0x35, 0x07, 0xe4, 0x7c, 0xd3, 0x75, 0xbf, 0x6e, | 2206 | 0xce, 0xf9, 0xa1, 0x98, 0x7c, 0xb3, 0x11, 0x95, 0x6f, 0x34, 0x4c, 0x79, |
2207 | 0xbb, 0xee, 0x1b, 0xf8, 0xfb, 0x81, 0x7d, 0x83, 0x66, 0x8c, 0x92, 0x31, | 2207 | 0xa5, 0xd1, 0x27, 0x17, 0x1a, 0x8e, 0xf3, 0x0d, 0xdb, 0x71, 0xde, 0xc0, |
2208 | 0xd5, 0xfc, 0xc3, 0x6e, 0xe9, 0x4d, 0x25, 0x45, 0x75, 0xe3, 0xcc, 0x84, | 2208 | 0xdf, 0x7f, 0xd8, 0x1b, 0x3c, 0x60, 0x14, 0x8d, 0xf1, 0xc6, 0x57, 0x3b, |
2209 | 0xcc, 0x57, 0x2b, 0xc6, 0xc3, 0x67, 0x16, 0x8d, 0x99, 0x33, 0x35, 0x23, | 2209 | 0xa4, 0x2b, 0x11, 0x17, 0xd5, 0x21, 0xd3, 0x95, 0x98, 0xcc, 0x54, 0xca, |
2210 | 0x7f, 0x26, 0x8a, 0x39, 0x29, 0x95, 0xed, 0x17, 0x8d, 0x7c, 0x73, 0xc1, | 2210 | 0xc6, 0x63, 0x67, 0xe7, 0x8c, 0xc9, 0xb3, 0x55, 0x9c, 0x19, 0xc6, 0x9c, |
2211 | 0x78, 0xe4, 0x4c, 0xaf, 0xa6, 0xad, 0x5c, 0xdd, 0x09, 0xda, 0xae, 0x83, | 2211 | 0x14, 0x4b, 0xf6, 0xcb, 0x46, 0xae, 0x31, 0x6b, 0x3c, 0x7e, 0xb6, 0x0b, |
2212 | 0x26, 0xca, 0x34, 0x65, 0xfe, 0x3c, 0xc4, 0xec, 0x54, 0xc8, 0x57, 0xbb, | 2212 | 0x34, 0xf2, 0xfc, 0x3d, 0x46, 0xf6, 0xf4, 0x2d, 0xc9, 0xda, 0x94, 0x71, |
2213 | 0xe4, 0xe2, 0x5c, 0x77, 0x5d, 0x95, 0x75, 0x8f, 0x3a, 0x19, 0xcb, 0x2c, | 2213 | 0xc2, 0xfc, 0x3c, 0xc4, 0x9e, 0x2d, 0x93, 0xe6, 0x56, 0x8f, 0x5e, 0xc7, |
2214 | 0x0b, 0xe9, 0xd3, 0x73, 0xe7, 0x23, 0xa0, 0x39, 0x2f, 0xa7, 0x41, 0x7f, | 2214 | 0x51, 0x69, 0xe7, 0x78, 0x36, 0x65, 0x99, 0x25, 0x21, 0x7d, 0x7a, 0xee, |
2215 | 0xb7, 0x91, 0x3f, 0x15, 0x05, 0x1d, 0x32, 0x10, 0x11, 0xee, 0x1b, 0x4e, | 2215 | 0x82, 0x4b, 0xf3, 0x8a, 0x91, 0x3d, 0xdb, 0x61, 0xe4, 0xce, 0x84, 0x41, |
2216 | 0x14, 0xa4, 0x81, 0x33, 0xc4, 0x54, 0x59, 0xca, 0x11, 0x34, 0x83, 0x96, | 2216 | 0x87, 0xf4, 0x85, 0x84, 0xfb, 0x06, 0x62, 0x79, 0xa9, 0xe3, 0x0c, 0x31, |
2217 | 0x6f, 0x54, 0xc1, 0x43, 0x15, 0x3c, 0x54, 0xc9, 0x5b, 0x52, 0xce, 0x8d, | 2217 | 0x55, 0x9a, 0x72, 0x05, 0xcd, 0xa0, 0xe5, 0x9b, 0x15, 0xf0, 0x50, 0x01, |
2218 | 0x06, 0xbc, 0xb9, 0xee, 0x5f, 0xdb, 0xa4, 0x3d, 0x95, 0xcc, 0xa9, 0x80, | 2218 | 0x0f, 0x15, 0xf2, 0x16, 0x97, 0xf3, 0x43, 0x3e, 0x6f, 0x8e, 0xf3, 0x77, |
2219 | 0x4f, 0xd7, 0xfd, 0xbe, 0x4d, 0x5e, 0xc9, 0x8f, 0xeb, 0xbe, 0x64, 0x53, | 2219 | 0x36, 0x69, 0x4f, 0xc4, 0x33, 0xca, 0xe7, 0xd3, 0x71, 0xfe, 0xdd, 0x26, |
2220 | 0x86, 0xee, 0x79, 0x65, 0x55, 0xc0, 0x8b, 0x05, 0xfc, 0x94, 0xef, 0x22, | 2220 | 0xaf, 0xe4, 0xc7, 0x71, 0x5e, 0xb1, 0x63, 0xa0, 0xdd, 0xb9, 0xa0, 0xac, |
2221 | 0x78, 0x58, 0x00, 0x7f, 0xa7, 0xc1, 0x5b, 0x0d, 0x74, 0xfc, 0xa8, 0xf3, | 2221 | 0x32, 0x78, 0xb1, 0x80, 0x9f, 0xb2, 0x9e, 0x03, 0x0f, 0xb3, 0xe0, 0x6f, |
2222 | 0x4a, 0x46, 0x7e, 0xf4, 0x86, 0xbc, 0x92, 0x94, 0x71, 0x61, 0x55, 0x41, | 2222 | 0x05, 0xbc, 0x55, 0x41, 0xc7, 0x4f, 0x3b, 0xaf, 0x68, 0xe4, 0x86, 0x36, |
2223 | 0xd6, 0xdb, 0xa4, 0xb0, 0x6c, 0xca, 0xec, 0x6a, 0xb0, 0x3f, 0xd0, 0xfb, | 2223 | 0xe4, 0x15, 0xa7, 0x8c, 0xf3, 0x4b, 0x0a, 0xb2, 0xde, 0x29, 0xf9, 0x05, |
2224 | 0x61, 0xd9, 0x57, 0xed, 0x87, 0x6c, 0x28, 0xcb, 0x94, 0x2d, 0x42, 0xbd, | 2224 | 0x53, 0xa6, 0x96, 0xfc, 0xfd, 0xbe, 0x1d, 0x1c, 0x91, 0x83, 0x95, 0x1e, |
2225 | 0x95, 0xd3, 0x4a, 0xc4, 0x28, 0xd8, 0x47, 0xb5, 0xbe, 0x57, 0x2d, 0xc9, | 2225 | 0xc8, 0x86, 0xb2, 0x4c, 0xd8, 0x22, 0x0e, 0x64, 0x54, 0x4a, 0x2a, 0x11, |
2226 | 0x15, 0x6c, 0xca, 0x51, 0x92, 0x05, 0xbb, 0x94, 0x88, 0xc2, 0xbe, 0x56, | 2226 | 0x23, 0x6f, 0x1f, 0xd7, 0xfa, 0x5f, 0xb2, 0x24, 0x93, 0xb7, 0x29, 0x47, |
2227 | 0xad, 0x92, 0x19, 0x15, 0xca, 0x31, 0x95, 0xf8, 0x32, 0x64, 0x79, 0xa8, | 2227 | 0x89, 0xe7, 0xed, 0x62, 0x2c, 0x0c, 0x7b, 0x5b, 0xb2, 0x8a, 0x66, 0x58, |
2228 | 0x22, 0xb9, 0xcf, 0x55, 0x02, 0x19, 0x7b, 0xf2, 0xfd, 0x7c, 0xe5, 0xa7, | 2228 | 0x28, 0xc7, 0x44, 0xec, 0xf7, 0x21, 0xcb, 0x27, 0xcb, 0x92, 0xf9, 0x74, |
2229 | 0x7b, 0xa4, 0x4b, 0x7d, 0xaa, 0x4d, 0x7e, 0x15, 0x7b, 0x89, 0xfb, 0x96, | 2229 | 0xd9, 0x97, 0xb1, 0x2b, 0xdf, 0xcf, 0x94, 0x3f, 0xd5, 0x29, 0xed, 0xea, |
2230 | 0xbd, 0xd8, 0xe7, 0xc1, 0x79, 0x7b, 0x53, 0x07, 0x44, 0x08, 0x5b, 0x1e, | 2230 | 0x9e, 0x16, 0xf9, 0x0d, 0xec, 0x25, 0xee, 0x4d, 0x7b, 0xb1, 0xcf, 0x85, |
2231 | 0x6a, 0xf3, 0x7c, 0xc2, 0x70, 0xac, 0x52, 0x22, 0x02, 0xb8, 0x82, 0x94, | 2231 | 0x73, 0xf7, 0x26, 0x9e, 0x10, 0x21, 0x6c, 0xa9, 0xbf, 0x45, 0xfb, 0x88, |
2232 | 0x27, 0xfc, 0xb9, 0x36, 0xc7, 0xba, 0x1e, 0x99, 0xb7, 0x53, 0xc9, 0xb2, | 2232 | 0x18, 0x59, 0xab, 0x18, 0x0b, 0x01, 0x2e, 0x2f, 0xa5, 0x51, 0x6f, 0xae, |
2233 | 0x5c, 0x8f, 0x5c, 0xb4, 0xf5, 0x5c, 0xa7, 0x63, 0xb9, 0xb2, 0x06, 0xec, | 2233 | 0x25, 0x6b, 0xdd, 0x0a, 0xcd, 0xd8, 0x89, 0x78, 0x49, 0x6e, 0x85, 0x2e, |
2234 | 0xcf, 0xc0, 0xfe, 0x2f, 0x80, 0xa3, 0x5f, 0xae, 0xe8, 0xf9, 0x1e, 0xec, | 2234 | 0xdb, 0x7a, 0x6e, 0x47, 0xd6, 0x72, 0x64, 0x19, 0xd8, 0x9f, 0x83, 0x3f, |
2235 | 0x4f, 0xb7, 0x01, 0x67, 0x97, 0xa4, 0xd2, 0x75, 0xcc, 0x5f, 0xf4, 0xe6, | 2235 | 0x5c, 0x04, 0x47, 0x5f, 0x2a, 0xeb, 0xf9, 0x4e, 0xec, 0x4f, 0xb6, 0x00, |
2236 | 0xfb, 0x3c, 0xbc, 0xe5, 0xa1, 0x2e, 0x8d, 0x5b, 0xe4, 0x45, 0x6f, 0xfe, | 2236 | 0x67, 0xbb, 0x24, 0x92, 0x35, 0xcc, 0x5f, 0x76, 0xe7, 0xbb, 0x5d, 0xbc, |
2237 | 0x36, 0x0f, 0x77, 0xf9, 0x6e, 0xcc, 0x03, 0xff, 0xc8, 0xf4, 0xa8, 0xa1, | 2237 | 0xa5, 0xfe, 0x76, 0x8d, 0x5b, 0xe4, 0x65, 0x77, 0xfe, 0x0e, 0x17, 0x77, |
2238 | 0xe7, 0x77, 0xd1, 0x7f, 0x7e, 0xa9, 0x72, 0x3d, 0xb2, 0x66, 0xbb, 0x92, | 2238 | 0xe9, 0x3e, 0xcc, 0x03, 0xff, 0xe0, 0xc4, 0x90, 0xa1, 0xe7, 0x7b, 0xe9, |
2239 | 0x9f, 0x18, 0x99, 0x1e, 0x31, 0x3c, 0x7c, 0xc7, 0xbc, 0x7d, 0x77, 0x7a, | 2239 | 0x4f, 0xbf, 0x5e, 0xbe, 0x15, 0x5a, 0xb6, 0x1d, 0xc9, 0x8d, 0x0e, 0x4e, |
2240 | 0xf8, 0x46, 0xa6, 0xd3, 0x86, 0x87, 0x6f, 0xb5, 0xa2, 0xf7, 0x4a, 0xa1, | 2240 | 0x0c, 0x1a, 0x2e, 0xbe, 0x13, 0xee, 0xbe, 0xbb, 0x5d, 0x7c, 0x83, 0x13, |
2241 | 0x42, 0xd8, 0x91, 0x69, 0xcb, 0xb8, 0x53, 0x66, 0xfb, 0x46, 0xa6, 0x07, | 2241 | 0x49, 0xc3, 0xc5, 0xb7, 0x54, 0xd6, 0x7b, 0x25, 0x5f, 0x26, 0xec, 0xe0, |
2242 | 0x0d, 0xf5, 0xa9, 0x6d, 0x1e, 0x1f, 0xa9, 0x80, 0x86, 0x6d, 0x9a, 0x06, | 2242 | 0x84, 0x65, 0xdc, 0x2d, 0x53, 0xdd, 0x83, 0x13, 0x7b, 0x0d, 0x75, 0xcf, |
2243 | 0x9e, 0xab, 0xe7, 0x87, 0x1d, 0xab, 0x7c, 0xf7, 0x36, 0x7d, 0x3e, 0xcf, | 2243 | 0x4e, 0x97, 0x8f, 0x84, 0x4f, 0xc3, 0x4e, 0x4d, 0x03, 0xcf, 0xd5, 0xf3, |
2244 | 0xd4, 0x73, 0x77, 0x93, 0x2e, 0x9e, 0x5d, 0x9c, 0xb8, 0xe5, 0xdc, 0x1f, | 2244 | 0x03, 0x59, 0xab, 0x74, 0xdf, 0x4e, 0x7d, 0x3e, 0xcf, 0xd4, 0x73, 0xf7, |
2245 | 0xbf, 0x29, 0x9f, 0xad, 0xce, 0xe4, 0x79, 0x12, 0x8b, 0x66, 0xa3, 0x13, | 2245 | 0x91, 0x2e, 0x9e, 0x5d, 0x18, 0xdd, 0x74, 0xee, 0xcf, 0xdc, 0x96, 0xcf, |
2246 | 0xf3, 0x95, 0xc3, 0xe2, 0x54, 0x93, 0x32, 0x37, 0xde, 0x29, 0xb3, 0xe6, | 2246 | 0x76, 0x67, 0xf2, 0x3c, 0x89, 0x84, 0xd3, 0xe1, 0xd1, 0x99, 0xf2, 0x11, |
2247 | 0xd0, 0xec, 0x3e, 0x61, 0xac, 0x89, 0x4d, 0x14, 0x7d, 0x1d, 0xe6, 0xc5, | 2247 | 0xc9, 0x56, 0xe2, 0x32, 0x3d, 0xb2, 0x43, 0xa6, 0xcc, 0xfe, 0xa9, 0x83, |
2248 | 0x90, 0x39, 0xf0, 0xb8, 0xaf, 0x21, 0x31, 0x03, 0xf0, 0x43, 0x8d, 0xa8, | 2248 | 0xc2, 0xd8, 0x13, 0x19, 0x2d, 0x78, 0x3a, 0xcc, 0x89, 0x21, 0xd3, 0xe0, |
2249 | 0x3c, 0xdb, 0x34, 0xa4, 0x5d, 0xfb, 0x67, 0xca, 0xdc, 0x80, 0x1d, 0x3e, | 2249 | 0xf1, 0x60, 0x5d, 0x22, 0x06, 0xe0, 0xfb, 0xeb, 0x61, 0x79, 0xbe, 0x61, |
2250 | 0x5d, 0xa5, 0x1d, 0xd3, 0x66, 0x25, 0x57, 0x87, 0x9d, 0x9e, 0xd7, 0xbe, | 2250 | 0x48, 0xab, 0xf6, 0xcf, 0x84, 0xb9, 0x06, 0x3b, 0x7c, 0xb6, 0x42, 0x3b, |
2251 | 0xda, 0x45, 0xbd, 0x96, 0x4a, 0x02, 0x57, 0xcc, 0x5a, 0x66, 0x5d, 0x3a, | 2251 | 0xa6, 0xcd, 0x4a, 0xa6, 0x06, 0x3b, 0xbd, 0xa0, 0x7d, 0xb5, 0x9d, 0x7a, |
2252 | 0x24, 0x37, 0x23, 0x25, 0xae, 0xfb, 0xbe, 0x93, 0x58, 0x91, 0x73, 0xb0, | 2252 | 0x2d, 0x16, 0x05, 0xae, 0x98, 0xb6, 0xcc, 0x9a, 0xb4, 0x49, 0x66, 0x52, |
2253 | 0x01, 0x31, 0x9d, 0x0c, 0xe7, 0x09, 0xdf, 0x02, 0x6b, 0x7a, 0x7e, 0x17, | 2253 | 0x8a, 0x5c, 0xf7, 0x7c, 0x27, 0xb6, 0x28, 0xdf, 0x85, 0x0d, 0x88, 0x99, |
2254 | 0x81, 0xdf, 0x15, 0x33, 0x84, 0x95, 0x92, 0x93, 0xa1, 0xef, 0xc1, 0x16, | 2254 | 0x4d, 0x71, 0x9e, 0xf0, 0x4d, 0xb0, 0xa6, 0xeb, 0x77, 0x21, 0xf8, 0x5d, |
2255 | 0x9b, 0xbb, 0x7a, 0xbc, 0xd8, 0x86, 0xd8, 0x12, 0xef, 0x86, 0x8f, 0x7f, | 2255 | 0x21, 0x45, 0x58, 0x29, 0xea, 0x58, 0xd1, 0x80, 0x2d, 0x36, 0xee, 0xee, |
2256 | 0x0a, 0xfe, 0x37, 0x60, 0x38, 0xa7, 0x5c, 0xb7, 0x68, 0x4b, 0x5c, 0x09, | 2256 | 0x74, 0x63, 0x5d, 0x04, 0xfe, 0xd9, 0x01, 0x1f, 0xbf, 0x07, 0xfe, 0xd7, |
2257 | 0xfd, 0x0f, 0xbe, 0xde, 0xe4, 0x5a, 0x37, 0xe6, 0xc5, 0x9c, 0xb3, 0xfb, | 2257 | 0x67, 0x64, 0xcf, 0x38, 0x0e, 0x62, 0x4f, 0x54, 0x09, 0xfd, 0x0f, 0xbe, |
2258 | 0xc0, 0x9f, 0xeb, 0x4e, 0xdb, 0x49, 0x29, 0xdb, 0xdb, 0xb1, 0xaf, 0x4d, | 2258 | 0xde, 0xe0, 0x5a, 0x07, 0xe6, 0xc5, 0x9c, 0xb6, 0xbb, 0xc1, 0x9f, 0xe3, |
2259 | 0xfa, 0x2c, 0xda, 0x3b, 0x7d, 0x7a, 0x1b, 0xce, 0x33, 0xf8, 0xdd, 0x8b, | 2259 | 0x4c, 0xd8, 0x71, 0x29, 0xd9, 0xbb, 0xb0, 0xaf, 0x45, 0xba, 0x2d, 0xda, |
2260 | 0xf3, 0x7a, 0x30, 0x97, 0x98, 0xa3, 0x1f, 0x67, 0xc6, 0xc0, 0xbf, 0x17, | 2260 | 0x3b, 0x7d, 0x7a, 0x27, 0xce, 0x33, 0xf8, 0xdd, 0x85, 0xf3, 0x3a, 0x31, |
2261 | 0x2f, 0x45, 0xde, 0x06, 0xad, 0xdc, 0xa3, 0xe1, 0x62, 0x1d, 0xd9, 0x8c, | 2261 | 0x17, 0x9b, 0xa6, 0x1f, 0xa7, 0x18, 0xb3, 0xdc, 0xf8, 0x29, 0x72, 0x15, |
2262 | 0x5c, 0xab, 0xec, 0x92, 0x4b, 0x71, 0xf2, 0x0f, 0x9c, 0x55, 0xc4, 0xc4, | 2262 | 0xb4, 0x72, 0x8f, 0x86, 0x8b, 0xb4, 0xa5, 0x53, 0x72, 0xa3, 0xdc, 0x2b, |
2263 | 0xb8, 0x01, 0xfa, 0x13, 0x7e, 0xdc, 0xdb, 0xe1, 0x7f, 0x1b, 0x77, 0x79, | 2263 | 0x57, 0xa2, 0xe4, 0x1f, 0x38, 0x2b, 0x88, 0x87, 0x51, 0x03, 0xf4, 0x93, |
2264 | 0x67, 0x88, 0x19, 0xc9, 0xf6, 0x4a, 0x5e, 0xcf, 0x89, 0x52, 0x13, 0xdb, | 2264 | 0x6e, 0xc6, 0xbf, 0xdd, 0xde, 0xb7, 0x71, 0xaf, 0x7b, 0x86, 0x98, 0xa1, |
2265 | 0xfc, 0xf5, 0x5e, 0x63, 0xef, 0x29, 0x25, 0xa3, 0xf7, 0x21, 0x66, 0xe1, | 2265 | 0x74, 0x97, 0xe4, 0xf4, 0x9c, 0x28, 0x35, 0xba, 0xd3, 0x5b, 0xef, 0x32, |
2266 | 0xac, 0x8b, 0x96, 0xeb, 0x5e, 0xb4, 0xbf, 0x0f, 0x9f, 0x57, 0xd2, 0x66, | 2266 | 0x0e, 0x9c, 0x51, 0x32, 0xf4, 0x20, 0x62, 0x16, 0xce, 0xba, 0x6c, 0x39, |
2267 | 0xfd, 0x63, 0xaf, 0x74, 0x41, 0x9e, 0x55, 0xa3, 0x45, 0x86, 0x09, 0x39, | 2267 | 0xce, 0x65, 0xfb, 0xc7, 0xf0, 0x79, 0x25, 0x2d, 0xd6, 0x7a, 0x97, 0xb4, |
2268 | 0x56, 0xe5, 0x9e, 0x92, 0x44, 0x2d, 0xc2, 0x10, 0xfe, 0xef, 0x01, 0x17, | 2268 | 0x43, 0x9e, 0x15, 0xa3, 0x49, 0x86, 0x31, 0x39, 0x51, 0xe1, 0x9e, 0xa2, |
2269 | 0x91, 0x0e, 0xf8, 0xe2, 0x05, 0x3b, 0x4e, 0x7a, 0xb7, 0x7b, 0xf0, 0x7d, | 2269 | 0x84, 0x2d, 0xc2, 0x10, 0xfe, 0x47, 0x80, 0x0b, 0x49, 0x1b, 0x7c, 0xf1, |
2270 | 0x38, 0x83, 0xb4, 0xd3, 0xf7, 0x5c, 0xed, 0x7b, 0x4e, 0x44, 0xe5, 0xa6, | 2270 | 0xa2, 0x1d, 0x25, 0xbd, 0xbb, 0x5c, 0xf8, 0x6e, 0x9c, 0x41, 0xda, 0xe9, |
2271 | 0x96, 0xe0, 0x49, 0xe3, 0x94, 0xb7, 0xd3, 0x87, 0x50, 0x2f, 0x73, 0xa3, | 2271 | 0x7b, 0x8e, 0xf6, 0xbd, 0x6c, 0x48, 0x65, 0xc6, 0xe7, 0xe1, 0x49, 0x23, |
2272 | 0x25, 0x53, 0x69, 0x5d, 0x8b, 0xe4, 0x2b, 0x77, 0xc9, 0xbc, 0x8d, 0xf3, | 2272 | 0x94, 0x77, 0xb6, 0x1b, 0xa1, 0x5f, 0xa6, 0x87, 0x8a, 0xa6, 0xd2, 0xba, |
2273 | 0xac, 0x28, 0x68, 0x66, 0x9c, 0x19, 0x2e, 0x45, 0x14, 0x3c, 0xac, 0x9f, | 2273 | 0x16, 0xc9, 0x95, 0xef, 0x95, 0x19, 0x1b, 0xe7, 0x59, 0x61, 0xd0, 0xcc, |
2274 | 0xb2, 0x0a, 0x68, 0x7d, 0x0b, 0xe7, 0x95, 0x8c, 0xa8, 0xc5, 0x33, 0xbe, | 2274 | 0x38, 0x33, 0x50, 0x0c, 0x29, 0x78, 0x58, 0x0f, 0x65, 0xe5, 0xd3, 0xfa, |
2275 | 0xe4, 0xcb, 0x87, 0x76, 0x67, 0x8b, 0x53, 0xe9, 0xe6, 0x37, 0xe8, 0xe8, | 2275 | 0x16, 0xce, 0x2b, 0x1a, 0x61, 0x8b, 0x67, 0xfc, 0xb2, 0x27, 0x1f, 0xda, |
2276 | 0xd2, 0x74, 0x44, 0xb2, 0x5a, 0x77, 0x86, 0xca, 0x52, 0x96, 0x6d, 0x3e, | 2276 | 0x9d, 0x2d, 0xd9, 0x72, 0x07, 0xbf, 0x41, 0x47, 0xbb, 0xa6, 0x23, 0x94, |
2277 | 0x3d, 0xb7, 0xe0, 0x01, 0x1f, 0xdc, 0x6b, 0x61, 0x6f, 0x0c, 0x34, 0xf6, | 2277 | 0xd6, 0xba, 0x33, 0x54, 0xda, 0x8f, 0xff, 0x04, 0xdd, 0x84, 0x07, 0x7c, |
2278 | 0xb4, 0xd0, 0xdf, 0x45, 0x78, 0xc8, 0x2a, 0xe6, 0x9f, 0xa1, 0xf9, 0x36, | 2278 | 0x70, 0xaf, 0x85, 0xbd, 0x11, 0xd0, 0xd8, 0xd9, 0x44, 0x7f, 0x3b, 0xe1, |
2279 | 0x3c, 0xbe, 0x03, 0x59, 0x7d, 0x1b, 0xb2, 0xfa, 0xc0, 0x1d, 0xdd, 0x4d, | 2279 | 0x21, 0xab, 0x88, 0x77, 0x86, 0xe6, 0xdb, 0x70, 0xf9, 0xf6, 0x65, 0xf5, |
2280 | 0x1c, 0x19, 0xe0, 0x60, 0x1e, 0x62, 0xbc, 0x62, 0x8c, 0x32, 0x6f, 0xe0, | 2280 | 0x2a, 0x64, 0xf5, 0xbe, 0x33, 0xb4, 0x8f, 0x38, 0x52, 0xc0, 0x01, 0xb9, |
2281 | 0x82, 0x1f, 0xa8, 0x48, 0xb6, 0x5b, 0xf2, 0xa6, 0xce, 0x01, 0x80, 0x9d, | 2281 | 0x9b, 0x8c, 0x57, 0x8c, 0x51, 0xe6, 0x06, 0x2e, 0xf8, 0x81, 0x0a, 0xa5, |
2282 | 0x14, 0x1d, 0xe3, 0x2d, 0xf2, 0xe8, 0x7f, 0x5b, 0x29, 0x6d, 0x37, 0x85, | 2282 | 0x3b, 0x24, 0x67, 0xea, 0x1c, 0x00, 0xd8, 0x31, 0xd1, 0x31, 0xde, 0x22, |
2283 | 0x1a, 0xf3, 0xc0, 0x57, 0x40, 0xdb, 0x46, 0x4a, 0x69, 0xd6, 0xba, 0x21, | 2283 | 0x8f, 0xde, 0xb7, 0x95, 0xd0, 0x76, 0x93, 0xaf, 0x32, 0x0f, 0xfc, 0x31, |
2284 | 0x73, 0x89, 0xb5, 0x65, 0xdf, 0x90, 0xb5, 0x8a, 0xda, 0xd9, 0x2e, 0xdb, | 2284 | 0x68, 0x5b, 0x4b, 0x28, 0xcd, 0x5a, 0x07, 0x64, 0x2e, 0x91, 0x96, 0xf4, |
2285 | 0x65, 0x06, 0x32, 0xaa, 0x4f, 0x22, 0x7f, 0x8e, 0x77, 0x4b, 0xe4, 0x1e, | 2285 | 0x1b, 0xb2, 0x5c, 0x56, 0x7b, 0x5a, 0x65, 0x97, 0x4c, 0x42, 0x46, 0xb5, |
2286 | 0xe6, 0x81, 0x04, 0x68, 0xdd, 0x48, 0x99, 0x72, 0xdd, 0x55, 0x23, 0xd8, | 2286 | 0x31, 0xe4, 0xaf, 0x91, 0x0e, 0x09, 0xdd, 0xcf, 0x3c, 0x10, 0x03, 0xad, |
2287 | 0x3f, 0x0e, 0x3d, 0xec, 0xa7, 0x4e, 0x95, 0x0f, 0x47, 0x98, 0x08, 0x65, | 2287 | 0x6b, 0x09, 0x53, 0x6e, 0x39, 0x6a, 0x10, 0xfb, 0x47, 0xa0, 0x87, 0x43, |
2288 | 0xde, 0xdf, 0x2e, 0xc4, 0xcd, 0xb5, 0xb1, 0x84, 0x29, 0x9c, 0xef, 0x84, | 2288 | 0xd4, 0xa9, 0xf2, 0xe0, 0x08, 0x13, 0xa2, 0xcc, 0x7b, 0x5a, 0x85, 0xb8, |
2289 | 0x5e, 0xb9, 0x97, 0xfc, 0x79, 0x7b, 0x3e, 0xce, 0x5f, 0xb0, 0x4e, 0x99, | 2289 | 0xb9, 0x36, 0x1c, 0x33, 0x85, 0xf3, 0xc8, 0x95, 0x93, 0xdc, 0x4b, 0xfe, |
2290 | 0x51, 0x76, 0xb0, 0x31, 0xf0, 0xe8, 0xd8, 0x3f, 0xeb, 0xcb, 0xe6, 0x76, | 2290 | 0xdc, 0x3d, 0x1f, 0xe6, 0xcf, 0x5f, 0xa7, 0xcc, 0x28, 0x3b, 0xd8, 0x18, |
2291 | 0xb9, 0x64, 0x8a, 0x51, 0xb7, 0x6f, 0x6b, 0x91, 0x1f, 0x79, 0xee, 0xdb, | 2291 | 0x78, 0xcc, 0xda, 0xbf, 0xe0, 0xc9, 0xe6, 0x4e, 0xb9, 0x62, 0x8a, 0x51, |
2292 | 0xc4, 0x33, 0x71, 0x6c, 0xcd, 0xf7, 0xc1, 0x1a, 0xcf, 0xf4, 0xce, 0x9e, | 2292 | 0xb3, 0xef, 0x68, 0x92, 0x1f, 0x79, 0xee, 0xde, 0xc2, 0x33, 0x71, 0x6c, |
2293 | 0xb7, 0x36, 0x52, 0x51, 0xb9, 0x55, 0xbe, 0xd0, 0xa5, 0x14, 0x2b, 0xb4, | 2293 | 0xcf, 0xf7, 0xe1, 0x2a, 0xcf, 0x74, 0xcf, 0x9e, 0xb1, 0xd6, 0x12, 0x61, |
2294 | 0x8d, 0x76, 0x29, 0xa0, 0xfe, 0xb0, 0x77, 0x23, 0xa8, 0x3c, 0xa2, 0x64, | 2294 | 0xd9, 0x2c, 0x5f, 0xe8, 0x52, 0x0a, 0x65, 0xda, 0x46, 0xab, 0xe4, 0x51, |
2295 | 0xe2, 0x3e, 0xe2, 0xfc, 0x3b, 0xf2, 0x34, 0x99, 0x54, 0x86, 0x14, 0xec, | 2295 | 0x8f, 0xd8, 0xfb, 0x10, 0x54, 0x1e, 0x57, 0x32, 0xfa, 0x20, 0x71, 0xfe, |
2296 | 0xce, 0x16, 0x7d, 0x71, 0xae, 0xd5, 0xb6, 0xbf, 0xed, 0xdb, 0xf6, 0x07, | 2296 | 0x23, 0x79, 0x1a, 0x8b, 0x2b, 0x43, 0xf2, 0x3a, 0xf7, 0xfb, 0xfa, 0xe2, |
2297 | 0xee, 0xc4, 0xee, 0x40, 0xef, 0x90, 0xd7, 0xc7, 0xf6, 0x08, 0xf4, 0xfc, | 2297 | 0x5c, 0xb3, 0x6d, 0xbf, 0xea, 0xd9, 0xf6, 0xfb, 0xce, 0xe8, 0x3e, 0x5f, |
2298 | 0x7f, 0xed, 0xa1, 0xad, 0xc4, 0x36, 0xed, 0x29, 0x6d, 0xb1, 0x67, 0x87, | 2298 | 0xef, 0x90, 0xd7, 0x87, 0xf6, 0x08, 0xf4, 0xfc, 0x7f, 0xed, 0xa1, 0xad, |
2299 | 0xc8, 0x17, 0xe8, 0x43, 0x3d, 0x7e, 0xcc, 0x08, 0x7c, 0x2a, 0xc0, 0x03, | 2299 | 0x44, 0xb6, 0xec, 0x29, 0x6e, 0xb3, 0x67, 0xb7, 0xc8, 0x2f, 0xd1, 0x87, |
2300 | 0xdd, 0x68, 0x5b, 0xe5, 0xdc, 0x56, 0xbe, 0x48, 0x1c, 0xc4, 0xc5, 0xbd, | 2300 | 0xba, 0xbd, 0x98, 0xe1, 0xfb, 0x94, 0x8f, 0x07, 0xba, 0xd1, 0xb6, 0xca, |
2301 | 0x84, 0x09, 0x72, 0x2a, 0xd4, 0x21, 0x5b, 0xe6, 0x55, 0x8c, 0x69, 0xbc, | 2301 | 0xb9, 0xed, 0x7c, 0x91, 0x38, 0x88, 0x8b, 0x7b, 0x09, 0xe3, 0xe7, 0x54, |
2302 | 0x2b, 0xc4, 0xa1, 0xd6, 0xfc, 0xca, 0x39, 0x13, 0xdf, 0x53, 0x78, 0x5a, | 2302 | 0xa8, 0x43, 0xb6, 0xcd, 0xab, 0x18, 0x13, 0x78, 0x57, 0x88, 0x43, 0xcd, |
2303 | 0x52, 0x68, 0xd0, 0x9f, 0xb8, 0x9f, 0xf9, 0xf6, 0x5d, 0x3f, 0x7e, 0x76, | 2303 | 0xf9, 0x95, 0x73, 0x26, 0xbe, 0xc7, 0xf1, 0xb4, 0x24, 0x5f, 0xa7, 0x3f, |
2304 | 0xcf, 0x46, 0xb3, 0x71, 0xc4, 0x4f, 0x99, 0x29, 0x57, 0x8e, 0xba, 0x11, | 2304 | 0x71, 0x3f, 0xf3, 0xed, 0x4d, 0x2f, 0x7e, 0x76, 0x4c, 0x85, 0xd3, 0x51, |
2305 | 0x4b, 0x4a, 0x77, 0x64, 0x69, 0x1f, 0xdd, 0x93, 0x88, 0x91, 0x33, 0xe5, | 2305 | 0xc4, 0x4f, 0x99, 0x2c, 0x95, 0x8f, 0xa3, 0x26, 0x92, 0xe2, 0x5d, 0x69, |
2306 | 0x06, 0xeb, 0x22, 0x84, 0x31, 0xec, 0x43, 0x8e, 0x8e, 0xa9, 0xc5, 0x58, | 2306 | 0xda, 0x47, 0xc7, 0x18, 0x62, 0xe4, 0x64, 0xa9, 0xce, 0xba, 0x08, 0x61, |
2307 | 0xe9, 0xc7, 0xb2, 0x8c, 0xcb, 0x49, 0x49, 0x36, 0xde, 0x43, 0xdd, 0x61, | 2307 | 0x0c, 0xfb, 0x90, 0xa3, 0x23, 0x6a, 0x2e, 0x52, 0xfc, 0x58, 0x9a, 0x71, |
2308 | 0x8a, 0xa3, 0x6d, 0xed, 0xf9, 0x5d, 0xa4, 0xb7, 0x8c, 0x1a, 0x22, 0x9a, | 2308 | 0x39, 0x2e, 0xf1, 0xfa, 0x3b, 0xa8, 0x3b, 0x4c, 0xc9, 0x6a, 0x5b, 0xfb, |
2309 | 0x95, 0xa8, 0xca, 0xb6, 0xc7, 0xe6, 0x32, 0xdd, 0xe2, 0x64, 0xa6, 0x77, | 2309 | 0xb3, 0x5e, 0xd2, 0x5b, 0x42, 0x0d, 0x11, 0x4e, 0x4b, 0x58, 0xa5, 0x5b, |
2310 | 0xa9, 0xf5, 0x7d, 0xbb, 0x22, 0xeb, 0x3b, 0x67, 0xdb, 0xb2, 0xa5, 0x5d, | 2310 | 0x23, 0xd3, 0xa9, 0x0e, 0xd4, 0x5a, 0x13, 0xbd, 0x6a, 0xf5, 0x60, 0x6f, |
2311 | 0x6a, 0x51, 0x64, 0xa5, 0x22, 0x0a, 0x75, 0x4d, 0xe2, 0xa0, 0xe0, 0x7b, | 2311 | 0x68, 0x75, 0xcf, 0x54, 0x4b, 0xba, 0xd8, 0xab, 0xe6, 0x44, 0x16, 0xcb, |
2312 | 0xfd, 0xd1, 0x47, 0x55, 0x36, 0x02, 0xdd, 0xca, 0x53, 0xab, 0x99, 0x28, | 2312 | 0xa2, 0x50, 0xd7, 0xc4, 0x0e, 0x0b, 0xbe, 0x57, 0x3f, 0xfb, 0x59, 0x95, |
2313 | 0x6b, 0xc6, 0xe4, 0x8c, 0x3c, 0x85, 0x3a, 0xf1, 0x49, 0x99, 0xab, 0x80, | 2313 | 0x0e, 0x41, 0xb7, 0x72, 0x6c, 0x29, 0x15, 0x66, 0x0d, 0x19, 0x9f, 0x94, |
2314 | 0x2e, 0xcd, 0x77, 0x02, 0xfc, 0x0e, 0x00, 0x37, 0x69, 0x8f, 0x23, 0xc6, | 2314 | 0x63, 0xa8, 0x1b, 0x9f, 0x91, 0xe9, 0x32, 0xe8, 0xd2, 0x7c, 0xc7, 0xc0, |
2315 | 0x7a, 0xb4, 0x83, 0xe6, 0x5c, 0x9e, 0x75, 0x52, 0x86, 0x79, 0xe5, 0x3d, | 2315 | 0x6f, 0x1f, 0x70, 0x93, 0xf6, 0x28, 0x62, 0xac, 0x4b, 0x3b, 0x68, 0xce, |
2316 | 0xd8, 0x0f, 0xfd, 0xe5, 0x5f, 0x64, 0xcd, 0xea, 0x94, 0x82, 0x17, 0x1f, | 2316 | 0xe4, 0x58, 0x27, 0xa5, 0x98, 0x57, 0xde, 0x81, 0xfd, 0xd0, 0x5f, 0xfe, |
2317 | 0x68, 0xaf, 0x58, 0x7b, 0xd7, 0x5f, 0xbb, 0x8a, 0x35, 0xda, 0xef, 0xb6, | 2317 | 0x59, 0x96, 0xad, 0x1d, 0x92, 0x77, 0xe3, 0x03, 0xed, 0x15, 0x6b, 0x37, |
2318 | 0x16, 0x1d, 0x7e, 0x55, 0xd7, 0x3a, 0x17, 0x6d, 0xbe, 0x13, 0xf6, 0x2f, | 2318 | 0xbd, 0xb5, 0x6b, 0x58, 0xa3, 0xfd, 0xee, 0x6c, 0xd2, 0xe1, 0x97, 0x75, |
2319 | 0x27, 0x3c, 0xd8, 0xd7, 0x27, 0xd6, 0xac, 0x47, 0xb7, 0x4b, 0x97, 0x49, | 2319 | 0xad, 0x73, 0xd9, 0xe6, 0x3b, 0x61, 0xff, 0x76, 0xd4, 0x85, 0x7d, 0x7d, |
2320 | 0xbd, 0xe1, 0x9c, 0x38, 0x63, 0x2c, 0xd6, 0x2f, 0xf9, 0xb8, 0xbe, 0x0b, | 2320 | 0x74, 0xd9, 0xfa, 0xdc, 0x2e, 0x69, 0x37, 0xa9, 0x37, 0x9c, 0x13, 0x65, |
2321 | 0x5c, 0xdd, 0xa4, 0x1b, 0x23, 0x8a, 0x75, 0xd0, 0x87, 0x9a, 0xa7, 0x70, | 2321 | 0x8c, 0xc5, 0xfa, 0x15, 0x0f, 0xd7, 0x5b, 0xc0, 0xd5, 0x41, 0xba, 0x31, |
2322 | 0x23, 0xd6, 0x10, 0xf6, 0x65, 0x1f, 0xd7, 0xb7, 0x5a, 0x70, 0x71, 0x8d, | 2322 | 0xc2, 0x58, 0x07, 0x7d, 0xa8, 0x79, 0xf2, 0x1b, 0xb1, 0x86, 0xb0, 0xdf, |
2323 | 0x4f, 0x9e, 0x89, 0xb3, 0xbb, 0xc8, 0x1b, 0xf9, 0xa1, 0x0e, 0xa8, 0x8f, | 2323 | 0xf1, 0x70, 0x7d, 0xab, 0x09, 0x17, 0xd7, 0xf8, 0xe4, 0x99, 0x38, 0xbb, |
2324 | 0xb4, 0x31, 0x83, 0xd8, 0x3e, 0xd3, 0xd4, 0xb5, 0x9d, 0x91, 0xaf, 0xa2, | 2324 | 0x9d, 0xbc, 0x91, 0x1f, 0xea, 0x80, 0xfa, 0x48, 0x1a, 0x93, 0x88, 0xed, |
2325 | 0xe6, 0x6a, 0x3e, 0x0f, 0x1a, 0x59, 0xc3, 0x0e, 0xfa, 0xf5, 0x35, 0xed, | 2325 | 0x93, 0x0d, 0x5d, 0xdb, 0x19, 0xb9, 0x0a, 0x6a, 0xae, 0xc6, 0x8b, 0xa0, |
2326 | 0x68, 0x43, 0xdb, 0x23, 0xe3, 0x4e, 0x59, 0xdb, 0xd5, 0x6b, 0x9e, 0x5d, | 2326 | 0x11, 0xb5, 0x58, 0x63, 0xd0, 0xab, 0xb7, 0x69, 0x47, 0x6b, 0xda, 0x1e, |
2327 | 0x59, 0xd4, 0xcd, 0x6b, 0x32, 0xd8, 0xa8, 0x6c, 0xf7, 0xfe, 0xaf, 0xb6, | 2327 | 0x19, 0x77, 0x4a, 0xda, 0xae, 0x2e, 0xb9, 0x76, 0x65, 0x51, 0x37, 0x97, |
2328 | 0x29, 0x11, 0xad, 0x4f, 0xe6, 0x37, 0xda, 0xd8, 0xed, 0x88, 0xeb, 0xee, | 2328 | 0x64, 0x6f, 0xbd, 0xba, 0xcb, 0xfd, 0xbf, 0xdb, 0xa6, 0x84, 0xb4, 0x3e, |
2329 | 0x0f, 0x99, 0x67, 0x66, 0x98, 0x83, 0x66, 0x98, 0x3b, 0x0c, 0x3f, 0x1e, | 2329 | 0x99, 0xdf, 0x68, 0x63, 0x77, 0x22, 0xae, 0x3b, 0xef, 0x32, 0xcf, 0x4c, |
2330 | 0x26, 0x5b, 0x70, 0x24, 0x81, 0xa3, 0xee, 0xdb, 0xef, 0x73, 0x3e, 0xae, | 2330 | 0x32, 0x07, 0x4d, 0x32, 0x77, 0x18, 0x5e, 0x3c, 0x8c, 0x37, 0xe1, 0x88, |
2331 | 0xa0, 0xfe, 0x0c, 0x62, 0xea, 0xef, 0xdf, 0x71, 0xeb, 0xfa, 0x47, 0x3e, | 2331 | 0x03, 0xc7, 0x8a, 0x67, 0xbf, 0x73, 0x1e, 0x2e, 0xbf, 0xfe, 0xf4, 0x63, |
2332 | 0x7d, 0xed, 0x3a, 0x1e, 0xc3, 0xd6, 0x41, 0x7f, 0x72, 0x56, 0xc1, 0xbe, | 2332 | 0xea, 0x9f, 0xdf, 0xb5, 0x79, 0x5d, 0x99, 0xee, 0x77, 0xab, 0x8e, 0xc7, |
2333 | 0xf2, 0x0d, 0x4f, 0x1f, 0xf0, 0x7d, 0xd8, 0x1e, 0x5f, 0x03, 0xdd, 0x7a, | 2333 | 0xb0, 0x75, 0xd0, 0x1f, 0x9f, 0x52, 0xb0, 0xaf, 0x5c, 0xdd, 0xd5, 0x07, |
2334 | 0xf5, 0xb7, 0x27, 0x03, 0xea, 0x34, 0x47, 0xbe, 0x73, 0x51, 0xd2, 0xd2, | 2334 | 0x7c, 0x1f, 0xb6, 0xc7, 0x57, 0x5f, 0xb7, 0x6e, 0xfd, 0xed, 0xca, 0x80, |
2335 | 0x9c, 0xc6, 0x7e, 0x39, 0xcc, 0xdc, 0x58, 0x00, 0x1f, 0x07, 0xcd, 0x31, | 2335 | 0x3a, 0xcd, 0x90, 0xef, 0x4c, 0x98, 0xb4, 0x34, 0x26, 0xb0, 0x5f, 0x8e, |
2336 | 0x73, 0x8e, 0xb8, 0xe3, 0x02, 0x9c, 0xa8, 0x25, 0xb3, 0x1d, 0xbe, 0x9e, | 2336 | 0x30, 0x37, 0xe6, 0xc1, 0xc7, 0x61, 0x73, 0xd8, 0x9c, 0x26, 0xee, 0xa8, |
2337 | 0xbf, 0xc9, 0xf3, 0x81, 0x7b, 0x1b, 0xbf, 0xf1, 0xfc, 0xa6, 0x4f, 0xcf, | 2337 | 0x00, 0x27, 0x6a, 0xc9, 0x74, 0x9b, 0xa7, 0xe7, 0x6f, 0xf3, 0x7c, 0xe0, |
2338 | 0x95, 0x5e, 0x8f, 0x9e, 0x60, 0x7d, 0xd0, 0xbc, 0xf5, 0xbb, 0xbe, 0xcb, | 2338 | 0xde, 0xc9, 0x6f, 0x3c, 0xbf, 0xed, 0xd1, 0x73, 0xa3, 0xcb, 0xa5, 0xc7, |
2339 | 0x97, 0x27, 0xde, 0x9f, 0xf4, 0xe9, 0xa2, 0x6e, 0x5a, 0x69, 0xa2, 0x5e, | 2339 | 0x5f, 0x1f, 0x34, 0x37, 0x7f, 0xaf, 0xf4, 0x7a, 0xf2, 0xc4, 0xfb, 0x33, |
2340 | 0xfe, 0x1d, 0x78, 0x74, 0xad, 0x51, 0x52, 0x59, 0xd4, 0x2e, 0x19, 0xe6, | 2340 | 0x1e, 0x5d, 0xd4, 0x4d, 0x33, 0x4d, 0xd4, 0xcb, 0xbb, 0xc0, 0xa3, 0x6b, |
2341 | 0xac, 0xd4, 0x64, 0x4e, 0x2c, 0xe8, 0x24, 0x65, 0xcf, 0x62, 0xd7, 0xbb, | 2341 | 0x8d, 0xa2, 0x4a, 0xa3, 0x76, 0x49, 0x31, 0x67, 0x25, 0xc6, 0x32, 0x62, |
2342 | 0x15, 0xea, 0xf9, 0x3a, 0x62, 0x35, 0xf5, 0xfe, 0xbe, 0xcc, 0x57, 0x86, | 2342 | 0x41, 0x27, 0x09, 0x7b, 0x0a, 0xbb, 0x6e, 0x96, 0xa9, 0xe7, 0x5b, 0x88, |
2343 | 0xec, 0x76, 0x83, 0xfe, 0x9a, 0x4a, 0x9f, 0x96, 0x31, 0xfb, 0xb4, 0xae, | 2343 | 0xd5, 0xd4, 0xfb, 0x7b, 0x32, 0x53, 0xee, 0xb7, 0x5b, 0x0d, 0xfa, 0x6b, |
2344 | 0xa1, 0x52, 0xc9, 0x63, 0x42, 0xd9, 0x5e, 0x97, 0x61, 0x5d, 0xdb, 0xbc, | 2344 | 0x22, 0xb9, 0x22, 0xc3, 0xf6, 0x8a, 0xae, 0xa1, 0x12, 0xf1, 0x13, 0x42, |
2345 | 0x2f, 0x16, 0xe4, 0x32, 0x53, 0x85, 0x8f, 0xed, 0xfe, 0x57, 0x57, 0xd7, | 2345 | 0xd9, 0xde, 0x92, 0x01, 0x5d, 0xdb, 0xbc, 0x27, 0x16, 0xe4, 0x32, 0x59, |
2346 | 0xa4, 0x08, 0x6f, 0xef, 0x6c, 0x81, 0xeb, 0x75, 0x8d, 0x87, 0xf8, 0x5a, | 2346 | 0x81, 0x8f, 0xed, 0xfb, 0x57, 0x47, 0xd7, 0xa4, 0x08, 0x6f, 0xd7, 0xb7, |
2347 | 0x71, 0x19, 0xd2, 0xb1, 0x3b, 0xc0, 0x67, 0xc9, 0x42, 0x33, 0xc0, 0x19, | 2347 | 0xc1, 0xf5, 0xba, 0xc6, 0x43, 0x7c, 0xcd, 0xb8, 0x0c, 0x69, 0xdb, 0xe7, |
2348 | 0x45, 0x5c, 0x46, 0x0c, 0xd8, 0xfd, 0x05, 0x5f, 0x1f, 0x7c, 0x7f, 0xd3, | 2348 | 0xe3, 0xb3, 0x64, 0xb6, 0xe1, 0xe3, 0x0c, 0x23, 0x2e, 0x23, 0x06, 0xec, |
2349 | 0x65, 0x2d, 0xa4, 0xb2, 0xa7, 0xfc, 0xb9, 0x3f, 0xa3, 0x0c, 0xf0, 0x1d, | 2349 | 0xfb, 0xbc, 0x67, 0x2f, 0x7c, 0xff, 0xbe, 0xc3, 0x5a, 0x48, 0xa5, 0xbf, |
2350 | 0xc8, 0xfd, 0x79, 0x3f, 0xde, 0x94, 0x8c, 0x5c, 0x93, 0x32, 0xa0, 0xad, | 2350 | 0xea, 0xcd, 0x7d, 0x8f, 0x32, 0xc0, 0xb7, 0x2f, 0xf7, 0x17, 0xbd, 0x78, |
2351 | 0x40, 0xff, 0xda, 0x3e, 0xe1, 0x33, 0xd5, 0xcf, 0x22, 0x66, 0xf5, 0x79, | 2351 | 0x53, 0x34, 0x32, 0x0d, 0xca, 0x80, 0xb6, 0x02, 0xfd, 0x6b, 0xfb, 0x84, |
2352 | 0xf5, 0x03, 0x7a, 0xb0, 0x5c, 0x93, 0x73, 0x1b, 0x1d, 0x8e, 0xdd, 0xe6, | 2352 | 0xcf, 0x54, 0x3e, 0x89, 0x98, 0xd5, 0xed, 0xd6, 0x0f, 0xe8, 0xaf, 0x32, |
2353 | 0xfb, 0xd2, 0x3e, 0xcc, 0xcd, 0xe0, 0x8f, 0xb2, 0x23, 0xcc, 0x7e, 0xbc, | 2353 | 0x0d, 0xce, 0xad, 0xb5, 0x65, 0xed, 0x16, 0xcf, 0x97, 0x0e, 0x62, 0x6e, |
2354 | 0xe7, 0x7c, 0x38, 0x99, 0x74, 0x90, 0xbb, 0x72, 0xfb, 0xa7, 0xf0, 0x6d, | 2354 | 0x12, 0x7f, 0x94, 0x1d, 0x61, 0x0e, 0xe1, 0x3d, 0xe3, 0xc1, 0xc9, 0x58, |
2355 | 0xf8, 0x7d, 0x96, 0x96, 0x7b, 0x0d, 0xb5, 0x0a, 0xe4, 0x39, 0x0c, 0x7e, | 2355 | 0x16, 0xb9, 0x2b, 0x73, 0x68, 0x1c, 0xdf, 0x86, 0xd7, 0x67, 0x69, 0xb9, |
2356 | 0x92, 0x32, 0xd5, 0x84, 0xce, 0x6f, 0xc4, 0xb3, 0x1b, 0x30, 0xa5, 0x9b, | 2356 | 0x57, 0x51, 0xab, 0x40, 0x9e, 0x03, 0xe0, 0x27, 0x2e, 0xe3, 0x0d, 0xe8, |
2357 | 0x30, 0x5e, 0xec, 0x9b, 0x6a, 0xbe, 0xe5, 0x32, 0x1e, 0xfc, 0x89, 0xf6, | 2357 | 0x7c, 0x23, 0x9e, 0x6d, 0xc0, 0x14, 0x6f, 0xc3, 0xb8, 0xb1, 0x6f, 0xbc, |
2358 | 0x97, 0x24, 0x68, 0x0f, 0x7a, 0xb5, 0x9c, 0xf1, 0x70, 0x75, 0xda, 0x78, | 2358 | 0xf1, 0xa6, 0xc3, 0x78, 0xf0, 0x57, 0xda, 0x5f, 0xe2, 0xa0, 0xdd, 0xef, |
2359 | 0xa4, 0xca, 0x3d, 0xea, 0x6b, 0xfd, 0x62, 0x25, 0x1d, 0x85, 0x3a, 0x75, | 2359 | 0xd5, 0x32, 0xc6, 0x63, 0x95, 0x09, 0xe3, 0xf1, 0x0a, 0xf7, 0xa8, 0xaf, |
2360 | 0x77, 0x2f, 0xce, 0x3c, 0x06, 0xdb, 0x28, 0x19, 0x33, 0xa3, 0xdb, 0xa5, | 2360 | 0xf5, 0x88, 0x15, 0xcf, 0x2a, 0xd4, 0xa9, 0xfb, 0xba, 0x70, 0xe6, 0x09, |
2361 | 0x90, 0xee, 0x07, 0xcd, 0xf7, 0xe3, 0xd9, 0x8e, 0xf9, 0x9f, 0xc2, 0x3c, | 2361 | 0xd8, 0x46, 0xd1, 0x98, 0x1c, 0xda, 0x25, 0xf9, 0x64, 0x0f, 0x68, 0x7e, |
2362 | 0xec, 0x28, 0x4d, 0xff, 0xe8, 0xd4, 0xbd, 0xe4, 0xac, 0x49, 0x1a, 0x87, | 2362 | 0x08, 0xcf, 0x56, 0xcc, 0xff, 0x3c, 0xe6, 0x61, 0x47, 0x49, 0xfa, 0xc7, |
2363 | 0x7d, 0xdb, 0xfa, 0x8e, 0xe9, 0xd9, 0xd2, 0x13, 0xf8, 0xde, 0x86, 0xf9, | 2363 | 0x0e, 0xdd, 0x5b, 0x4e, 0x99, 0xa4, 0x71, 0xc0, 0xb3, 0xad, 0x37, 0x4d, |
2364 | 0x5f, 0xc0, 0x13, 0xb9, 0x6c, 0x77, 0x30, 0x4f, 0x1f, 0x9c, 0xc4, 0xfc, | 2364 | 0xd7, 0x96, 0x9e, 0xc6, 0xf7, 0x4e, 0xcc, 0x7f, 0x01, 0x4f, 0xe4, 0xb2, |
2365 | 0xbd, 0xc0, 0xf1, 0xdb, 0x78, 0xbf, 0x0b, 0xef, 0xbf, 0xb5, 0x69, 0xef, | 2365 | 0x7d, 0xfe, 0x3c, 0x7d, 0x70, 0x0c, 0xf3, 0x0f, 0x00, 0xc7, 0x1f, 0xe0, |
2366 | 0x6f, 0xf2, 0x6c, 0xcc, 0x3b, 0x9b, 0xe6, 0x83, 0xf8, 0xcd, 0xf3, 0x44, | 2366 | 0xfd, 0x5e, 0xbc, 0xff, 0xde, 0x96, 0xbd, 0xbf, 0xcb, 0xb3, 0x31, 0x9f, |
2367 | 0xfa, 0xd6, 0xc1, 0xf8, 0x7a, 0x4c, 0x76, 0x9c, 0xee, 0x12, 0x55, 0xf7, | 2367 | 0xdd, 0x32, 0xef, 0xc7, 0x6f, 0x9e, 0x27, 0xd2, 0xbd, 0x0a, 0xc6, 0x57, |
2368 | 0x62, 0xb8, 0xaa, 0x9b, 0xd2, 0x7f, 0x9a, 0xf1, 0xfb, 0xaf, 0xb0, 0xc7, | 2368 | 0x23, 0xb2, 0x7b, 0xa5, 0x5d, 0x54, 0xcd, 0x8d, 0xe1, 0xaa, 0x66, 0x4a, |
2369 | 0x12, 0xb5, 0x0e, 0xa5, 0x51, 0xb7, 0xda, 0x47, 0x0f, 0x1c, 0x19, 0x5c, | 2369 | 0xcf, 0x0a, 0xe3, 0xf7, 0x0f, 0xb0, 0xc7, 0x12, 0xb5, 0x0a, 0xa5, 0x51, |
2370 | 0xe6, 0x73, 0xf6, 0xc8, 0x44, 0x83, 0x30, 0x7c, 0x7f, 0xec, 0xc8, 0x60, | 2370 | 0xb7, 0xda, 0x47, 0x9f, 0x39, 0xba, 0x77, 0x81, 0xcf, 0xe2, 0xd1, 0xd1, |
2371 | 0xe3, 0x6f, 0x01, 0x0b, 0xb9, 0x54, 0x03, 0xfc, 0x84, 0xff, 0xd3, 0x4d, | 2371 | 0x3a, 0x61, 0xf8, 0x7e, 0xec, 0xe8, 0xde, 0xfa, 0x3f, 0x00, 0x16, 0x72, |
2372 | 0x67, 0x6a, 0xd9, 0xe2, 0x4c, 0xfa, 0xfd, 0x81, 0x23, 0x4e, 0x8d, 0x75, | 2372 | 0xa9, 0xf8, 0xf8, 0x09, 0x7f, 0x7e, 0xcb, 0x99, 0x5a, 0xb6, 0x38, 0x93, |
2373 | 0x42, 0x2a, 0x21, 0xba, 0x16, 0x9f, 0x3d, 0x52, 0x44, 0x7e, 0x8c, 0x68, | 2373 | 0x7e, 0xff, 0xcc, 0xd1, 0x6c, 0x95, 0x75, 0x42, 0x22, 0x26, 0xba, 0x16, |
2374 | 0x5a, 0x82, 0x75, 0xae, 0x51, 0x0f, 0x5b, 0xd1, 0x46, 0xba, 0x5a, 0xf1, | 2374 | 0x2f, 0x1e, 0x2d, 0x20, 0x3f, 0x86, 0x34, 0x2d, 0xfe, 0x3a, 0xd7, 0xa8, |
2375 | 0x30, 0xcf, 0x10, 0xcf, 0x63, 0xc0, 0x93, 0x06, 0x1e, 0xe6, 0x1b, 0x8f, | 2375 | 0x87, 0xed, 0x68, 0x23, 0x5d, 0xcd, 0x78, 0x98, 0x67, 0x88, 0xe7, 0x18, |
2376 | 0xde, 0xe4, 0xf2, 0x56, 0xb4, 0x11, 0x17, 0xcf, 0x0a, 0xf0, 0xf5, 0x8b, | 2376 | 0xf0, 0x24, 0x81, 0x87, 0xf9, 0xc6, 0xa5, 0x37, 0xbe, 0xb0, 0x1d, 0x6d, |
2377 | 0x3a, 0xfd, 0x26, 0xe9, 0x35, 0x59, 0xdb, 0x7a, 0xb1, 0xa6, 0x4d, 0x0a, | 2377 | 0xc4, 0xc5, 0xb3, 0x7c, 0x7c, 0x3d, 0xa2, 0x56, 0x7e, 0x48, 0x7a, 0x4d, |
2378 | 0x27, 0x99, 0xb3, 0x77, 0xfb, 0xdf, 0x71, 0x93, 0x3d, 0x77, 0x52, 0x71, | 2378 | 0xd6, 0xb6, 0x6e, 0xac, 0x69, 0x91, 0xfc, 0x69, 0xe6, 0xec, 0x7d, 0xde, |
2379 | 0x9e, 0x4f, 0xac, 0x65, 0xee, 0xc4, 0x1c, 0xbe, 0x57, 0x02, 0x58, 0xe5, | 2379 | 0x37, 0xca, 0x18, 0xf4, 0xdc, 0x71, 0xc5, 0x79, 0x3e, 0xb1, 0x96, 0x62, |
2380 | 0xc3, 0xf6, 0xb4, 0xf0, 0xdd, 0xe6, 0xcb, 0x9a, 0x67, 0x06, 0xbd, 0x67, | 2380 | 0xb9, 0x82, 0xef, 0x45, 0x1f, 0x56, 0x79, 0xb0, 0x9d, 0x4d, 0x7c, 0xb7, |
2381 | 0x2b, 0x2d, 0x00, 0x85, 0x1e, 0xfa, 0x6e, 0xe8, 0x21, 0xe0, 0x13, 0x0b, | 2381 | 0x78, 0xb2, 0xe6, 0x99, 0x7e, 0xef, 0xd9, 0x4c, 0x0b, 0x40, 0xa1, 0x87, |
2382 | 0xeb, 0xa4, 0x2d, 0x0d, 0x5e, 0x03, 0xda, 0x3e, 0xa9, 0xfe, 0xb8, 0x37, | 2382 | 0xee, 0x0d, 0x3d, 0xf8, 0x7c, 0x62, 0x61, 0x95, 0xb4, 0x25, 0xc1, 0xab, |
2383 | 0x8d, 0xbf, 0xe0, 0xbc, 0x40, 0x06, 0xa4, 0x8b, 0x4f, 0xd8, 0xf2, 0xc7, | 2383 | 0x4f, 0xdb, 0x47, 0xd5, 0x1f, 0xf7, 0x26, 0xf1, 0xe7, 0x9f, 0xe7, 0xcb, |
2384 | 0x7a, 0xe7, 0x34, 0xfc, 0x8e, 0xf7, 0x1e, 0xae, 0xbb, 0x66, 0x53, 0xf6, | 2384 | 0x80, 0x74, 0xf1, 0x09, 0x5b, 0xfe, 0x50, 0xef, 0x9c, 0x84, 0xdf, 0xf1, |
2385 | 0x1d, 0xd0, 0x3b, 0x79, 0x31, 0xd0, 0x4b, 0x28, 0xd6, 0x74, 0x49, 0xf6, | 2385 | 0x1e, 0xc4, 0x71, 0x96, 0x6d, 0xca, 0xbe, 0x0d, 0x7a, 0x27, 0x2f, 0x06, |
2386 | 0xac, 0x87, 0xe4, 0x6d, 0xe0, 0xca, 0xa1, 0xaf, 0xf4, 0x7a, 0xa3, 0x59, | 2386 | 0x7a, 0x09, 0xc5, 0x9a, 0x2e, 0xce, 0x9e, 0xf5, 0x49, 0xb9, 0x0a, 0x5c, |
2387 | 0xc4, 0xc7, 0x0d, 0xd8, 0xe7, 0x45, 0x8b, 0xf7, 0x2f, 0x51, 0xe6, 0x3b, | 2387 | 0x19, 0xf4, 0x95, 0x6e, 0x6f, 0x34, 0x85, 0xf8, 0xb8, 0x06, 0xfb, 0xbc, |
2388 | 0x29, 0x37, 0xfe, 0x19, 0x30, 0xac, 0xaf, 0x6e, 0xde, 0xad, 0x2c, 0x03, | 2388 | 0x6c, 0xf1, 0x3e, 0x26, 0xcc, 0x7c, 0x27, 0xa5, 0xfa, 0xbf, 0x00, 0x86, |
2389 | 0x66, 0x05, 0x6b, 0xc7, 0xbc, 0xb8, 0xcc, 0xd8, 0xee, 0x2a, 0xd4, 0x1e, | 2389 | 0xf5, 0xd5, 0xed, 0xbb, 0x96, 0x05, 0xc0, 0x2c, 0x62, 0xed, 0x84, 0x1b, |
2390 | 0x45, 0xeb, 0xbf, 0x5d, 0xd6, 0x59, 0x37, 0x61, 0xb7, 0xba, 0x0b, 0x41, | 2390 | 0x97, 0x19, 0xdb, 0x1d, 0x85, 0xda, 0xa3, 0x60, 0xfd, 0xb7, 0xc3, 0x3a, |
2391 | 0xce, 0x59, 0x4a, 0x2d, 0x2c, 0x23, 0x86, 0xd7, 0x2c, 0xb5, 0x43, 0x69, | 2391 | 0xeb, 0x36, 0xec, 0x76, 0x77, 0x21, 0xc8, 0x39, 0xf3, 0x89, 0xd9, 0x05, |
2392 | 0x8b, 0x4c, 0xd5, 0x10, 0x93, 0xd0, 0xf5, 0xa6, 0x92, 0xcb, 0xf2, 0x03, | 2392 | 0xc4, 0xf0, 0xaa, 0xa5, 0x76, 0x2b, 0x6d, 0x91, 0x89, 0x2a, 0x62, 0x12, |
2393 | 0xad, 0x87, 0x36, 0x6b, 0xcc, 0xec, 0x57, 0x5f, 0xa4, 0x5d, 0x69, 0xca, | 2393 | 0xba, 0xde, 0x44, 0x7c, 0x41, 0xfe, 0x53, 0xeb, 0xa1, 0xc5, 0x1a, 0x36, |
2394 | 0x23, 0x27, 0x90, 0x97, 0xc7, 0x1f, 0x46, 0xce, 0x81, 0xbc, 0x4e, 0x94, | 2394 | 0x7b, 0xd4, 0xe7, 0x68, 0x57, 0x9a, 0xf2, 0xd0, 0x29, 0xe4, 0xe5, 0x91, |
2395 | 0xd0, 0xc9, 0xd3, 0x46, 0x36, 0x7e, 0xbd, 0x68, 0x79, 0x7d, 0x80, 0xce, | 2395 | 0xc7, 0x90, 0x73, 0x20, 0xaf, 0x53, 0x45, 0x74, 0xf2, 0xb4, 0x91, 0x37, |
2396 | 0x67, 0xe2, 0xf1, 0x18, 0x39, 0xd1, 0xad, 0xe3, 0x4c, 0x41, 0xc7, 0x9b, | 2396 | 0x7e, 0xab, 0x60, 0xb9, 0x7d, 0x80, 0xce, 0x67, 0xe2, 0xf2, 0x18, 0x3a, |
2397 | 0x21, 0x73, 0x46, 0x75, 0xa1, 0xc6, 0x40, 0x01, 0x8a, 0x0a, 0xc7, 0x1c, | 2397 | 0xd5, 0xa1, 0xe3, 0x4c, 0x5e, 0xc7, 0x9b, 0x7e, 0x73, 0x52, 0xb5, 0xa3, |
2398 | 0x11, 0x19, 0x5c, 0x44, 0x5c, 0x41, 0x1c, 0x1e, 0x5c, 0x47, 0x74, 0x3b, | 2398 | 0xc6, 0x40, 0x01, 0x8a, 0x0a, 0xc7, 0x1c, 0x14, 0xd9, 0x3b, 0x87, 0xb8, |
2399 | 0x41, 0x78, 0x25, 0xd1, 0x13, 0x11, 0x69, 0x3b, 0xc1, 0xfb, 0x10, 0xd9, | 2399 | 0x82, 0x38, 0xbc, 0x77, 0x15, 0xd1, 0xed, 0x14, 0xe1, 0x95, 0x84, 0x4f, |
2400 | 0x89, 0x7e, 0x8c, 0x38, 0x07, 0xa3, 0x78, 0x4e, 0xe1, 0x6f, 0x0f, 0x6a, | 2400 | 0x85, 0xa4, 0xe5, 0x14, 0xef, 0x43, 0x64, 0x0f, 0xfa, 0x31, 0xe2, 0xdc, |
2401 | 0x2b, 0x13, 0x35, 0xf2, 0x16, 0xf0, 0x80, 0xe5, 0x9e, 0xad, 0xe0, 0xbb, | 2401 | 0x1b, 0xc6, 0x73, 0x1c, 0x7f, 0xfb, 0x51, 0x5b, 0x99, 0xa8, 0x91, 0xb7, |
2402 | 0xfb, 0xa4, 0x2b, 0x86, 0x3d, 0x84, 0x8f, 0x82, 0x8e, 0x9d, 0xa0, 0xc7, | 2402 | 0x81, 0x07, 0x2c, 0xf7, 0x6c, 0x07, 0x6f, 0x76, 0x4b, 0x7b, 0x04, 0x7b, |
2403 | 0x3b, 0x9f, 0x38, 0xa2, 0x27, 0x44, 0x86, 0x16, 0xa5, 0x5f, 0xe9, 0x3d, | 2403 | 0x08, 0x1f, 0x06, 0x1d, 0x7b, 0x40, 0x8f, 0x7b, 0x3e, 0x71, 0x84, 0x4f, |
2404 | 0x51, 0x29, 0x66, 0xb8, 0xd6, 0x0d, 0x78, 0xee, 0xc3, 0x9a, 0xde, 0xe7, | 2404 | 0x89, 0xf4, 0xcf, 0x49, 0x8f, 0xd2, 0x7b, 0xc2, 0x52, 0x48, 0x71, 0xad, |
2405 | 0xdd, 0x2b, 0x15, 0x6e, 0xd2, 0x8d, 0x39, 0x03, 0xef, 0xa8, 0xa7, 0x32, | 2405 | 0x03, 0xf0, 0xdc, 0x87, 0x35, 0xbd, 0xcf, 0xbd, 0x57, 0xca, 0xdf, 0xa6, |
2406 | 0xa6, 0x0c, 0xd5, 0x3d, 0xd8, 0xc1, 0xf5, 0x43, 0x78, 0x92, 0x57, 0x8f, | 2406 | 0x1b, 0x73, 0x06, 0xde, 0x51, 0x4f, 0xa5, 0x4c, 0xe9, 0xaf, 0xb9, 0xb0, |
2407 | 0x36, 0x85, 0x9a, 0xb8, 0x00, 0xa9, 0x46, 0x47, 0x78, 0x3f, 0x43, 0x18, | 2407 | 0x7b, 0x57, 0xbf, 0xd4, 0xcd, 0xbb, 0x29, 0x65, 0xb9, 0xb4, 0x29, 0xd4, |
2408 | 0xf6, 0xb5, 0xdd, 0x1a, 0xc6, 0x1c, 0xa1, 0xfc, 0xbc, 0x39, 0xa5, 0xfe, | 2408 | 0xc4, 0x79, 0x48, 0x35, 0x3c, 0xc8, 0xfb, 0x19, 0xc2, 0xb0, 0xaf, 0x35, |
2409 | 0xb7, 0x7b, 0x97, 0xd6, 0x9a, 0x42, 0xfb, 0x0a, 0xf6, 0x7f, 0x45, 0xfb, | 2409 | 0x35, 0x8c, 0x39, 0x48, 0xf9, 0xb9, 0x73, 0x4a, 0xfd, 0x6f, 0xf7, 0x2e, |
2410 | 0x8a, 0xa8, 0xa4, 0xef, 0x2b, 0xf8, 0x5e, 0xe1, 0x77, 0x90, 0x8b, 0x7f, | 2410 | 0xcd, 0x35, 0x85, 0xf6, 0x15, 0xec, 0xff, 0x43, 0xed, 0x2b, 0xa2, 0xe2, |
2411 | 0xed, 0x0e, 0x2f, 0xde, 0xbb, 0x32, 0x67, 0xf3, 0x0e, 0xc3, 0x95, 0x8b, | 2411 | 0x9e, 0xaf, 0xe0, 0x7b, 0x91, 0xdf, 0x7e, 0x2e, 0xfe, 0xed, 0xbb, 0xdc, |
2412 | 0x76, 0xc9, 0x78, 0xf0, 0x96, 0x3a, 0x33, 0xad, 0xf3, 0x73, 0x11, 0xb2, | 2412 | 0x78, 0xef, 0xc8, 0xb4, 0xcd, 0x3b, 0x0c, 0x47, 0x2e, 0xdb, 0x45, 0xe3, |
2413 | 0xbf, 0xdc, 0xd0, 0x3d, 0x9b, 0x5c, 0x6a, 0xc4, 0xe4, 0xca, 0x6a, 0x97, | 2413 | 0x91, 0x4d, 0x75, 0x66, 0x52, 0xe7, 0xe7, 0x02, 0x64, 0xbf, 0x5e, 0xd7, |
2414 | 0x5c, 0x5e, 0xf6, 0x6c, 0xfe, 0xf2, 0x32, 0xed, 0xdc, 0x94, 0xef, 0xad, | 2414 | 0x3d, 0x9b, 0x5c, 0xa9, 0x47, 0xe4, 0xea, 0x52, 0xbb, 0xac, 0x2f, 0xb8, |
2415 | 0x5a, 0x58, 0x4b, 0xe3, 0xaf, 0x5f, 0xde, 0x59, 0xbd, 0xb5, 0xee, 0x3c, | 2415 | 0x36, 0xbf, 0xbe, 0x40, 0x3b, 0x37, 0xe5, 0xed, 0x25, 0x0b, 0x6b, 0x49, |
2416 | 0xdf, 0x7c, 0x00, 0xb4, 0xf4, 0x4b, 0xc4, 0x72, 0x75, 0xff, 0x95, 0x47, | 2416 | 0xfc, 0xf5, 0xc8, 0xf5, 0xa5, 0xcd, 0x75, 0xe7, 0x85, 0xc6, 0xc3, 0xa0, |
2417 | 0xee, 0x2b, 0xc9, 0x94, 0x14, 0xaa, 0x43, 0xe8, 0x01, 0x91, 0x9c, 0xa3, | 2417 | 0xa5, 0x47, 0x42, 0x96, 0xa3, 0xfb, 0xaf, 0x1c, 0x72, 0x5f, 0x51, 0xc6, |
2418 | 0xcc, 0x41, 0xd0, 0x7f, 0xf5, 0x33, 0xa8, 0x4d, 0x52, 0x70, 0x9e, 0x21, | 2418 | 0x25, 0x5f, 0xe9, 0x47, 0x0f, 0x88, 0xe4, 0x1c, 0x66, 0x0e, 0x82, 0xfe, |
2419 | 0x7d, 0x8f, 0xf8, 0x33, 0xd1, 0x7e, 0x69, 0xb7, 0xbe, 0xdc, 0xe7, 0xe5, | 2419 | 0x2b, 0x9f, 0x40, 0x6d, 0x92, 0x80, 0xf3, 0xf4, 0xeb, 0x7b, 0xc5, 0x4f, |
2420 | 0x2a, 0xd3, 0xeb, 0x53, 0xad, 0x20, 0x5f, 0xbf, 0x0e, 0xdc, 0xe3, 0xb0, | 2420 | 0x85, 0x7b, 0xa4, 0xd5, 0xfa, 0xa3, 0x6e, 0x37, 0x57, 0x99, 0x6e, 0x9f, |
2421 | 0x53, 0xda, 0xa6, 0x0d, 0x9b, 0x35, 0x65, 0x6d, 0x34, 0x55, 0x2b, 0x09, | 2421 | 0x6a, 0xf9, 0xf9, 0xfa, 0x75, 0xe0, 0x1e, 0x81, 0x9d, 0xd2, 0x36, 0x6d, |
2422 | 0xe3, 0x43, 0x06, 0x67, 0x7e, 0x08, 0x9e, 0xd3, 0x90, 0x47, 0xa7, 0xae, | 2422 | 0xd8, 0xac, 0x29, 0xcb, 0x43, 0x89, 0x6a, 0x51, 0x18, 0x1f, 0x52, 0x38, |
2423 | 0x85, 0x72, 0x0a, 0xba, 0x5d, 0x9c, 0x97, 0x42, 0xf3, 0x57, 0x80, 0x2f, | 2423 | 0xd3, 0xc0, 0xbe, 0x24, 0xe4, 0xb1, 0x43, 0xd7, 0x42, 0x19, 0x05, 0xdd, |
2424 | 0x27, 0xb3, 0xcd, 0x49, 0x9c, 0x75, 0x1c, 0x76, 0x3b, 0xda, 0x2f, 0x5d, | 2424 | 0xce, 0xcd, 0x48, 0xbe, 0xf1, 0x9b, 0x98, 0xcf, 0xc8, 0x54, 0x63, 0x0c, |
2425 | 0x3c, 0x27, 0x03, 0x1a, 0xef, 0x97, 0xe2, 0xc9, 0x79, 0x39, 0x58, 0x25, | 2425 | 0x67, 0x9d, 0xa4, 0xdd, 0xf6, 0x48, 0x3b, 0xcf, 0x49, 0x81, 0xc6, 0x87, |
2426 | 0x9d, 0xc8, 0x25, 0x76, 0x2a, 0x9d, 0x97, 0xb1, 0xe4, 0x2a, 0x6a, 0x27, | 2426 | 0xa4, 0x70, 0x7a, 0x46, 0x0e, 0x57, 0x48, 0x27, 0xef, 0x19, 0x13, 0xc9, |
2427 | 0xcf, 0x1f, 0xb3, 0x52, 0x3c, 0x05, 0x1c, 0x55, 0xde, 0x03, 0x0c, 0xc1, | 2427 | 0x9c, 0x0c, 0xc7, 0x97, 0x50, 0x3b, 0xb9, 0xfe, 0x98, 0x96, 0xc2, 0x19, |
2428 | 0x6e, 0xc6, 0x74, 0x5f, 0x33, 0xab, 0xe3, 0x0e, 0xe7, 0xdf, 0x84, 0x9e, | 2428 | 0xe0, 0xa8, 0xf0, 0x1e, 0xa0, 0x1f, 0x76, 0x33, 0xac, 0xfb, 0x9a, 0x29, |
2429 | 0x86, 0x4a, 0x7b, 0x00, 0x57, 0x40, 0x0f, 0x34, 0x83, 0x7a, 0x79, 0xa5, | 2429 | 0x1d, 0x77, 0x38, 0xff, 0x43, 0xe8, 0xa9, 0xbf, 0xb8, 0x1f, 0x70, 0x79, |
2430 | 0x8a, 0x7e, 0xcf, 0x8e, 0xb0, 0xf6, 0x52, 0xea, 0x9e, 0x01, 0xa9, 0x57, | 2430 | 0xf4, 0x40, 0x93, 0xa8, 0x97, 0x17, 0x2b, 0xe8, 0xf7, 0xec, 0x10, 0x6b, |
2431 | 0xc7, 0x4c, 0xa5, 0x58, 0x53, 0x51, 0x17, 0x5c, 0xa3, 0x7f, 0x27, 0x54, | 2431 | 0x2f, 0xa5, 0xee, 0xef, 0x93, 0x5a, 0x65, 0xd8, 0x54, 0x8a, 0x35, 0x15, |
2432 | 0xd4, 0x1a, 0x90, 0xd5, 0x6a, 0x09, 0x7d, 0xb3, 0xf2, 0xef, 0x35, 0x4a, | 2432 | 0x75, 0xc1, 0x35, 0xfa, 0x77, 0x4c, 0x85, 0xad, 0x3e, 0x59, 0xaa, 0x14, |
2433 | 0x62, 0x5a, 0x5e, 0xdc, 0xcb, 0x29, 0xf2, 0x8d, 0xfa, 0xb3, 0xf9, 0x59, | 2433 | 0xd1, 0x37, 0x2b, 0xef, 0x5e, 0x03, 0x16, 0x60, 0xb9, 0x71, 0x2f, 0xa3, |
2434 | 0xd0, 0x98, 0x4b, 0x9a, 0x72, 0x14, 0xf4, 0xe1, 0x7d, 0x05, 0x36, 0xbe, | 2434 | 0xc8, 0x37, 0xea, 0xcf, 0xc6, 0x27, 0x41, 0x63, 0x26, 0x6e, 0xca, 0x71, |
2435 | 0xc8, 0x1a, 0x2e, 0x87, 0xb5, 0xac, 0x1c, 0x3e, 0x33, 0x03, 0x1a, 0x7a, | 2435 | 0xd0, 0x87, 0xf7, 0x45, 0xd8, 0xf8, 0x1c, 0x6b, 0xb8, 0x0c, 0xd6, 0xd2, |
2436 | 0x65, 0xe8, 0x77, 0xe9, 0x63, 0x07, 0x30, 0xc7, 0xef, 0x14, 0xec, 0xf5, | 2436 | 0x72, 0xe4, 0xec, 0x24, 0x68, 0xe8, 0x92, 0xfe, 0x3f, 0xa1, 0x8f, 0x3d, |
2437 | 0x31, 0xbc, 0x13, 0x36, 0x81, 0x27, 0xe5, 0x30, 0x80, 0xa7, 0x09, 0x5a, | 2437 | 0x81, 0x39, 0x7e, 0x27, 0x60, 0xaf, 0x5f, 0xc4, 0x3b, 0x61, 0x63, 0x78, |
2438 | 0x62, 0x5e, 0x6f, 0xb2, 0x3f, 0x29, 0xf5, 0x93, 0xf7, 0xc9, 0xec, 0xca, | 2438 | 0x52, 0x0e, 0x7d, 0x78, 0x9a, 0xa0, 0x25, 0xe2, 0xf6, 0x26, 0x87, 0xe2, |
2439 | 0x7d, 0xc0, 0xff, 0x36, 0xfa, 0x02, 0xe4, 0xb7, 0x15, 0x9e, 0xc5, 0xfa, | 2439 | 0x52, 0x3b, 0xfd, 0xa0, 0x4c, 0x2d, 0x3e, 0x08, 0xfc, 0x3f, 0x42, 0x5f, |
2440 | 0x8f, 0xe7, 0x74, 0xf4, 0x6b, 0xdf, 0x58, 0xe4, 0x3c, 0x9f, 0xfb, 0xb0, | 2440 | 0x80, 0xfc, 0xb6, 0xc8, 0xb3, 0x58, 0xff, 0xf1, 0x9c, 0x9d, 0x3d, 0xda, |
2441 | 0x1f, 0x3d, 0x46, 0x35, 0x27, 0xc5, 0x2a, 0xcf, 0x82, 0xee, 0x50, 0x4f, | 2441 | 0x37, 0xe6, 0x38, 0xcf, 0xe7, 0x41, 0xec, 0x47, 0x8f, 0x51, 0xc9, 0x48, |
2442 | 0x15, 0x4e, 0xce, 0xf8, 0x3a, 0xee, 0x97, 0x7c, 0xbc, 0xc4, 0xfe, 0x02, | 2442 | 0xa1, 0xc2, 0xb3, 0xa0, 0x3b, 0xd4, 0x53, 0xf9, 0xd3, 0x93, 0x9e, 0x8e, |
2443 | 0x79, 0x62, 0x79, 0xc2, 0xa9, 0xa4, 0x4c, 0x47, 0x11, 0x57, 0x5a, 0x98, | 2443 | 0x7b, 0x24, 0x17, 0x2d, 0xb2, 0xbf, 0x40, 0x9e, 0x58, 0x18, 0xcd, 0x96, |
2444 | 0x1b, 0xbc, 0xb9, 0x98, 0x58, 0x8b, 0xe8, 0x6d, 0xb3, 0x5c, 0x3b, 0xea, | 2444 | 0x13, 0x66, 0x56, 0x11, 0x57, 0x52, 0x98, 0x1b, 0xdc, 0xb9, 0x88, 0x58, |
2445 | 0xdf, 0x1d, 0x10, 0xd7, 0x5b, 0x32, 0x05, 0x1b, 0x1b, 0x5a, 0x1c, 0x47, | 2445 | 0x73, 0xe8, 0x6d, 0xd3, 0x5c, 0x3b, 0xee, 0xdd, 0x1d, 0x10, 0xd7, 0x9b, |
2446 | 0x2d, 0xfc, 0x5d, 0xd4, 0x92, 0x77, 0xfa, 0x32, 0x98, 0xf4, 0x6d, 0xa3, | 2446 | 0x32, 0x0e, 0x1b, 0xeb, 0x9f, 0x1b, 0x41, 0x2d, 0xfc, 0x16, 0x6a, 0xc9, |
2447 | 0xab, 0xc5, 0x26, 0xa0, 0xe7, 0x2a, 0x74, 0x5f, 0x85, 0x1d, 0x20, 0x56, | 2447 | 0x84, 0x27, 0x83, 0x31, 0xcf, 0x36, 0xda, 0x9b, 0x6c, 0x02, 0x7a, 0xae, |
2448 | 0xbf, 0x74, 0xc3, 0x3e, 0x26, 0x5b, 0x6a, 0xcc, 0x1e, 0xf9, 0x8b, 0x5a, | 2448 | 0x40, 0xf7, 0x15, 0xd8, 0x01, 0x62, 0xf5, 0x2b, 0x1b, 0xf6, 0x31, 0xd6, |
2449 | 0x2a, 0xbd, 0x01, 0xfb, 0x79, 0x07, 0xbd, 0xc0, 0x06, 0x7a, 0xd5, 0xcb, | 2449 | 0x54, 0x63, 0x76, 0xca, 0xdf, 0x54, 0x13, 0xc9, 0x35, 0xd8, 0xcf, 0x75, |
2450 | 0xe8, 0xeb, 0x56, 0x2a, 0xfb, 0x41, 0x3f, 0x6b, 0x4a, 0x7e, 0x27, 0x74, | 2450 | 0xf4, 0x02, 0x6b, 0xe8, 0x55, 0xd7, 0xd1, 0xd7, 0x2d, 0x96, 0x0f, 0x81, |
2451 | 0xad, 0xd3, 0x61, 0x1d, 0xbb, 0x43, 0xdf, 0xed, 0xca, 0xfe, 0x7e, 0xf6, | 2451 | 0x7e, 0xd6, 0x94, 0xfc, 0x8e, 0xe9, 0x5a, 0xa7, 0xcd, 0x7a, 0xe1, 0x2e, |
2452 | 0x9a, 0xec, 0xcb, 0x79, 0x0f, 0x7d, 0x05, 0x7a, 0xdc, 0x30, 0xb9, 0x1e, | 2452 | 0x7d, 0xb7, 0x2b, 0x4f, 0xf4, 0xb0, 0xd7, 0x64, 0x5f, 0xce, 0x7b, 0xe9, |
2453 | 0xec, 0x63, 0x2f, 0x10, 0xd8, 0x0f, 0x69, 0xa1, 0xfd, 0x70, 0x0f, 0x61, | 2453 | 0xab, 0xd0, 0xe3, 0x9a, 0xc9, 0x75, 0x7f, 0x1f, 0x7b, 0x01, 0xdf, 0x7e, |
2454 | 0xfa, 0xb5, 0x9f, 0x14, 0x34, 0x3e, 0xda, 0xec, 0x8b, 0x7d, 0x9e, 0x9f, | 2454 | 0x48, 0x0b, 0xed, 0x87, 0x7b, 0x08, 0xd3, 0xa3, 0xfd, 0x24, 0xaf, 0xf1, |
2455 | 0xe9, 0x3a, 0xcb, 0xbc, 0x24, 0x81, 0xfd, 0xbe, 0xef, 0xb2, 0xaf, 0x73, | 2455 | 0xd1, 0x66, 0xeb, 0xdd, 0xae, 0x9f, 0xe9, 0x3a, 0xcb, 0xbc, 0x22, 0xbe, |
2456 | 0x46, 0x11, 0xbb, 0x9b, 0xae, 0x3c, 0x67, 0xdf, 0xea, 0x77, 0x7b, 0xab, | 2456 | 0xfd, 0xbe, 0xe7, 0xb0, 0xaf, 0xcb, 0x0e, 0x21, 0x76, 0x37, 0x1c, 0x79, |
2457 | 0x81, 0x9c, 0x28, 0xc7, 0xfd, 0x72, 0xac, 0x99, 0x82, 0x4f, 0x50, 0x86, | 2457 | 0xc1, 0xde, 0xec, 0x77, 0x07, 0x2a, 0xbe, 0x9c, 0x28, 0xc7, 0x43, 0x72, |
2458 | 0x56, 0x8b, 0x0c, 0x45, 0xfe, 0xa8, 0x2a, 0xf2, 0x62, 0x95, 0x6b, 0x5a, | 2458 | 0xa2, 0x91, 0x80, 0x4f, 0x50, 0x86, 0x56, 0x93, 0x0c, 0x45, 0xbe, 0x5e, |
2459 | 0x86, 0x09, 0x27, 0xd2, 0xa5, 0xef, 0xd2, 0x0b, 0xf2, 0x1d, 0x39, 0xb8, | 2459 | 0x11, 0x79, 0xb9, 0xc2, 0x35, 0x2d, 0xc3, 0x58, 0x36, 0xd4, 0xce, 0xbb, |
2460 | 0x24, 0x72, 0x06, 0xeb, 0x6b, 0x55, 0xfa, 0xea, 0x38, 0xea, 0xd7, 0x6d, | 2460 | 0x75, 0xd8, 0xe5, 0xdf, 0xcb, 0xe1, 0x79, 0x91, 0xb3, 0x58, 0x5f, 0xae, |
2461 | 0x52, 0x5f, 0x46, 0x4f, 0x56, 0x95, 0x59, 0xe7, 0x5e, 0xe6, 0x9b, 0x98, | 2461 | 0xd0, 0x57, 0x47, 0x50, 0xbf, 0xee, 0x94, 0xda, 0x02, 0x7a, 0xb2, 0x8a, |
2462 | 0x5c, 0xd6, 0x77, 0xb2, 0x22, 0x23, 0x67, 0xa3, 0x12, 0x3d, 0x8b, 0xe6, | 2462 | 0x4c, 0x65, 0x1f, 0x60, 0xbe, 0x89, 0xc8, 0xba, 0xbe, 0x93, 0x15, 0x19, |
2463 | 0x0f, 0xb2, 0x3f, 0x37, 0x1a, 0xdc, 0xd1, 0x7a, 0x3e, 0x5f, 0xae, 0x60, | 2463 | 0x3c, 0x17, 0x96, 0xf0, 0x39, 0x34, 0x7f, 0x90, 0xfd, 0xf9, 0x21, 0xff, |
2464 | 0x6f, 0x75, 0x48, 0xc7, 0xc9, 0x72, 0xa3, 0x28, 0x85, 0x1a, 0xcf, 0xc2, | 2464 | 0x8e, 0xd6, 0xf5, 0xf9, 0x52, 0x19, 0x7b, 0x2b, 0xfd, 0x3a, 0x4e, 0x96, |
2465 | 0x73, 0x39, 0x89, 0xb5, 0x8c, 0xcc, 0x9d, 0x1c, 0x97, 0xa7, 0x71, 0x06, | 2465 | 0xea, 0x05, 0xc9, 0x57, 0x79, 0x16, 0x9e, 0x0b, 0x71, 0xac, 0xa5, 0x64, |
2466 | 0xfa, 0x3f, 0x9c, 0x31, 0x25, 0xa5, 0x33, 0x98, 0x6f, 0x5c, 0x95, 0xe5, | 2466 | 0xfa, 0xf4, 0x88, 0x3c, 0x8b, 0x33, 0xd0, 0xff, 0xe1, 0x8c, 0x71, 0x29, |
2467 | 0xd5, 0xa2, 0xd4, 0x6b, 0xe7, 0x5d, 0xaf, 0x8f, 0x20, 0x3e, 0x7c, 0x2f, | 2467 | 0x9e, 0xc5, 0x7c, 0xfd, 0x9a, 0x2c, 0x2c, 0x15, 0xa4, 0x56, 0xbd, 0xd0, |
2468 | 0xb7, 0xf6, 0xb2, 0xfb, 0xd9, 0xcf, 0xa0, 0x57, 0xb5, 0xf0, 0x0d, 0x99, | 2468 | 0x74, 0xf7, 0x8e, 0xef, 0x85, 0xe6, 0x5e, 0xf6, 0x10, 0xfb, 0x19, 0xf4, |
2469 | 0x35, 0xe6, 0x66, 0x6f, 0xbd, 0x33, 0x6e, 0xed, 0x61, 0xa7, 0x65, 0xa1, | 2469 | 0xaa, 0x16, 0xbe, 0x21, 0xb3, 0xfa, 0xf4, 0xd4, 0xe6, 0x3b, 0xe3, 0xe6, |
2470 | 0x9a, 0x91, 0xf2, 0xc9, 0x71, 0x7d, 0xd7, 0xd0, 0x91, 0x3d, 0xfc, 0xc4, | 2470 | 0x1e, 0x76, 0x42, 0x66, 0x2b, 0x29, 0x29, 0x9d, 0x1e, 0xd1, 0x77, 0x0d, |
2471 | 0x35, 0xe4, 0x8a, 0x69, 0x7d, 0x67, 0x7c, 0x5d, 0x1e, 0xb2, 0x17, 0xe4, | 2471 | 0x6d, 0xe9, 0xea, 0xd3, 0x37, 0x90, 0x2b, 0x26, 0xf4, 0x9d, 0xf1, 0x2d, |
2472 | 0x90, 0xb5, 0x4f, 0x8e, 0xa1, 0xbe, 0xfe, 0x1c, 0x7a, 0xfd, 0x64, 0x1f, | 2472 | 0x79, 0xd4, 0x9e, 0x95, 0x27, 0xad, 0x83, 0x72, 0x02, 0xf5, 0xf5, 0xa7, |
2473 | 0xf5, 0x08, 0x7a, 0x2d, 0xf6, 0xa0, 0xae, 0x4c, 0xd9, 0x9f, 0x36, 0x9f, | 2473 | 0xd1, 0xeb, 0xc7, 0xbb, 0xa9, 0x47, 0xd0, 0x6b, 0xb1, 0x07, 0x75, 0x64, |
2474 | 0x65, 0x97, 0xd0, 0x60, 0x9e, 0xfc, 0x2f, 0x37, 0x87, 0xbc, 0x77, 0x0d, | 2474 | 0xdc, 0xfe, 0xb8, 0xf9, 0x3c, 0x24, 0x7b, 0xb5, 0xce, 0x3c, 0xf9, 0x5f, |
2475 | 0xbd, 0x63, 0x4e, 0xc3, 0x19, 0x1e, 0x5c, 0x8d, 0x70, 0x63, 0xe6, 0x73, | 2475 | 0x4e, 0x06, 0x79, 0xef, 0x06, 0x7a, 0xc7, 0x8c, 0x86, 0x33, 0x5c, 0xb8, |
2476 | 0x84, 0x5b, 0x36, 0x7c, 0x38, 0x03, 0x70, 0x11, 0xb9, 0x60, 0x47, 0x61, | 2476 | 0x2a, 0xe1, 0x86, 0xcd, 0x17, 0x08, 0xb7, 0x60, 0x78, 0x70, 0x06, 0xe0, |
2477 | 0x23, 0xd3, 0xe0, 0x13, 0x31, 0x7e, 0xa2, 0xc7, 0xaf, 0x83, 0x3b, 0x91, | 2477 | 0x42, 0x72, 0xd1, 0x0e, 0xc3, 0x46, 0x26, 0xc0, 0x27, 0x62, 0xfc, 0x68, |
2478 | 0x5b, 0x6f, 0xee, 0x7f, 0xd5, 0xdf, 0xff, 0xb4, 0xbf, 0xff, 0xe2, 0x8d, | 2478 | 0xa7, 0x57, 0x07, 0xef, 0x40, 0x6e, 0xbd, 0xbd, 0xff, 0x35, 0x6f, 0xff, |
2479 | 0xfd, 0x41, 0x7e, 0xfd, 0xd0, 0x95, 0x16, 0xba, 0x5e, 0xad, 0x78, 0xf0, | 2479 | 0xb3, 0xde, 0xfe, 0xcb, 0x1b, 0xfb, 0xfd, 0xfc, 0xfa, 0x13, 0x47, 0x9a, |
2480 | 0x0b, 0x3e, 0x5d, 0x17, 0x6f, 0xd0, 0x15, 0xc0, 0x43, 0x9e, 0x9a, 0x67, | 2480 | 0xe8, 0x7a, 0xad, 0xec, 0xc2, 0xcf, 0x7a, 0x74, 0x5d, 0xde, 0xa0, 0xcb, |
2481 | 0xc6, 0x66, 0xc6, 0xe8, 0x21, 0xc8, 0xd1, 0x95, 0xbc, 0x0d, 0xdf, 0xa8, | 2481 | 0x87, 0x87, 0x3c, 0x35, 0xcf, 0x8c, 0xcd, 0x8c, 0xd1, 0xfd, 0x90, 0xa3, |
2482 | 0xa6, 0x26, 0x4b, 0xfa, 0x4e, 0x4d, 0xc9, 0x46, 0x7c, 0x41, 0xa6, 0xad, | 2482 | 0x23, 0x39, 0x1b, 0xbe, 0x51, 0x49, 0x8c, 0x15, 0xf5, 0x9d, 0x9a, 0x92, |
2483 | 0xd4, 0xe4, 0x9c, 0x44, 0x60, 0xcb, 0x8c, 0x2d, 0x11, 0xa9, 0x33, 0xe6, | 2483 | 0xb5, 0xe8, 0xac, 0x4c, 0x58, 0x89, 0xb1, 0x69, 0x09, 0xc1, 0x96, 0x19, |
2484 | 0xe0, 0x59, 0xb0, 0xb7, 0xa6, 0xf5, 0x4a, 0x0b, 0xad, 0x91, 0x17, 0x48, | 2484 | 0x5b, 0x42, 0x52, 0x63, 0xcc, 0xc1, 0x33, 0x6f, 0x6f, 0x4f, 0xeb, 0xd5, |
2485 | 0xa3, 0x47, 0x6b, 0x6c, 0xf8, 0x26, 0xad, 0x1e, 0xbc, 0x47, 0xeb, 0x95, | 2485 | 0x26, 0x5a, 0x43, 0x2f, 0x91, 0x46, 0x97, 0xd6, 0xc8, 0xc0, 0x6d, 0x5a, |
2486 | 0x4a, 0x0b, 0xfc, 0xd9, 0xa8, 0x0f, 0x1f, 0x6d, 0x81, 0xa7, 0x3d, 0xb3, | 2486 | 0x5d, 0x78, 0x97, 0xd6, 0xab, 0xe5, 0x26, 0xf8, 0x73, 0x61, 0x0f, 0x3e, |
2487 | 0xae, 0xa0, 0x3d, 0x93, 0xb6, 0x9f, 0x80, 0x6f, 0x48, 0xac, 0x33, 0x7b, | 2487 | 0xdc, 0x04, 0x4f, 0x7b, 0x66, 0x5d, 0x41, 0x7b, 0x26, 0x6d, 0x3f, 0x0b, |
2488 | 0xf8, 0xc8, 0xdd, 0xc3, 0xae, 0xc4, 0x50, 0x6f, 0xb4, 0x63, 0xed, 0x72, | 2488 | 0xdf, 0x90, 0xc8, 0x8e, 0x74, 0xf5, 0xe8, 0x7d, 0x03, 0x8e, 0x44, 0x50, |
2489 | 0x8d, 0xb5, 0x88, 0x1a, 0x6c, 0x97, 0x11, 0xd8, 0x2c, 0x75, 0xe7, 0xdd, | 2489 | 0x6f, 0xb4, 0x62, 0x6d, 0xbd, 0xca, 0x5a, 0x44, 0xed, 0x6d, 0x95, 0x41, |
2490 | 0x0d, 0x3e, 0xa4, 0x6b, 0x02, 0x57, 0x0e, 0xd9, 0xa4, 0xe5, 0x3f, 0xdd, | 2490 | 0xd8, 0x2c, 0x75, 0xe7, 0xde, 0x0d, 0x3e, 0xaa, 0x6b, 0x02, 0x47, 0x9e, |
2491 | 0x17, 0xe3, 0x23, 0x76, 0x59, 0x46, 0xcd, 0x76, 0x9c, 0x5f, 0x6f, 0x6a, | 2491 | 0xb4, 0x49, 0xcb, 0x8f, 0x9d, 0x97, 0xa3, 0x83, 0x76, 0x49, 0x86, 0xcc, |
2492 | 0x9c, 0x69, 0xd2, 0x72, 0x7a, 0x74, 0xc8, 0xfc, 0x73, 0xf0, 0x39, 0x55, | 2492 | 0x56, 0x9c, 0x5f, 0x6b, 0x68, 0x9c, 0x49, 0xd2, 0xb2, 0x32, 0xd4, 0x6f, |
2493 | 0x33, 0xa4, 0x6e, 0xa5, 0x12, 0xe7, 0x80, 0x63, 0x0f, 0x74, 0x53, 0x1f, | 2493 | 0x7e, 0x0f, 0x7c, 0x8e, 0x57, 0x0d, 0xa9, 0x59, 0x89, 0xd8, 0x79, 0xe0, |
2494 | 0x27, 0x3d, 0x22, 0x07, 0x61, 0xdf, 0x75, 0x9d, 0x17, 0x69, 0xc7, 0xa9, | 2494 | 0xd8, 0x0f, 0xdd, 0xd4, 0x46, 0x48, 0x8f, 0xc8, 0x61, 0xd8, 0x77, 0x4d, |
2495 | 0xe9, 0x12, 0x6a, 0x9d, 0x3f, 0xd6, 0xb9, 0xcd, 0x75, 0xaf, 0x21, 0xbf, | 2495 | 0xe7, 0x45, 0xda, 0x71, 0x62, 0xa2, 0x88, 0x5a, 0xe7, 0x2f, 0x75, 0x6e, |
2496 | 0x4d, 0x6f, 0xb2, 0x3d, 0x75, 0xd6, 0xb3, 0x3d, 0x75, 0x16, 0x3d, 0xf0, | 2496 | 0x73, 0x9c, 0x1b, 0xc8, 0x6f, 0x13, 0x5b, 0x6c, 0x4f, 0x9d, 0x73, 0x6d, |
2497 | 0xf1, 0x98, 0x74, 0xac, 0xc1, 0x7f, 0x5e, 0xd8, 0xe9, 0xd5, 0x73, 0x2f, | 2497 | 0x4f, 0x9d, 0x43, 0x0f, 0x7c, 0x32, 0x22, 0x6d, 0xcb, 0xf0, 0x9f, 0x97, |
2498 | 0x24, 0x8d, 0xfc, 0x49, 0xc4, 0xbb, 0xe3, 0x51, 0xb1, 0x8e, 0xeb, 0x7c, | 2498 | 0xf6, 0xb8, 0xf5, 0xdc, 0x4b, 0xfc, 0xdd, 0x09, 0xf1, 0xee, 0x64, 0x58, |
2499 | 0x00, 0x79, 0x4f, 0xc9, 0xdc, 0x29, 0xc6, 0x54, 0x4b, 0x86, 0x8f, 0x53, | 2499 | 0xac, 0x93, 0x3a, 0x1f, 0x40, 0xde, 0xe3, 0x32, 0x7d, 0x86, 0x31, 0xd5, |
2500 | 0x1f, 0xac, 0x6b, 0x96, 0x27, 0x8a, 0xf0, 0x91, 0x79, 0xc4, 0x05, 0xb5, | 2500 | 0x92, 0x81, 0x93, 0xd4, 0x07, 0xeb, 0x9a, 0x85, 0xd1, 0x02, 0x7c, 0x64, |
2501 | 0xf6, 0xae, 0x14, 0x2d, 0xca, 0xa1, 0x57, 0xba, 0xd6, 0xd0, 0x8f, 0xaf, | 2501 | 0x06, 0x71, 0x41, 0x2d, 0xdf, 0x94, 0x82, 0x45, 0x39, 0x74, 0x49, 0xfb, |
2502 | 0x21, 0x36, 0xac, 0x25, 0xa4, 0x0d, 0xbe, 0xa5, 0xce, 0xc6, 0x8d, 0xf2, | 2502 | 0x32, 0xfa, 0xf1, 0x65, 0xc4, 0x86, 0xe5, 0x98, 0xb4, 0xc0, 0xb7, 0xd4, |
2503 | 0xd2, 0x0f, 0xe1, 0x0f, 0xfc, 0x0d, 0x07, 0xb5, 0xe5, 0xd9, 0x84, 0x41, | 2503 | 0xb9, 0xa8, 0x51, 0x9a, 0x7f, 0x17, 0xfe, 0xc0, 0xdf, 0x70, 0x50, 0x5b, |
2504 | 0xdf, 0x52, 0x67, 0x69, 0xe7, 0x28, 0xa7, 0xce, 0xd2, 0xce, 0x49, 0x47, | 2504 | 0x9e, 0x8b, 0x19, 0xf4, 0x2d, 0x75, 0x8e, 0x76, 0x8e, 0x72, 0xea, 0x1c, |
2505 | 0xe0, 0x2f, 0x78, 0x3f, 0x3b, 0xae, 0xef, 0xa9, 0xaf, 0xd9, 0xe4, 0xe5, | 2505 | 0xed, 0x9c, 0x74, 0xf8, 0xfe, 0x82, 0xf7, 0x73, 0x23, 0xfa, 0x9e, 0xfa, |
2506 | 0x6f, 0xc4, 0xa9, 0xb1, 0x46, 0x24, 0x3f, 0xd2, 0x87, 0x5a, 0x66, 0xbb, | 2506 | 0x86, 0x4d, 0x5e, 0x7e, 0x20, 0xd9, 0x2a, 0x6b, 0x44, 0xf2, 0x23, 0xdd, |
2507 | 0x63, 0x0f, 0x4f, 0x5e, 0x96, 0x4f, 0xca, 0xd7, 0xed, 0x9f, 0x80, 0x2f, | 2507 | 0xa8, 0x65, 0x76, 0x65, 0xed, 0x81, 0xb1, 0x75, 0xf9, 0xa8, 0x7c, 0xdd, |
2508 | 0xf2, 0xd1, 0xca, 0x17, 0x79, 0xea, 0x95, 0x36, 0xcd, 0x57, 0xc0, 0x0f, | 2508 | 0xf9, 0x11, 0xf8, 0x22, 0x1f, 0xcd, 0x7c, 0x91, 0xa7, 0x2e, 0x69, 0xd1, |
2509 | 0x04, 0x0d, 0x7e, 0x06, 0x8f, 0x27, 0x80, 0xff, 0x31, 0xc4, 0x80, 0x01, | 2509 | 0x7c, 0xf9, 0xfc, 0x40, 0xd0, 0xe0, 0x67, 0xef, 0xc9, 0x18, 0xf0, 0x7f, |
2510 | 0x3c, 0x0f, 0xe0, 0x89, 0x94, 0x76, 0x96, 0xbc, 0x93, 0xd7, 0x77, 0x50, | 2510 | 0x11, 0x31, 0xa0, 0x0f, 0xcf, 0x27, 0xf0, 0x44, 0x4a, 0x3b, 0x47, 0xde, |
2511 | 0x37, 0x06, 0x7c, 0xce, 0xe2, 0xfd, 0x15, 0x99, 0x5b, 0x72, 0x8f, 0x22, | 2511 | 0xc9, 0xeb, 0x75, 0xd4, 0x8d, 0x3e, 0x9f, 0x53, 0x78, 0x7f, 0x55, 0xa6, |
2512 | 0xaf, 0xf2, 0x0e, 0xbd, 0xdf, 0xbb, 0x0f, 0xde, 0xcc, 0xfb, 0x2b, 0xe2, | 2512 | 0xe7, 0x9d, 0xe3, 0xc8, 0xab, 0xbc, 0x43, 0xef, 0x71, 0xef, 0x83, 0xb7, |
2513 | 0xc9, 0x27, 0x65, 0xd6, 0x05, 0xef, 0xab, 0x9b, 0x65, 0xd1, 0x1a, 0x3b, | 2513 | 0xf2, 0xfe, 0xaa, 0xb8, 0xf2, 0x49, 0x98, 0x35, 0xc1, 0xfb, 0xd2, 0x56, |
2514 | 0x12, 0xba, 0x0e, 0x3f, 0xd8, 0x60, 0x9c, 0xa0, 0x8c, 0xde, 0x11, 0x67, | 2514 | 0x59, 0x34, 0xc7, 0x8e, 0x98, 0xae, 0xc3, 0x0f, 0xd7, 0x19, 0x27, 0x28, |
2515 | 0x89, 0xf7, 0x5f, 0x1e, 0xbe, 0xd9, 0x46, 0x10, 0x37, 0x5a, 0xf7, 0xd8, | 2515 | 0xa3, 0xeb, 0x92, 0x9d, 0xe7, 0xfd, 0x97, 0x8b, 0x6f, 0xaa, 0xee, 0xc7, |
2516 | 0x80, 0x1b, 0x00, 0x1c, 0xe9, 0xda, 0xa0, 0xfc, 0x10, 0x73, 0x76, 0xb5, | 2516 | 0x8d, 0xe6, 0x3d, 0x36, 0xe0, 0xfa, 0x00, 0x47, 0xba, 0xd6, 0x28, 0x3f, |
2517 | 0xc4, 0x9a, 0xd6, 0x7d, 0x93, 0xf2, 0x0c, 0xea, 0x80, 0x57, 0xed, 0x5b, | 2517 | 0xc4, 0x9c, 0xde, 0xa6, 0x58, 0xd3, 0xbc, 0x6f, 0x4c, 0x9e, 0x43, 0x1d, |
2518 | 0xe4, 0x3a, 0xcb, 0x5a, 0xa8, 0xde, 0x98, 0x81, 0x4f, 0xb6, 0x21, 0x96, | 2518 | 0xf0, 0x9a, 0xbd, 0x49, 0xae, 0x53, 0xac, 0x85, 0x6a, 0xf5, 0x49, 0xf8, |
2519 | 0x99, 0x72, 0xb9, 0xd2, 0x2e, 0x75, 0xd4, 0x3b, 0x2b, 0xab, 0x8c, 0x85, | 2519 | 0x64, 0x0b, 0x62, 0x99, 0x29, 0xeb, 0xe5, 0x56, 0xa9, 0xa1, 0xde, 0x59, |
2520 | 0xa4, 0xbd, 0x0b, 0xf3, 0x5e, 0xfc, 0x62, 0xac, 0xbd, 0x5c, 0x41, 0x9e, | 2520 | 0x5c, 0x62, 0x2c, 0x24, 0xed, 0xed, 0x98, 0x77, 0xe3, 0x17, 0x63, 0xed, |
2521 | 0x85, 0x6f, 0x5f, 0xae, 0xc4, 0xf1, 0x1c, 0xc0, 0xd3, 0xc2, 0x33, 0x89, | 2521 | 0x7a, 0x19, 0x79, 0x16, 0xbe, 0xbd, 0x5e, 0x8e, 0xe2, 0xd9, 0x87, 0xa7, |
2522 | 0x67, 0x1a, 0xcf, 0x71, 0x3c, 0xc7, 0xf1, 0xb4, 0xb0, 0x37, 0x81, 0x67, | 2522 | 0x85, 0x67, 0x1c, 0xcf, 0x24, 0x9e, 0x23, 0x78, 0x8e, 0xe0, 0x69, 0x61, |
2523 | 0xd0, 0x33, 0x10, 0xd7, 0x4d, 0xbe, 0xcb, 0xfa, 0x3c, 0xd4, 0x8a, 0x16, | 2523 | 0x6f, 0x0c, 0x4f, 0xbf, 0x67, 0x20, 0xae, 0xdb, 0x7c, 0x97, 0xf4, 0x79, |
2524 | 0x73, 0x5a, 0xd4, 0xce, 0xa3, 0x8f, 0x70, 0xc6, 0x75, 0xad, 0x87, 0xfc, | 2524 | 0xa8, 0x15, 0x2d, 0xe6, 0xb4, 0xb0, 0x9d, 0x43, 0x1f, 0x91, 0x1d, 0x61, |
2525 | 0xf6, 0x91, 0x6b, 0x5a, 0xec, 0xcb, 0x4b, 0xc6, 0x9e, 0x51, 0xe6, 0x85, | 2525 | 0xad, 0xc7, 0x9a, 0xef, 0x03, 0xc7, 0xb4, 0xd8, 0x97, 0x17, 0x8d, 0xfd, |
2526 | 0x1a, 0xf2, 0xc2, 0x7f, 0xec, 0x40, 0xff, 0x68, 0xee, 0xd5, 0x77, 0x47, | 2526 | 0x43, 0xcc, 0x0b, 0x55, 0xe4, 0x85, 0xf7, 0x76, 0xa3, 0x7f, 0x34, 0x0f, |
2527 | 0x4b, 0xf8, 0xe6, 0x3b, 0x7a, 0xde, 0xf8, 0x3c, 0xf2, 0x14, 0xe3, 0xa7, | 2527 | 0xe8, 0xbb, 0xa3, 0x79, 0x7c, 0xf3, 0x1d, 0x3d, 0x6f, 0x74, 0x06, 0x79, |
2528 | 0x8b, 0x3d, 0x05, 0xc4, 0xf1, 0xed, 0xf0, 0xbf, 0x1c, 0xe2, 0x36, 0xde, | 2528 | 0x8a, 0xf1, 0xd3, 0xc1, 0x9e, 0x3c, 0xe2, 0xf8, 0x2e, 0xf8, 0x5f, 0x06, |
2529 | 0x97, 0x37, 0x76, 0x78, 0x39, 0x15, 0xf5, 0xbb, 0xda, 0x7c, 0x5f, 0x63, | 2529 | 0x71, 0x1b, 0xef, 0x0b, 0x97, 0x76, 0xbb, 0x39, 0x15, 0xf9, 0x56, 0x6d, |
2530 | 0x63, 0xcf, 0x56, 0xbd, 0x41, 0x0f, 0x70, 0xa4, 0x6a, 0xcb, 0xf0, 0xc1, | 2530 | 0xbd, 0xaf, 0xb1, 0xb1, 0x67, 0xbb, 0xde, 0xa0, 0x13, 0x38, 0x12, 0xd5, |
2531 | 0x37, 0xed, 0xa3, 0xba, 0xb6, 0xa3, 0x2e, 0x9e, 0x46, 0x8d, 0x9a, 0x5f, | 2531 | 0x05, 0xf8, 0xe0, 0xf7, 0xed, 0xe3, 0xba, 0xb6, 0xa3, 0x2e, 0x9e, 0x45, |
2532 | 0x64, 0x0d, 0xf3, 0x14, 0xfa, 0x12, 0xf4, 0x67, 0x71, 0xf6, 0xe4, 0xcc, | 2532 | 0x8d, 0x9a, 0x9b, 0x63, 0x0d, 0x73, 0x0c, 0x7d, 0x09, 0xfa, 0xb3, 0x28, |
2533 | 0x05, 0xba, 0x16, 0x8d, 0x4b, 0x17, 0xf3, 0xc0, 0x15, 0x9c, 0x07, 0xbe, | 2533 | 0x7b, 0x72, 0xe6, 0x02, 0x5d, 0x8b, 0x46, 0xa5, 0x9d, 0x79, 0xe0, 0x06, |
2534 | 0x56, 0x5c, 0xc8, 0xec, 0x41, 0xd4, 0x84, 0xae, 0x1b, 0xb5, 0xf6, 0x48, | 2534 | 0xce, 0x03, 0x5f, 0x8b, 0x0e, 0x64, 0xf6, 0x08, 0x6a, 0x42, 0xc7, 0x09, |
2535 | 0xf2, 0x11, 0xc6, 0x1c, 0xc1, 0x7e, 0x53, 0xbc, 0x7b, 0x75, 0xc4, 0xdd, | 2535 | 0x5b, 0xfb, 0x25, 0xfe, 0x38, 0x63, 0x8e, 0x60, 0xbf, 0x29, 0xee, 0xbd, |
2536 | 0x19, 0xfd, 0xfb, 0x30, 0x8c, 0x6b, 0x1c, 0x7b, 0x6f, 0x13, 0xef, 0xb7, | 2536 | 0x3a, 0xe2, 0xee, 0xa4, 0xfe, 0xbd, 0x18, 0xc6, 0x65, 0x63, 0xef, 0x1d, |
2537 | 0x5c, 0xde, 0x69, 0x8b, 0xec, 0x59, 0xf4, 0x6a, 0x5a, 0x65, 0xb5, 0xe2, | 2537 | 0xc0, 0xc5, 0x79, 0xde, 0x69, 0x8b, 0xec, 0x9f, 0x73, 0x6b, 0x5a, 0x65, |
2538 | 0xfb, 0x49, 0x1f, 0x1f, 0xd7, 0x95, 0xff, 0xdb, 0xc6, 0x4e, 0xc8, 0x08, | 2538 | 0x35, 0xe3, 0xfb, 0x39, 0x0f, 0x1f, 0xd7, 0x95, 0xf7, 0xdb, 0xc6, 0x1e, |
2539 | 0xfe, 0x00, 0x1d, 0x1f, 0x43, 0xfd, 0x7c, 0x01, 0x7a, 0x79, 0x15, 0x3a, | 2539 | 0xc8, 0x08, 0xfe, 0x00, 0x1d, 0x9f, 0x40, 0xfd, 0x7c, 0x11, 0x7a, 0x79, |
2540 | 0x79, 0xad, 0x42, 0x5b, 0x1f, 0x83, 0xdd, 0x43, 0x86, 0x33, 0xfa, 0x0c, | 2540 | 0x0d, 0x3a, 0xb9, 0x54, 0xa6, 0xad, 0x0f, 0xc3, 0xee, 0x21, 0xc3, 0x49, |
2541 | 0x7d, 0xf6, 0x85, 0x0a, 0x62, 0x27, 0xe3, 0x9f, 0xfa, 0x52, 0x9c, 0xf5, | 2541 | 0xe2, 0x1a, 0xd1, 0x67, 0x5f, 0x2c, 0x23, 0x76, 0x32, 0xfe, 0xa9, 0x5f, |
2542 | 0x21, 0xf3, 0xa0, 0x87, 0x67, 0xc0, 0x83, 0x93, 0x60, 0x6d, 0x87, 0xa6, | 2542 | 0x8d, 0xb2, 0x3e, 0x64, 0x1e, 0x74, 0xf1, 0xf4, 0xb9, 0x70, 0xe2, 0xaf, |
2543 | 0xa7, 0xae, 0xef, 0xc1, 0x28, 0x27, 0xd8, 0x20, 0x7f, 0x23, 0xd0, 0x30, | 2543 | 0xed, 0xd6, 0xf4, 0xd4, 0xf4, 0x3d, 0x18, 0xe5, 0x04, 0x1b, 0xe4, 0x6f, |
2544 | 0x5f, 0x8c, 0xeb, 0x7b, 0x78, 0xc5, 0x39, 0xf2, 0x31, 0x2e, 0xce, 0x62, | 2544 | 0x04, 0x1a, 0xe6, 0x0b, 0x51, 0x7d, 0x0f, 0xaf, 0x38, 0x47, 0x3e, 0x46, |
2545 | 0xb0, 0xaf, 0x0f, 0xfb, 0x3a, 0x5b, 0x70, 0xdd, 0xbe, 0x89, 0x07, 0xe5, | 2545 | 0x24, 0x3b, 0xe7, 0xef, 0xeb, 0xc6, 0xbe, 0x1d, 0x4d, 0xb8, 0xee, 0xdc, |
2546 | 0xf3, 0xc0, 0xf5, 0xcd, 0x75, 0x7f, 0xca, 0x2c, 0xdd, 0xb8, 0x1b, 0x66, | 2546 | 0xc2, 0x83, 0xf2, 0x78, 0xe0, 0xfa, 0xd6, 0xba, 0x3f, 0x61, 0x16, 0x37, |
2547 | 0xfe, 0xa5, 0x6e, 0x32, 0xd8, 0x1f, 0xe8, 0x67, 0xc0, 0xef, 0x05, 0x52, | 2547 | 0xee, 0x86, 0x99, 0x7f, 0xa9, 0x9b, 0x14, 0xf6, 0xfb, 0xfa, 0xe9, 0xf3, |
2548 | 0x0b, 0xe8, 0x23, 0x20, 0x7f, 0xea, 0x68, 0x92, 0xf1, 0x09, 0xf8, 0x6d, | 2548 | 0x7a, 0x81, 0xc4, 0x6c, 0x51, 0x58, 0xab, 0x50, 0x47, 0x63, 0xf0, 0x6b, |
2549 | 0xa9, 0x55, 0x3a, 0x44, 0xf5, 0xb3, 0x37, 0x66, 0xad, 0xdc, 0x7a, 0xe6, | 2549 | 0x13, 0xf8, 0x6d, 0xa9, 0x96, 0xdb, 0x44, 0xf5, 0xb0, 0x37, 0x66, 0xad, |
2550 | 0x2f, 0xfa, 0x67, 0xa2, 0x9f, 0x3e, 0xc1, 0xba, 0x59, 0xe7, 0x19, 0xc0, | 2550 | 0xdc, 0x7c, 0xe6, 0xaf, 0x78, 0x67, 0xa2, 0x9f, 0x3e, 0xc5, 0xba, 0x59, |
2551 | 0x74, 0x6f, 0xa2, 0xed, 0xe7, 0x7c, 0x38, 0xae, 0xa7, 0xa5, 0x84, 0x3a, | 2551 | 0xe7, 0x19, 0xc0, 0x74, 0x6c, 0xa1, 0xed, 0x17, 0x3d, 0x38, 0xae, 0x27, |
2552 | 0x34, 0xbf, 0x88, 0x8a, 0x1e, 0xf1, 0x5b, 0x65, 0xf9, 0xbb, 0x16, 0xef, | 2552 | 0xa5, 0x88, 0x3a, 0x34, 0x37, 0x87, 0x8a, 0x1e, 0xf1, 0x5b, 0xa5, 0xf9, |
2553 | 0xf0, 0xc6, 0x92, 0x73, 0xa0, 0xb1, 0x64, 0xe6, 0x78, 0x6f, 0x06, 0x1c, | 2553 | 0xbb, 0x16, 0xef, 0xf0, 0x86, 0xe3, 0xd3, 0xa0, 0xb1, 0x68, 0x66, 0x78, |
2554 | 0xbb, 0x36, 0xe1, 0x98, 0xf2, 0x71, 0x4c, 0x49, 0xf9, 0xd4, 0x34, 0x7c, | 2554 | 0x6f, 0x06, 0x1c, 0xbd, 0x5b, 0x70, 0x8c, 0x7b, 0x38, 0xc6, 0xa5, 0x74, |
2555 | 0x2d, 0x87, 0xfc, 0x3e, 0x64, 0x3e, 0x28, 0x9f, 0x41, 0x73, 0x8d, 0xb9, | 2555 | 0x66, 0x02, 0xbe, 0x96, 0x41, 0x7e, 0xef, 0x37, 0x1f, 0x91, 0x4f, 0xa0, |
2556 | 0x33, 0xe3, 0xd0, 0x93, 0xeb, 0xee, 0xb1, 0xf7, 0x83, 0xee, 0x97, 0x91, | 2556 | 0xb9, 0xc6, 0xdc, 0xd9, 0x11, 0xe8, 0xc9, 0x71, 0xf6, 0xdb, 0x87, 0x40, |
2557 | 0x5b, 0x83, 0x9a, 0xa7, 0x9c, 0x88, 0x20, 0x87, 0x1d, 0xd6, 0xbf, 0xc3, | 2557 | 0xf7, 0x77, 0x90, 0x5b, 0xfd, 0x9a, 0xa7, 0x14, 0x0b, 0x21, 0x87, 0x1d, |
2558 | 0x96, 0x4c, 0x13, 0xf6, 0xaa, 0x8c, 0xb1, 0x34, 0xda, 0x7b, 0xe4, 0xb7, | 2558 | 0xd1, 0xbf, 0xc3, 0x16, 0x4d, 0x13, 0xf6, 0xaa, 0x8c, 0xe1, 0x24, 0xda, |
2559 | 0x05, 0xe4, 0x2a, 0xf2, 0xd9, 0x23, 0x65, 0xd3, 0x78, 0x20, 0x82, 0xba, | 2559 | 0x7b, 0xe4, 0xb7, 0x59, 0xe4, 0x2a, 0xf2, 0xd9, 0x29, 0x25, 0xd3, 0x78, |
2560 | 0xc6, 0x59, 0xa4, 0x1f, 0xc9, 0x70, 0x24, 0xdb, 0x8e, 0x9a, 0xd4, 0x95, | 2560 | 0x38, 0x84, 0xba, 0x26, 0x3b, 0x47, 0x3f, 0x92, 0x81, 0x50, 0xba, 0x15, |
2561 | 0xef, 0xd9, 0xfc, 0x77, 0x09, 0x0b, 0x72, 0xa1, 0x61, 0xe2, 0x79, 0x0e, | 2561 | 0x35, 0xa9, 0x23, 0x6f, 0xdb, 0xfc, 0x77, 0x0a, 0xb3, 0x72, 0xb1, 0x6e, |
2562 | 0x7a, 0xf8, 0x3d, 0xbc, 0xff, 0x53, 0x3f, 0xea, 0x3e, 0xac, 0xe4, 0x60, | 2562 | 0xe2, 0xf9, 0x5d, 0xe8, 0xe1, 0x4f, 0xf1, 0xfe, 0x76, 0x0f, 0xea, 0x3e, |
2563 | 0xbb, 0x69, 0x5d, 0xcf, 0xb0, 0x8e, 0xa8, 0x23, 0xdf, 0x2a, 0xe4, 0x1a, | 2563 | 0xac, 0x64, 0x60, 0xbb, 0x49, 0x5d, 0xcf, 0xb0, 0x8e, 0xa8, 0x21, 0xdf, |
2564 | 0xd4, 0x55, 0x93, 0xac, 0x5d, 0x9f, 0x59, 0xb9, 0x2a, 0xaf, 0x2d, 0xf1, | 2564 | 0x2a, 0xe4, 0x1a, 0xd4, 0x55, 0x63, 0xac, 0x5d, 0x9f, 0x5b, 0xbc, 0x26, |
2565 | 0x77, 0x50, 0xe6, 0xe5, 0x7d, 0x8c, 0x07, 0xe6, 0x7c, 0x06, 0x73, 0xab, | 2565 | 0x97, 0xe6, 0xf9, 0x3b, 0x28, 0xf3, 0xf2, 0x41, 0xc6, 0x03, 0x73, 0x26, |
2566 | 0x8c, 0x65, 0xf8, 0x6e, 0xc2, 0x81, 0xfa, 0x51, 0x23, 0xa0, 0xd6, 0xbe, | 2566 | 0x85, 0xb9, 0x25, 0xc6, 0x32, 0x7c, 0x37, 0xe0, 0x40, 0x3d, 0xa8, 0x11, |
2567 | 0x6c, 0xa5, 0xc1, 0xe7, 0x55, 0xb9, 0xb0, 0x14, 0x95, 0x15, 0x8b, 0x75, | 2567 | 0x50, 0x6b, 0xaf, 0x5b, 0x49, 0xf0, 0x79, 0x4d, 0x2e, 0xce, 0x87, 0x65, |
2568 | 0x91, 0x24, 0x1d, 0xc0, 0x5e, 0x58, 0xfd, 0x07, 0xcf, 0x26, 0x08, 0x8f, | 2568 | 0xd1, 0x62, 0x5d, 0x24, 0xf1, 0x2c, 0x60, 0x2f, 0x2e, 0xfd, 0x93, 0x6b, |
2569 | 0x9e, 0xa7, 0x84, 0xba, 0xee, 0x41, 0xbd, 0xf7, 0x47, 0xe9, 0x99, 0x34, | 2569 | 0x13, 0x84, 0x47, 0xcf, 0x53, 0x44, 0x5d, 0xf7, 0x88, 0xde, 0xfb, 0xd3, |
2570 | 0xb5, 0xf6, 0x79, 0x45, 0xb9, 0x40, 0x7f, 0xd2, 0xbf, 0x51, 0xb0, 0x36, | 2570 | 0xf4, 0x4c, 0x9a, 0x9a, 0xfb, 0xbc, 0x82, 0x5c, 0xa4, 0x3f, 0xe9, 0xdf, |
2571 | 0x78, 0x0a, 0x36, 0xcb, 0xda, 0x9d, 0xfd, 0x00, 0xde, 0x1b, 0x5c, 0x27, | 2571 | 0x28, 0x58, 0x1b, 0x1c, 0x83, 0xcd, 0xb2, 0x76, 0x67, 0x3f, 0x80, 0xf7, |
2572 | 0xef, 0x78, 0x2e, 0x0f, 0x41, 0x36, 0xf4, 0x7b, 0xde, 0x89, 0x21, 0x8f, | 2572 | 0x3a, 0xd7, 0xc9, 0x3b, 0x9e, 0x0b, 0xfd, 0x90, 0x0d, 0xfd, 0x9e, 0x77, |
2573 | 0x2a, 0xfa, 0x7a, 0x59, 0xc7, 0x82, 0x72, 0xb5, 0x88, 0x9c, 0x82, 0x18, | 2573 | 0x62, 0xc8, 0xa3, 0x8a, 0xbe, 0x5e, 0xd2, 0xb1, 0xa0, 0x54, 0x29, 0x20, |
2574 | 0x60, 0xef, 0x82, 0x2d, 0xce, 0x40, 0x97, 0x93, 0x80, 0xdb, 0x94, 0x4b, | 2574 | 0xa7, 0x20, 0x06, 0xd8, 0xbd, 0xb0, 0xc5, 0x49, 0xe8, 0x72, 0x0c, 0x70, |
2575 | 0xd6, 0xcb, 0xba, 0x2e, 0x53, 0xa7, 0x6f, 0xde, 0xdf, 0x14, 0xe0, 0x3f, | 2575 | 0x5b, 0x72, 0xc9, 0x6a, 0x49, 0xd7, 0x65, 0x6a, 0xe5, 0xf6, 0xfd, 0x4d, |
2576 | 0x6a, 0x1d, 0xb6, 0x05, 0x1f, 0x52, 0xeb, 0x71, 0x3c, 0x11, 0x8f, 0xd7, | 2576 | 0x1e, 0xfe, 0xa3, 0x56, 0x61, 0x5b, 0xf0, 0x21, 0xb5, 0x1a, 0xc5, 0x13, |
2577 | 0xd1, 0x5f, 0x54, 0x78, 0x3f, 0x84, 0xde, 0xa0, 0xc2, 0xbb, 0x93, 0x34, | 2577 | 0xf1, 0x78, 0x15, 0xfd, 0x45, 0x99, 0xf7, 0x43, 0xe8, 0x0d, 0xca, 0xbc, |
2578 | 0x9e, 0xe3, 0xbc, 0x2f, 0xf2, 0xe3, 0x1a, 0xf1, 0x93, 0x8e, 0x20, 0xbe, | 2578 | 0x3b, 0x49, 0xe2, 0x39, 0xc2, 0xfb, 0x22, 0x2f, 0xae, 0x11, 0x3f, 0xe9, |
2579 | 0xb0, 0x96, 0x64, 0x7c, 0x09, 0xea, 0x49, 0xcf, 0x16, 0x8e, 0x55, 0x19, | 2579 | 0xf0, 0xe3, 0x0b, 0x6b, 0x49, 0xc6, 0x17, 0xbf, 0x9e, 0x74, 0x6d, 0xe1, |
2580 | 0x43, 0x68, 0xd7, 0x43, 0x88, 0x5b, 0xb4, 0x05, 0xaf, 0x96, 0x5c, 0xad, | 2580 | 0x44, 0x85, 0x31, 0x84, 0x76, 0xdd, 0x8f, 0xb8, 0x45, 0x5b, 0x70, 0x6b, |
2581 | 0x79, 0x32, 0x9b, 0x6b, 0x9e, 0xd7, 0x39, 0x62, 0xaf, 0x58, 0xb0, 0x31, | 2581 | 0xc9, 0xa5, 0xaa, 0x2b, 0xb3, 0xe9, 0xc6, 0x05, 0x9d, 0x23, 0x0e, 0x88, |
2582 | 0xca, 0x0e, 0x6b, 0x3a, 0x07, 0x9c, 0x93, 0x9c, 0x7e, 0x52, 0x66, 0xaf, | 2582 | 0x05, 0x1b, 0xa3, 0xec, 0xb0, 0xa6, 0x73, 0xc0, 0x79, 0xc9, 0xe8, 0x27, |
2583 | 0x48, 0x6e, 0x75, 0x5c, 0x9e, 0xd3, 0x71, 0x2b, 0x88, 0x59, 0xac, 0x21, | 2583 | 0x65, 0xf6, 0xaa, 0x64, 0x96, 0x46, 0xe4, 0x05, 0x1d, 0xb7, 0xfc, 0x98, |
2584 | 0xf9, 0xfb, 0x71, 0x5a, 0x9e, 0x3d, 0x79, 0x55, 0x9c, 0xe7, 0x19, 0xb7, | 2584 | 0xc5, 0x1a, 0x92, 0xbf, 0x1f, 0x27, 0xe5, 0xf9, 0xd3, 0xd7, 0x24, 0xfb, |
2585 | 0xc6, 0x12, 0x9d, 0x06, 0x63, 0x95, 0x2b, 0x0d, 0xe4, 0xa6, 0x07, 0x6d, | 2585 | 0x22, 0xe3, 0xd6, 0x70, 0x6c, 0x87, 0xc1, 0x58, 0xe5, 0x48, 0x1d, 0xb9, |
2586 | 0xfe, 0x5b, 0x80, 0x08, 0x7a, 0x3a, 0x57, 0xda, 0x27, 0x52, 0x76, 0xd2, | 2586 | 0xe9, 0x11, 0x9b, 0xff, 0x16, 0x20, 0x84, 0x9e, 0xce, 0x91, 0xd6, 0xd1, |
2587 | 0x18, 0x3a, 0xd0, 0x69, 0x30, 0x37, 0x8e, 0x99, 0x8f, 0x4b, 0x70, 0x1f, | 2587 | 0x84, 0x1d, 0x37, 0xfa, 0x9f, 0xd8, 0x61, 0x30, 0x37, 0x0e, 0x9b, 0x4f, |
2588 | 0xd5, 0x21, 0x8f, 0xeb, 0xbb, 0x0a, 0xb8, 0xed, 0xe2, 0x07, 0xfa, 0x77, | 2588 | 0x89, 0x7f, 0x1f, 0xd5, 0x26, 0x4f, 0xe9, 0xbb, 0x0a, 0xb8, 0xed, 0xdc, |
2589 | 0x94, 0x6b, 0x19, 0xca, 0x1a, 0xdf, 0xeb, 0x9c, 0x2f, 0xc5, 0xae, 0x65, | 2589 | 0xfb, 0xfa, 0x77, 0x94, 0x1b, 0x29, 0xca, 0x1a, 0xdf, 0xab, 0x9c, 0x2f, |
2590 | 0xda, 0xa4, 0x7c, 0x9b, 0xeb, 0x1e, 0x9a, 0x98, 0xd8, 0xe1, 0xfd, 0x7b, | 2590 | 0x46, 0x6e, 0xa4, 0x5a, 0xa4, 0x74, 0x87, 0xe3, 0x3c, 0x39, 0xfa, 0xc0, |
2591 | 0x91, 0x23, 0xb7, 0x79, 0xb1, 0xa0, 0xe0, 0x7f, 0xaf, 0xe1, 0x49, 0xdb, | 2591 | 0x6e, 0xf7, 0xdf, 0x8b, 0x3c, 0x7d, 0x87, 0x1b, 0x0b, 0x7e, 0xcd, 0xfb, |
2592 | 0x66, 0xbe, 0x65, 0x7e, 0xa4, 0xde, 0xf0, 0x5c, 0xe5, 0x3b, 0x73, 0xef, | 2592 | 0xfe, 0x3a, 0x9e, 0xb4, 0x6d, 0xe6, 0x5b, 0xe6, 0x47, 0xea, 0x0d, 0xcf, |
2593 | 0x02, 0x72, 0x2f, 0xf3, 0xe5, 0x76, 0xc9, 0xf3, 0x77, 0x3e, 0xa5, 0xe7, | 2593 | 0x25, 0xbe, 0x33, 0xf7, 0xce, 0x22, 0xf7, 0x32, 0x5f, 0xee, 0x92, 0x1c, |
2594 | 0x4b, 0x5e, 0x2d, 0xed, 0xc3, 0xd5, 0x66, 0x65, 0xae, 0xc6, 0x1a, 0xea, | 2594 | 0x7f, 0xe7, 0x53, 0x7a, 0xbe, 0xe8, 0xd6, 0xd2, 0x1e, 0x5c, 0x75, 0x4a, |
2595 | 0x02, 0x72, 0xd9, 0x28, 0x6c, 0x95, 0x39, 0xed, 0x28, 0xf2, 0x39, 0x7f, | 2595 | 0xa6, 0xab, 0xac, 0xa1, 0x2e, 0x22, 0x97, 0x0d, 0xc1, 0x56, 0x99, 0xd3, |
2596 | 0x9f, 0xc6, 0xda, 0x32, 0xf7, 0xa5, 0xd2, 0x49, 0xd5, 0xfa, 0xbb, 0xd2, | 2596 | 0x8e, 0x23, 0x9f, 0xf3, 0xf7, 0x69, 0xac, 0x2d, 0x70, 0x5f, 0x22, 0x19, |
2597 | 0xd5, 0x38, 0xef, 0xa3, 0xce, 0x8d, 0x42, 0xef, 0xbf, 0xc3, 0xde, 0x62, | 2597 | 0x57, 0xcd, 0xbf, 0x2b, 0xdd, 0x8c, 0xf2, 0x3e, 0xea, 0xfc, 0x10, 0xf4, |
2598 | 0x58, 0xdb, 0x88, 0xf3, 0x02, 0x65, 0xef, 0xfd, 0x7e, 0x2d, 0x7d, 0x9e, | 2598 | 0xfe, 0x15, 0xf6, 0x16, 0x03, 0xda, 0x46, 0xb2, 0x2f, 0x51, 0xf6, 0xee, |
2599 | 0x0f, 0xb0, 0x0e, 0xf8, 0x3c, 0xe4, 0xb2, 0xd7, 0xbe, 0xca, 0xdc, 0xfd, | 2599 | 0xef, 0xd7, 0xd2, 0xed, 0xfa, 0x00, 0xeb, 0x80, 0xcf, 0x40, 0x2e, 0x07, |
2600 | 0x6f, 0xca, 0x1a, 0x4b, 0x3f, 0x6e, 0xd0, 0xb7, 0xf1, 0xbd, 0x1a, 0x91, | 2600 | 0xec, 0x6b, 0xcc, 0xdd, 0xff, 0xa6, 0xac, 0xe1, 0xe4, 0x53, 0x06, 0x7d, |
2601 | 0xe5, 0x38, 0xf9, 0x87, 0xbc, 0x0c, 0xfa, 0xce, 0x56, 0x72, 0xd8, 0x2c, | 2601 | 0x1b, 0xdf, 0x4b, 0x21, 0x59, 0x88, 0x92, 0x7f, 0xc8, 0xcb, 0xa0, 0xef, |
2602 | 0x83, 0x3f, 0x80, 0x0c, 0x28, 0xcb, 0x40, 0x06, 0x7c, 0x9f, 0x86, 0xbe, | 2602 | 0x6c, 0x27, 0x87, 0xad, 0x32, 0xf8, 0x0b, 0xc8, 0x80, 0xb2, 0xf4, 0x65, |
2603 | 0xd8, 0x33, 0x0c, 0xe9, 0x3e, 0xb2, 0xdc, 0xf4, 0xce, 0x2e, 0x57, 0x5b, | 2603 | 0xc0, 0xf7, 0x09, 0xe8, 0x8b, 0x3d, 0x43, 0xbf, 0xee, 0x23, 0x4b, 0x0d, |
2604 | 0x69, 0x26, 0xbd, 0xd4, 0xe9, 0x39, 0xc9, 0x6b, 0xfd, 0x2e, 0x48, 0xbe, | 2604 | 0xf7, 0xec, 0x52, 0xa5, 0x99, 0x66, 0xd2, 0x4b, 0x9d, 0x9e, 0x97, 0x9c, |
2605 | 0x76, 0x4e, 0xf6, 0xd4, 0x16, 0xe4, 0x21, 0xeb, 0x01, 0xf0, 0x7b, 0xc9, | 2605 | 0xd6, 0xef, 0xac, 0xe4, 0xaa, 0xe7, 0x65, 0x7f, 0x75, 0x56, 0x1e, 0xb5, |
2606 | 0x2d, 0x5a, 0xba, 0x57, 0x99, 0x2c, 0xe0, 0xec, 0xe2, 0xff, 0x74, 0x6e, | 2606 | 0x1e, 0x06, 0xbf, 0x57, 0x9c, 0x82, 0xa5, 0x7b, 0x95, 0xb1, 0x3c, 0xce, |
2607 | 0xb5, 0xbf, 0x6d, 0x55, 0x67, 0xfc, 0xf1, 0xb5, 0x9d, 0xa4, 0xa1, 0x09, | 2607 | 0x2e, 0x8c, 0xf4, 0xca, 0x4d, 0xd4, 0x1d, 0xcf, 0x2e, 0x9a, 0xf2, 0x3f, |
2608 | 0xb7, 0xae, 0x93, 0xb8, 0x69, 0x0a, 0x76, 0x7c, 0xdb, 0x46, 0x24, 0xad, | 2608 | 0x9d, 0x5b, 0x5f, 0x6c, 0x5b, 0xd5, 0x19, 0xff, 0x7c, 0x6d, 0x27, 0x69, |
2609 | 0x6e, 0x43, 0x46, 0xa3, 0x2e, 0x53, 0x4c, 0x12, 0xba, 0x74, 0xeb, 0x44, | 2609 | 0x68, 0xc2, 0xad, 0xeb, 0x24, 0x6e, 0x9a, 0x51, 0x3b, 0xbe, 0x6d, 0x23, |
2610 | 0xda, 0x75, 0x5d, 0x37, 0xd0, 0x64, 0x9c, 0xb4, 0x14, 0x98, 0x54, 0x28, | 2610 | 0x92, 0xa2, 0xdb, 0x10, 0x68, 0xd4, 0x65, 0x8a, 0x71, 0x42, 0x17, 0xb6, |
2611 | 0xac, 0x43, 0x08, 0xa9, 0xc6, 0x6d, 0x35, 0xa6, 0xa5, 0x71, 0xfa, 0x46, | 2611 | 0x22, 0xd2, 0xae, 0xab, 0x2a, 0x8d, 0x81, 0xe5, 0xa6, 0x7f, 0xd8, 0xc3, |
2612 | 0x10, 0x5f, 0xb0, 0x92, 0xb4, 0x65, 0x52, 0x84, 0x5b, 0x04, 0xdb, 0x3e, | 2612 | 0x0a, 0x85, 0x75, 0x08, 0x21, 0xd5, 0xb8, 0xe9, 0xd6, 0x69, 0x21, 0x4e, |
2613 | 0xb0, 0xd1, 0xa5, 0x8c, 0x3f, 0x60, 0xfb, 0x30, 0x26, 0xb1, 0x29, 0x2b, | 2613 | 0xff, 0x2d, 0x8c, 0x87, 0xcd, 0x4a, 0xd2, 0x96, 0x4d, 0x11, 0x2e, 0x88, |
2614 | 0xb0, 0xb1, 0x7d, 0xea, 0x07, 0x26, 0x75, 0xda, 0x8a, 0xf7, 0xfb, 0x3d, | 2614 | 0xb2, 0x3d, 0x6c, 0xa3, 0x4a, 0x01, 0xed, 0x79, 0x7b, 0x99, 0x34, 0x36, |
2615 | 0xe7, 0x5e, 0xc7, 0x36, 0x41, 0x48, 0x8b, 0x14, 0xf9, 0x9e, 0x97, 0x7b, | 2615 | 0x65, 0x05, 0x36, 0x5e, 0x36, 0xf5, 0x81, 0x07, 0xa6, 0xd1, 0x79, 0xbf, |
2616 | 0xee, 0xb9, 0xe7, 0x79, 0x7f, 0x9e, 0xdf, 0xed, 0x59, 0x27, 0x9f, 0xc0, | 2616 | 0xdf, 0x77, 0xee, 0x75, 0x6c, 0x13, 0x84, 0xb4, 0x48, 0x91, 0xef, 0x39, |
2617 | 0xef, 0x38, 0x35, 0x67, 0x4b, 0xda, 0xee, 0x97, 0x9f, 0x6a, 0x2e, 0x9f, | 2617 | 0xf7, 0xdc, 0x73, 0xce, 0x3d, 0xdf, 0xff, 0xef, 0xfb, 0xdd, 0x8c, 0x3d, |
2618 | 0xf1, 0x49, 0x00, 0x3e, 0xa9, 0xc1, 0x16, 0x48, 0x8b, 0x13, 0xbb, 0x21, | 2618 | 0x28, 0x3f, 0xd2, 0x5c, 0x3e, 0xe3, 0x93, 0x00, 0x7c, 0x52, 0x83, 0x2d, |
2619 | 0xf4, 0x29, 0xc3, 0xa0, 0x75, 0xdc, 0xf8, 0xcd, 0xb6, 0x19, 0xdf, 0x74, | 2619 | 0x90, 0x36, 0x27, 0x76, 0x53, 0xe8, 0x53, 0x86, 0x41, 0xeb, 0xb8, 0xf1, |
2620 | 0x06, 0xbe, 0xbb, 0xbb, 0xad, 0xc5, 0xcf, 0xf9, 0x1a, 0xff, 0xf6, 0x7d, | 2620 | 0x9b, 0x6d, 0x73, 0x7f, 0xcb, 0x59, 0xf8, 0xee, 0xee, 0x7d, 0x6d, 0x7e, |
2621 | 0xaf, 0x86, 0xd6, 0x2f, 0xd3, 0xd8, 0xcf, 0x9b, 0xaa, 0x67, 0x1d, 0xf0, | 2621 | 0xce, 0xd7, 0xf8, 0xb7, 0x7f, 0xf2, 0x6a, 0x68, 0x83, 0x32, 0x83, 0xfd, |
2622 | 0x12, 0x73, 0xd3, 0x31, 0xcd, 0x3f, 0x84, 0xa7, 0xa8, 0xa3, 0xae, 0x40, | 2622 | 0xbc, 0xa1, 0x7a, 0xd6, 0x01, 0x2f, 0x31, 0x37, 0x1d, 0xd3, 0xfc, 0x43, |
2623 | 0x47, 0x0d, 0x50, 0x77, 0x0d, 0xce, 0xb9, 0xcc, 0x0f, 0x44, 0xe5, 0x0f, | 2623 | 0x78, 0x9a, 0x3a, 0xea, 0x2a, 0x74, 0xd4, 0x10, 0x75, 0xd7, 0xf0, 0xbc, |
2624 | 0x93, 0xd4, 0xc3, 0x71, 0xf9, 0xfd, 0xe4, 0xb3, 0xd8, 0x4f, 0xa2, 0xc0, | 2624 | 0xcb, 0xfc, 0x40, 0x54, 0xfe, 0x38, 0x45, 0x3d, 0x1c, 0x97, 0x3f, 0x4c, |
2625 | 0x1c, 0xe5, 0xf5, 0xe9, 0xac, 0x62, 0x92, 0x86, 0xd5, 0x07, 0x7e, 0x5a, | 2625 | 0x3d, 0x8b, 0xfd, 0x24, 0x8a, 0xcc, 0x51, 0xde, 0x98, 0xc9, 0xd1, 0x4f, |
2626 | 0xed, 0x40, 0xdc, 0xca, 0xad, 0x0d, 0xab, 0xbe, 0x39, 0xa2, 0xb5, 0xdd, | 2626 | 0x52, 0x7f, 0x3e, 0xed, 0x3e, 0xad, 0x76, 0x20, 0x6e, 0xe5, 0xd7, 0x87, |
2627 | 0xb8, 0xd5, 0x21, 0xd7, 0xcf, 0x1b, 0x1d, 0x1b, 0x9e, 0x8a, 0x06, 0x86, | 2627 | 0x55, 0xdf, 0x1c, 0xd3, 0xda, 0x6e, 0xdc, 0xea, 0x92, 0x1b, 0x17, 0x8c, |
2628 | 0xe7, 0x69, 0x97, 0x92, 0xb1, 0x8c, 0x55, 0x2f, 0x07, 0xa3, 0xcc, 0x3d, | 2628 | 0x8e, 0x0d, 0x4f, 0x47, 0x03, 0x23, 0x0b, 0xb4, 0x4b, 0xc9, 0x58, 0xd6, |
2629 | 0xa7, 0xa8, 0x9f, 0x61, 0x0b, 0xbb, 0xed, 0x8c, 0xd5, 0xe0, 0xd9, 0x9f, | 2629 | 0x6a, 0x94, 0x43, 0x51, 0xe6, 0x9e, 0x53, 0xd4, 0xcf, 0xb0, 0x85, 0xbd, |
2630 | 0x58, 0x8d, 0x9e, 0x3d, 0xe2, 0xe9, 0x59, 0x8e, 0xa5, 0x40, 0x53, 0xda, | 2630 | 0x76, 0xd6, 0x6a, 0xf2, 0xec, 0x4f, 0xac, 0x4e, 0xcf, 0x1e, 0xf3, 0xf4, |
2631 | 0xa2, 0xc4, 0xf4, 0x88, 0x95, 0x84, 0xcd, 0xc3, 0xf5, 0x02, 0xd7, 0x8f, | 2631 | 0x2c, 0xef, 0xa5, 0x68, 0x03, 0x20, 0x93, 0x89, 0x99, 0x51, 0x2b, 0x09, |
2632 | 0xcb, 0xd1, 0x85, 0xc3, 0xf0, 0xbf, 0xbb, 0xed, 0xbd, 0xb4, 0xab, 0xf6, | 2632 | 0x9b, 0x87, 0xeb, 0x45, 0xce, 0x1f, 0x97, 0xe3, 0x8b, 0x47, 0xe1, 0x7f, |
2633 | 0x00, 0xf1, 0x38, 0x78, 0xfe, 0x86, 0x9a, 0xb5, 0x1e, 0xf6, 0xd6, 0xe2, | 2633 | 0xf7, 0xda, 0x7b, 0x69, 0x57, 0xed, 0x21, 0xe2, 0x71, 0xb0, 0xfe, 0x97, |
2634 | 0x38, 0xe4, 0x7c, 0x8a, 0xf5, 0xda, 0x7a, 0xe6, 0x73, 0x74, 0xaf, 0xd5, | 2634 | 0xea, 0xe6, 0x7a, 0xd4, 0x9b, 0x8b, 0xf7, 0x21, 0xe7, 0xd3, 0xac, 0xd7, |
2635 | 0x73, 0xf7, 0x94, 0x9f, 0x7b, 0x32, 0xef, 0x78, 0x58, 0x30, 0xfc, 0xc2, | 2635 | 0x36, 0x32, 0x9f, 0xa3, 0x7b, 0xad, 0x1d, 0xbb, 0xa7, 0xb2, 0xee, 0x64, |
2636 | 0x17, 0xfa, 0x76, 0x84, 0xcf, 0xe4, 0xf3, 0x9a, 0x65, 0x68, 0x3f, 0xf4, | 2636 | 0xc1, 0xf1, 0xb0, 0x61, 0xf8, 0x85, 0x2f, 0xf4, 0x8d, 0x08, 0xd7, 0xe4, |
2637 | 0xcb, 0x14, 0xff, 0xb3, 0x5e, 0xed, 0x0a, 0xf1, 0x4a, 0xb4, 0x7d, 0x05, | 2637 | 0x7a, 0xad, 0x92, 0xde, 0x0f, 0xfd, 0x32, 0xcd, 0xff, 0x9c, 0x57, 0xbb, |
2638 | 0xdb, 0xf4, 0x35, 0x6f, 0xbd, 0xad, 0xad, 0xd2, 0x18, 0xad, 0x98, 0xcf, | 2638 | 0x42, 0xbc, 0x12, 0xed, 0x5c, 0xc5, 0x36, 0x7d, 0xc5, 0x9b, 0xaf, 0xbf, |
2639 | 0xdc, 0x0a, 0xdb, 0x71, 0xc9, 0x2e, 0xf0, 0xb7, 0x54, 0x8a, 0x38, 0x75, | 2639 | 0x5d, 0x9a, 0xa3, 0x55, 0xe3, 0x99, 0x5b, 0x61, 0x3b, 0x2e, 0xb9, 0x45, |
2640 | 0xb2, 0xd7, 0x5e, 0x5f, 0xb3, 0xc6, 0x16, 0xf4, 0x19, 0x9f, 0x20, 0x38, | 2640 | 0xfe, 0x96, 0xcb, 0x11, 0xa7, 0x41, 0xf6, 0xda, 0x1b, 0xeb, 0xe6, 0xd8, |
2641 | 0x15, 0xf0, 0x7c, 0x8b, 0xbb, 0xe9, 0x37, 0x79, 0xd7, 0x0d, 0x9a, 0x93, | 2641 | 0x86, 0x3e, 0xe3, 0x13, 0x04, 0xa7, 0x03, 0x9e, 0x6f, 0xb1, 0x89, 0x7e, |
2642 | 0x89, 0x5b, 0xed, 0x35, 0xef, 0x71, 0x77, 0xd9, 0x0e, 0xc7, 0x2d, 0xea, | 2642 | 0x93, 0x77, 0xdd, 0xa4, 0x39, 0x99, 0xb8, 0xd5, 0x59, 0xf7, 0x1e, 0x9b, |
2643 | 0xce, 0x60, 0x54, 0x9a, 0xc9, 0x43, 0x25, 0xf5, 0xe3, 0x43, 0x8e, 0xc1, | 2643 | 0x2a, 0x76, 0x38, 0x6e, 0x51, 0x77, 0x36, 0x46, 0xa5, 0x95, 0x3c, 0x54, |
2644 | 0x5c, 0x44, 0x9d, 0xf1, 0x56, 0xe6, 0xec, 0xdf, 0xd1, 0x73, 0x6b, 0xa2, | 2644 | 0x56, 0x3f, 0x3e, 0xe4, 0x18, 0xcc, 0x45, 0xd4, 0x39, 0xd2, 0xce, 0x9c, |
2645 | 0x4f, 0x80, 0x6b, 0xf0, 0xc9, 0xe7, 0xf2, 0xbd, 0xcc, 0xf5, 0x62, 0xfd, | 2645 | 0xfd, 0x5b, 0x7a, 0x6e, 0x2d, 0xf4, 0x09, 0x70, 0x0d, 0x3e, 0xf9, 0x4c, |
2646 | 0x46, 0xae, 0xef, 0x7a, 0xe7, 0x9c, 0x70, 0xb3, 0xd6, 0x7d, 0x92, 0x39, | 2646 | 0xbe, 0x97, 0xb9, 0x5e, 0xcc, 0xdf, 0xcc, 0xf9, 0x5d, 0xef, 0x9c, 0x13, |
2647 | 0x6f, 0xf8, 0x6f, 0xc8, 0x01, 0xef, 0x35, 0xa3, 0x3d, 0x4f, 0x9b, 0xf0, | 2647 | 0x6e, 0xce, 0xba, 0x5f, 0xb2, 0x17, 0x0c, 0xff, 0xa5, 0x1d, 0xf0, 0x5e, |
2648 | 0x45, 0xeb, 0xf8, 0xb6, 0xa1, 0x4b, 0x6d, 0xc3, 0x89, 0x3c, 0xf9, 0x93, | 2648 | 0x2b, 0xda, 0x0b, 0xb4, 0x09, 0x9f, 0x37, 0x8f, 0x6f, 0x1b, 0x7a, 0xd4, |
2649 | 0x7c, 0xe9, 0xf3, 0xa3, 0xaf, 0xf3, 0xc8, 0xa3, 0xd4, 0xb3, 0xfd, 0x72, | 2649 | 0x36, 0x9c, 0x2a, 0x90, 0x3f, 0xc9, 0x97, 0x3e, 0x3f, 0xfa, 0x3a, 0x8f, |
2650 | 0x26, 0xcf, 0xb3, 0x49, 0x69, 0x4d, 0x6b, 0xe3, 0xd9, 0x71, 0xc5, 0x64, | 2650 | 0x3c, 0x4a, 0x3d, 0x3b, 0x28, 0x67, 0x0b, 0x3c, 0x9b, 0x94, 0xd6, 0xb4, |
2651 | 0x75, 0x4e, 0x25, 0x5e, 0xce, 0xca, 0xa0, 0x5c, 0x71, 0x79, 0x66, 0x89, | 2651 | 0x36, 0x9f, 0x3b, 0xa8, 0x98, 0xac, 0xee, 0xe9, 0xc4, 0x4b, 0x39, 0x19, |
2652 | 0x42, 0x3a, 0xd8, 0x54, 0xf1, 0xfe, 0xfb, 0xf5, 0xcc, 0xc2, 0xea, 0x33, | 2652 | 0x96, 0xab, 0x2e, 0xcf, 0x2c, 0x51, 0xcc, 0x04, 0x5b, 0xaa, 0xde, 0x7f, |
2653 | 0xc6, 0x30, 0xf7, 0x79, 0x8f, 0xde, 0xcd, 0x7a, 0xb6, 0xe9, 0x2a, 0xfa, | 2653 | 0xbf, 0x9e, 0x59, 0x58, 0x7d, 0xc6, 0x18, 0xc6, 0x3e, 0xef, 0xd1, 0xbb, |
2654 | 0x7c, 0x53, 0xcf, 0x29, 0x0c, 0x9d, 0xc8, 0xfa, 0x7e, 0x38, 0xc2, 0x7b, | 2654 | 0x55, 0xcf, 0x36, 0x53, 0x43, 0x9f, 0xaf, 0xeb, 0x39, 0x85, 0xa1, 0x13, |
2655 | 0xf8, 0x5c, 0xfa, 0x7c, 0x7c, 0x16, 0x79, 0xaf, 0x13, 0x16, 0xbb, 0x57, | 2655 | 0x59, 0xdf, 0x0f, 0x47, 0xf8, 0x0c, 0xd7, 0xa5, 0xcf, 0xc7, 0xb5, 0xc8, |
2656 | 0x82, 0x3b, 0x20, 0xfa, 0x3b, 0x58, 0x47, 0x0e, 0x40, 0x56, 0x37, 0x1a, | 2656 | 0x7b, 0xdd, 0xb0, 0xd8, 0xfd, 0x12, 0xdc, 0x09, 0xd1, 0xdf, 0xc9, 0x3a, |
2657 | 0x0c, 0xcc, 0x98, 0xf1, 0x35, 0xd2, 0xd6, 0x55, 0x9c, 0x23, 0x62, 0x15, | 2657 | 0x72, 0x00, 0xb2, 0xba, 0xd9, 0x60, 0x60, 0xc6, 0x8d, 0xaf, 0x91, 0xb1, |
2658 | 0xf8, 0xd1, 0x27, 0x5e, 0xba, 0x8d, 0xf5, 0xd2, 0x9e, 0xbf, 0xde, 0x87, | 2658 | 0xae, 0xe1, 0x1c, 0x11, 0xab, 0xc0, 0x8f, 0x3e, 0xf5, 0x93, 0xdb, 0x98, |
2659 | 0xf5, 0x1d, 0xaf, 0xae, 0x3e, 0xb9, 0x8d, 0xbc, 0x3a, 0xa2, 0xf5, 0x41, | 2659 | 0x2f, 0xe3, 0xf9, 0xeb, 0x03, 0x98, 0xdf, 0xf1, 0xea, 0xea, 0x53, 0xdb, |
2660 | 0xde, 0x43, 0x39, 0xe6, 0x99, 0x91, 0x2e, 0xef, 0xe3, 0x7e, 0xb6, 0xb7, | 2660 | 0xc9, 0xab, 0xa3, 0x5a, 0x1f, 0xe4, 0x33, 0x94, 0x63, 0x9e, 0x19, 0xe9, |
2661 | 0xd4, 0xd0, 0x31, 0xe9, 0xed, 0xcf, 0x1f, 0x0f, 0x4b, 0xb8, 0x95, 0x3a, | 2661 | 0xf2, 0x1e, 0x9e, 0x67, 0x7b, 0x5b, 0x1d, 0x1d, 0x93, 0xde, 0xfe, 0xfc, |
2662 | 0x2e, 0x2a, 0xc9, 0x29, 0xc6, 0x2c, 0xb0, 0x5d, 0x63, 0x5c, 0xeb, 0xcb, | 2662 | 0xfb, 0x61, 0x09, 0xb7, 0x53, 0xc7, 0x45, 0x25, 0x39, 0xcd, 0x98, 0x05, |
2663 | 0x75, 0x71, 0xfa, 0xff, 0xd4, 0xc5, 0x69, 0xeb, 0x23, 0xe5, 0x9d, 0xb0, | 2663 | 0xb6, 0x6b, 0x9c, 0x73, 0x7d, 0xb1, 0x2e, 0xce, 0xfc, 0x9f, 0xba, 0x38, |
2664 | 0xe6, 0xb1, 0xbe, 0x98, 0xae, 0x85, 0x2a, 0xba, 0xfa, 0xb5, 0xfb, 0x68, | 2664 | 0x63, 0x7d, 0xa4, 0xbc, 0x13, 0xd6, 0x3c, 0xd6, 0xe7, 0xd3, 0xb5, 0x58, |
2665 | 0x99, 0x8e, 0x3f, 0xc9, 0xd3, 0x5e, 0xa5, 0x34, 0xa7, 0xfc, 0xb7, 0x49, | 2665 | 0x43, 0x57, 0xbf, 0x76, 0x1f, 0xad, 0xd0, 0xf1, 0x87, 0x05, 0xda, 0xab, |
2666 | 0x9e, 0x2d, 0xf7, 0x78, 0x85, 0x7b, 0x1c, 0x5c, 0x74, 0x89, 0x83, 0xf9, | 2666 | 0x94, 0xe6, 0x94, 0xff, 0x3e, 0xc5, 0xb3, 0xe5, 0x1e, 0xaf, 0x72, 0x8f, |
2667 | 0x96, 0xca, 0xf0, 0xa9, 0x3c, 0x75, 0x4c, 0x93, 0xcc, 0x4d, 0xfb, 0x7a, | 2667 | 0xc3, 0x4b, 0x8a, 0x83, 0x7c, 0x58, 0x65, 0xf8, 0x74, 0x81, 0x3a, 0xa6, |
2668 | 0x66, 0xd4, 0xf3, 0x71, 0x73, 0x6b, 0xeb, 0x54, 0xcf, 0xc0, 0xbb, 0x71, | 2668 | 0x45, 0xe6, 0x67, 0x7c, 0x3d, 0x33, 0xe6, 0xf9, 0xb8, 0xf9, 0xf5, 0x0d, |
2669 | 0x86, 0x3d, 0xfb, 0xd2, 0x21, 0xb3, 0xe7, 0x69, 0x77, 0x93, 0xe8, 0x8b, | 2669 | 0xaa, 0x67, 0xe0, 0xdd, 0x38, 0x23, 0x9e, 0x7d, 0xe9, 0x92, 0xb9, 0x0b, |
2670 | 0x06, 0x66, 0xe7, 0x59, 0x9b, 0x24, 0x16, 0x65, 0x50, 0x58, 0xf7, 0x1f, | 2670 | 0xb4, 0xbb, 0x49, 0xf4, 0x45, 0x03, 0x73, 0x0b, 0xac, 0x4d, 0x12, 0x8b, |
2671 | 0xb6, 0x4f, 0x40, 0xde, 0x62, 0xf2, 0xe1, 0x24, 0x7d, 0xfa, 0x3a, 0xf8, | 2671 | 0x32, 0x2c, 0xac, 0xfb, 0x8f, 0xd8, 0xa7, 0x20, 0x6f, 0x31, 0x79, 0x7f, |
2672 | 0xc6, 0xcd, 0x35, 0xe7, 0xbb, 0xbd, 0xec, 0x13, 0x56, 0xd3, 0xbd, 0xa3, | 2672 | 0x8a, 0x3e, 0x7d, 0x03, 0x7c, 0xe3, 0xd6, 0xba, 0xf3, 0xdd, 0x51, 0xf1, |
2673 | 0x4d, 0x1a, 0xc9, 0xe7, 0x8e, 0x7d, 0x5d, 0xe8, 0x83, 0xf1, 0x3a, 0x83, | 2673 | 0x09, 0x6b, 0xe9, 0x1e, 0xef, 0x90, 0x66, 0xf2, 0xb9, 0x63, 0xdf, 0x10, |
2674 | 0x58, 0x80, 0xb1, 0x47, 0x5c, 0x63, 0x8f, 0xd9, 0x02, 0xfb, 0x9a, 0xbc, | 2674 | 0xfa, 0x60, 0xbc, 0xce, 0x22, 0x16, 0x60, 0xec, 0x11, 0xd7, 0xd8, 0x63, |
2675 | 0xbc, 0x52, 0x93, 0xf2, 0x0a, 0xf9, 0x2d, 0xad, 0xfe, 0xf7, 0x80, 0xea, | 2675 | 0xae, 0xc8, 0xbe, 0x16, 0x2f, 0xaf, 0xd4, 0xa2, 0xbc, 0x42, 0x7e, 0xcb, |
2676 | 0xac, 0xdc, 0x64, 0xb7, 0xc1, 0xb1, 0xd8, 0x31, 0xe5, 0x3d, 0xa9, 0xe2, | 2676 | 0xa8, 0xff, 0x3d, 0xa4, 0x3a, 0x2b, 0x3f, 0xd5, 0x6b, 0x70, 0x2c, 0x76, |
2677 | 0xbd, 0x98, 0xef, 0x4b, 0xb6, 0x19, 0xdf, 0xca, 0x56, 0x7d, 0x13, 0xd6, | 2677 | 0x4c, 0x79, 0x4f, 0x6a, 0x78, 0x2f, 0xe6, 0xad, 0x3d, 0xd6, 0x61, 0x7c, |
2678 | 0x79, 0xb4, 0x2b, 0x5c, 0x9f, 0xbc, 0x41, 0x1e, 0xa1, 0xce, 0xf3, 0xe7, | 2678 | 0x2b, 0x5b, 0xf5, 0x4d, 0x58, 0xc7, 0xd1, 0xae, 0x70, 0x7e, 0xf2, 0x06, |
2679 | 0xf9, 0xf4, 0xf0, 0xdb, 0x9c, 0x4f, 0xfe, 0xaf, 0xc4, 0x22, 0xf8, 0xb2, | 2679 | 0x79, 0x84, 0x3a, 0xcf, 0x1f, 0xe7, 0xd3, 0xc3, 0x6f, 0x73, 0x3c, 0xf9, |
2680 | 0xea, 0xf7, 0xf9, 0x72, 0xc7, 0xb1, 0x4a, 0x9b, 0x40, 0xb9, 0xab, 0xac, | 2680 | 0xbf, 0x1a, 0x8b, 0xe0, 0xcb, 0xaa, 0xdf, 0xe7, 0xcb, 0x1d, 0xef, 0x55, |
2681 | 0x4f, 0xda, 0x12, 0x99, 0x5a, 0xa6, 0xcb, 0x50, 0x2f, 0xf7, 0xff, 0x3c, | 2681 | 0xdb, 0x04, 0xca, 0x5d, 0x75, 0x7d, 0xd2, 0x96, 0xc8, 0xf4, 0x0a, 0x5d, |
2682 | 0x73, 0xbb, 0x90, 0xb7, 0x95, 0x68, 0x73, 0x4c, 0x69, 0x93, 0x06, 0x6d, | 2682 | 0xd2, 0xfd, 0xdc, 0xff, 0xf3, 0xcc, 0xed, 0x42, 0xde, 0x56, 0xa3, 0xcd, |
2683 | 0x22, 0x4a, 0x1b, 0xc6, 0x7b, 0x4f, 0x79, 0xfc, 0xd6, 0x84, 0xf3, 0x62, | 2683 | 0x09, 0xa5, 0x4d, 0x06, 0xb4, 0x89, 0x28, 0x6d, 0x18, 0xef, 0x3d, 0xe5, |
2684 | 0xae, 0x16, 0xba, 0x6e, 0x1f, 0x75, 0xfe, 0x33, 0x6d, 0x5a, 0x1f, 0x74, | 2684 | 0xf1, 0x5b, 0x0b, 0xce, 0x8b, 0xb9, 0x5a, 0xe8, 0xba, 0x7d, 0xd4, 0xf9, |
2685 | 0xa8, 0xfb, 0x56, 0x43, 0x9f, 0xb1, 0xbd, 0x59, 0xfd, 0x11, 0x13, 0x6f, | 2685 | 0xcf, 0x76, 0x68, 0x7d, 0xd0, 0xa1, 0xee, 0x5b, 0x0b, 0x7d, 0xc6, 0xf6, |
2686 | 0xc5, 0x35, 0x0f, 0x1a, 0x84, 0x7e, 0x9e, 0x9d, 0x84, 0xaf, 0x46, 0xdc, | 2686 | 0x56, 0xf5, 0x47, 0x4c, 0xbc, 0x15, 0xd7, 0x3c, 0x68, 0x10, 0xfa, 0x79, |
2687 | 0x5b, 0x15, 0xad, 0x1e, 0xf7, 0xce, 0xeb, 0x55, 0xa5, 0x0d, 0x65, 0x80, | 2687 | 0x6e, 0x0a, 0xbe, 0x1a, 0x71, 0x6f, 0x35, 0xb4, 0xfa, 0x8e, 0x77, 0x5e, |
2688 | 0x7a, 0x73, 0x0d, 0xd6, 0xdb, 0x13, 0xed, 0x01, 0x7f, 0xbd, 0x82, 0xfe, | 2688 | 0xf3, 0x4a, 0x1b, 0xca, 0x00, 0xf5, 0xe6, 0x3a, 0xcc, 0xb7, 0x27, 0xda, |
2689 | 0x8d, 0x1a, 0x4f, 0x04, 0x21, 0xf3, 0x37, 0x26, 0x5b, 0xbd, 0x18, 0xce, | 2689 | 0x07, 0xfe, 0xfa, 0x19, 0xfa, 0x37, 0x6b, 0x3c, 0x11, 0x84, 0xcc, 0xdf, |
2690 | 0x41, 0x1b, 0x71, 0xeb, 0x64, 0x84, 0x31, 0x05, 0xda, 0x5d, 0x52, 0x37, | 2690 | 0x9c, 0x6a, 0xf7, 0x62, 0x38, 0x07, 0x6d, 0xc4, 0xad, 0x53, 0x11, 0xc6, |
2691 | 0x85, 0xf8, 0x15, 0x7a, 0x7c, 0x51, 0xed, 0x51, 0x0f, 0xc6, 0xef, 0x20, | 2691 | 0x14, 0x68, 0xf7, 0x48, 0xc3, 0x34, 0xe2, 0x57, 0xe8, 0xf1, 0x25, 0xb5, |
2692 | 0xce, 0x0f, 0xd7, 0x87, 0x71, 0x5f, 0xb7, 0xc1, 0x22, 0x44, 0x37, 0xe9, | 2692 | 0x47, 0x7d, 0xb8, 0x7f, 0x07, 0x71, 0x7e, 0xb8, 0x3e, 0x8a, 0xe7, 0x7a, |
2693 | 0x99, 0xce, 0x4e, 0x26, 0x62, 0x87, 0xc4, 0xeb, 0x1b, 0x73, 0x55, 0x1f, | 2693 | 0x0d, 0x16, 0x21, 0xba, 0x45, 0xcf, 0x74, 0x6e, 0x2a, 0x11, 0x3b, 0x2c, |
2694 | 0x2c, 0xef, 0xeb, 0x01, 0xd9, 0x53, 0xb6, 0x17, 0x8c, 0xa3, 0xe1, 0xc3, | 2694 | 0x5e, 0xdf, 0xb8, 0xab, 0xfa, 0x60, 0x65, 0x5f, 0x0f, 0xca, 0x9e, 0x8a, |
2695 | 0x4f, 0x1b, 0x7b, 0x90, 0x2b, 0xf4, 0x28, 0x3e, 0x2a, 0x38, 0xb0, 0x80, | 2695 | 0xbd, 0x60, 0x1c, 0x0d, 0x1f, 0x7e, 0xc6, 0xd8, 0x83, 0x7c, 0xb1, 0x4f, |
2696 | 0xb3, 0xa4, 0x4f, 0xba, 0x04, 0x3f, 0xdc, 0xc5, 0x19, 0xd2, 0xef, 0x2e, | 2696 | 0xf1, 0x51, 0xc1, 0xa1, 0x45, 0x9c, 0x25, 0x7d, 0xd2, 0x65, 0xf8, 0xe1, |
2697 | 0x1d, 0x3f, 0xe9, 0xa6, 0x58, 0x1f, 0x83, 0x3e, 0x38, 0x2e, 0xc3, 0x88, | 2697 | 0x2e, 0xce, 0x90, 0x7e, 0x77, 0xf9, 0xe4, 0xa4, 0x9b, 0x62, 0x7d, 0x0c, |
2698 | 0x0b, 0x86, 0x83, 0xcd, 0xcc, 0x2b, 0xc3, 0x37, 0xcc, 0x7a, 0xb9, 0xc7, | 2698 | 0xfa, 0xe0, 0xa4, 0x8c, 0x20, 0x2e, 0x18, 0x09, 0xb6, 0x32, 0xaf, 0x0c, |
2699 | 0x1e, 0xe6, 0x4c, 0xe5, 0xec, 0x3c, 0xf7, 0x4e, 0xd9, 0x36, 0xb1, 0xf7, | 2699 | 0xdf, 0x30, 0xe7, 0xe5, 0x1e, 0xfb, 0x98, 0x33, 0x95, 0x73, 0x0b, 0xdc, |
2700 | 0xec, 0x24, 0xf7, 0x6b, 0xf2, 0x10, 0x6c, 0x5b, 0x53, 0x2e, 0x7e, 0x79, | 2700 | 0x3b, 0x65, 0xdb, 0xc4, 0xde, 0x73, 0x53, 0xdc, 0xaf, 0xc9, 0x43, 0xb0, |
2701 | 0x16, 0x7d, 0xf8, 0xed, 0x87, 0x3c, 0x70, 0x2e, 0x7e, 0xe7, 0x97, 0xe4, | 2701 | 0x6d, 0x4d, 0xbb, 0xf8, 0xe5, 0x59, 0x0c, 0xe0, 0x77, 0x10, 0xf2, 0xc0, |
2702 | 0xbd, 0xf3, 0xbe, 0x6d, 0x0f, 0xc8, 0xbb, 0x4e, 0xe9, 0xf8, 0x09, 0x77, | 2702 | 0xb1, 0xf8, 0x5d, 0x58, 0x96, 0x77, 0x2f, 0xf8, 0xb6, 0x3d, 0x20, 0x6f, |
2703 | 0x2d, 0xcf, 0xc0, 0xcd, 0xb2, 0x66, 0xed, 0x38, 0x6e, 0x4e, 0x4a, 0xa5, | 2703 | 0x3b, 0xe5, 0x93, 0xa7, 0xdc, 0xf5, 0x3c, 0x03, 0x37, 0xc7, 0x9a, 0xb5, |
2704 | 0x45, 0x77, 0x71, 0xad, 0xa5, 0xb4, 0xa4, 0xfc, 0x7f, 0x80, 0x33, 0xbc, | 2704 | 0xe3, 0xb8, 0x79, 0x29, 0x97, 0x97, 0xdc, 0xa5, 0xf5, 0x96, 0xd2, 0x92, |
2705 | 0x76, 0xaf, 0x25, 0x86, 0x7e, 0xa4, 0xcd, 0xe7, 0x6b, 0x7f, 0x95, 0xb6, | 2705 | 0xf2, 0xbf, 0x8c, 0x33, 0xbc, 0x7e, 0xaf, 0x25, 0x86, 0x7e, 0xa4, 0xcd, |
2706 | 0xc0, 0xd7, 0x7f, 0xe4, 0x47, 0xf2, 0xe5, 0x92, 0xec, 0x54, 0xfd, 0xbf, | 2706 | 0x67, 0x6b, 0x7f, 0xd5, 0xb6, 0xc0, 0xd7, 0x7f, 0xe4, 0x47, 0xf2, 0xe5, |
2707 | 0xd2, 0x7d, 0x95, 0xba, 0xdf, 0xf7, 0x6f, 0xa9, 0xdf, 0xc9, 0x8b, 0x31, | 2707 | 0xb2, 0xec, 0x52, 0xfd, 0xbf, 0xda, 0x73, 0xd5, 0xba, 0xdf, 0xf7, 0x6f, |
2708 | 0x8d, 0x0f, 0x36, 0x4d, 0xd5, 0xea, 0x84, 0x1f, 0x78, 0x75, 0x85, 0x95, | 2708 | 0xa9, 0xdf, 0xb5, 0xfe, 0xa3, 0xf1, 0xc1, 0x96, 0xe9, 0x7a, 0x9d, 0xf0, |
2709 | 0x78, 0xef, 0x80, 0xa7, 0x17, 0x52, 0xea, 0x3b, 0xa7, 0x6c, 0xea, 0x07, | 2709 | 0x98, 0x57, 0x57, 0x58, 0x8d, 0xf7, 0x0e, 0x78, 0x7a, 0x21, 0xa5, 0xbe, |
2710 | 0xee, 0xa7, 0x51, 0xc6, 0x67, 0x6e, 0x83, 0x26, 0xbe, 0x0e, 0x66, 0xdc, | 2710 | 0x73, 0xca, 0xa6, 0x7e, 0xe0, 0x7e, 0x9a, 0xe5, 0xe0, 0xec, 0x6d, 0xd0, |
2711 | 0xe7, 0xeb, 0x8e, 0x66, 0xcf, 0x17, 0xb6, 0xa4, 0xf3, 0x2c, 0x7d, 0x27, | 2711 | 0xc4, 0xd7, 0xc1, 0x8c, 0xfb, 0x7c, 0xdd, 0xd1, 0xea, 0xf9, 0xc2, 0x96, |
2712 | 0x07, 0x7a, 0xb4, 0x45, 0xd2, 0x63, 0x41, 0x49, 0x9e, 0x6d, 0x89, 0x19, | 2712 | 0x74, 0x9f, 0xa3, 0xef, 0xe4, 0x40, 0x8f, 0xb6, 0x49, 0x66, 0x3c, 0x28, |
2713 | 0x5f, 0x97, 0xfc, 0x07, 0x79, 0xd3, 0x3e, 0xb6, 0x37, 0xa0, 0xff, 0x4e, | 2713 | 0xc9, 0x73, 0x1b, 0x62, 0xc6, 0xd7, 0x25, 0xff, 0x41, 0xde, 0xb4, 0x4f, |
2714 | 0xe1, 0xb3, 0x0d, 0x3f, 0x43, 0x9e, 0xf7, 0xf9, 0x63, 0x76, 0x0d, 0x8f, | 2714 | 0x7d, 0x51, 0xf4, 0xdf, 0x29, 0x5c, 0xdb, 0xf0, 0x33, 0xe4, 0x79, 0x9f, |
2715 | 0xee, 0xf0, 0x78, 0x94, 0xe3, 0x96, 0xa9, 0x7f, 0x60, 0x6e, 0xe7, 0x59, | 2715 | 0x7f, 0xcf, 0xae, 0xe3, 0xd1, 0x9d, 0x1e, 0x8f, 0xf2, 0xbe, 0x65, 0xea, |
2716 | 0xee, 0xd1, 0xdc, 0xd7, 0x79, 0xd6, 0xc4, 0xeb, 0xd5, 0xf7, 0xf5, 0x94, | 2716 | 0x1f, 0x18, 0xdb, 0x7d, 0x8e, 0x7b, 0x34, 0xcf, 0x75, 0x9f, 0x33, 0xf1, |
2717 | 0xef, 0xc3, 0x78, 0x97, 0x62, 0xc3, 0xb0, 0xf6, 0xce, 0x7e, 0xf8, 0x74, | 2717 | 0x7a, 0xed, 0x73, 0x7d, 0x95, 0xe7, 0x70, 0xbf, 0x47, 0xb1, 0x61, 0x98, |
2718 | 0x3d, 0xb4, 0x39, 0xb4, 0xdf, 0x1b, 0xdd, 0x9d, 0x42, 0x7e, 0x4f, 0x78, | 2718 | 0x7b, 0xd7, 0x20, 0x7c, 0xba, 0x3e, 0xda, 0x1c, 0xda, 0xef, 0xcd, 0xee, |
2719 | 0x3c, 0x47, 0x7d, 0x13, 0xf1, 0xf4, 0xcd, 0xb2, 0x7d, 0x19, 0x36, 0xf8, | 2719 | 0x2e, 0x21, 0xbf, 0x27, 0x3c, 0x9e, 0xa3, 0xbe, 0x89, 0x78, 0xfa, 0x66, |
2720 | 0x13, 0xe6, 0x44, 0x2a, 0xec, 0xcb, 0x43, 0xe6, 0xdd, 0xaa, 0xec, 0xcb, | 2720 | 0xc5, 0xbe, 0x8c, 0x18, 0xfc, 0x09, 0x73, 0x22, 0x55, 0xf6, 0xe5, 0x71, |
2721 | 0x9d, 0xde, 0x3a, 0xfe, 0x98, 0xaf, 0x57, 0xfc, 0xb6, 0xaf, 0x57, 0x6a, | 2721 | 0xf3, 0x6e, 0x35, 0xf6, 0xe5, 0x4e, 0x6f, 0x1e, 0xff, 0x9e, 0xaf, 0x57, |
2722 | 0x7d, 0x5a, 0x9f, 0xf6, 0xd5, 0xb8, 0xaf, 0xca, 0x98, 0x2f, 0xb7, 0x62, | 2722 | 0xfc, 0xb6, 0xaf, 0x57, 0xea, 0x7d, 0x5a, 0x9f, 0xf6, 0xb5, 0xb8, 0xaf, |
2723 | 0xde, 0x25, 0x83, 0x98, 0x8d, 0x3e, 0x65, 0x22, 0x6b, 0x30, 0xd3, 0xd6, | 2723 | 0xea, 0x98, 0x2f, 0xbf, 0x6a, 0xde, 0x25, 0x8b, 0x98, 0x8d, 0x3e, 0x65, |
2724 | 0x19, 0x8b, 0xb8, 0x0f, 0xe7, 0x67, 0x32, 0x14, 0xb9, 0xad, 0xb1, 0xf5, | 2724 | 0x22, 0x67, 0x30, 0xd3, 0xd6, 0x59, 0x8b, 0xb8, 0x0f, 0xe7, 0xc7, 0x92, |
2725 | 0xa9, 0x99, 0x51, 0xcd, 0xf3, 0xcc, 0xba, 0x9e, 0xde, 0x89, 0xee, 0x86, | 2725 | 0x8e, 0xdc, 0xd6, 0xd8, 0xfa, 0xf4, 0xec, 0x98, 0xe6, 0x79, 0xe6, 0x5c, |
2726 | 0x5c, 0xcd, 0x47, 0x96, 0x31, 0x45, 0x4f, 0x1e, 0x1b, 0x82, 0x1d, 0x4a, | 2726 | 0x4f, 0xef, 0x44, 0x77, 0x43, 0xae, 0x5e, 0x89, 0xac, 0x60, 0x8a, 0x66, |
2727 | 0x69, 0xbd, 0xec, 0x71, 0xec, 0xb7, 0x5f, 0xf1, 0x5c, 0xab, 0x9c, 0xe7, | 2727 | 0x4e, 0xa4, 0x61, 0x87, 0x52, 0x5a, 0x2f, 0xfb, 0x2e, 0xf6, 0x3b, 0xa8, |
2728 | 0x64, 0x97, 0x5d, 0xd2, 0xda, 0x4d, 0xc3, 0x40, 0xf6, 0x58, 0xc3, 0x69, | 2728 | 0x78, 0xae, 0x35, 0xce, 0x73, 0xf2, 0x90, 0x5d, 0xd6, 0xda, 0x4d, 0xd3, |
2729 | 0x9f, 0xef, 0xc9, 0x4f, 0x4f, 0x1e, 0x1b, 0x9f, 0x2e, 0x0d, 0x86, 0xb6, | 2729 | 0x50, 0xf1, 0x44, 0xd3, 0x8b, 0x3e, 0xdf, 0x93, 0x9f, 0x66, 0x4e, 0x1c, |
2730 | 0x75, 0xdb, 0x39, 0x59, 0x0f, 0x9a, 0x0f, 0xca, 0xa3, 0x8a, 0x1d, 0x7e, | 2730 | 0x9c, 0x29, 0x0f, 0x87, 0xb6, 0xf7, 0xda, 0x79, 0x21, 0x66, 0x7f, 0x58, |
2731 | 0x0d, 0xe3, 0xfb, 0x18, 0x5f, 0x26, 0x42, 0x8a, 0x09, 0x4e, 0xc4, 0x26, | 2731 | 0x8e, 0x28, 0x76, 0xf8, 0x15, 0xdc, 0xdf, 0xc7, 0xf8, 0x32, 0x11, 0x52, |
2732 | 0x20, 0x8b, 0x19, 0x37, 0xd1, 0x35, 0x14, 0x5c, 0xcd, 0xdc, 0x0d, 0x62, | 2732 | 0x4c, 0x70, 0x22, 0x36, 0x01, 0x59, 0xcc, 0xba, 0xc4, 0xf8, 0xaf, 0x55, |
2733 | 0x66, 0xfa, 0x59, 0xc4, 0x14, 0x3c, 0x2b, 0x87, 0xdc, 0x8d, 0xee, 0xa2, | 2733 | 0xac, 0xff, 0x9c, 0xd0, 0xcf, 0x22, 0xa6, 0xe0, 0x59, 0x39, 0xec, 0x6e, |
2734 | 0x64, 0x3d, 0x4c, 0x3e, 0x6b, 0x42, 0xf5, 0x32, 0xe1, 0x86, 0x1a, 0x86, | 2734 | 0x76, 0x97, 0xc4, 0xf8, 0xbf, 0x59, 0xad, 0x09, 0x35, 0xca, 0x84, 0x1b, |
2735 | 0x8a, 0x46, 0x06, 0x46, 0x82, 0xa9, 0x55, 0x27, 0x9d, 0x68, 0xc3, 0xce, | 2735 | 0x6a, 0x4a, 0x97, 0x8c, 0x0c, 0x8c, 0x06, 0x53, 0x6b, 0x26, 0x9d, 0x68, |
2736 | 0x22, 0x64, 0xbc, 0x08, 0xfd, 0x5f, 0x8c, 0x05, 0x86, 0x15, 0x9b, 0xf6, | 2736 | 0xd3, 0xae, 0x12, 0x64, 0xbc, 0x04, 0xfd, 0x5f, 0x8a, 0x05, 0x46, 0x14, |
2737 | 0x55, 0x19, 0x6a, 0xa5, 0x9f, 0x4f, 0x7d, 0xf2, 0x35, 0xb9, 0x61, 0x6f, | 2737 | 0x9b, 0xf6, 0x65, 0x49, 0xb7, 0xd3, 0xcf, 0xa7, 0x3e, 0xf9, 0x8a, 0xdc, |
2738 | 0x96, 0x1b, 0x5d, 0xc4, 0x63, 0xf6, 0xa2, 0x4d, 0x5d, 0xd2, 0x8f, 0xbe, | 2738 | 0xb4, 0xb7, 0xca, 0xcd, 0x1e, 0xe2, 0x31, 0xfb, 0xd1, 0xa6, 0x2e, 0x19, |
2739 | 0x24, 0xfa, 0x1a, 0x94, 0x1f, 0x35, 0x3e, 0x83, 0xce, 0xba, 0x61, 0x53, | 2739 | 0x44, 0x5f, 0x12, 0x7d, 0x4d, 0xca, 0x8f, 0x1a, 0x9f, 0x41, 0x67, 0xdd, |
2740 | 0x57, 0xdd, 0xc5, 0x5f, 0xbc, 0xeb, 0x9f, 0x41, 0x13, 0x62, 0x3b, 0xb6, | 2740 | 0xb4, 0xa9, 0xab, 0xee, 0xe2, 0x2f, 0xde, 0xf5, 0x6f, 0xa0, 0x09, 0xb1, |
2741 | 0xa0, 0x4d, 0x1d, 0x67, 0xd7, 0xf4, 0xb7, 0xa3, 0x7d, 0x2f, 0xd6, 0xa8, | 2741 | 0x1d, 0xdb, 0xd0, 0xa6, 0x8e, 0xb3, 0xeb, 0xfa, 0x3b, 0xd1, 0xbe, 0x17, |
2742 | 0xd3, 0xf7, 0xb3, 0x9c, 0x6d, 0xa6, 0xce, 0x59, 0x35, 0x67, 0x4d, 0x4d, | 2742 | 0x73, 0x34, 0xe8, 0xfb, 0x59, 0xce, 0x76, 0x53, 0xe7, 0xac, 0x19, 0xb3, |
2743 | 0xfb, 0xdd, 0x16, 0x83, 0x4f, 0xb8, 0x45, 0x7a, 0x67, 0x53, 0xb2, 0xab, | 2743 | 0xae, 0xae, 0xfd, 0xfb, 0x36, 0x83, 0x4f, 0xf8, 0x94, 0xf4, 0xce, 0xa5, |
2744 | 0xad, 0xba, 0xfd, 0xcf, 0x9a, 0x76, 0xb3, 0xac, 0x6a, 0x21, 0x19, 0x9e, | 2744 | 0xe4, 0xe1, 0x8e, 0xda, 0xf6, 0xbf, 0xea, 0xda, 0xad, 0xb2, 0xa6, 0x8d, |
2745 | 0x68, 0xad, 0xee, 0xf7, 0xf9, 0xc9, 0x6f, 0xb7, 0xe1, 0x7d, 0x13, 0x30, | 2745 | 0x64, 0x38, 0xd6, 0x5e, 0xdb, 0xef, 0xf3, 0x93, 0xdf, 0xee, 0xc0, 0xfb, |
2746 | 0x78, 0x49, 0x8d, 0xa5, 0x6e, 0x44, 0xf9, 0xac, 0xbf, 0xd6, 0xdc, 0xc3, | 2746 | 0x42, 0x66, 0xac, 0xa4, 0xc6, 0x52, 0x37, 0xa3, 0x5c, 0xeb, 0xc3, 0xba, |
2747 | 0x6b, 0xde, 0xc3, 0x7b, 0x99, 0xd7, 0xfb, 0x37, 0xfb, 0x71, 0x0f, 0x73, | 2747 | 0x67, 0x78, 0xcd, 0x67, 0xf8, 0x2c, 0xf3, 0x7a, 0xb7, 0xd9, 0x8f, 0x67, |
2748 | 0x02, 0xcc, 0x6b, 0x90, 0x67, 0x57, 0x8a, 0xb3, 0x38, 0xe7, 0xf3, 0xf9, | 2748 | 0x98, 0x13, 0x60, 0x5e, 0x83, 0x3c, 0xbb, 0x5a, 0x9c, 0xc5, 0x31, 0x9f, |
2749 | 0x86, 0x74, 0x99, 0xf7, 0x7c, 0xbd, 0x12, 0x2b, 0x63, 0xd5, 0x76, 0xe6, | 2749 | 0xcd, 0x37, 0x64, 0x2a, 0xbc, 0xe7, 0xeb, 0x95, 0x58, 0x05, 0xab, 0xb6, |
2750 | 0xfd, 0x9c, 0x30, 0x69, 0xa7, 0x35, 0xa9, 0xd8, 0x75, 0xd0, 0xf9, 0x20, | 2750 | 0xab, 0xe0, 0xe7, 0x84, 0x49, 0x3b, 0xad, 0x49, 0xc5, 0x6e, 0x80, 0xce, |
2751 | 0xe8, 0xfc, 0x40, 0x90, 0x71, 0x61, 0xa3, 0x47, 0x6b, 0x47, 0x86, 0x8b, | 2751 | 0x87, 0x40, 0xe7, 0x07, 0x83, 0x8c, 0x0b, 0x9b, 0x3d, 0x5a, 0x3b, 0x32, |
2752 | 0x6f, 0x43, 0xc6, 0xc9, 0xa3, 0xf0, 0x29, 0x8a, 0x96, 0x87, 0xcf, 0xe8, | 2752 | 0x52, 0xfa, 0x0d, 0x64, 0x9c, 0x3c, 0x0a, 0x9f, 0xa2, 0x64, 0x79, 0xf8, |
2753 | 0x83, 0x4d, 0x73, 0x25, 0xa8, 0x79, 0x07, 0xc4, 0xf7, 0x73, 0xd7, 0x64, | 2753 | 0x8c, 0x01, 0xd8, 0x34, 0x57, 0x82, 0x9a, 0x77, 0x40, 0x7c, 0x3f, 0x7f, |
2754 | 0x78, 0x92, 0x39, 0x01, 0xf2, 0x33, 0xe3, 0xfa, 0x14, 0xc6, 0x6e, 0x62, | 2754 | 0x5d, 0x46, 0xa6, 0x98, 0x13, 0x20, 0x3f, 0x33, 0xae, 0x4f, 0xe1, 0xde, |
2755 | 0xae, 0x0b, 0x19, 0x1e, 0x05, 0xbf, 0x86, 0xc4, 0x99, 0xda, 0x22, 0xd9, | 2755 | 0x2d, 0x8c, 0x75, 0x21, 0xc3, 0x63, 0xe0, 0xd7, 0x90, 0x38, 0xd3, 0xdb, |
2756 | 0xb1, 0x51, 0xf5, 0x01, 0x3a, 0x61, 0xa3, 0x4e, 0xb8, 0x23, 0x72, 0xf2, | 2756 | 0x24, 0x37, 0x3e, 0xa6, 0x3e, 0x40, 0x37, 0x6c, 0xd4, 0x29, 0x77, 0x54, |
2757 | 0xf2, 0xdd, 0x90, 0x55, 0xc6, 0xfd, 0x9a, 0xd3, 0x28, 0x85, 0xd5, 0x37, | 2757 | 0x26, 0xaf, 0x6c, 0x82, 0xac, 0x32, 0xee, 0xd7, 0x9c, 0x46, 0x39, 0xac, |
2758 | 0xa7, 0xcf, 0xc1, 0x3c, 0x9c, 0xa9, 0x31, 0x1b, 0xb9, 0x7d, 0x24, 0x26, | 2758 | 0xbe, 0x39, 0x7d, 0x0e, 0xe6, 0xe1, 0x4c, 0x8d, 0xd9, 0xc8, 0xed, 0xa1, |
2759 | 0xcd, 0x23, 0x32, 0x3d, 0x63, 0x2b, 0xde, 0x25, 0x25, 0xb7, 0x4b, 0xa4, | 2759 | 0x98, 0xb4, 0x8e, 0xca, 0xcc, 0xac, 0xad, 0x78, 0x97, 0x94, 0xdc, 0x2e, |
2760 | 0x5d, 0x66, 0x5f, 0x1c, 0xba, 0x8a, 0xbe, 0x7c, 0x2e, 0x62, 0xce, 0x72, | 2760 | 0x93, 0x76, 0xd9, 0x7d, 0x71, 0xe8, 0x2a, 0xfa, 0xf2, 0x3f, 0x88, 0x98, |
2761 | 0x74, 0x1d, 0x63, 0xe2, 0xe4, 0x54, 0xe5, 0x1a, 0x8a, 0x91, 0xc1, 0xd8, | 2761 | 0xb3, 0xdc, 0xbd, 0x81, 0x31, 0x71, 0x72, 0xba, 0x7a, 0x0e, 0xc5, 0xc8, |
2762 | 0xa5, 0x16, 0x23, 0x33, 0x8c, 0x8f, 0x3f, 0x2a, 0xa5, 0xa2, 0x7c, 0x26, | 2762 | 0xe0, 0xde, 0x2f, 0xdb, 0x8c, 0xcc, 0x30, 0x3e, 0xfe, 0xa0, 0x9c, 0x8a, |
2763 | 0xe7, 0xb2, 0x76, 0x4b, 0x1e, 0xe1, 0xde, 0xfe, 0xe3, 0xf1, 0xf2, 0x4b, | 2763 | 0x72, 0x4d, 0x8e, 0x65, 0xed, 0x96, 0x3c, 0xc2, 0xbd, 0xfd, 0xc7, 0xe3, |
2764 | 0x58, 0x2f, 0x2e, 0x9d, 0xaf, 0x8f, 0x6a, 0x5c, 0x7f, 0xa2, 0x2a, 0x86, | 2764 | 0xe5, 0x97, 0x31, 0x5f, 0x5c, 0xba, 0x5f, 0x1d, 0xd3, 0xb8, 0xfe, 0x54, |
2765 | 0x35, 0xf9, 0x02, 0x13, 0xc7, 0x5e, 0x93, 0x89, 0x05, 0xd2, 0x87, 0x36, | 2765 | 0x4d, 0x0c, 0x6b, 0xf2, 0x05, 0x26, 0x8e, 0xbd, 0x2e, 0x13, 0x8b, 0xa4, |
2766 | 0x3e, 0x20, 0x3f, 0x77, 0xba, 0xed, 0xc7, 0xb4, 0xd6, 0x98, 0x48, 0xb1, | 2766 | 0x0f, 0x6d, 0x7c, 0x40, 0x7e, 0xe1, 0xf4, 0xda, 0x4f, 0x68, 0xad, 0x31, |
2767 | 0x3e, 0xd3, 0xe8, 0x24, 0xed, 0x39, 0x09, 0xf5, 0x7f, 0x03, 0xd7, 0x8c, | 2767 | 0x91, 0x62, 0x7d, 0xa6, 0xd9, 0x49, 0xda, 0xf3, 0x12, 0x1a, 0xfc, 0x1a, |
2768 | 0x6b, 0x73, 0x6e, 0xb7, 0xfb, 0x98, 0xf8, 0x38, 0x90, 0x8d, 0xa9, 0xfa, | 2768 | 0xae, 0x19, 0xd7, 0xe6, 0xdd, 0x5e, 0xf7, 0x09, 0xf1, 0x71, 0x20, 0x9b, |
2769 | 0xc0, 0xad, 0xd2, 0xb5, 0x7d, 0x9c, 0x63, 0x70, 0x20, 0x12, 0x20, 0xad, | 2769 | 0x53, 0x8d, 0x81, 0x4f, 0xca, 0xd7, 0xf7, 0x71, 0x8c, 0xc1, 0x81, 0x48, |
2770 | 0x3e, 0xb8, 0x8b, 0xf8, 0x99, 0xea, 0xfc, 0xdf, 0xfd, 0x47, 0xf6, 0xf6, | 2770 | 0x80, 0xb4, 0x7a, 0xef, 0x2e, 0xe2, 0x67, 0x6a, 0xf3, 0x7f, 0x0f, 0x1c, |
2771 | 0x25, 0x5e, 0x64, 0x0c, 0x1b, 0x76, 0x0e, 0xac, 0x33, 0xef, 0x9a, 0xcd, | 2771 | 0xdb, 0x3b, 0x90, 0x38, 0xc3, 0x18, 0x36, 0xec, 0x3c, 0xba, 0xc1, 0xbc, |
2772 | 0xae, 0x11, 0xad, 0x9f, 0x1d, 0xfd, 0xbb, 0x43, 0x3c, 0x44, 0x22, 0x56, | 2772 | 0x6b, 0x2e, 0xb7, 0x4e, 0xb4, 0x7e, 0x76, 0xfc, 0x1f, 0x0e, 0xf1, 0x10, |
2773 | 0x6f, 0x31, 0x0f, 0x4e, 0x1d, 0xc7, 0x9a, 0x0a, 0x73, 0x6e, 0xc4, 0xf2, | 2773 | 0x89, 0x58, 0xa3, 0xc5, 0x3c, 0x38, 0x75, 0x1c, 0x6b, 0x2a, 0xcc, 0xb9, |
2774 | 0x37, 0xc8, 0xa5, 0x1e, 0x4b, 0xee, 0x0f, 0xa5, 0xe2, 0x96, 0x6c, 0x8a, | 2774 | 0x11, 0xcb, 0xdf, 0x24, 0x97, 0xfb, 0x2c, 0x79, 0x20, 0x94, 0x8a, 0x5b, |
2775 | 0x9f, 0x15, 0x3c, 0x93, 0xf5, 0x95, 0x85, 0x44, 0x96, 0xf3, 0x43, 0x53, | 2775 | 0xb2, 0x25, 0x7e, 0x4e, 0xb0, 0x26, 0xeb, 0x2b, 0x8b, 0x89, 0x1c, 0xc7, |
2776 | 0x5c, 0x2f, 0xae, 0xf1, 0x4a, 0x72, 0x53, 0xa9, 0xf4, 0x94, 0x2b, 0x81, | 2776 | 0x87, 0xa6, 0x39, 0x5f, 0x5c, 0xe3, 0x95, 0xe4, 0x96, 0x72, 0xf9, 0x29, |
2777 | 0xe4, 0xd6, 0x8f, 0x4b, 0xac, 0x85, 0x5b, 0xaf, 0x7f, 0x11, 0x4e, 0x41, | 2777 | 0x57, 0x02, 0xc9, 0x7b, 0x3e, 0x2c, 0xb3, 0x16, 0x6e, 0xbd, 0xfa, 0x79, |
2778 | 0xbf, 0x1d, 0x98, 0x30, 0x98, 0xc3, 0x89, 0xa3, 0x9d, 0x0b, 0x6c, 0xa7, | 2778 | 0x38, 0x05, 0xea, 0x0a, 0x7b, 0xc2, 0x60, 0x0e, 0x27, 0x8f, 0x77, 0x2f, |
2779 | 0x77, 0x99, 0xf6, 0x61, 0xb4, 0xeb, 0x3c, 0xac, 0xd3, 0x0f, 0x8f, 0x76, | 2779 | 0xb2, 0xfd, 0xe4, 0x43, 0xa6, 0x7d, 0x06, 0xed, 0x06, 0x0f, 0xeb, 0x34, |
2780 | 0x16, 0x9e, 0x58, 0x67, 0xe2, 0xef, 0x25, 0xc5, 0x7f, 0xbd, 0x53, 0x15, | 2780 | 0x75, 0xbc, 0xbb, 0x78, 0x6c, 0x83, 0x89, 0xbf, 0x97, 0x15, 0xff, 0xf5, |
2781 | 0xd3, 0xa4, 0x02, 0x63, 0xf9, 0xd1, 0xc0, 0x68, 0xde, 0xea, 0x69, 0x00, | 2781 | 0x56, 0x4d, 0x4c, 0x93, 0x0a, 0x8c, 0x17, 0xc6, 0x02, 0x63, 0x05, 0xab, |
2782 | 0xad, 0xe6, 0x5d, 0xe6, 0x6a, 0xfc, 0x9c, 0x15, 0xf3, 0xfd, 0x22, 0x4f, | 2782 | 0xaf, 0x09, 0xb4, 0x5a, 0x70, 0x99, 0xab, 0xf1, 0x73, 0x56, 0xcc, 0xf7, |
2783 | 0x2a, 0x46, 0x8a, 0x35, 0x45, 0x4b, 0x7d, 0xa1, 0x83, 0xf3, 0xcc, 0xf1, | 2783 | 0x8b, 0x3c, 0xa9, 0x18, 0x29, 0xd6, 0x14, 0x2d, 0xf5, 0x85, 0x0e, 0x2d, |
2784 | 0x47, 0x54, 0x1f, 0x1c, 0x5a, 0x68, 0x96, 0x9c, 0xbd, 0x56, 0x72, 0x2a, | 2784 | 0x30, 0xc7, 0x1f, 0x51, 0x7d, 0x70, 0x78, 0xb1, 0x55, 0xf2, 0xf6, 0x7a, |
2785 | 0xe3, 0x51, 0xd5, 0x01, 0x96, 0xb3, 0x15, 0x7d, 0xdc, 0xf7, 0x43, 0x8a, | 2785 | 0xc9, 0xab, 0x8c, 0x47, 0x55, 0x07, 0x58, 0xce, 0x3d, 0xe8, 0xe3, 0xbe, |
2786 | 0x8b, 0x78, 0x23, 0xdf, 0x8e, 0x36, 0x73, 0xcd, 0xdb, 0x6b, 0xfa, 0x2b, | 2786 | 0x1f, 0x57, 0x5c, 0xc4, 0xeb, 0x85, 0x4e, 0xb4, 0x99, 0x6b, 0xde, 0x51, |
2787 | 0xeb, 0xb2, 0x09, 0xdb, 0xb2, 0x6a, 0x6b, 0xb2, 0xec, 0xab, 0xad, 0xc5, | 2787 | 0xd7, 0x5f, 0x5d, 0x97, 0x4d, 0xd8, 0x96, 0x55, 0x5f, 0x93, 0x65, 0x5f, |
2788 | 0x9e, 0x92, 0x6b, 0xe4, 0x9b, 0xa2, 0x9f, 0x73, 0x77, 0xbd, 0x9c, 0xfb, | 2788 | 0x7d, 0x2d, 0xf6, 0xb4, 0x5c, 0x27, 0xdf, 0x94, 0xfc, 0x9c, 0xbb, 0xeb, |
2789 | 0xf7, 0xb1, 0x26, 0xd7, 0x96, 0x74, 0x68, 0xa0, 0xa1, 0xe7, 0xc4, 0x64, | 2789 | 0xe5, 0xdc, 0x1f, 0xc3, 0x9c, 0x9c, 0x5b, 0x32, 0xa1, 0xa1, 0xa6, 0xbe, |
2790 | 0xf0, 0xe6, 0x72, 0xfe, 0x14, 0xed, 0x85, 0x72, 0xad, 0x1c, 0x63, 0xcf, | 2790 | 0x53, 0x53, 0xc1, 0x5b, 0x2b, 0xf9, 0x53, 0xb4, 0x17, 0x2b, 0xb5, 0x72, |
2791 | 0xc0, 0x17, 0xc9, 0xc1, 0xaf, 0xc8, 0x7a, 0xdf, 0x1f, 0x70, 0xbc, 0x7c, | 2791 | 0xdc, 0x7b, 0x06, 0xbe, 0x48, 0x1e, 0x7e, 0x45, 0xce, 0xfb, 0xfe, 0x80, |
2792 | 0xff, 0x97, 0xec, 0xa9, 0x51, 0xeb, 0xec, 0x56, 0x55, 0x9d, 0xfd, 0x7b, | 2792 | 0xf7, 0x2b, 0xcf, 0x7f, 0xc1, 0x9e, 0x9a, 0xb5, 0xce, 0x6e, 0xd5, 0xd4, |
2793 | 0xb8, 0x97, 0x35, 0xf6, 0x6c, 0xa9, 0x0e, 0xbc, 0x5b, 0x47, 0x9c, 0x48, | 2793 | 0xd9, 0xbf, 0x8d, 0x67, 0x59, 0x63, 0xcf, 0x95, 0x1b, 0xc0, 0xbb, 0x0d, |
2794 | 0x79, 0x3e, 0x75, 0xbc, 0xea, 0x72, 0x5d, 0x6b, 0xa7, 0xb7, 0x56, 0x10, | 2794 | 0xc4, 0x89, 0x54, 0xc6, 0x53, 0xc7, 0xab, 0x2e, 0xd7, 0xb9, 0x76, 0x79, |
2795 | 0x7a, 0x7e, 0x7c, 0xd2, 0x9f, 0x73, 0x5c, 0xea, 0x7b, 0x13, 0xb1, 0xa0, | 2795 | 0x73, 0x05, 0xa1, 0xe7, 0x0f, 0x4e, 0xf9, 0x63, 0x4e, 0x4a, 0x63, 0x7f, |
2796 | 0xc5, 0x39, 0x46, 0xdf, 0x0f, 0xb9, 0xc7, 0xa1, 0xc7, 0xa9, 0xf3, 0xf9, | 2796 | 0x22, 0x16, 0xb4, 0x38, 0xc6, 0xe8, 0xfb, 0xb4, 0x7b, 0x12, 0x7a, 0x9c, |
2797 | 0xde, 0x0e, 0x7c, 0x3d, 0xea, 0x02, 0xea, 0x73, 0xb5, 0x01, 0xf1, 0x1c, | 2797 | 0x3a, 0x9f, 0xef, 0xed, 0xc0, 0xd7, 0xa3, 0x2e, 0xa0, 0x3e, 0x57, 0x1b, |
2798 | 0x74, 0xfd, 0x70, 0xd1, 0x7c, 0xeb, 0xf5, 0xf5, 0x60, 0x62, 0x3a, 0xa3, | 2798 | 0x10, 0xcf, 0x43, 0xd7, 0x8f, 0x94, 0x34, 0x97, 0x1f, 0xfb, 0x6a, 0x30, |
2799 | 0xba, 0x01, 0xfe, 0x5e, 0xf1, 0x0d, 0xe6, 0x83, 0x5e, 0x94, 0x40, 0x65, | 2799 | 0x31, 0x93, 0x55, 0xdd, 0x00, 0x7f, 0xaf, 0xf4, 0x26, 0xf3, 0x41, 0x67, |
2800 | 0x9d, 0x86, 0xb1, 0x19, 0x6b, 0x1a, 0x4d, 0xd0, 0x0d, 0x22, 0x57, 0xc0, | 2800 | 0x24, 0x50, 0x5d, 0xa7, 0x61, 0x6c, 0xc6, 0x9a, 0x46, 0x0b, 0x74, 0x83, |
2801 | 0x1b, 0x57, 0xe7, 0xc9, 0xaf, 0xc1, 0x56, 0x13, 0x5f, 0x2d, 0x6e, 0xb7, | 2801 | 0xc8, 0x55, 0xf0, 0xc6, 0x6b, 0x0b, 0xe4, 0xd7, 0x60, 0xbb, 0x89, 0xaf, |
2802 | 0xa4, 0x55, 0x6b, 0x9f, 0x39, 0x27, 0x42, 0xff, 0x64, 0x30, 0xd9, 0x0b, | 2802 | 0x96, 0x76, 0x58, 0xd2, 0xae, 0xb5, 0xcf, 0xbc, 0x13, 0xa1, 0x7f, 0x32, |
2803 | 0x3f, 0x5b, 0xb1, 0x07, 0xcc, 0x57, 0x8e, 0x23, 0x1e, 0xab, 0xcc, 0xb1, | 2803 | 0x9c, 0xec, 0x87, 0x9f, 0xad, 0xd8, 0x03, 0xe6, 0x2b, 0x0f, 0x22, 0x1e, |
2804 | 0x40, 0xbe, 0xc6, 0xd8, 0x9f, 0x81, 0x5f, 0xb9, 0x5c, 0xf7, 0xc8, 0x15, | 2804 | 0xab, 0xce, 0xb1, 0x40, 0xbe, 0xc6, 0xd9, 0x9f, 0x85, 0x5f, 0xb9, 0x52, |
2805 | 0x4e, 0x6a, 0x6e, 0x73, 0x76, 0xbe, 0x49, 0x75, 0xec, 0x6c, 0x61, 0x04, | 2805 | 0xf7, 0xc8, 0x17, 0x27, 0x35, 0xb7, 0x39, 0xb7, 0xd0, 0xa2, 0x3a, 0x76, |
2806 | 0xe7, 0x22, 0x9b, 0xad, 0x81, 0x9c, 0xd7, 0x1f, 0x96, 0x42, 0x81, 0x6d, | 2806 | 0xae, 0x38, 0x86, 0x73, 0x91, 0xad, 0xd6, 0x50, 0xde, 0xeb, 0x0f, 0x4b, |
2807 | 0xe9, 0xa8, 0xd3, 0x73, 0xf7, 0x6b, 0x3b, 0xb6, 0xcc, 0xc1, 0x57, 0x2c, | 2807 | 0xb1, 0xc8, 0xb6, 0x74, 0x35, 0xe8, 0xb9, 0xfb, 0xb5, 0x1d, 0x5b, 0xe6, |
2808 | 0x2c, 0x38, 0xf8, 0xef, 0xc2, 0x7f, 0x0f, 0xfe, 0x77, 0xcb, 0xd0, 0x14, | 2808 | 0xe1, 0x2b, 0x16, 0x17, 0x1d, 0xfc, 0xf7, 0xe0, 0xbf, 0x0f, 0xff, 0xbb, |
2809 | 0xfd, 0x57, 0xd6, 0x72, 0x9a, 0x6a, 0x9e, 0x4f, 0x1f, 0xa9, 0x43, 0x71, | 2809 | 0x25, 0x3d, 0x4d, 0xff, 0x95, 0xb5, 0x9c, 0x96, 0xba, 0xf5, 0xe9, 0x23, |
2810 | 0x60, 0x39, 0x2f, 0xce, 0xc9, 0x15, 0x6a, 0xe5, 0x84, 0x79, 0x52, 0x5f, | 2810 | 0x75, 0x29, 0x0e, 0x2c, 0xef, 0xc5, 0x39, 0xf9, 0x62, 0xbd, 0x9c, 0x30, |
2811 | 0x47, 0x30, 0x5f, 0xea, 0xd7, 0xfa, 0x2a, 0x6b, 0x58, 0x96, 0x57, 0xf7, | 2811 | 0x4f, 0xea, 0xeb, 0x08, 0xe6, 0x4b, 0xfd, 0x5a, 0x5f, 0x75, 0x0d, 0xcb, |
2812 | 0x22, 0x4f, 0x37, 0xca, 0xa1, 0x82, 0x5f, 0xbb, 0x8a, 0xc9, 0xa3, 0xe5, | 2812 | 0xf2, 0xea, 0x5e, 0xe4, 0xe9, 0x66, 0x39, 0x5c, 0xf4, 0x6b, 0x57, 0x31, |
2813 | 0xda, 0x95, 0xa4, 0x83, 0x03, 0xb7, 0x1e, 0xcc, 0x4c, 0x2a, 0x9e, 0xc0, | 2813 | 0x39, 0x52, 0xa9, 0x5d, 0x49, 0x26, 0x38, 0xf4, 0xc9, 0x23, 0xd9, 0x29, |
2814 | 0xb2, 0x06, 0xae, 0x3d, 0x38, 0xb1, 0xf0, 0xee, 0x83, 0xcb, 0x98, 0x70, | 2814 | 0xc5, 0x13, 0x58, 0xd6, 0xd0, 0xf5, 0x47, 0x26, 0x16, 0xdf, 0x7e, 0x64, |
2815 | 0x8c, 0x2d, 0xac, 0x84, 0x19, 0x22, 0x96, 0xee, 0x33, 0xf2, 0x10, 0x0d, | 2815 | 0x05, 0x13, 0x8e, 0x7b, 0x8b, 0xab, 0x61, 0x86, 0x88, 0xa5, 0xe3, 0xb7, |
2816 | 0x27, 0xf6, 0xed, 0xc7, 0x3c, 0xc4, 0xd9, 0x6d, 0xb0, 0x97, 0xf1, 0xcb, | 2816 | 0x72, 0xea, 0xbb, 0x61, 0xdf, 0x7e, 0xcc, 0x43, 0x9c, 0x1d, 0xf4, 0x4c, |
2817 | 0x7e, 0x3c, 0x4a, 0x1c, 0x29, 0xef, 0xab, 0xc4, 0x7e, 0x84, 0x70, 0xfe, | 2817 | 0xf3, 0x0a, 0x76, 0xd7, 0xc4, 0xa3, 0xc4, 0x91, 0xf2, 0xb9, 0x6a, 0xec, |
2818 | 0x12, 0xb0, 0x9c, 0x2c, 0xf6, 0x71, 0xa1, 0xdd, 0xf8, 0x81, 0xc4, 0x99, | 2818 | 0x47, 0x08, 0xe7, 0x2f, 0x01, 0xcb, 0xc9, 0x61, 0x1f, 0x3f, 0xed, 0x34, |
2819 | 0x26, 0x2a, 0xb0, 0x47, 0x3e, 0xd6, 0xf4, 0x65, 0xac, 0x95, 0x96, 0xdf, | 2819 | 0x7e, 0x20, 0x71, 0xa6, 0x89, 0x2a, 0xec, 0x91, 0x8f, 0x35, 0x7d, 0x09, |
2820 | 0x14, 0x1f, 0x96, 0x5f, 0x16, 0x47, 0x21, 0xdf, 0x13, 0x58, 0xf3, 0x80, | 2820 | 0x73, 0x65, 0xe4, 0x77, 0xa5, 0x47, 0xe5, 0x57, 0xa5, 0x31, 0xc8, 0xf7, |
2821 | 0xfc, 0xa2, 0xb8, 0x4f, 0xde, 0x2a, 0x8e, 0xc9, 0x9b, 0xc5, 0xdd, 0x88, | 2821 | 0x04, 0xe6, 0x3c, 0x20, 0x6f, 0x96, 0xf6, 0xc9, 0xb5, 0xd2, 0xb8, 0xbc, |
2822 | 0xa9, 0x46, 0x88, 0xf5, 0xf4, 0xb0, 0xd2, 0x83, 0x32, 0x7e, 0x4e, 0x31, | 2822 | 0x51, 0xda, 0x8d, 0x98, 0x6a, 0x94, 0x58, 0x4f, 0x0f, 0x2b, 0x3d, 0x2c, |
2823 | 0x80, 0x37, 0xe9, 0xf7, 0x1c, 0x55, 0x3f, 0x9b, 0xf8, 0xfa, 0xc4, 0xaf, | 2823 | 0x07, 0xcf, 0x2b, 0x06, 0xf0, 0x16, 0xfd, 0x9e, 0xe3, 0xea, 0x67, 0x13, |
2824 | 0x18, 0xcf, 0x13, 0x9b, 0x59, 0x28, 0xfa, 0x18, 0x8e, 0x89, 0x0e, 0x3c, | 2824 | 0x5f, 0x9f, 0xf8, 0x35, 0xe3, 0x79, 0x62, 0x33, 0x8b, 0x25, 0x1f, 0xc3, |
2825 | 0xdb, 0xe6, 0xb7, 0x29, 0xc3, 0xe7, 0x22, 0x81, 0x91, 0x73, 0xa1, 0xc0, | 2825 | 0x71, 0xb4, 0x0b, 0x6b, 0xdb, 0xfc, 0x36, 0x65, 0xe4, 0x7c, 0x24, 0x30, |
2826 | 0x03, 0xfa, 0x9d, 0x0b, 0xeb, 0x9d, 0x25, 0x39, 0xe9, 0x3a, 0xe4, 0xcd, | 2826 | 0x7a, 0x3e, 0x14, 0x78, 0x50, 0xbf, 0x73, 0x61, 0xbd, 0xb3, 0x2c, 0x93, |
2827 | 0xfe, 0x61, 0xc8, 0xc2, 0x08, 0x54, 0xfd, 0x2e, 0x67, 0xad, 0x80, 0xa4, | 2827 | 0xae, 0x43, 0xde, 0x1c, 0x1c, 0x81, 0x2c, 0x8c, 0x42, 0xd5, 0x3f, 0xe4, |
2828 | 0xa9, 0x4f, 0xe0, 0x67, 0x26, 0x4f, 0xbb, 0x92, 0xc9, 0xcf, 0x05, 0x0c, | 2828 | 0xac, 0x17, 0x90, 0x34, 0xf5, 0x11, 0xfc, 0xcc, 0xe4, 0x8b, 0xae, 0x64, |
2829 | 0x1e, 0xcd, 0x46, 0xbb, 0x07, 0xed, 0x57, 0xbd, 0xf6, 0x0e, 0xc9, 0xcc, | 2829 | 0x0b, 0xf3, 0x01, 0x83, 0x47, 0xb3, 0xd1, 0xee, 0x43, 0xfb, 0xe7, 0x5e, |
2830 | 0x48, 0xea, 0x43, 0xf5, 0x87, 0x5f, 0xf1, 0xfa, 0xfa, 0xd1, 0x07, 0xce, | 2830 | 0x7b, 0xa7, 0x64, 0x67, 0x25, 0xf5, 0xbe, 0xfa, 0xc3, 0x2f, 0x7b, 0x7d, |
2831 | 0xbc, 0xc0, 0xbe, 0x0b, 0x5e, 0x1f, 0xcf, 0x84, 0xb5, 0xfa, 0xb8, 0xf2, | 2831 | 0x83, 0xe8, 0x03, 0x67, 0x5e, 0x64, 0xdf, 0x45, 0xaf, 0x8f, 0x67, 0xc2, |
2832 | 0x55, 0xc6, 0x1e, 0x13, 0xfd, 0xae, 0x41, 0x6b, 0xf1, 0x4b, 0xed, 0x46, | 2832 | 0x5a, 0x7d, 0x5c, 0xf9, 0x2a, 0x6b, 0x8f, 0x8b, 0x7e, 0xd7, 0xa0, 0xb5, |
2833 | 0xb7, 0x11, 0x13, 0xf8, 0x8f, 0x76, 0xc6, 0x60, 0x05, 0xc8, 0xd7, 0x5d, | 2833 | 0xf8, 0x0f, 0x3a, 0x8d, 0x6e, 0x23, 0x26, 0xf0, 0x9f, 0x9d, 0x8c, 0xc1, |
2834 | 0xd0, 0x89, 0x7f, 0xd9, 0xbc, 0xdc, 0xb6, 0x06, 0x3e, 0xad, 0xc0, 0x68, | 2834 | 0x8a, 0x90, 0xaf, 0xbb, 0xa0, 0x13, 0xff, 0xba, 0x75, 0xa5, 0x6d, 0x0d, |
2835 | 0x7f, 0x2a, 0x9d, 0x0b, 0xff, 0xf2, 0xf0, 0xbc, 0x07, 0xf1, 0x6e, 0x38, | 2835 | 0x7d, 0x5c, 0x85, 0xd1, 0xfe, 0x58, 0xba, 0x17, 0xff, 0xed, 0xe1, 0x79, |
2836 | 0xab, 0x3c, 0x71, 0xe3, 0x71, 0xc8, 0x76, 0x93, 0xac, 0x3d, 0x43, 0x7a, | 2836 | 0x9f, 0xc0, 0xbb, 0xe1, 0xac, 0x0a, 0xc4, 0x8d, 0xc7, 0x21, 0xdb, 0x2d, |
2837 | 0x75, 0x43, 0x57, 0xa7, 0x20, 0xb7, 0xae, 0xcc, 0x17, 0x43, 0x81, 0xe1, | 2837 | 0xb2, 0xfe, 0x2c, 0xe9, 0xd5, 0x0b, 0x5d, 0x9d, 0x82, 0xdc, 0xba, 0xb2, |
2838 | 0x7c, 0x4a, 0x0c, 0x9e, 0xda, 0x92, 0x74, 0x34, 0x25, 0xa7, 0xfa, 0x12, | 2838 | 0x50, 0x0a, 0x05, 0x46, 0x0a, 0x29, 0x31, 0x78, 0x6a, 0x4b, 0x32, 0xd1, |
2839 | 0x5d, 0xcc, 0x43, 0x66, 0x7a, 0x5d, 0xb9, 0x58, 0xa4, 0x3d, 0xce, 0xca, | 2839 | 0x94, 0x9c, 0x1e, 0x48, 0xf4, 0x30, 0x0f, 0x99, 0xed, 0x77, 0xe5, 0x52, |
2840 | 0xa5, 0xbe, 0x84, 0x5b, 0x10, 0xe2, 0x62, 0x5c, 0xb9, 0x04, 0xd9, 0xfc, | 2840 | 0x89, 0xf6, 0x38, 0x27, 0x97, 0x07, 0x12, 0x6e, 0x51, 0x88, 0x8b, 0x71, |
2841 | 0xdd, 0xb9, 0xdd, 0xf2, 0x68, 0x5e, 0xfd, 0xe0, 0xee, 0xb0, 0xbc, 0x20, | 2841 | 0xe5, 0x32, 0x64, 0xf3, 0x9d, 0xf3, 0xbb, 0xe5, 0x48, 0x41, 0xfd, 0xe0, |
2842 | 0x17, 0xfb, 0x5e, 0xb8, 0x79, 0xd1, 0x7d, 0x04, 0x67, 0x4a, 0x3e, 0xcc, | 2842 | 0xde, 0xb0, 0xbc, 0x20, 0x97, 0x06, 0x5e, 0xb8, 0x75, 0xc9, 0x3d, 0x84, |
2843 | 0x74, 0x98, 0x7d, 0x2b, 0x0e, 0x49, 0x98, 0x0f, 0xd1, 0x9a, 0x9a, 0x53, | 2843 | 0x33, 0x25, 0x1f, 0x1e, 0xee, 0x32, 0xfb, 0x56, 0x1c, 0x92, 0x30, 0x1f, |
2844 | 0x2f, 0x43, 0xfb, 0x23, 0x5e, 0x5c, 0x0e, 0x9f, 0x3b, 0xe0, 0x9a, 0x7a, | 2844 | 0xa2, 0x35, 0x35, 0xa7, 0x51, 0xd2, 0xfb, 0x23, 0x5e, 0x5c, 0x0e, 0x9f, |
2845 | 0x4a, 0xc0, 0xdf, 0x67, 0x18, 0x7e, 0x0c, 0xef, 0xf3, 0x69, 0xe3, 0xaf, | 2845 | 0x3b, 0x30, 0x60, 0xea, 0x29, 0x01, 0x7f, 0x9f, 0x61, 0xf8, 0x31, 0x7c, |
2846 | 0xd3, 0x1e, 0x18, 0x9a, 0x69, 0x96, 0xd0, 0x85, 0xaf, 0x80, 0xae, 0x21, | 2846 | 0xce, 0xa7, 0x8d, 0x3f, 0x4f, 0x67, 0x20, 0x3d, 0xdb, 0x2a, 0xa1, 0x8b, |
2847 | 0x39, 0xd8, 0x5b, 0x2a, 0x7d, 0xc7, 0x0d, 0xc5, 0x27, 0x10, 0xa3, 0x60, | 2847 | 0xf7, 0x81, 0xae, 0x21, 0x39, 0xd4, 0x5f, 0x2e, 0x7f, 0xd3, 0x0d, 0xc5, |
2848 | 0xff, 0xb2, 0xe6, 0x74, 0x0b, 0x68, 0xd2, 0x20, 0xd1, 0xd3, 0xfe, 0xf3, | 2848 | 0x27, 0x10, 0xa3, 0x60, 0xff, 0xb2, 0xee, 0xc5, 0x36, 0xd0, 0xa4, 0x49, |
2849 | 0xea, 0x3d, 0x2c, 0xc3, 0x99, 0x35, 0xc6, 0x96, 0xf9, 0xd8, 0x06, 0x7f, | 2849 | 0xa2, 0x2f, 0xfa, 0xeb, 0x35, 0x7a, 0x58, 0x86, 0x8b, 0xeb, 0x8c, 0x2d, |
2850 | 0x3d, 0x83, 0x29, 0xeb, 0xb4, 0x7a, 0x03, 0xde, 0x77, 0x12, 0x5e, 0x7b, | 2850 | 0xf3, 0xb1, 0x0d, 0xfe, 0x7c, 0x06, 0x53, 0xd6, 0x6d, 0xf5, 0x07, 0xbc, |
2851 | 0x6b, 0xe0, 0xfe, 0x50, 0xab, 0x84, 0x9c, 0x67, 0xd7, 0x13, 0x1b, 0xb9, | 2851 | 0xef, 0x24, 0xbc, 0xf6, 0x3d, 0x81, 0x07, 0x42, 0xed, 0x12, 0x72, 0x9e, |
2852 | 0x98, 0xf7, 0xfb, 0xe1, 0x27, 0x86, 0x7c, 0x7f, 0x58, 0xb6, 0x2d, 0x9f, | 2852 | 0xdf, 0x48, 0x6c, 0xe4, 0x52, 0xc1, 0xef, 0x87, 0x9f, 0x18, 0xf2, 0xfd, |
2853 | 0xb5, 0x6c, 0xeb, 0x5c, 0xf8, 0xae, 0xb7, 0x66, 0xca, 0x9b, 0x8b, 0x98, | 2853 | 0x61, 0xd9, 0xbe, 0x72, 0xd6, 0xb2, 0xbd, 0x7b, 0xf1, 0x5b, 0xde, 0x9c, |
2854 | 0x23, 0xb6, 0x5a, 0xed, 0x93, 0x99, 0xfb, 0x5f, 0x79, 0xba, 0x37, 0xf1, | 2854 | 0x29, 0x6f, 0x2c, 0x62, 0x8e, 0xd8, 0x5a, 0xb5, 0x4f, 0x66, 0xec, 0xa7, |
2855 | 0x9a, 0xe2, 0x64, 0xcb, 0xf7, 0x70, 0x1c, 0x31, 0x64, 0x51, 0xef, 0x89, | 2855 | 0xf2, 0x74, 0x7f, 0xe2, 0x15, 0xc5, 0xc9, 0x56, 0x9e, 0xe1, 0x7d, 0xc4, |
2856 | 0xed, 0x01, 0x7d, 0xd3, 0xb1, 0x7b, 0xec, 0x39, 0x2b, 0x18, 0x30, 0xfe, | 2856 | 0x90, 0x25, 0x7d, 0x26, 0xb6, 0x07, 0xf4, 0xcd, 0xc4, 0xee, 0xb6, 0xe7, |
2857 | 0x48, 0x9d, 0xfc, 0x28, 0x0a, 0xbb, 0xcd, 0x6f, 0x58, 0x98, 0xff, 0x72, | 2857 | 0xad, 0x60, 0xc0, 0xf8, 0x23, 0x0d, 0xf2, 0xbd, 0x28, 0xec, 0x36, 0xbf, |
2858 | 0x6f, 0x7b, 0x7e, 0x0a, 0xfb, 0x12, 0x2f, 0x26, 0xad, 0x34, 0xf6, 0xc7, | 2858 | 0x61, 0x61, 0xfe, 0xcb, 0xbd, 0xed, 0xf9, 0x29, 0xec, 0x4b, 0x9c, 0x49, |
2859 | 0x33, 0x20, 0x06, 0xd4, 0x02, 0x9d, 0xda, 0xf1, 0x7e, 0x88, 0x9f, 0x7a, | 2859 | 0x5a, 0x13, 0xd8, 0x1f, 0xcf, 0x80, 0x18, 0x50, 0x0b, 0x74, 0xea, 0xc4, |
2860 | 0xfd, 0xf7, 0x5f, 0x03, 0x1d, 0xc6, 0xfd, 0x1b, 0x5c, 0x98, 0x58, 0xcc, | 2860 | 0xfb, 0x21, 0x7e, 0xea, 0xf7, 0xdf, 0x7f, 0x1d, 0x74, 0x18, 0xf7, 0x6f, |
2861 | 0x85, 0x0c, 0x7a, 0x18, 0xd8, 0x4a, 0xb9, 0xf5, 0xb1, 0xb1, 0x3e, 0x9e, | 2861 | 0x70, 0x61, 0x62, 0x31, 0x17, 0x32, 0xec, 0x61, 0x60, 0xab, 0xe5, 0xd6, |
2862 | 0x8e, 0x18, 0xa5, 0x18, 0xfc, 0x40, 0xca, 0x04, 0x79, 0xb3, 0x0d, 0xfd, | 2862 | 0xc7, 0xc6, 0xfa, 0x78, 0x3a, 0x62, 0x94, 0x62, 0xf0, 0x03, 0x29, 0x13, |
2863 | 0xab, 0x6e, 0xa5, 0xf4, 0xd5, 0xfd, 0xbe, 0x8f, 0xcb, 0xd8, 0xee, 0x89, | 2863 | 0xe4, 0xcd, 0x0e, 0xf4, 0xaf, 0xf9, 0x24, 0xa5, 0xaf, 0xee, 0xf7, 0x7d, |
2864 | 0xfc, 0x3e, 0x83, 0xcd, 0xb3, 0x96, 0x24, 0xd5, 0x91, 0xb4, 0x4f, 0x62, | 2864 | 0x58, 0xc1, 0x76, 0x4f, 0x14, 0xf6, 0x19, 0x6c, 0x9e, 0xb5, 0x2c, 0xa9, |
2865 | 0xbf, 0x43, 0xa1, 0x44, 0x21, 0x2b, 0x31, 0x99, 0x83, 0xbe, 0xb8, 0x0a, | 2865 | 0xae, 0xa4, 0x3d, 0x89, 0xfd, 0xa6, 0x43, 0x89, 0x62, 0x4e, 0x62, 0x32, |
2866 | 0xd9, 0x7f, 0xab, 0xc8, 0xef, 0x6d, 0x53, 0x72, 0x28, 0x0f, 0x83, 0x3e, | 2866 | 0x0f, 0x7d, 0xf1, 0x1a, 0x64, 0xff, 0x5a, 0x29, 0x1e, 0x48, 0x63, 0x4f, |
2867 | 0xa3, 0xdf, 0x7e, 0x41, 0xef, 0x0f, 0xc8, 0x6c, 0x3e, 0xd1, 0x35, 0x07, | 2867 | 0x87, 0x0b, 0x43, 0x32, 0x31, 0xab, 0xdf, 0x7e, 0x41, 0xef, 0x0f, 0xc9, |
2868 | 0xfe, 0x9b, 0xcb, 0x13, 0x5f, 0xd4, 0x1d, 0x1f, 0xc1, 0x8a, 0x8b, 0xf9, | 2868 | 0x5c, 0x21, 0xd1, 0x33, 0x0f, 0xfe, 0x9b, 0x2f, 0x10, 0x5f, 0xd4, 0x1b, |
2869 | 0x8d, 0xb0, 0x0f, 0x92, 0xba, 0x08, 0xff, 0xe7, 0x62, 0xb1, 0x0b, 0x7c, | 2869 | 0x1f, 0xc5, 0x8c, 0x4b, 0x85, 0xcd, 0xb0, 0x0f, 0x92, 0xba, 0x04, 0xff, |
2870 | 0x86, 0xf1, 0xa2, 0x83, 0x5f, 0xe8, 0xcc, 0x62, 0x1f, 0xe4, 0x9c, 0x7b, | 2870 | 0xe7, 0x52, 0xa9, 0x07, 0x7c, 0x86, 0xfb, 0x25, 0x07, 0xbf, 0xd0, 0x99, |
2871 | 0xb1, 0x65, 0x7e, 0x33, 0xce, 0x8e, 0x38, 0x22, 0xc5, 0x8f, 0x7f, 0x86, | 2871 | 0xa5, 0x01, 0xc8, 0x39, 0xf7, 0x62, 0xcb, 0xc2, 0x56, 0x9c, 0x1d, 0x71, |
2872 | 0xf3, 0xf5, 0xdf, 0x7b, 0xbb, 0xda, 0xe9, 0x39, 0xdd, 0x17, 0xec, 0x32, | 2872 | 0x44, 0x8a, 0x1f, 0xff, 0x2f, 0xce, 0xd7, 0x7f, 0xef, 0x1d, 0x6a, 0xa7, |
2873 | 0x62, 0x80, 0x4c, 0xaf, 0xb1, 0xdb, 0x43, 0x91, 0x16, 0x19, 0xba, 0x87, | 2873 | 0xe7, 0x75, 0x5f, 0xb0, 0xcb, 0x88, 0x01, 0xb2, 0xfd, 0xc6, 0x6e, 0xa7, |
2874 | 0x76, 0xbc, 0x55, 0x63, 0x44, 0xe5, 0xc5, 0x08, 0xc7, 0x7f, 0xbb, 0xde, | 2874 | 0x23, 0x6d, 0x92, 0xbe, 0x9b, 0x76, 0xbc, 0x5d, 0x63, 0x44, 0xe5, 0xc5, |
2875 | 0xd0, 0x2f, 0x5c, 0xd3, 0x7e, 0x1b, 0xbf, 0xcd, 0xd2, 0xe6, 0xf0, 0xd7, | 2875 | 0x08, 0xef, 0xbf, 0xb3, 0xd1, 0xd0, 0x2f, 0x5c, 0xd7, 0xbe, 0x8e, 0xdf, |
2876 | 0xc6, 0xef, 0xb5, 0xf5, 0xac, 0xef, 0xb6, 0x39, 0x49, 0x3c, 0xeb, 0xd7, | 2876 | 0x56, 0xe9, 0x70, 0xf8, 0x6b, 0xe3, 0xf7, 0xed, 0x8d, 0xac, 0xef, 0x76, |
2877 | 0x5e, 0xbe, 0x00, 0xd7, 0x73, 0xbc, 0x67, 0x9d, 0xf7, 0x5c, 0xae, 0xdb, | 2877 | 0x38, 0x49, 0xac, 0xf5, 0x5b, 0x2f, 0x5f, 0x80, 0xeb, 0x79, 0x3e, 0xb3, |
2878 | 0x8c, 0x75, 0x9a, 0xbc, 0x67, 0x35, 0x6b, 0x7e, 0xd2, 0x3c, 0x0b, 0x31, | 2878 | 0xc1, 0x5b, 0x97, 0xf3, 0xb6, 0x62, 0x9e, 0x16, 0x6f, 0xad, 0x56, 0xcd, |
2879 | 0x6e, 0xfe, 0x4f, 0xeb, 0x79, 0x86, 0xfc, 0xde, 0xb8, 0xba, 0xfd, 0xc7, | 2879 | 0x4f, 0x9a, 0xb5, 0x10, 0xe3, 0x16, 0xfe, 0xb2, 0x51, 0xbf, 0x35, 0x86, |
2880 | 0xf5, 0xc4, 0xcd, 0xb5, 0x39, 0xcd, 0x8a, 0xf1, 0xbc, 0xd1, 0xda, 0x8a, | 2880 | 0xbd, 0xa8, 0x6d, 0xff, 0x79, 0x23, 0x71, 0x73, 0x1d, 0x4e, 0xab, 0x62, |
2881 | 0x6b, 0x3e, 0x93, 0x73, 0x4c, 0x3e, 0x7c, 0xb6, 0xc8, 0xf5, 0xd9, 0x4e, | 2881 | 0x3c, 0x6f, 0xb6, 0xb7, 0xe3, 0x9a, 0x6b, 0x72, 0x8c, 0xc9, 0x87, 0xcf, |
2882 | 0xc9, 0x31, 0xcd, 0x67, 0x18, 0x2c, 0xdf, 0x6c, 0xfe, 0x3e, 0x99, 0x38, | 2882 | 0x95, 0x38, 0x3f, 0xdb, 0x29, 0x39, 0xa1, 0xf9, 0x0c, 0x83, 0xe5, 0x9b, |
2883 | 0xa7, 0xf8, 0xba, 0xe9, 0x9c, 0xc5, 0xef, 0x5e, 0xf8, 0xbd, 0x1c, 0x7d, | 2883 | 0x2b, 0xdc, 0x2f, 0x13, 0xe7, 0x15, 0x5f, 0x37, 0x93, 0xb7, 0xf8, 0xdd, |
2884 | 0x89, 0x51, 0x19, 0xc7, 0xf9, 0x5d, 0x82, 0x4f, 0xb5, 0x68, 0xbe, 0x8b, | 2884 | 0x0b, 0xbf, 0x97, 0xa3, 0x2f, 0x31, 0x26, 0x07, 0x71, 0x7e, 0x97, 0xe1, |
2885 | 0xc5, 0xdf, 0x01, 0x9c, 0x4b, 0x08, 0x32, 0x46, 0x19, 0xa5, 0x4c, 0xe1, | 2885 | 0x53, 0x2d, 0x99, 0xef, 0x62, 0xf1, 0x77, 0x00, 0xe7, 0x12, 0x82, 0x8c, |
2886 | 0xfc, 0xc6, 0x6c, 0x79, 0xaf, 0x8f, 0xf2, 0xdc, 0x27, 0x97, 0xcb, 0xf2, | 2886 | 0x51, 0x46, 0x29, 0x53, 0x38, 0xbf, 0x71, 0x5b, 0xde, 0x1d, 0xa0, 0x3c, |
2887 | 0x9c, 0x85, 0x3c, 0x53, 0x96, 0xb3, 0x90, 0x69, 0xc3, 0xd7, 0xfb, 0x11, | 2887 | 0x0f, 0xc8, 0x95, 0x8a, 0x3c, 0xe7, 0x20, 0xcf, 0x94, 0xe5, 0x1c, 0x64, |
2888 | 0x63, 0xa4, 0x62, 0xb0, 0x57, 0xea, 0x43, 0xbc, 0x0c, 0xbe, 0xb6, 0xbd, | 2888 | 0xda, 0xf0, 0xf5, 0x7e, 0x7e, 0x67, 0x1d, 0x83, 0xbd, 0x52, 0x1f, 0xe2, |
2889 | 0x6f, 0xa5, 0x02, 0x9a, 0xc3, 0xc9, 0xcc, 0xd4, 0x79, 0xdf, 0x01, 0xe0, | 2889 | 0x25, 0xf0, 0xb5, 0xed, 0x7d, 0x2b, 0x15, 0xd0, 0x1c, 0x4e, 0x76, 0xb6, |
2890 | 0xfa, 0xf2, 0x73, 0x32, 0x34, 0xd3, 0x88, 0x7d, 0x6f, 0xe8, 0xe0, 0x99, | 2890 | 0xc1, 0xfb, 0x0e, 0x00, 0xd7, 0x57, 0x9e, 0x93, 0xf4, 0x6c, 0x33, 0xbf, |
2891 | 0x65, 0x2e, 0xf3, 0xdf, 0xe7, 0x45, 0xe2, 0x4d, 0xe9, 0xcf, 0xf2, 0x9a, | 2891 | 0xe7, 0xea, 0xe2, 0x99, 0x65, 0xaf, 0xf0, 0xdf, 0xe7, 0x45, 0xe2, 0x4d, |
2892 | 0x71, 0xde, 0x7a, 0xcc, 0xe9, 0x07, 0x9d, 0x1b, 0xb1, 0x3e, 0xf7, 0xb8, | 2892 | 0xe9, 0xcf, 0xf2, 0x9a, 0x71, 0xde, 0x26, 0x8c, 0x19, 0x04, 0x9d, 0x9b, |
2893 | 0xd2, 0x3c, 0x8e, 0x87, 0x2a, 0xf0, 0xa9, 0x3e, 0xbd, 0x57, 0xeb, 0x33, | 2893 | 0x31, 0x3f, 0xf7, 0xb8, 0xda, 0x38, 0xde, 0x0f, 0x55, 0xe1, 0x53, 0x7d, |
2894 | 0x33, 0xbd, 0x8d, 0xde, 0xfb, 0xf1, 0x1c, 0xc8, 0xf7, 0x31, 0xf0, 0x2d, | 2894 | 0x7a, 0xaf, 0xd5, 0x35, 0xb3, 0xfd, 0xcd, 0xde, 0xfb, 0xf1, 0x1c, 0x94, |
2895 | 0x7d, 0x62, 0xf2, 0x4b, 0x4a, 0xcf, 0x61, 0x36, 0x4f, 0xfe, 0x0d, 0x69, | 2895 | 0xef, 0xc1, 0xb7, 0xf4, 0x89, 0xc9, 0x2f, 0x29, 0x3d, 0x87, 0xb9, 0x02, |
2896 | 0x0e, 0x23, 0x03, 0xdb, 0xb2, 0x57, 0xe7, 0xc7, 0x96, 0xe5, 0xbb, 0x23, | 2896 | 0xf9, 0x37, 0xa4, 0x39, 0x8c, 0x2c, 0x6c, 0xcb, 0x5e, 0x1d, 0x1f, 0x5b, |
2897 | 0xa0, 0x71, 0x77, 0x26, 0xbf, 0x4a, 0x3a, 0x55, 0x07, 0x75, 0x78, 0xbc, | 2897 | 0x91, 0xef, 0xae, 0x80, 0xc6, 0xdd, 0xd9, 0xc2, 0x1a, 0xe9, 0x56, 0x1d, |
2898 | 0x0d, 0x7b, 0xa1, 0x58, 0xee, 0x03, 0x72, 0xb4, 0xd8, 0x0f, 0x3a, 0xc4, | 2898 | 0xd4, 0xe5, 0xf1, 0x36, 0xec, 0x85, 0x62, 0xb9, 0x0f, 0xc8, 0xf1, 0xd2, |
2899 | 0xe4, 0x29, 0xf8, 0xcd, 0xcf, 0x14, 0xef, 0x90, 0xa5, 0x08, 0xf6, 0x55, | 2899 | 0x20, 0xe8, 0x10, 0x93, 0xa7, 0xe0, 0x37, 0x3f, 0x53, 0xba, 0x43, 0x96, |
2900 | 0x96, 0xb1, 0x41, 0xf9, 0xf1, 0xdc, 0x06, 0xef, 0x3a, 0xe1, 0x2e, 0x59, | 2900 | 0x23, 0xd8, 0x57, 0x45, 0xc6, 0x86, 0xe5, 0xfb, 0xf3, 0x09, 0xef, 0x3a, |
2901 | 0xdb, 0xb1, 0x07, 0xca, 0x13, 0xe5, 0x8a, 0xf3, 0x82, 0x88, 0x45, 0xb8, | 2901 | 0xe1, 0x2e, 0x5b, 0x3b, 0xb0, 0x07, 0xca, 0x13, 0xe5, 0x8a, 0xe3, 0x82, |
2902 | 0xee, 0x11, 0xa3, 0xdb, 0xb0, 0x6e, 0x21, 0x42, 0xf9, 0xe5, 0xde, 0x42, | 2902 | 0x88, 0x45, 0x38, 0xef, 0xd3, 0x46, 0xb7, 0x61, 0xde, 0x62, 0x84, 0xf2, |
2903 | 0x9e, 0xcc, 0x32, 0xae, 0xe2, 0x3b, 0x1b, 0x9b, 0x94, 0xae, 0x3a, 0x8b, | 2903 | 0xcb, 0xbd, 0x85, 0x3c, 0x99, 0x65, 0x5c, 0xc5, 0x77, 0x36, 0x36, 0x29, |
2904 | 0x84, 0xe2, 0x40, 0x97, 0xcf, 0xc0, 0x5f, 0xc7, 0x97, 0x4b, 0xff, 0x3b, | 2904 | 0x53, 0x73, 0x16, 0x09, 0xc5, 0x81, 0xae, 0x9c, 0x81, 0x3f, 0x8f, 0x2f, |
2905 | 0x0a, 0xea, 0x51, 0xd8, 0xca, 0x3c, 0x6c, 0x65, 0x1e, 0x36, 0x12, 0xb2, | 2905 | 0x97, 0xfe, 0x77, 0x14, 0xd4, 0xa3, 0xb0, 0x95, 0x05, 0xd8, 0xca, 0x02, |
2906 | 0xf0, 0x56, 0x1e, 0x36, 0x32, 0x0f, 0x1b, 0x09, 0x7d, 0xf6, 0x06, 0x62, | 2906 | 0x6c, 0x24, 0x64, 0xe1, 0x5a, 0x01, 0x36, 0xb2, 0x00, 0x1b, 0x09, 0x7d, |
2907 | 0xbb, 0xab, 0xe0, 0x21, 0xe3, 0x6b, 0x1f, 0xa6, 0xaf, 0x8d, 0xbf, 0xff, | 2907 | 0xf6, 0x3a, 0x62, 0xbb, 0xd7, 0xc0, 0x43, 0xc6, 0xd7, 0x3e, 0x4a, 0x5f, |
2908 | 0x01, 0x88, 0x97, 0xee, 0xe9, 0xc4, 0x71, 0x00, 0x00, 0x00 }; | 2908 | 0x1b, 0x7f, 0xff, 0x03, 0x4c, 0x03, 0x3a, 0xe1, 0xd4, 0x71, 0x00, 0x00, |
2909 | 0x00 }; | ||
2909 | 2910 | ||
2910 | static const u32 bnx2_RXP_b06FwData[(0x0/4) + 1] = { 0x0 }; | 2911 | static const u32 bnx2_RXP_b06FwData[(0x0/4) + 1] = { 0x0 }; |
2911 | static const u32 bnx2_RXP_b06FwRodata[(0x24/4) + 1] = { | 2912 | static const u32 bnx2_RXP_b06FwRodata[(0x24/4) + 1] = { |
2912 | 0x08004580, 0x08004580, 0x080044f8, 0x08004530, 0x08004564, 0x08004588, | 2913 | 0x08004590, 0x08004590, 0x08004508, 0x08004540, 0x08004574, 0x08004598, |
2913 | 0x08004588, 0x08004588, 0x08004468, 0x00000000 }; | 2914 | 0x08004598, 0x08004598, 0x08004478, 0x00000000 }; |
2914 | 2915 | ||
2915 | static struct fw_info bnx2_rxp_fw_06 = { | 2916 | static struct fw_info bnx2_rxp_fw_06 = { |
2916 | /* Firmware version: 4.0.5 */ | 2917 | /* Firmware version: 4.1.1 */ |
2917 | .ver_major = 0x4, | 2918 | .ver_major = 0x4, |
2918 | .ver_minor = 0x0, | 2919 | .ver_minor = 0x1, |
2919 | .ver_fix = 0x5, | 2920 | .ver_fix = 0x1, |
2920 | 2921 | ||
2921 | .start_addr = 0x080031d0, | 2922 | .start_addr = 0x080031d0, |
2922 | 2923 | ||
2923 | .text_addr = 0x08000000, | 2924 | .text_addr = 0x08000000, |
2924 | .text_len = 0x71c0, | 2925 | .text_len = 0x71d0, |
2925 | .text_index = 0x0, | 2926 | .text_index = 0x0, |
2926 | .gz_text = bnx2_RXP_b06FwText, | 2927 | .gz_text = bnx2_RXP_b06FwText, |
2927 | .gz_text_len = sizeof(bnx2_RXP_b06FwText), | 2928 | .gz_text_len = sizeof(bnx2_RXP_b06FwText), |
@@ -2931,22 +2932,22 @@ static struct fw_info bnx2_rxp_fw_06 = { | |||
2931 | .data_index = 0x0, | 2932 | .data_index = 0x0, |
2932 | .data = bnx2_RXP_b06FwData, | 2933 | .data = bnx2_RXP_b06FwData, |
2933 | 2934 | ||
2934 | .sbss_addr = 0x08007200, | 2935 | .sbss_addr = 0x08007220, |
2935 | .sbss_len = 0x58, | 2936 | .sbss_len = 0x58, |
2936 | .sbss_index = 0x0, | 2937 | .sbss_index = 0x0, |
2937 | 2938 | ||
2938 | .bss_addr = 0x08007258, | 2939 | .bss_addr = 0x08007278, |
2939 | .bss_len = 0x44c, | 2940 | .bss_len = 0x44c, |
2940 | .bss_index = 0x0, | 2941 | .bss_index = 0x0, |
2941 | 2942 | ||
2942 | .rodata_addr = 0x080071c0, | 2943 | .rodata_addr = 0x080071d0, |
2943 | .rodata_len = 0x24, | 2944 | .rodata_len = 0x24, |
2944 | .rodata_index = 0x0, | 2945 | .rodata_index = 0x0, |
2945 | .rodata = bnx2_RXP_b06FwRodata, | 2946 | .rodata = bnx2_RXP_b06FwRodata, |
2946 | }; | 2947 | }; |
2947 | 2948 | ||
2948 | static u8 bnx2_rv2p_proc1[] = { | 2949 | static u8 bnx2_rv2p_proc1[] = { |
2949 | /* Date: 12/07/2007 14:57 */ | 2950 | /* Date: 12/07/2007 15:02 */ |
2950 | 0xd5, 0x56, 0x41, 0x6b, 0x13, 0x51, 0x10, 0x9e, 0xdd, 0x6c, 0xbb, 0xdb, | 2951 | 0xd5, 0x56, 0x41, 0x6b, 0x13, 0x51, 0x10, 0x9e, 0xdd, 0x6c, 0xbb, 0xdb, |
2951 | 0x64, 0xb3, 0x59, 0xaa, 0xd6, 0x50, 0x53, 0x93, 0x06, 0x2f, 0xad, 0x29, | 2952 | 0x64, 0xb3, 0x59, 0xaa, 0xd6, 0x50, 0x53, 0x93, 0x06, 0x2f, 0xad, 0x29, |
2952 | 0x6d, 0xaa, 0x82, 0x42, 0xa1, 0x92, 0x4b, 0xc1, 0xf6, 0x20, 0xf5, 0x22, | 2953 | 0x6d, 0xaa, 0x82, 0x42, 0xa1, 0x92, 0x4b, 0xc1, 0xf6, 0x20, 0xf5, 0x22, |
@@ -3032,7 +3033,7 @@ static u8 bnx2_rv2p_proc1[] = { | |||
3032 | 0xa7, 0xd8, 0x0d, 0x00, 0x00, 0x00 }; | 3033 | 0xa7, 0xd8, 0x0d, 0x00, 0x00, 0x00 }; |
3033 | 3034 | ||
3034 | static u8 bnx2_rv2p_proc2[] = { | 3035 | static u8 bnx2_rv2p_proc2[] = { |
3035 | /* Date: 12/07/2007 14:57 */ | 3036 | /* Date: 12/07/2007 15:02 */ |
3036 | 0xed, 0x59, 0x5d, 0x6c, 0x54, 0xc7, 0x15, 0x9e, 0xbd, 0xbb, 0x7b, 0xf7, | 3037 | 0xed, 0x59, 0x5d, 0x6c, 0x54, 0xc7, 0x15, 0x9e, 0xbd, 0xbb, 0x7b, 0xf7, |
3037 | 0x7a, 0x7d, 0xf7, 0xae, 0x71, 0xa8, 0xff, 0xf9, 0xb3, 0x09, 0xd8, 0xa9, | 3038 | 0x7a, 0x7d, 0xf7, 0xae, 0x71, 0xa8, 0xff, 0xf9, 0xb3, 0x09, 0xd8, 0xa9, |
3038 | 0x21, 0xce, 0x9a, 0x98, 0x02, 0x55, 0x63, 0x39, 0x95, 0x81, 0xa6, 0x55, | 3039 | 0x21, 0xce, 0x9a, 0x98, 0x02, 0x55, 0x63, 0x39, 0x95, 0x81, 0xa6, 0x55, |
diff --git a/drivers/net/bnx2_fw2.h b/drivers/net/bnx2_fw2.h index 13b222eb2f63..e6ffa2769f3d 100644 --- a/drivers/net/bnx2_fw2.h +++ b/drivers/net/bnx2_fw2.h | |||
@@ -3173,250 +3173,250 @@ static struct fw_info bnx2_rxp_fw_09 = { | |||
3173 | }; | 3173 | }; |
3174 | 3174 | ||
3175 | static u8 bnx2_xi_rv2p_proc1[] = { | 3175 | static u8 bnx2_xi_rv2p_proc1[] = { |
3176 | /* Date: 12/07/2007 16:21 */ | 3176 | /* Date: 01/14/2008 15:44 */ |
3177 | 0xc5, 0x56, 0xcd, 0x6b, 0x13, 0x51, 0x10, 0x9f, 0xdd, 0xa4, 0xd9, 0x34, | 3177 | 0xc5, 0x56, 0xcd, 0x6b, 0x13, 0x51, 0x10, 0x9f, 0xdd, 0x7c, 0x6c, 0x9a, |
3178 | 0xd9, 0x64, 0x97, 0xaa, 0x25, 0xb4, 0x91, 0xa6, 0x55, 0x0f, 0x69, 0x23, | 3178 | 0x6c, 0xb2, 0xa1, 0x6a, 0x09, 0x35, 0xd2, 0x58, 0x7a, 0x30, 0x6d, 0xc4, |
3179 | 0xb6, 0xea, 0xc1, 0x43, 0xc1, 0xda, 0x8b, 0xa0, 0x9e, 0x7a, 0x10, 0xf1, | 3179 | 0x56, 0x3d, 0x78, 0x28, 0x54, 0x7a, 0x11, 0xac, 0xa7, 0x1e, 0x44, 0xc4, |
3180 | 0xdb, 0x20, 0x05, 0xf1, 0x8f, 0x70, 0x51, 0xab, 0x20, 0x78, 0x28, 0x6a, | 3180 | 0xcf, 0x20, 0x05, 0xf5, 0x8f, 0x70, 0x51, 0xab, 0x20, 0x78, 0x28, 0x68, |
3181 | 0xb0, 0x0a, 0xea, 0x49, 0x45, 0x3c, 0x34, 0x07, 0x41, 0x50, 0x14, 0x14, | 3181 | 0xb4, 0x7e, 0xa0, 0x27, 0x15, 0xf1, 0x90, 0x1c, 0x04, 0x05, 0x45, 0x50, |
3182 | 0x3c, 0xe9, 0x4d, 0xf0, 0xe3, 0x50, 0x15, 0x3f, 0x0e, 0x7a, 0x13, 0x8f, | 3182 | 0xf0, 0xa4, 0x37, 0x41, 0xbd, 0x54, 0xc5, 0x0f, 0xf0, 0xe2, 0x45, 0x8f, |
3183 | 0xda, 0xf8, 0xde, 0xcc, 0xef, 0xd9, 0xdd, 0x4d, 0xd3, 0x14, 0x0f, 0xba, | 3183 | 0xda, 0xf8, 0xde, 0xcc, 0xef, 0xd9, 0xdd, 0x4d, 0xd2, 0x14, 0x0f, 0x1a, |
3184 | 0xd0, 0xfc, 0xfa, 0xde, 0x9b, 0x37, 0x6f, 0xe6, 0x37, 0xf3, 0x66, 0x9e, | 3184 | 0x68, 0x7f, 0xec, 0xdb, 0xdf, 0x9b, 0x37, 0xf3, 0x9b, 0x79, 0x33, 0x9b, |
3185 | 0x4f, 0x44, 0x36, 0x05, 0xf5, 0x3e, 0x85, 0x94, 0xb5, 0x12, 0x69, 0x05, | 3185 | 0x27, 0x22, 0x9b, 0xfc, 0xc6, 0x80, 0x42, 0x72, 0xad, 0x58, 0x4a, 0x81, |
3186 | 0x16, 0xd1, 0x5d, 0x97, 0x31, 0xd8, 0x40, 0xf2, 0x0d, 0x09, 0x04, 0x43, | 3186 | 0x45, 0x74, 0xcf, 0x65, 0xf4, 0x37, 0x91, 0xfc, 0x46, 0x04, 0xfc, 0x91, |
3187 | 0xbe, 0xfa, 0xfd, 0x4e, 0x5b, 0x4b, 0x1a, 0x13, 0xb4, 0xb5, 0x5f, 0xe3, | 3187 | 0xbc, 0xfa, 0xff, 0x9d, 0x26, 0x4a, 0x1a, 0x63, 0x34, 0xb1, 0x5e, 0xe3, |
3188 | 0x36, 0x7a, 0x5c, 0x2a, 0x28, 0xfc, 0xd5, 0xa0, 0x40, 0x8f, 0xd7, 0xcc, | 3188 | 0x24, 0x3d, 0x29, 0x15, 0x14, 0xfe, 0x6a, 0x92, 0xaf, 0x9f, 0x87, 0xea, |
3189 | 0xde, 0xaf, 0x67, 0x59, 0xef, 0x3b, 0xec, 0x7f, 0x9d, 0x10, 0xdc, 0x52, | 3189 | 0x0f, 0x1a, 0x19, 0xb6, 0xfb, 0x0e, 0xfb, 0xdf, 0xc4, 0x04, 0xb7, 0x55, |
3190 | 0x49, 0x8b, 0x1e, 0x20, 0xad, 0xf7, 0x19, 0x5e, 0x4e, 0xeb, 0x71, 0xd1, | 3190 | 0x52, 0x62, 0x07, 0x48, 0x1b, 0xf3, 0x0c, 0xaf, 0xe6, 0xf4, 0x73, 0xd1, |
3191 | 0x0a, 0xd6, 0xe3, 0x7c, 0x5b, 0xe6, 0xe7, 0xa6, 0x3d, 0x3d, 0x4f, 0xef, | 3191 | 0xf2, 0x37, 0xe2, 0x7c, 0x5b, 0xd6, 0x17, 0xe6, 0x3c, 0xbd, 0x4e, 0xef, |
3192 | 0xc7, 0xf5, 0xd8, 0xcb, 0x9c, 0xae, 0xa7, 0x59, 0xaf, 0xac, 0x77, 0x65, | 3192 | 0x27, 0xf5, 0xb3, 0x97, 0x3e, 0xdd, 0x48, 0xb1, 0x5d, 0x79, 0xdf, 0x9b, |
3193 | 0x4e, 0xf3, 0x3e, 0xd7, 0x12, 0x7d, 0xea, 0x8f, 0xf7, 0x6f, 0x56, 0x7a, | 3193 | 0x3e, 0xcd, 0xfb, 0x5c, 0x4b, 0xec, 0xa9, 0x3f, 0xde, 0xbf, 0x55, 0xd9, |
3194 | 0x60, 0x37, 0x89, 0x9e, 0x43, 0x25, 0x3d, 0x3f, 0x06, 0xb9, 0x51, 0xc8, | 3194 | 0x81, 0xdf, 0x24, 0x76, 0x0e, 0x96, 0xf4, 0xfa, 0x76, 0xf0, 0xc6, 0xc1, |
3195 | 0x15, 0x9b, 0xe4, 0xe6, 0xa6, 0x35, 0x3a, 0x54, 0xad, 0x68, 0x7f, 0xfa, | 3195 | 0x2b, 0xb6, 0xf0, 0x16, 0xe6, 0x34, 0x3a, 0x54, 0xad, 0xe8, 0x78, 0x06, |
3196 | 0x95, 0xa1, 0xae, 0xf0, 0xd3, 0x27, 0xfe, 0x4e, 0xc2, 0xec, 0x77, 0x83, | 3196 | 0x49, 0xe2, 0x49, 0xd0, 0x4c, 0xca, 0x15, 0x9d, 0x06, 0x84, 0xfd, 0x6e, |
3197 | 0xfa, 0x1f, 0x65, 0xdb, 0xa0, 0x96, 0x9b, 0x53, 0x7e, 0x1b, 0x7f, 0x8d, | 3197 | 0x58, 0xef, 0x57, 0xbe, 0x0d, 0x6b, 0xde, 0x82, 0x8a, 0xdb, 0xc4, 0x1b, |
3198 | 0xbc, 0xc8, 0x39, 0xac, 0xe7, 0xad, 0x5a, 0x37, 0x7e, 0x85, 0xfd, 0xc9, | 3198 | 0xe6, 0x39, 0x15, 0x63, 0x57, 0xf3, 0xde, 0x2a, 0x9e, 0x89, 0x2f, 0x18, |
3199 | 0x86, 0xfc, 0x89, 0xf9, 0xd9, 0xe4, 0x57, 0x98, 0xa7, 0xf4, 0x22, 0x76, | 3199 | 0x57, 0x26, 0x10, 0x57, 0x24, 0xde, 0x96, 0xf8, 0x82, 0x7a, 0xa5, 0xda, |
3200 | 0xeb, 0x73, 0x94, 0x0d, 0x7c, 0x4e, 0x0a, 0xfc, 0xa6, 0x62, 0xfb, 0x52, | 3200 | 0xf8, 0xaf, 0xcf, 0x51, 0xbe, 0xf0, 0x39, 0x49, 0xe8, 0x9c, 0x8c, 0xec, |
3201 | 0x2d, 0xf6, 0x7d, 0x6a, 0x2c, 0xf8, 0x69, 0xd6, 0xf5, 0xfc, 0xd3, 0x85, | 3201 | 0x4b, 0x76, 0x88, 0xfb, 0x93, 0x35, 0xb3, 0x21, 0xec, 0x3f, 0x91, 0xb6, |
3202 | 0xf9, 0x72, 0x74, 0x5d, 0xfc, 0xef, 0x80, 0xff, 0x8f, 0xe0, 0xdf, 0x0e, | 3202 | 0xf7, 0x54, 0xf9, 0x8d, 0xf5, 0x72, 0x3b, 0x1d, 0x12, 0xd0, 0xe1, 0x31, |
3203 | 0x5a, 0x6b, 0x17, 0x78, 0x3d, 0xc9, 0xfb, 0x7b, 0x95, 0x3d, 0x1a, 0x57, | 3203 | 0xe2, 0x9b, 0xa2, 0x21, 0xbb, 0xc0, 0xef, 0xe3, 0xbc, 0x7f, 0xad, 0xf2, |
3204 | 0x03, 0xfb, 0x81, 0x07, 0x81, 0x07, 0x80, 0xab, 0x80, 0x2b, 0x81, 0x2b, | 3204 | 0x47, 0xe3, 0x3a, 0xe0, 0x7a, 0xe0, 0x01, 0xe0, 0x7e, 0xe0, 0x1a, 0xe0, |
3205 | 0x80, 0x5d, 0xc0, 0xcb, 0x40, 0x1f, 0xe8, 0x01, 0xf3, 0xc0, 0x8b, 0x40, | 3205 | 0x6a, 0xe0, 0x2a, 0x60, 0x2f, 0xf0, 0x32, 0x30, 0x0f, 0xf4, 0x80, 0x39, |
3206 | 0x17, 0x98, 0x05, 0xd6, 0x80, 0x57, 0x81, 0x69, 0xe0, 0x31, 0xe0, 0x23, | 3206 | 0xe0, 0x05, 0xa0, 0x0b, 0xcc, 0x00, 0x6b, 0xc0, 0xab, 0xc0, 0x14, 0xf0, |
3207 | 0xe0, 0x13, 0xe0, 0x37, 0xe0, 0x39, 0xa3, 0xcf, 0xc2, 0xb9, 0x40, 0x42, | 3207 | 0x28, 0xf0, 0x21, 0xf0, 0x31, 0xf0, 0x0b, 0xf0, 0x1c, 0xd0, 0xb1, 0x60, |
3208 | 0x3e, 0x58, 0x31, 0x9e, 0xae, 0x21, 0xef, 0x35, 0xcf, 0x58, 0x2f, 0x1b, | 3208 | 0x0f, 0xa8, 0x7e, 0x3e, 0xee, 0x47, 0x48, 0xa7, 0xeb, 0xa8, 0x7f, 0xad, |
3209 | 0x39, 0xc4, 0x97, 0x79, 0x9a, 0x81, 0x5c, 0xd7, 0xec, 0x8d, 0xd8, 0xfd, | 3209 | 0x33, 0xde, 0x97, 0x0d, 0x0f, 0xf9, 0x65, 0x9d, 0x2e, 0x83, 0xd7, 0x5b, |
3210 | 0x28, 0xb5, 0xbd, 0x17, 0xf1, 0xb8, 0x79, 0xec, 0xcf, 0xe1, 0xed, 0x1e, | 3210 | 0xbf, 0x19, 0xb9, 0x27, 0xa5, 0xae, 0xf7, 0x23, 0x9a, 0x37, 0x8f, 0xe3, |
3211 | 0x9f, 0x93, 0x4f, 0xc9, 0xbc, 0x31, 0x6b, 0x8f, 0x27, 0x78, 0x34, 0x23, | 3211 | 0x39, 0xb4, 0xc3, 0xe3, 0x73, 0x72, 0x49, 0x59, 0x37, 0x6e, 0xed, 0xf1, |
3212 | 0xf8, 0x39, 0xd3, 0xa9, 0x7e, 0x1b, 0x8d, 0xc9, 0xac, 0x8c, 0x8f, 0xe4, | 3212 | 0x04, 0x8f, 0xa4, 0x05, 0x3f, 0xa7, 0x7b, 0xd4, 0xff, 0x66, 0x73, 0x26, |
3213 | 0x0c, 0xcf, 0x46, 0x8f, 0xb1, 0xa7, 0x9d, 0x1d, 0xad, 0xce, 0x33, 0x76, | 3213 | 0x23, 0xcf, 0x87, 0xb3, 0x46, 0x67, 0x63, 0xc7, 0xf8, 0xd3, 0xcd, 0x8f, |
3214 | 0xb5, 0x3b, 0x57, 0xb0, 0x6a, 0x47, 0xfd, 0xbf, 0x32, 0x2c, 0x98, 0x1c, | 3214 | 0x4e, 0xe7, 0x19, 0xbf, 0xba, 0x9d, 0x2b, 0x58, 0xb5, 0xc3, 0xf1, 0x5f, |
3215 | 0x61, 0xa8, 0xb8, 0xa9, 0xa4, 0xc6, 0xcd, 0xee, 0x33, 0x73, 0x8e, 0x46, | 3215 | 0x19, 0x15, 0x8c, 0x8f, 0x31, 0x54, 0xdc, 0x64, 0x5c, 0xe3, 0x56, 0xf7, |
3216 | 0xb7, 0x50, 0xe3, 0xfb, 0x92, 0xa4, 0x5a, 0x4a, 0xeb, 0xfd, 0xd9, 0x38, | 3216 | 0xb9, 0x39, 0x47, 0xa3, 0x5b, 0xa8, 0xf1, 0x7d, 0x89, 0x53, 0x2d, 0xa9, |
3217 | 0x2f, 0x72, 0x3d, 0x47, 0x5e, 0x30, 0x16, 0xae, 0x3c, 0x17, 0xf9, 0x57, | 3217 | 0xed, 0xfe, 0x6c, 0x9e, 0x17, 0x5e, 0xff, 0xe1, 0x97, 0x8c, 0x85, 0x2b, |
3218 | 0x25, 0x97, 0x71, 0xf7, 0x10, 0xc5, 0x3e, 0xb3, 0x2e, 0xf7, 0x31, 0x60, | 3218 | 0x2f, 0x84, 0xff, 0xba, 0xe4, 0x32, 0xee, 0x1e, 0xa1, 0xc8, 0xcf, 0xbc, |
3219 | 0xbb, 0x7f, 0x58, 0x41, 0xdd, 0x9c, 0x83, 0x7d, 0xc7, 0x4d, 0x1c, 0x7d, | 3219 | 0x97, 0xfb, 0xe8, 0xb3, 0xdf, 0x3f, 0x2c, 0xbf, 0x61, 0xce, 0xc1, 0xbe, |
3220 | 0xb6, 0x73, 0x80, 0x64, 0x3c, 0x51, 0x96, 0xf5, 0x89, 0x32, 0xee, 0xf3, | 3220 | 0xe3, 0x26, 0x8f, 0x79, 0xf6, 0x73, 0x90, 0xe4, 0x79, 0xba, 0x2c, 0xef, |
3221 | 0x40, 0x34, 0x1f, 0xe4, 0x5e, 0x24, 0x10, 0xef, 0x7d, 0xb8, 0x17, 0xf1, | 3221 | 0xa7, 0xcb, 0xb8, 0xcf, 0x83, 0xe1, 0x7a, 0x90, 0x7b, 0x11, 0x43, 0xbe, |
3222 | 0x7b, 0x9c, 0x9e, 0xbd, 0x31, 0x1d, 0xce, 0x97, 0x02, 0x55, 0x47, 0x60, | 3222 | 0xf7, 0xe2, 0x5e, 0x44, 0xef, 0x71, 0xaa, 0x7e, 0x73, 0x2e, 0x58, 0x2f, |
3223 | 0x4f, 0x53, 0x9c, 0x4d, 0x3d, 0x36, 0xf9, 0xce, 0xd3, 0xb3, 0x41, 0x22, | 3223 | 0x05, 0xaa, 0x8e, 0xc1, 0x9f, 0x96, 0x3c, 0x9b, 0xbe, 0x6c, 0xea, 0x9d, |
3224 | 0xc2, 0xdf, 0x18, 0x55, 0xc2, 0x71, 0xb2, 0x16, 0xc9, 0x97, 0x76, 0xe7, | 3224 | 0x97, 0xeb, 0x7e, 0x2c, 0xa4, 0xdf, 0x76, 0xaa, 0x04, 0xf3, 0x64, 0xb5, |
3225 | 0x44, 0xf4, 0xe5, 0x55, 0x04, 0xa8, 0x39, 0x8f, 0x1d, 0xf8, 0x35, 0x86, | 3225 | 0xa9, 0x97, 0x6e, 0xe7, 0x84, 0xec, 0xe5, 0x54, 0x06, 0xa8, 0xb5, 0x8e, |
3226 | 0x3c, 0xee, 0x6d, 0xca, 0x63, 0x53, 0xe7, 0x25, 0x9f, 0x5b, 0xd5, 0xaf, | 3226 | 0x1d, 0xc4, 0x35, 0x81, 0x3a, 0x5e, 0xdb, 0x52, 0xc7, 0xa6, 0xdf, 0x4b, |
3227 | 0xbf, 0xaf, 0xcf, 0x22, 0x17, 0x84, 0xf2, 0xd3, 0xd4, 0x43, 0xf0, 0xe4, | 3227 | 0x3d, 0x77, 0xea, 0x5f, 0x7f, 0xdf, 0xa7, 0x85, 0xe7, 0x07, 0xea, 0xd3, |
3228 | 0xb0, 0x5c, 0x71, 0xee, 0x9e, 0xc4, 0x4d, 0xea, 0xb8, 0x4a, 0xc6, 0x20, | 3228 | 0xf4, 0x43, 0xe8, 0xe4, 0x30, 0xaf, 0xb8, 0x70, 0x5f, 0xf2, 0x26, 0xfd, |
3229 | 0x6a, 0xa7, 0x63, 0xfc, 0xeb, 0x0b, 0xd7, 0xc1, 0x75, 0x2d, 0xe2, 0x15, | 3229 | 0x5c, 0x15, 0xa3, 0x1f, 0xf6, 0xd3, 0x31, 0xf1, 0x0d, 0x04, 0xfb, 0xe7, |
3230 | 0xae, 0xbb, 0x71, 0x5e, 0xa2, 0x79, 0x2f, 0xf1, 0xcf, 0x80, 0xa7, 0xde, | 3230 | 0x50, 0x87, 0x7c, 0x05, 0xfb, 0x6e, 0x54, 0x97, 0x70, 0xdd, 0x4b, 0xfe, |
3231 | 0x36, 0x75, 0xa1, 0x13, 0x72, 0xdd, 0x4b, 0xc8, 0x89, 0xde, 0xf1, 0x72, | 3231 | 0xd3, 0xd0, 0xa9, 0xbf, 0x4b, 0x5f, 0xe8, 0x01, 0x6f, 0xcd, 0x32, 0x3c, |
3232 | 0xb8, 0x8e, 0xf8, 0x0d, 0xd4, 0xc1, 0x3f, 0x71, 0x78, 0xd8, 0x22, 0x0e, | 3232 | 0xb1, 0x3b, 0x59, 0x0e, 0xf6, 0x11, 0xaf, 0x89, 0xfe, 0x87, 0x7d, 0x7d, |
3233 | 0xa3, 0xff, 0x37, 0x0e, 0xe8, 0xa7, 0xed, 0xe2, 0x40, 0xb1, 0x38, 0xfc, | 3233 | 0xf5, 0x47, 0x1d, 0xf2, 0x30, 0xfe, 0x7f, 0xf3, 0x80, 0xf9, 0x52, 0xb4, |
3234 | 0x98, 0x5f, 0x5e, 0x1c, 0x08, 0x3c, 0x51, 0x8b, 0x38, 0xa4, 0xc0, 0xd7, | 3234 | 0x24, 0x0f, 0x09, 0x5a, 0x99, 0xbe, 0x84, 0xf8, 0xa9, 0x83, 0xbe, 0x49, |
3235 | 0xd7, 0xf9, 0xa5, 0xe3, 0x90, 0x85, 0xdc, 0xe7, 0x90, 0x1c, 0xdb, 0x3d, | 3235 | 0xe8, 0xf0, 0x6d, 0x71, 0x79, 0x7d, 0x33, 0xe0, 0x7d, 0x0d, 0xf0, 0xb8, |
3236 | 0x2a, 0xf7, 0xd4, 0xa9, 0x7e, 0x89, 0xf1, 0x3b, 0x52, 0xd1, 0xf5, 0xe7, | 3236 | 0x2e, 0xc6, 0xe5, 0xfe, 0x39, 0xd5, 0x2f, 0x11, 0xdd, 0xc6, 0x2a, 0xba, |
3237 | 0x04, 0xd5, 0xe1, 0xff, 0x9b, 0x08, 0x0f, 0x39, 0x65, 0x9f, 0xbc, 0x23, | 3237 | 0xaf, 0x9c, 0xa0, 0x06, 0xe2, 0x7a, 0x1b, 0x8a, 0x2f, 0xab, 0xfc, 0x93, |
3238 | 0x6e, 0xd7, 0x0d, 0x5f, 0xb2, 0x5c, 0xaa, 0x08, 0xde, 0x62, 0x79, 0x3f, | 3238 | 0xef, 0x84, 0x3b, 0x0d, 0xa3, 0x83, 0xbc, 0x2e, 0x55, 0x04, 0x6f, 0x33, |
3239 | 0xc4, 0x5b, 0x94, 0x5f, 0xe1, 0xcd, 0xa7, 0x9b, 0x7f, 0xea, 0x92, 0xc7, | 3239 | 0x3f, 0x1f, 0xd0, 0x23, 0xac, 0x9b, 0xe8, 0x91, 0xa7, 0x5b, 0x7f, 0xfa, |
3240 | 0xfa, 0x86, 0x51, 0xd7, 0x0f, 0xa3, 0xbe, 0x7e, 0xc8, 0x48, 0xfd, 0xae, | 3240 | 0x8d, 0xc7, 0xf6, 0x46, 0xd1, 0xaf, 0x0f, 0xa1, 0x6f, 0x7e, 0x48, 0x4b, |
3241 | 0xee, 0xe4, 0x3a, 0x4b, 0xdd, 0xa8, 0xb3, 0xd5, 0x9c, 0x8c, 0x7b, 0x72, | 3241 | 0x5f, 0xae, 0x4e, 0x71, 0xff, 0xa4, 0x3e, 0xf4, 0xcf, 0x6a, 0x56, 0x9e, |
3242 | 0xf2, 0x6e, 0x19, 0x76, 0x5c, 0x96, 0xeb, 0xc9, 0x09, 0x76, 0x67, 0xf5, | 3242 | 0xfb, 0xb3, 0xf2, 0x1d, 0x36, 0xea, 0xb8, 0xcc, 0xeb, 0xcf, 0x0a, 0xf6, |
3243 | 0xbe, 0x02, 0x7d, 0xdc, 0xc5, 0xe2, 0x95, 0x19, 0x57, 0xea, 0xed, 0xcc, | 3243 | 0x65, 0xf4, 0xbe, 0x02, 0x7d, 0xdc, 0xc5, 0xf4, 0xca, 0xbc, 0x2b, 0x7d, |
3244 | 0x73, 0xd4, 0x7f, 0xcf, 0xf0, 0x04, 0x7f, 0x37, 0xe9, 0xf9, 0x6e, 0x55, | 3244 | 0x74, 0xfe, 0x05, 0xfa, 0xba, 0x67, 0x74, 0x42, 0xbc, 0x5b, 0xf4, 0x7a, |
3245 | 0xef, 0xc2, 0xfc, 0x2a, 0x99, 0x41, 0xb1, 0xef, 0x3a, 0xac, 0x2f, 0x99, | 3245 | 0x1f, 0x7f, 0xf2, 0x2c, 0xe9, 0xab, 0x38, 0xc3, 0xe2, 0xdf, 0x0d, 0x78, |
3246 | 0x7d, 0x7d, 0x9a, 0xcf, 0x07, 0xf3, 0xa6, 0xbf, 0x0c, 0x6c, 0xd7, 0xf6, | 3246 | 0x5f, 0x32, 0xfb, 0x06, 0xb4, 0x9e, 0x4f, 0x16, 0xcd, 0xdc, 0x18, 0xdc, |
3247 | 0x78, 0x94, 0x77, 0x24, 0x9e, 0x82, 0x4a, 0xce, 0x76, 0xf4, 0xb6, 0xe2, | 3247 | 0xa1, 0xfd, 0xf1, 0x28, 0xe7, 0x48, 0x3e, 0x05, 0x15, 0xcf, 0x76, 0xf4, |
3248 | 0x94, 0x2d, 0xe3, 0xa9, 0x93, 0xac, 0x66, 0xd7, 0x94, 0x99, 0x1f, 0xe7, | 3248 | 0xb6, 0xe2, 0xac, 0x2d, 0xcf, 0xb3, 0x27, 0xd9, 0xcc, 0xae, 0x59, 0xb3, |
3249 | 0x44, 0x9e, 0xb8, 0xf3, 0x94, 0xe7, 0xf3, 0xf5, 0x84, 0xcc, 0x3b, 0x3b, | 3249 | 0x3e, 0xc9, 0x05, 0x3a, 0x7d, 0xf7, 0x19, 0xaf, 0xe7, 0x1a, 0x31, 0x59, |
3250 | 0x0d, 0x1f, 0x1e, 0xfb, 0x57, 0x13, 0x3e, 0xf6, 0x5f, 0x12, 0xdc, 0xab, | 3250 | 0x77, 0xa6, 0x8c, 0x1e, 0x1e, 0xc7, 0x57, 0x13, 0x3d, 0xf6, 0x5d, 0x14, |
3251 | 0x9e, 0x22, 0xfa, 0xcb, 0xd4, 0x5c, 0xe9, 0x3f, 0x33, 0x6e, 0x9a, 0x91, | 3251 | 0xdc, 0x4b, 0x3b, 0x19, 0xd3, 0x35, 0x57, 0xe6, 0xca, 0xbc, 0x9b, 0x62, |
3252 | 0x98, 0x0f, 0x7b, 0xa3, 0xf4, 0x91, 0x0e, 0xd4, 0xff, 0xce, 0x50, 0x9c, | 3252 | 0x24, 0xd6, 0xc3, 0xde, 0x2c, 0xf3, 0x21, 0x81, 0xbe, 0xde, 0x13, 0xc8, |
3253 | 0xe2, 0x7d, 0x79, 0xb9, 0xf1, 0x0a, 0xf7, 0x0b, 0xd3, 0x47, 0xe2, 0x7d, | 3253 | 0x53, 0x74, 0xde, 0xae, 0x34, 0x5f, 0xc1, 0x39, 0x60, 0xe6, 0x43, 0xb4, |
3254 | 0x21, 0x87, 0x3c, 0xbb, 0xdc, 0x26, 0x1f, 0x4d, 0x9d, 0xbd, 0x80, 0x7b, | 3254 | 0xdf, 0x67, 0x51, 0x67, 0xd7, 0xba, 0xd4, 0xa3, 0xe9, 0x9f, 0x97, 0x16, |
3255 | 0xb0, 0x58, 0x3f, 0xd6, 0x98, 0x6f, 0xf1, 0x8e, 0x28, 0x22, 0xff, 0x4c, | 3255 | 0xe5, 0x1e, 0xb4, 0x9b, 0xb3, 0x1a, 0x73, 0x1d, 0xbe, 0x0f, 0x8a, 0xa8, |
3256 | 0xdf, 0x5c, 0xec, 0xbd, 0x20, 0xf2, 0xcb, 0x7b, 0x27, 0xf8, 0x2d, 0xde, | 3256 | 0x3f, 0x33, 0x0f, 0xdb, 0x7d, 0x07, 0x08, 0x7f, 0x65, 0xf3, 0x3f, 0xdf, |
3257 | 0x09, 0xff, 0xec, 0x3d, 0x50, 0x58, 0x88, 0xa3, 0xc9, 0xd3, 0x70, 0x1c, | 3257 | 0x61, 0xfe, 0xff, 0xb3, 0x39, 0x5f, 0x58, 0xca, 0xa3, 0xa9, 0xd3, 0x60, |
3258 | 0xc3, 0xf9, 0x1a, 0xef, 0xd7, 0x4b, 0xf5, 0xe9, 0x3c, 0x78, 0x9e, 0x04, | 3258 | 0x1e, 0x83, 0xf5, 0x1a, 0x9d, 0xc3, 0xcb, 0xcd, 0xdf, 0x1c, 0x74, 0x3e, |
3259 | 0xcf, 0x49, 0xea, 0x48, 0x30, 0x31, 0x6e, 0xf2, 0x14, 0xeb, 0xb5, 0xa7, | 3259 | 0x06, 0x9d, 0xe3, 0x94, 0x88, 0xb1, 0x30, 0x6e, 0xfc, 0x14, 0xdb, 0xb5, |
3260 | 0x6c, 0x16, 0x77, 0x3b, 0xce, 0x58, 0x1a, 0xf3, 0xee, 0x19, 0x91, 0x4b, | 3260 | 0x67, 0x6d, 0xa6, 0xbb, 0x89, 0x33, 0x96, 0xc6, 0x9c, 0x7b, 0x46, 0x78, |
3261 | 0xca, 0x7c, 0xc1, 0xe0, 0xd9, 0x53, 0xf2, 0x3e, 0xb4, 0xe9, 0x37, 0xf9, | 3261 | 0x71, 0x59, 0x2f, 0x18, 0x3c, 0x7b, 0x4a, 0xbe, 0xfb, 0x6c, 0xfa, 0x0d, |
3262 | 0x0f, 0x65, 0x7b, 0x50, 0x0d, 0x00, 0x00, 0x00 }; | 3262 | 0x6d, 0x29, 0x98, 0xe1, 0x30, 0x0d, 0x00, 0x00, 0x00 }; |
3263 | 3263 | ||
3264 | static u8 bnx2_xi_rv2p_proc2[] = { | 3264 | static u8 bnx2_xi_rv2p_proc2[] = { |
3265 | /* Date: 12/07/2007 16:21 */ | 3265 | /* Date: 01/14/2008 15:44 */ |
3266 | 0xad, 0x58, 0x5d, 0x6c, 0xd3, 0x55, 0x14, 0xbf, 0xfd, 0x58, 0xdb, 0xb5, | 3266 | 0xad, 0x58, 0x5d, 0x6c, 0xd3, 0x55, 0x14, 0xbf, 0xfd, 0x58, 0xdb, 0x75, |
3267 | 0xff, 0xb6, 0x63, 0x9b, 0xdd, 0xa7, 0x6e, 0x6e, 0x61, 0x6c, 0xd8, 0xcd, | 3267 | 0xff, 0xb6, 0x63, 0x9b, 0xdd, 0xa7, 0x6e, 0x6e, 0x61, 0x6c, 0xd8, 0xcd, |
3268 | 0xd1, 0x8d, 0x4f, 0x4d, 0x5c, 0x86, 0x19, 0x20, 0x26, 0x8c, 0x61, 0xd4, | 3268 | 0xd1, 0x8d, 0x4f, 0x4d, 0x5c, 0x86, 0x19, 0x20, 0x26, 0x8c, 0x61, 0xd4, |
3269 | 0x37, 0xd8, 0x90, 0xb2, 0xb1, 0x8d, 0x2c, 0x8c, 0xf0, 0xc0, 0x8b, 0x0d, | 3269 | 0x37, 0xd8, 0x90, 0xb2, 0xb2, 0x8d, 0x2c, 0x8c, 0xf0, 0xc0, 0x8b, 0x0d, |
3270 | 0xd3, 0xf1, 0xd2, 0x07, 0x47, 0xb2, 0x0d, 0x8d, 0xc1, 0x45, 0x7d, 0x40, | 3270 | 0xd3, 0xf1, 0xd2, 0x07, 0x47, 0xb2, 0x0d, 0x8d, 0xc1, 0x45, 0x7d, 0x40, |
3271 | 0x9f, 0xec, 0x83, 0x32, 0x30, 0xc6, 0xc4, 0xe8, 0x42, 0xf0, 0x01, 0x48, | 3271 | 0x9f, 0xec, 0x83, 0x52, 0x30, 0xc6, 0xc4, 0xe8, 0x42, 0xf0, 0x01, 0x48, |
3272 | 0x30, 0xc6, 0x68, 0x48, 0x08, 0xea, 0x32, 0x10, 0x75, 0x0c, 0xfb, 0x64, | 3272 | 0x30, 0xc6, 0x68, 0x48, 0x08, 0xea, 0x32, 0x10, 0x75, 0x0c, 0xfb, 0x64, |
3273 | 0x98, 0xf7, 0x9e, 0xdf, 0xb9, 0xff, 0xfe, 0xff, 0x6d, 0x27, 0x18, 0xec, | 3273 | 0x98, 0xf7, 0x9e, 0xdf, 0xb9, 0xff, 0xfe, 0xff, 0x5d, 0x27, 0x18, 0xec, |
3274 | 0x43, 0x4f, 0xef, 0xbd, 0xe7, 0x9e, 0x7b, 0x3e, 0x7e, 0xe7, 0x9c, 0x7b, | 3274 | 0x43, 0x4f, 0xef, 0xbd, 0xe7, 0x9e, 0x7b, 0x3e, 0x7e, 0xe7, 0x9c, 0x7b, |
3275 | 0x5b, 0x24, 0x84, 0x70, 0x8a, 0x44, 0xaa, 0x46, 0x52, 0x11, 0x70, 0xb8, | 3275 | 0x5b, 0x2c, 0x84, 0x70, 0x8a, 0x44, 0xaa, 0x56, 0x52, 0x61, 0x38, 0x5c, |
3276 | 0x04, 0x3e, 0x6b, 0x8b, 0x88, 0x5c, 0x4b, 0xf9, 0xe4, 0x77, 0x81, 0x78, | 3276 | 0x02, 0x9f, 0xb5, 0xc5, 0x44, 0xae, 0xa5, 0x7c, 0xf2, 0xbb, 0x40, 0xbc, |
3277 | 0xc9, 0x59, 0x4e, 0x63, 0xb7, 0x50, 0x34, 0x2c, 0x44, 0xc2, 0x4a, 0x4b, | 3277 | 0xe4, 0xac, 0xa0, 0xb1, 0x5b, 0x28, 0x1a, 0x12, 0x22, 0x61, 0xa5, 0xa5, |
3278 | 0x98, 0x5e, 0x65, 0xfa, 0x3b, 0xd3, 0xc7, 0x1d, 0xa0, 0x57, 0x78, 0xbc, | 3278 | 0x4c, 0xaf, 0x32, 0xfd, 0x9d, 0xe9, 0xe3, 0x0e, 0xd0, 0x2b, 0x3c, 0xde, |
3279 | 0x85, 0xc7, 0xd7, 0x78, 0xfc, 0x23, 0xd3, 0x8d, 0x3c, 0xbf, 0x99, 0x69, | 3279 | 0xc2, 0xe3, 0x6b, 0x3c, 0xfe, 0x91, 0xe9, 0x46, 0x9e, 0xdf, 0xcc, 0x34, |
3280 | 0x92, 0xe9, 0x76, 0x5e, 0x9f, 0x65, 0x2a, 0x3f, 0x09, 0x43, 0x7e, 0xc9, | 3280 | 0xc9, 0x74, 0x3b, 0xaf, 0xa7, 0x99, 0xca, 0x4f, 0xc2, 0x90, 0x5f, 0x72, |
3281 | 0xe5, 0x26, 0xad, 0xa7, 0x81, 0xe9, 0x26, 0xe8, 0xbb, 0xa7, 0x56, 0xf1, | 3281 | 0xb9, 0x59, 0xeb, 0x69, 0x60, 0xba, 0x19, 0xfa, 0xee, 0xa9, 0x53, 0x7c, |
3282 | 0x2d, 0x2c, 0x67, 0xf8, 0x30, 0x7f, 0x7d, 0x02, 0xb4, 0x06, 0xbb, 0x3e, | 3282 | 0xf3, 0x4b, 0x59, 0x3e, 0xcc, 0x5f, 0x9f, 0x00, 0xad, 0xc5, 0xae, 0x8f, |
3283 | 0x4e, 0x3c, 0xad, 0xf7, 0x83, 0xf4, 0x06, 0x41, 0xfb, 0xd8, 0xfe, 0x8e, | 3283 | 0x13, 0x4f, 0xeb, 0xfd, 0x20, 0x7d, 0x01, 0xd0, 0x7e, 0xb6, 0xbf, 0x33, |
3284 | 0x28, 0x91, 0xe4, 0x7e, 0x27, 0xc6, 0x5d, 0x0d, 0xca, 0x0f, 0xc5, 0xc2, | 3284 | 0x42, 0x24, 0xb9, 0xdf, 0x89, 0x71, 0x77, 0xa3, 0xf2, 0x43, 0x89, 0x70, |
3285 | 0xed, 0x54, 0x72, 0x5a, 0x7c, 0x9e, 0xf3, 0x98, 0x7f, 0x35, 0x0c, 0xfa, | 3285 | 0x3b, 0x95, 0x9c, 0x56, 0x9f, 0xe7, 0x3c, 0xe6, 0x5f, 0x0d, 0x81, 0xbe, |
3286 | 0x9a, 0x1f, 0xf4, 0x17, 0x7f, 0xa1, 0xfc, 0x5e, 0x5e, 0x8e, 0x07, 0x58, | 3286 | 0xe6, 0x07, 0xfd, 0xc5, 0x5f, 0x28, 0xbf, 0x97, 0x96, 0x62, 0x45, 0x2c, |
3287 | 0xbe, 0xc1, 0x6a, 0x07, 0xb0, 0x7f, 0xce, 0x80, 0x1e, 0x2f, 0xd7, 0x42, | 3287 | 0xdf, 0x60, 0xb5, 0x8b, 0xb0, 0x7f, 0xd6, 0x80, 0x1e, 0x2f, 0xd7, 0x41, |
3288 | 0xbf, 0xef, 0x9f, 0x52, 0xf3, 0x2e, 0x91, 0x60, 0x39, 0x42, 0x68, 0x3d, | 3288 | 0xbf, 0xef, 0x9f, 0x52, 0xf3, 0x2e, 0x91, 0x60, 0x39, 0x42, 0x68, 0x3d, |
3289 | 0x79, 0x7d, 0x10, 0xfb, 0x56, 0xad, 0xc1, 0xea, 0x5b, 0x71, 0x8c, 0xab, | 3289 | 0x79, 0x7d, 0x10, 0xfb, 0x56, 0xad, 0xc1, 0xea, 0x5b, 0x31, 0x8c, 0xab, |
3290 | 0x3e, 0x28, 0xa2, 0xb8, 0x9c, 0x4e, 0x69, 0xfe, 0x7c, 0x72, 0xdd, 0x52, | 3290 | 0x3f, 0x28, 0xa6, 0xb8, 0x9c, 0x4e, 0x69, 0xfe, 0x7c, 0x72, 0xdd, 0x52, |
3291 | 0x2e, 0xe4, 0x8b, 0x3a, 0x1f, 0x29, 0x93, 0x88, 0x82, 0x8a, 0xe6, 0xec, | 3291 | 0x2e, 0xe4, 0x8b, 0x7a, 0x1f, 0x29, 0x93, 0x88, 0x80, 0x8a, 0x96, 0xdc, |
3292 | 0x73, 0x20, 0x7f, 0x6a, 0xb5, 0x9a, 0x77, 0x8a, 0x1e, 0x97, 0x9a, 0xf7, | 3292 | 0x73, 0x20, 0x7f, 0x6a, 0xb5, 0x9a, 0x77, 0x8a, 0x5e, 0x97, 0x9a, 0xf7, |
3293 | 0x88, 0x9e, 0x01, 0xed, 0x5f, 0xac, 0xc7, 0x3d, 0x44, 0xca, 0x7b, 0xc7, | 3293 | 0x88, 0xde, 0xb8, 0xf6, 0x2f, 0xd6, 0x63, 0x1e, 0x22, 0x15, 0x7d, 0xe3, |
3294 | 0x95, 0x9d, 0x61, 0xb1, 0xcf, 0x19, 0x26, 0x7e, 0xf8, 0xc5, 0xe5, 0x33, | 3294 | 0xca, 0xce, 0x90, 0xd8, 0xe7, 0x0c, 0x11, 0x3f, 0xfc, 0xe2, 0xf2, 0x19, |
3295 | 0x3e, 0x03, 0xff, 0x97, 0x35, 0x06, 0xd9, 0x12, 0x6f, 0xc3, 0xbe, 0xd2, | 3295 | 0x9f, 0x81, 0xff, 0xcb, 0x5a, 0x83, 0x6c, 0x89, 0xb5, 0x63, 0x5f, 0x59, |
3296 | 0x18, 0xe8, 0x64, 0xac, 0x40, 0x91, 0x68, 0x7c, 0x94, 0x86, 0x2d, 0x37, | 3296 | 0x14, 0x74, 0x32, 0x5a, 0xa0, 0x48, 0x24, 0x36, 0x4a, 0xc3, 0xd6, 0x9b, |
3297 | 0xd7, 0xf9, 0x88, 0x2f, 0xd1, 0xac, 0xe3, 0xa7, 0xe3, 0xa5, 0xe2, 0xf8, | 3297 | 0xeb, 0x7c, 0xc4, 0x97, 0x68, 0xd1, 0xf1, 0xd3, 0xf1, 0x52, 0x71, 0xfc, |
3298 | 0x89, 0x8c, 0x23, 0xbb, 0xa5, 0x1e, 0x7e, 0xfd, 0x75, 0xb5, 0xe2, 0x97, | 3298 | 0x44, 0xc6, 0x91, 0xdd, 0xd2, 0x00, 0xbf, 0xfe, 0xba, 0x5a, 0xf1, 0x4b, |
3299 | 0xce, 0xad, 0xc3, 0x39, 0x19, 0xfd, 0xac, 0xf1, 0xff, 0xe8, 0x3f, 0xc4, | 3299 | 0xe7, 0xd6, 0xe3, 0x9c, 0xac, 0x7e, 0xd6, 0xf8, 0x7f, 0xf4, 0x1f, 0xe2, |
3300 | 0x5f, 0xc9, 0xeb, 0x60, 0xbf, 0xd4, 0x4a, 0xbf, 0x28, 0x5a, 0xed, 0x48, | 3300 | 0xaf, 0xe4, 0x75, 0xb2, 0x5f, 0xea, 0xa4, 0x5f, 0x14, 0xad, 0x71, 0x24, |
3301 | 0x34, 0xdb, 0xe3, 0x71, 0x7d, 0x22, 0x4c, 0xbf, 0x6f, 0x75, 0x16, 0x91, | 3301 | 0x5a, 0xec, 0xf1, 0xb8, 0x3e, 0x11, 0xa2, 0xdf, 0xb7, 0xba, 0x8a, 0xc9, |
3302 | 0x5f, 0x77, 0x61, 0xfe, 0x54, 0xd7, 0x39, 0xc4, 0x63, 0x07, 0xd9, 0x2f, | 3302 | 0xaf, 0xbb, 0x30, 0x7f, 0xaa, 0xfb, 0x1c, 0xe2, 0xb1, 0x83, 0xec, 0x17, |
3303 | 0xfc, 0x6f, 0x7c, 0x8a, 0x5d, 0xbd, 0x41, 0x35, 0x7e, 0xa5, 0x3d, 0x7e, | 3303 | 0xfe, 0x37, 0x3e, 0xc5, 0xae, 0xbe, 0x80, 0x1a, 0xbf, 0xd2, 0x11, 0xbb, |
3304 | 0x01, 0xeb, 0x05, 0x63, 0xf0, 0xeb, 0x2e, 0x96, 0xba, 0xc3, 0xe5, 0x50, | 3304 | 0x80, 0xf5, 0x82, 0x31, 0xf8, 0x75, 0x17, 0x4b, 0xdd, 0xe1, 0x72, 0x28, |
3305 | 0x24, 0xe9, 0x19, 0xa3, 0xa1, 0x31, 0x47, 0xeb, 0x86, 0x38, 0x99, 0xc2, | 3305 | 0x92, 0xf4, 0x8c, 0xd1, 0xd0, 0x98, 0xa5, 0x75, 0x43, 0x9c, 0x4c, 0x61, |
3306 | 0xfa, 0xe1, 0x80, 0x1a, 0xef, 0x8a, 0x2e, 0x60, 0x1c, 0x1d, 0x18, 0xe7, | 3306 | 0xfd, 0x70, 0x91, 0x1a, 0xef, 0x8a, 0xcc, 0x63, 0x1c, 0x89, 0x8f, 0xf3, |
3307 | 0x8d, 0x4e, 0xf8, 0xe1, 0x96, 0x13, 0xf2, 0x18, 0x5e, 0x7e, 0x37, 0xc5, | 3307 | 0x46, 0x27, 0xfc, 0x70, 0xcb, 0x09, 0x79, 0x0c, 0x2f, 0xbf, 0x9b, 0xe2, |
3308 | 0xc1, 0x21, 0x8c, 0x2e, 0xd0, 0x37, 0x69, 0xfd, 0x6f, 0x47, 0x92, 0xec, | 3308 | 0xe0, 0x10, 0x46, 0x37, 0xe8, 0x9b, 0xb4, 0xfe, 0xb7, 0x23, 0x49, 0x76, |
3309 | 0xee, 0x0a, 0xb9, 0xcf, 0x81, 0x91, 0x71, 0x6d, 0xe2, 0x56, 0xe3, 0xfe, | 3309 | 0x77, 0x07, 0xdd, 0xe7, 0xc0, 0xc8, 0xb8, 0x36, 0x71, 0xab, 0x71, 0xff, |
3310 | 0x61, 0xf1, 0x3b, 0x6e, 0x68, 0xbc, 0xb2, 0xff, 0xd9, 0xbf, 0xef, 0x89, | 3310 | 0xb0, 0xf8, 0x1d, 0x37, 0x34, 0x5e, 0xd9, 0xff, 0xec, 0xdf, 0xf7, 0x44, |
3311 | 0x6c, 0x9c, 0x82, 0x76, 0x35, 0x80, 0x7a, 0xea, 0xb3, 0xf1, 0xaa, 0xf1, | 3311 | 0x2e, 0x4e, 0x41, 0xbb, 0x1b, 0x41, 0x3d, 0x0d, 0xb9, 0x78, 0xd5, 0xf8, |
3312 | 0x69, 0xf7, 0x33, 0xc7, 0xc7, 0x82, 0x17, 0x22, 0x12, 0x27, 0x36, 0xdc, | 3312 | 0xb4, 0xfb, 0x99, 0xe3, 0x63, 0xc1, 0x0b, 0x11, 0x89, 0x13, 0x1b, 0x6e, |
3313 | 0x30, 0x4e, 0x2b, 0xa4, 0xbf, 0x74, 0xfc, 0x95, 0x20, 0xaf, 0x18, 0x64, | 3313 | 0x18, 0xa7, 0x95, 0xd2, 0x5f, 0x3a, 0xfe, 0x4a, 0x90, 0x57, 0x0c, 0xb2, |
3314 | 0x79, 0x03, 0x6c, 0xd7, 0x10, 0xdb, 0x75, 0xc7, 0xaf, 0xfd, 0xaa, 0xed, | 3314 | 0xbc, 0x38, 0xdb, 0x35, 0xc4, 0x76, 0xdd, 0xf1, 0x6b, 0xbf, 0x6a, 0x7b, |
3315 | 0x01, 0x3d, 0x69, 0xb3, 0xc7, 0x21, 0xf1, 0x64, 0xc7, 0x21, 0xeb, 0x93, | 3315 | 0x40, 0x4f, 0xda, 0xec, 0x71, 0x48, 0x3c, 0xd9, 0x71, 0xc8, 0xfa, 0x24, |
3316 | 0xfc, 0xa6, 0x0e, 0x3f, 0xaa, 0xea, 0x41, 0x4d, 0x3b, 0x1b, 0x14, 0x9f, | 3316 | 0xbf, 0xa9, 0xc7, 0x8f, 0xea, 0x06, 0x50, 0xd3, 0xce, 0x46, 0xc5, 0xe7, |
3317 | 0x27, 0x36, 0x9d, 0xb2, 0xe3, 0x50, 0xe7, 0xe3, 0x9e, 0x5a, 0x2d, 0x5f, | 3317 | 0x89, 0x4e, 0xa7, 0xec, 0x38, 0xd4, 0xf9, 0xb8, 0xa7, 0x4e, 0xcb, 0x57, |
3318 | 0xe1, 0x32, 0x2d, 0x71, 0x89, 0xb8, 0x9d, 0x4e, 0x59, 0xf3, 0xb3, 0x32, | 3318 | 0xb8, 0xcc, 0x48, 0x5c, 0x22, 0x6e, 0xa7, 0x53, 0xd6, 0xfc, 0xac, 0xca, |
3319 | 0x4f, 0x7e, 0xda, 0xf3, 0x42, 0xfb, 0xe5, 0x70, 0x90, 0x0a, 0x54, 0xfb, | 3319 | 0x93, 0x9f, 0xf6, 0xbc, 0xd0, 0x7e, 0x39, 0x1c, 0xa0, 0x02, 0xd5, 0x71, |
3320 | 0xe5, 0x79, 0xfb, 0x79, 0xc0, 0xb7, 0xd7, 0xc4, 0x4f, 0xe9, 0x06, 0xf6, | 3320 | 0x79, 0xce, 0x7e, 0x1e, 0xf0, 0xed, 0x35, 0xf1, 0x53, 0xb6, 0x81, 0xfd, |
3321 | 0x1f, 0xd3, 0xc8, 0x46, 0x25, 0xaf, 0x9b, 0xe5, 0xb7, 0xb2, 0x7c, 0xc3, | 3321 | 0xc7, 0x34, 0xbc, 0x51, 0xc9, 0xeb, 0x61, 0xf9, 0x6d, 0x2c, 0xdf, 0xb0, |
3322 | 0x92, 0x77, 0x4a, 0xbf, 0x4e, 0x33, 0xdf, 0x74, 0xdc, 0x32, 0x79, 0xa7, | 3322 | 0xe4, 0x9d, 0xd2, 0xaf, 0xcb, 0xcc, 0x37, 0x1d, 0xb7, 0x6c, 0xde, 0x69, |
3323 | 0xfd, 0x47, 0xe7, 0x47, 0x2f, 0xcf, 0xab, 0xfd, 0x55, 0x0f, 0xc8, 0xc3, | 3323 | 0xff, 0xd1, 0xf9, 0x91, 0xcb, 0x73, 0x6a, 0x7f, 0xf5, 0x03, 0xf2, 0x70, |
3324 | 0x4d, 0xa6, 0xbc, 0xef, 0xcc, 0x7c, 0x53, 0xeb, 0x01, 0xf1, 0x1c, 0x0f, | 3324 | 0x93, 0x29, 0xef, 0x3b, 0x33, 0xdf, 0xd4, 0x7a, 0x91, 0x78, 0x8e, 0x87, |
3325 | 0xed, 0xf5, 0xe4, 0x4f, 0x59, 0x4f, 0xc8, 0x0e, 0x9f, 0x71, 0x8e, 0xeb, | 3325 | 0xf6, 0x7a, 0xf2, 0xa7, 0xac, 0x27, 0x64, 0x87, 0xcf, 0x38, 0xc7, 0xf5, |
3326 | 0xc7, 0xa8, 0x3a, 0xa7, 0x9c, 0xf5, 0x2e, 0x67, 0xbd, 0x65, 0xbf, 0x6a, | 3326 | 0x63, 0x54, 0x9d, 0x53, 0xc1, 0x7a, 0x57, 0xb0, 0xde, 0xb2, 0x5f, 0xb5, |
3327 | 0xe6, 0x3a, 0xb3, 0xd7, 0x5a, 0x2f, 0xd6, 0x5a, 0xf2, 0x5e, 0x8d, 0x1b, | 3327 | 0x70, 0x9d, 0xd9, 0x6b, 0xad, 0x17, 0x6b, 0x2d, 0x79, 0xaf, 0xc6, 0x4d, |
3328 | 0x97, 0x73, 0xfb, 0x85, 0xcd, 0x9f, 0x09, 0x41, 0xfe, 0xf7, 0x72, 0x7c, | 3328 | 0x4b, 0xcb, 0xfb, 0x85, 0xcd, 0x9f, 0x09, 0x41, 0xfe, 0xf7, 0x72, 0x7c, |
3329 | 0x3c, 0x79, 0xfa, 0x8b, 0xe6, 0x07, 0xbe, 0xb6, 0x11, 0xbf, 0xcf, 0xc4, | 3329 | 0x3c, 0x79, 0xfa, 0x8b, 0xe6, 0x07, 0xbe, 0xb6, 0x11, 0xbf, 0xcf, 0xc4, |
3330 | 0xbf, 0xdd, 0xde, 0xca, 0x3c, 0x75, 0x27, 0xdb, 0x7e, 0xf8, 0xb3, 0xd7, | 3330 | 0xbf, 0xdd, 0xde, 0xaa, 0x3c, 0x75, 0x27, 0xd7, 0x7e, 0xf8, 0xb3, 0xcf, |
3331 | 0x19, 0x24, 0xbe, 0x1b, 0x23, 0x6a, 0xdf, 0x49, 0x87, 0xf6, 0x53, 0x07, | 3331 | 0x19, 0x20, 0xbe, 0x1b, 0x23, 0x6a, 0xdf, 0x49, 0x87, 0xf6, 0x53, 0x27, |
3332 | 0xea, 0x90, 0x03, 0xf6, 0x56, 0xb3, 0xbd, 0x72, 0xb9, 0x99, 0xf0, 0xef, | 3332 | 0xea, 0x90, 0x03, 0xf6, 0xd6, 0xb0, 0xbd, 0x72, 0xb9, 0x85, 0xf0, 0xef, |
3333 | 0xbb, 0x31, 0x62, 0xb5, 0xd7, 0xf8, 0x97, 0xf3, 0xec, 0xb8, 0x19, 0xe1, | 3333 | 0xbb, 0x31, 0x62, 0xb5, 0xd7, 0xf8, 0x97, 0xf3, 0xec, 0xb8, 0x19, 0xe1, |
3334 | 0x3e, 0xd6, 0x87, 0xbc, 0xf0, 0xed, 0xff, 0x5c, 0xeb, 0xc3, 0xe7, 0x86, | 3334 | 0x3e, 0xd6, 0x8f, 0xbc, 0xf0, 0xed, 0xff, 0x5c, 0xeb, 0xc3, 0xe7, 0x86, |
3335 | 0xf5, 0xf9, 0x4a, 0x5e, 0x95, 0x98, 0x1f, 0x55, 0xfb, 0x1f, 0x13, 0x0c, | 3335 | 0xf4, 0xf9, 0x4a, 0x5e, 0xb5, 0x98, 0x1b, 0x55, 0xfb, 0x1f, 0x13, 0x0c, |
3336 | 0x33, 0x31, 0xdc, 0x88, 0xfa, 0x77, 0xe7, 0x00, 0xf4, 0x1f, 0x6e, 0xd0, | 3336 | 0x33, 0x31, 0xdc, 0x84, 0xfa, 0x77, 0xe7, 0x00, 0xf4, 0x1f, 0x6e, 0xd4, |
3337 | 0x7d, 0x1c, 0x38, 0x16, 0x5c, 0xff, 0xbf, 0x9e, 0xc8, 0xe7, 0x97, 0x41, | 3337 | 0x7d, 0x1c, 0x38, 0x16, 0x5c, 0xff, 0xbf, 0x9e, 0xc8, 0xe7, 0x97, 0x41, |
3338 | 0x07, 0xf8, 0x4a, 0xd9, 0xae, 0x22, 0xb6, 0x2b, 0x2a, 0xb2, 0xeb, 0xec, | 3338 | 0x07, 0xf8, 0xca, 0xd8, 0xae, 0x62, 0xb6, 0x2b, 0x22, 0x72, 0xeb, 0xec, |
3339 | 0x5e, 0xca, 0x97, 0x0e, 0xe6, 0x7b, 0x56, 0xd7, 0xe3, 0x1c, 0x3e, 0xd8, | 3339 | 0x5e, 0xca, 0x97, 0x4e, 0xe6, 0x7b, 0x56, 0xd7, 0xe3, 0x65, 0x7c, 0xb0, |
3340 | 0x5f, 0xc0, 0xe7, 0xe7, 0xf3, 0x57, 0x3e, 0xb9, 0xb3, 0x8c, 0xa3, 0x7e, | 3340 | 0xbf, 0x80, 0xcf, 0xcf, 0xe7, 0xaf, 0x7c, 0x72, 0xd3, 0x8c, 0xa3, 0x01, |
3341 | 0xe6, 0x73, 0xe7, 0xa9, 0xf3, 0x18, 0xa5, 0xd7, 0x50, 0x9d, 0x3f, 0x73, | 3341 | 0xe6, 0x73, 0xe7, 0xa9, 0xf3, 0x18, 0x65, 0xd6, 0x50, 0x9d, 0x3f, 0x73, |
3342 | 0x7c, 0x56, 0xf1, 0x05, 0x4d, 0x9c, 0xdb, 0xed, 0xfa, 0xe9, 0xfe, 0xa3, | 3342 | 0x3c, 0xad, 0xf8, 0x02, 0x26, 0xce, 0xed, 0x76, 0xfd, 0x74, 0xff, 0xd1, |
3343 | 0xfb, 0x5f, 0xf1, 0x45, 0xc4, 0xc1, 0xd0, 0x4a, 0x7e, 0x76, 0xab, 0xe9, | 3343 | 0xfd, 0xaf, 0xf8, 0xc2, 0xe2, 0x60, 0x70, 0x25, 0x3f, 0xbb, 0xd5, 0xf4, |
3344 | 0x99, 0xc5, 0x59, 0x1d, 0x27, 0x83, 0xec, 0x9c, 0x1f, 0x55, 0xe7, 0x7f, | 3344 | 0xcc, 0x42, 0x5a, 0xc7, 0xc9, 0x20, 0x3b, 0xe7, 0x46, 0xd5, 0xf9, 0x1f, |
3345 | 0x98, 0xe5, 0x7f, 0xa7, 0xc5, 0xff, 0xe0, 0x7f, 0x22, 0xfa, 0xa8, 0x7e, | 3345 | 0xe6, 0xf8, 0xdf, 0x69, 0xf1, 0x3f, 0xf8, 0x9f, 0x88, 0x3c, 0xaa, 0xdf, |
3346 | 0xcf, 0xd7, 0x97, 0xbf, 0xb8, 0x9f, 0x9b, 0x27, 0x6a, 0xfe, 0xc2, 0x43, | 3346 | 0xf3, 0xf5, 0xe5, 0x2f, 0xee, 0x2f, 0xcf, 0x13, 0x35, 0x7f, 0xe1, 0xa1, |
3347 | 0xfb, 0x63, 0x77, 0x9b, 0xd5, 0xfe, 0x7a, 0x31, 0x97, 0x42, 0x7e, 0x75, | 3347 | 0xfd, 0xb1, 0xbb, 0xdd, 0x6a, 0x7f, 0x83, 0x98, 0x4d, 0x21, 0xbf, 0x7a, |
3348 | 0x33, 0x0e, 0xf7, 0x71, 0xbd, 0xbe, 0xe1, 0x57, 0x13, 0x3e, 0xd1, 0xb7, | 3348 | 0x18, 0x87, 0xfb, 0xb8, 0x5e, 0xdf, 0xf0, 0xab, 0x09, 0x9f, 0xe8, 0xdf, |
3349 | 0x93, 0xfc, 0x21, 0x22, 0x01, 0xf8, 0xa7, 0xef, 0x45, 0xed, 0x4f, 0xcc, | 3349 | 0x49, 0xfe, 0x10, 0xe1, 0x22, 0xf8, 0xa7, 0xff, 0x45, 0xed, 0x4f, 0xcc, |
3350 | 0x57, 0x52, 0xbf, 0x75, 0x89, 0x6e, 0xaf, 0x41, 0xfc, 0x95, 0x41, 0xd0, | 3350 | 0x57, 0x51, 0xbf, 0x75, 0x89, 0x1e, 0xaf, 0x41, 0xfc, 0x55, 0x01, 0xd0, |
3351 | 0x08, 0xd7, 0xf9, 0x39, 0xb3, 0x8f, 0x81, 0x9e, 0xf6, 0xe8, 0xba, 0x8c, | 3351 | 0x30, 0xd7, 0xf9, 0x59, 0xb3, 0x8f, 0x81, 0x9e, 0xf6, 0xe8, 0xba, 0x8c, |
3352 | 0x7e, 0xfe, 0x95, 0x47, 0x31, 0xc8, 0x20, 0x35, 0xa1, 0x3e, 0x77, 0x36, | 3352 | 0x7e, 0xfe, 0x95, 0x47, 0x31, 0xc8, 0x20, 0x35, 0xa3, 0x3e, 0x77, 0x35, |
3353 | 0x18, 0xb4, 0xde, 0xd3, 0x04, 0x3c, 0x89, 0x3a, 0xdd, 0xe7, 0xf0, 0xe1, | 3353 | 0x1a, 0xb4, 0xde, 0xdb, 0x0c, 0x3c, 0x89, 0x7a, 0xdd, 0xe7, 0xf0, 0xe1, |
3354 | 0x3e, 0x50, 0x99, 0xe9, 0x77, 0xd6, 0x7e, 0x58, 0x68, 0xe9, 0x07, 0xfa, | 3354 | 0x3e, 0x50, 0x95, 0xed, 0x77, 0xd6, 0x7e, 0x58, 0x68, 0xe9, 0x07, 0xfa, |
3355 | 0x3c, 0xed, 0x47, 0x2d, 0x97, 0x86, 0xb2, 0xaf, 0x58, 0xfb, 0xa1, 0xee, | 3355 | 0x3c, 0xed, 0x47, 0x2d, 0x97, 0x86, 0xb2, 0xaf, 0x58, 0xfb, 0xa1, 0xee, |
3356 | 0x13, 0x4b, 0xdc, 0x27, 0x4a, 0xc4, 0xc5, 0x14, 0xec, 0x9a, 0x4b, 0x65, | 3356 | 0x13, 0x8b, 0xdc, 0x27, 0x4a, 0xc5, 0xc5, 0x14, 0xec, 0x9a, 0x4d, 0xe5, |
3357 | 0xe3, 0x4f, 0x9f, 0xa7, 0xe5, 0x41, 0x6f, 0x6d, 0x47, 0x46, 0x3e, 0xce, | 3357 | 0xe2, 0x4f, 0x9f, 0xa7, 0xe5, 0x41, 0x6f, 0x6d, 0x47, 0x56, 0x3e, 0xce, |
3358 | 0x3f, 0xc0, 0x7a, 0xfe, 0x4c, 0xf7, 0xd8, 0x08, 0xdb, 0xa3, 0xe4, 0x62, | 3358 | 0x3f, 0xc0, 0x7a, 0xfe, 0x4c, 0xf7, 0xd8, 0x30, 0xdb, 0xa3, 0xe4, 0x62, |
3359 | 0x7e, 0x3b, 0xf7, 0xe7, 0x84, 0x39, 0xb6, 0xf7, 0xd5, 0x6e, 0xd2, 0xab, | 3359 | 0x7e, 0x3b, 0xf7, 0xe7, 0x84, 0x39, 0xb6, 0xf7, 0xd5, 0x1e, 0xd2, 0xab, |
3360 | 0x98, 0xf1, 0x16, 0xb1, 0xe4, 0x03, 0xf8, 0x4b, 0x5b, 0x41, 0x27, 0x5b, | 3360 | 0x84, 0xf1, 0x16, 0xb6, 0xe4, 0x03, 0xf8, 0xcb, 0xda, 0x40, 0x27, 0xdb, |
3361 | 0x75, 0x1c, 0x74, 0xbc, 0x74, 0x7c, 0x10, 0xc7, 0xc8, 0x3a, 0x62, 0x6b, | 3361 | 0x74, 0x1c, 0x74, 0xbc, 0x74, 0x7c, 0x10, 0xc7, 0xf0, 0x3a, 0x62, 0xeb, |
3362 | 0xef, 0x5b, 0x47, 0x7d, 0xa4, 0xb5, 0x6f, 0x51, 0xe3, 0x0f, 0xfb, 0x77, | 3362 | 0xe8, 0x5f, 0x47, 0x7d, 0xa4, 0xad, 0x7f, 0x41, 0xe3, 0x0f, 0xfb, 0x77, |
3363 | 0x47, 0x15, 0xff, 0xeb, 0xe2, 0x2a, 0xe1, 0x50, 0x88, 0x1f, 0x98, 0x66, | 3363 | 0x47, 0x14, 0xff, 0xeb, 0xe2, 0x2a, 0xe1, 0x50, 0x88, 0x1f, 0x98, 0x66, |
3364 | 0xfa, 0x15, 0x07, 0xc0, 0xcc, 0x57, 0x8e, 0x5f, 0x01, 0x4f, 0xb7, 0xe9, | 3364 | 0xfb, 0x15, 0x07, 0xc0, 0xcc, 0x57, 0x8e, 0x5f, 0x01, 0x4f, 0xb7, 0xeb, |
3365 | 0x7a, 0xae, 0xe3, 0x65, 0xcd, 0xd7, 0x78, 0x0e, 0x6e, 0x33, 0x75, 0x59, | 3365 | 0x7a, 0xae, 0xe3, 0x65, 0xcd, 0xd7, 0xd8, 0x32, 0xdc, 0x66, 0xeb, 0xb2, |
3366 | 0xdb, 0xa9, 0xf8, 0xa3, 0x8c, 0x47, 0x9f, 0xe8, 0xdc, 0x86, 0x7b, 0x6e, | 3366 | 0xb6, 0x53, 0xf1, 0x47, 0x18, 0x8f, 0x3e, 0xd1, 0xb5, 0x0d, 0xf7, 0xdc, |
3367 | 0xc8, 0x8b, 0xba, 0x1f, 0xf2, 0x5a, 0xe3, 0x25, 0x71, 0x51, 0xe8, 0x55, | 3367 | 0xa0, 0x17, 0x75, 0x3f, 0xe8, 0xb5, 0xc6, 0x4b, 0xe2, 0xa2, 0xd0, 0xab, |
3368 | 0xc3, 0xea, 0xe2, 0x42, 0xb2, 0xe7, 0xd4, 0xa5, 0x6f, 0x69, 0xf9, 0xfd, | 3368 | 0x86, 0x35, 0x25, 0x85, 0x64, 0xcf, 0xa9, 0x4b, 0xdf, 0xd2, 0xf2, 0xfb, |
3369 | 0xe9, 0x00, 0xe6, 0xcb, 0x76, 0x86, 0xc9, 0x1f, 0x53, 0xc0, 0xf3, 0xbb, | 3369 | 0xd3, 0x45, 0x98, 0x2f, 0xdf, 0x19, 0x22, 0x7f, 0x4c, 0x01, 0xcf, 0xef, |
3370 | 0x93, 0xa0, 0xef, 0x88, 0x17, 0xb0, 0xbf, 0xf8, 0x04, 0xdd, 0x03, 0x7d, | 3370 | 0x4e, 0x82, 0xbe, 0x23, 0x5e, 0xc0, 0xfe, 0x92, 0x13, 0x74, 0x0f, 0xf4, |
3371 | 0x65, 0x8c, 0xcf, 0x72, 0xd4, 0x89, 0xe4, 0x34, 0xdd, 0x4b, 0x96, 0x97, | 3371 | 0x95, 0x33, 0x3e, 0x2b, 0x50, 0x27, 0x92, 0xd3, 0x74, 0x2f, 0x59, 0x5a, |
3372 | 0x45, 0x50, 0x51, 0x8f, 0xd9, 0x6f, 0x80, 0x4f, 0xb7, 0x25, 0xce, 0x0f, | 3372 | 0x12, 0x01, 0x45, 0x3d, 0x66, 0xbf, 0x01, 0x3e, 0xdd, 0x96, 0x38, 0x3f, |
3373 | 0xc2, 0x2b, 0xdd, 0x2b, 0x25, 0x1e, 0xb1, 0x9d, 0x71, 0xeb, 0xcb, 0xc6, | 3373 | 0x08, 0xaf, 0x74, 0xaf, 0x94, 0x78, 0xc4, 0x76, 0xc6, 0xad, 0x2f, 0x17, |
3374 | 0xad, 0xf6, 0x47, 0xb9, 0x33, 0x2f, 0x4e, 0x37, 0xd8, 0x71, 0xea, 0x61, | 3374 | 0xb7, 0xda, 0x1f, 0x15, 0xce, 0xbc, 0x38, 0xdd, 0x60, 0xc7, 0xa9, 0x87, |
3375 | 0x9c, 0xde, 0x33, 0xfb, 0x7b, 0xae, 0x5c, 0xf4, 0xf9, 0x8b, 0xff, 0x1b, | 3375 | 0x71, 0x7a, 0xcf, 0xec, 0xef, 0xcb, 0xe5, 0xa2, 0xcf, 0x5f, 0xfc, 0xdf, |
3376 | 0x6e, 0x41, 0xb7, 0xd7, 0xab, 0xf3, 0xcb, 0x72, 0xea, 0x71, 0x8d, 0x2d, | 3376 | 0x70, 0x0b, 0xba, 0xbd, 0x41, 0x9d, 0x5f, 0xbe, 0xac, 0x1e, 0xd7, 0xda, |
3377 | 0xce, 0x4d, 0xf7, 0xb5, 0x5e, 0x27, 0x3c, 0xd6, 0xf5, 0x66, 0xb3, 0x9f, | 3377 | 0xe2, 0xdc, 0x7c, 0x5f, 0xeb, 0x75, 0xc2, 0x63, 0x5d, 0x6f, 0x31, 0xfb, |
3378 | 0x1d, 0xe1, 0x77, 0x5e, 0xda, 0xa0, 0x1f, 0xb1, 0x3b, 0x49, 0x1a, 0x1a, | 3378 | 0xd9, 0x11, 0x7e, 0xe7, 0x65, 0x0c, 0xfa, 0x11, 0xbd, 0x93, 0xa4, 0xa1, |
3379 | 0x15, 0x67, 0x15, 0x5f, 0x63, 0xec, 0x08, 0xd7, 0xdb, 0x4b, 0x2e, 0xd4, | 3379 | 0x51, 0x79, 0x56, 0xf1, 0x35, 0x45, 0x8f, 0x70, 0xbd, 0xbd, 0xe4, 0x42, |
3380 | 0x9b, 0xfe, 0x03, 0x18, 0x5f, 0xe6, 0xfa, 0x71, 0x77, 0x0d, 0xd5, 0xe5, | 3380 | 0xbd, 0x19, 0x38, 0x80, 0xf1, 0x65, 0xae, 0x1f, 0x77, 0xd7, 0x50, 0x5d, |
3381 | 0xd8, 0x91, 0xf3, 0x5a, 0x1e, 0xc9, 0x31, 0xd2, 0x5c, 0xd7, 0x9f, 0x77, | 3381 | 0x8e, 0x1e, 0x39, 0xaf, 0xe5, 0x91, 0x1c, 0x23, 0xc3, 0x75, 0xfd, 0x79, |
3382 | 0x71, 0xbd, 0x25, 0xbf, 0xb9, 0x63, 0x7f, 0xd0, 0x7d, 0xc6, 0x2d, 0x3a, | 3382 | 0x17, 0xd7, 0x5b, 0xf2, 0x9b, 0x3b, 0xfa, 0x07, 0xdd, 0x67, 0xdc, 0xa2, |
3383 | 0x9f, 0x54, 0xb4, 0x42, 0xd6, 0x6f, 0x3e, 0xff, 0x19, 0xd0, 0x1e, 0x2f, | 3383 | 0xeb, 0x49, 0x45, 0x2b, 0x65, 0xfd, 0xe6, 0xf3, 0x9f, 0x01, 0xed, 0xf5, |
3384 | 0xa8, 0x68, 0xb2, 0xc7, 0x43, 0x98, 0x76, 0x61, 0xe4, 0xa9, 0x63, 0x39, | 3384 | 0x82, 0x8a, 0x66, 0x7b, 0x3c, 0x84, 0x69, 0x17, 0x46, 0x9e, 0x7a, 0x96, |
3385 | 0xbd, 0x18, 0x7b, 0xf9, 0x5e, 0x36, 0xcd, 0x7e, 0x0a, 0x91, 0x3f, 0x8a, | 3385 | 0xd3, 0x87, 0xb1, 0x97, 0xef, 0x65, 0xd3, 0xec, 0xa7, 0x20, 0xf9, 0xa3, |
3386 | 0xa4, 0x9d, 0x8a, 0x86, 0x63, 0xa3, 0xb3, 0xd0, 0x7f, 0x68, 0x2b, 0xec, | 3386 | 0x58, 0xda, 0xa9, 0x68, 0x28, 0x3a, 0x9a, 0x86, 0xfe, 0x43, 0x5b, 0x61, |
3387 | 0x5b, 0x62, 0xbb, 0x99, 0x86, 0xde, 0x1e, 0x23, 0xfc, 0x85, 0xc6, 0xf1, | 3387 | 0xdf, 0x22, 0xdb, 0xcd, 0x34, 0xf8, 0xf6, 0x18, 0xe1, 0x2f, 0x38, 0x8e, |
3388 | 0x0e, 0x09, 0x79, 0xc6, 0x60, 0xc7, 0x50, 0x1a, 0xe3, 0xa5, 0xcd, 0xa0, | 3388 | 0x77, 0x48, 0xd0, 0x33, 0x06, 0x3b, 0x86, 0x32, 0x18, 0x2f, 0x6e, 0x06, |
3389 | 0x7f, 0x6d, 0xc1, 0xbe, 0xa3, 0xc7, 0xd9, 0x1f, 0x5b, 0xf3, 0xef, 0xeb, | 3389 | 0xfd, 0x6b, 0x0b, 0xf6, 0x1d, 0x3d, 0xce, 0xfe, 0xd8, 0x9a, 0x7f, 0xdf, |
3390 | 0xbf, 0x07, 0xbe, 0xe1, 0x46, 0x75, 0xfe, 0xe0, 0x0c, 0xbf, 0x5f, 0xc4, | 3390 | 0xc0, 0x3d, 0xf0, 0x0d, 0x37, 0xa9, 0xf3, 0x07, 0x67, 0xf8, 0xfd, 0x22, |
3391 | 0x80, 0x4b, 0x8d, 0x07, 0x8c, 0x34, 0x8f, 0x0f, 0x71, 0x7d, 0xbf, 0xcd, | 3391 | 0xe2, 0x2e, 0x35, 0x8e, 0x1b, 0x19, 0x1e, 0x1f, 0xe2, 0xfa, 0x7e, 0x9b, |
3392 | 0xef, 0x8d, 0xa1, 0xac, 0xf7, 0xc6, 0x02, 0xee, 0x99, 0x33, 0xe9, 0x24, | 3392 | 0xdf, 0x1b, 0x43, 0x39, 0xef, 0x8d, 0x79, 0xdc, 0x33, 0x67, 0x32, 0x49, |
3393 | 0x70, 0x91, 0x28, 0xcc, 0x7e, 0xaf, 0xaa, 0x71, 0x75, 0xac, 0x8c, 0xe3, | 3393 | 0xe0, 0x22, 0x51, 0x98, 0xfb, 0x5e, 0x55, 0xe3, 0x9a, 0x68, 0x39, 0xc7, |
3394 | 0x54, 0xba, 0x1e, 0x74, 0x72, 0x3d, 0xde, 0x09, 0x43, 0xc7, 0xd8, 0x2f, | 3394 | 0xa9, 0x6c, 0x3d, 0xe8, 0xe4, 0x7a, 0xbc, 0x13, 0x86, 0x8e, 0xb1, 0x5f, |
3395 | 0xed, 0x14, 0xa7, 0x96, 0xc5, 0xd9, 0x95, 0xde, 0xc9, 0xe0, 0x9b, 0xe2, | 3395 | 0x3a, 0x28, 0x4e, 0xad, 0x0b, 0xe9, 0x95, 0xde, 0xc9, 0xe0, 0x9b, 0xe2, |
3396 | 0x73, 0x23, 0xdc, 0x4f, 0x22, 0xc8, 0x3f, 0x51, 0x9e, 0xe4, 0x77, 0xcb, | 3396 | 0x73, 0xc3, 0xdc, 0x4f, 0xc2, 0xc8, 0x3f, 0x51, 0x91, 0xe4, 0x77, 0xcb, |
3397 | 0x04, 0xee, 0x9d, 0x53, 0x06, 0x68, 0x24, 0xa8, 0xf5, 0x45, 0x3e, 0x26, | 3397 | 0x04, 0xee, 0x9d, 0x53, 0x06, 0x68, 0x38, 0xa0, 0xf5, 0x45, 0x3e, 0x26, |
3398 | 0x52, 0xc8, 0x3b, 0xac, 0x3b, 0x2c, 0xeb, 0x7c, 0x1f, 0xc9, 0x79, 0xe7, | 3398 | 0x52, 0xc8, 0x3b, 0xac, 0x3b, 0x2c, 0xeb, 0x7c, 0x1f, 0x59, 0xf6, 0xce, |
3399 | 0x28, 0xba, 0xe4, 0x28, 0x71, 0x68, 0x3b, 0xb1, 0xda, 0x17, 0x54, 0xf8, | 3399 | 0x51, 0x74, 0xd1, 0x51, 0xea, 0xd0, 0x76, 0x62, 0xb5, 0x3f, 0xa0, 0xf0, |
3400 | 0xbd, 0x69, 0xe6, 0xd5, 0x02, 0xf9, 0xad, 0x6a, 0x26, 0x4d, 0xfa, 0x57, | 3400 | 0x7b, 0xd3, 0xcc, 0xab, 0x79, 0xf2, 0x5b, 0xf5, 0x4c, 0x86, 0xf4, 0xaf, |
3401 | 0x8a, 0x12, 0xea, 0xc3, 0x15, 0xa1, 0x45, 0xf8, 0x31, 0x36, 0xcd, 0xfe, | 3401 | 0x12, 0xa5, 0xd4, 0x87, 0x2b, 0x83, 0x0b, 0xf0, 0x63, 0x74, 0x9a, 0xfd, |
3402 | 0x1f, 0xd9, 0x04, 0x7a, 0x8c, 0xf1, 0xa7, 0x71, 0x75, 0x65, 0xa3, 0x41, | 3402 | 0x3f, 0xb2, 0x09, 0xf4, 0x18, 0xe3, 0x4f, 0xe3, 0xea, 0xca, 0x46, 0x83, |
3403 | 0xfb, 0xe6, 0x47, 0x71, 0x8e, 0xbe, 0x47, 0x64, 0xbf, 0xc7, 0x35, 0x1e, | 3403 | 0xf6, 0xcd, 0x8d, 0xe2, 0x1c, 0x7d, 0x8f, 0xc8, 0x7d, 0x8f, 0x6b, 0x3c, |
3404 | 0x2b, 0xda, 0x50, 0x48, 0xfb, 0x8f, 0xaa, 0x73, 0x82, 0x12, 0x47, 0x4a, | 3404 | 0x56, 0xb6, 0xa3, 0x90, 0x0e, 0x1c, 0x55, 0xe7, 0x04, 0x24, 0x8e, 0x94, |
3405 | 0x7f, 0xe9, 0x13, 0xce, 0x47, 0x3b, 0x4e, 0x15, 0x8e, 0x75, 0x7e, 0x58, | 3405 | 0xfe, 0xd2, 0x27, 0x9c, 0x8f, 0x76, 0x9c, 0x2a, 0x1c, 0xeb, 0xfc, 0xb0, |
3406 | 0xf1, 0x9d, 0x9d, 0xef, 0x19, 0xbc, 0x86, 0xe8, 0x5e, 0x2e, 0x8b, 0x5c, | 3406 | 0xe2, 0x3b, 0x37, 0xdf, 0xb3, 0x78, 0x0d, 0xd2, 0xbd, 0x5c, 0x16, 0xb9, |
3407 | 0x82, 0xdf, 0x4d, 0x7c, 0x3f, 0x58, 0x29, 0x7e, 0x6f, 0x23, 0x7e, 0x31, | 3407 | 0x04, 0xbf, 0x9b, 0xf8, 0x7e, 0xb0, 0x52, 0xfc, 0xde, 0x46, 0xfc, 0xa2, |
3408 | 0xd6, 0xdb, 0x18, 0x18, 0x43, 0x5f, 0x1c, 0x67, 0x1c, 0x2d, 0x34, 0xf2, | 3408 | 0xac, 0xb7, 0x11, 0x1f, 0x43, 0x5f, 0x1c, 0x67, 0x1c, 0xcd, 0x37, 0xf1, |
3409 | 0xfd, 0x87, 0xf5, 0xfb, 0x8d, 0xdf, 0x67, 0xc0, 0x9b, 0xd7, 0x88, 0xcf, | 3409 | 0xfd, 0x87, 0xf5, 0xfb, 0x8d, 0xdf, 0x67, 0xc0, 0x9b, 0xd7, 0x88, 0xa5, |
3410 | 0x32, 0xbe, 0x18, 0xf7, 0x87, 0xd8, 0xee, 0xdb, 0xb0, 0xdb, 0xd0, 0x76, | 3410 | 0x19, 0x5f, 0x8c, 0xfb, 0x43, 0x6c, 0xf7, 0x6d, 0xd8, 0x6d, 0x68, 0xbb, |
3411 | 0x0f, 0x98, 0x76, 0xeb, 0xfb, 0x95, 0x55, 0x4e, 0xb1, 0xc4, 0xad, 0xa2, | 3411 | 0xe3, 0xa6, 0xdd, 0xfa, 0x7e, 0x65, 0x95, 0x53, 0x22, 0x71, 0xab, 0xe8, |
3412 | 0xab, 0x8c, 0x2b, 0x54, 0xcf, 0x0a, 0xd8, 0x4e, 0xc9, 0xd7, 0xa6, 0xec, | 3412 | 0x2a, 0xe3, 0x0a, 0xd5, 0xb3, 0x02, 0xb6, 0x53, 0xf2, 0xb5, 0x2b, 0x7b, |
3413 | 0x09, 0xb1, 0x3d, 0x41, 0x71, 0xb0, 0xc5, 0xba, 0x2f, 0xc0, 0xfb, 0xfc, | 3413 | 0x82, 0x6c, 0x4f, 0x40, 0x1c, 0x6c, 0xb5, 0xee, 0x2b, 0xe2, 0x7d, 0x7e, |
3414 | 0x72, 0x1f, 0xe6, 0x51, 0x17, 0x8c, 0x15, 0xfc, 0xa9, 0xfc, 0xa6, 0xe5, | 3414 | 0xb9, 0x0f, 0xf3, 0xa8, 0x0b, 0xc6, 0x0a, 0xfe, 0x54, 0x7e, 0xd3, 0x72, |
3415 | 0x66, 0xe7, 0xbd, 0xd5, 0x7f, 0x74, 0x23, 0xa5, 0x0f, 0xea, 0x9b, 0x8c, | 3415 | 0x73, 0xf3, 0xde, 0xea, 0x3f, 0xba, 0x91, 0xd2, 0x07, 0xf5, 0x4d, 0xc6, |
3416 | 0x53, 0x33, 0xfe, 0x3f, 0xd0, 0xf5, 0xed, 0x2e, 0xdd, 0x5f, 0xfd, 0x67, | 3416 | 0xa9, 0x05, 0xff, 0x1f, 0xe8, 0xfa, 0x76, 0x97, 0xee, 0xaf, 0xfe, 0x33, |
3417 | 0x86, 0x51, 0x9f, 0xce, 0x0c, 0x9f, 0xe5, 0x77, 0x07, 0xfb, 0xa5, 0x9b, | 3417 | 0xc3, 0xa8, 0x4f, 0x67, 0x86, 0xcf, 0xf2, 0xbb, 0x83, 0xfd, 0xd2, 0x43, |
3418 | 0xfe, 0xb7, 0x90, 0xb1, 0xab, 0xb3, 0xd7, 0x37, 0xbb, 0x1e, 0x55, 0x16, | 3418 | 0xff, 0x5b, 0xc8, 0xd8, 0xd5, 0xdb, 0xeb, 0x9b, 0x5d, 0x8f, 0x6a, 0x8b, |
3419 | 0x3d, 0xf4, 0xb9, 0xff, 0x00, 0x0e, 0x4b, 0x7c, 0x26, 0x30, 0x14, 0x00, | 3419 | 0x1e, 0xfa, 0xdc, 0x7f, 0x00, 0x5a, 0x33, 0xe6, 0xc0, 0x30, 0x14, 0x00, |
3420 | 0x00, 0x00 }; | 3420 | 0x00, 0x00 }; |
3421 | 3421 | ||
3422 | static u8 bnx2_TPAT_b09FwText[] = { | 3422 | static u8 bnx2_TPAT_b09FwText[] = { |
diff --git a/drivers/net/macvlan.c b/drivers/net/macvlan.c index 6ef6b8b39e71..f651a816b280 100644 --- a/drivers/net/macvlan.c +++ b/drivers/net/macvlan.c | |||
@@ -508,7 +508,7 @@ static int __init macvlan_init_module(void) | |||
508 | goto err1; | 508 | goto err1; |
509 | return 0; | 509 | return 0; |
510 | err1: | 510 | err1: |
511 | macvlan_handle_frame_hook = macvlan_handle_frame; | 511 | macvlan_handle_frame_hook = NULL; |
512 | unregister_netdevice_notifier(&macvlan_notifier_block); | 512 | unregister_netdevice_notifier(&macvlan_notifier_block); |
513 | return err; | 513 | return err; |
514 | } | 514 | } |
diff --git a/drivers/net/usb/asix.c b/drivers/net/usb/asix.c index 569028b2baf2..6f245cfb6624 100644 --- a/drivers/net/usb/asix.c +++ b/drivers/net/usb/asix.c | |||
@@ -33,8 +33,7 @@ | |||
33 | #include <linux/mii.h> | 33 | #include <linux/mii.h> |
34 | #include <linux/usb.h> | 34 | #include <linux/usb.h> |
35 | #include <linux/crc32.h> | 35 | #include <linux/crc32.h> |
36 | 36 | #include <linux/usb/usbnet.h> | |
37 | #include "usbnet.h" | ||
38 | 37 | ||
39 | #define DRIVER_VERSION "14-Jun-2006" | 38 | #define DRIVER_VERSION "14-Jun-2006" |
40 | static const char driver_name [] = "asix"; | 39 | static const char driver_name [] = "asix"; |
diff --git a/drivers/net/usb/cdc_ether.c b/drivers/net/usb/cdc_ether.c index a42acc3cc609..a934428a5890 100644 --- a/drivers/net/usb/cdc_ether.c +++ b/drivers/net/usb/cdc_ether.c | |||
@@ -31,8 +31,7 @@ | |||
31 | #include <linux/mii.h> | 31 | #include <linux/mii.h> |
32 | #include <linux/usb.h> | 32 | #include <linux/usb.h> |
33 | #include <linux/usb/cdc.h> | 33 | #include <linux/usb/cdc.h> |
34 | 34 | #include <linux/usb/usbnet.h> | |
35 | #include "usbnet.h" | ||
36 | 35 | ||
37 | 36 | ||
38 | #if defined(CONFIG_USB_NET_RNDIS_HOST) || defined(CONFIG_USB_NET_RNDIS_HOST_MODULE) | 37 | #if defined(CONFIG_USB_NET_RNDIS_HOST) || defined(CONFIG_USB_NET_RNDIS_HOST_MODULE) |
@@ -228,15 +227,16 @@ next_desc: | |||
228 | buf += buf [0]; | 227 | buf += buf [0]; |
229 | } | 228 | } |
230 | 229 | ||
231 | /* Microsoft ActiveSync based RNDIS devices lack the CDC descriptors, | 230 | /* Microsoft ActiveSync based and some regular RNDIS devices lack the |
232 | * so we'll hard-wire the interfaces and not check for descriptors. | 231 | * CDC descriptors, so we'll hard-wire the interfaces and not check |
232 | * for descriptors. | ||
233 | */ | 233 | */ |
234 | if (is_activesync(&intf->cur_altsetting->desc) && !info->u) { | 234 | if (rndis && !info->u) { |
235 | info->control = usb_ifnum_to_if(dev->udev, 0); | 235 | info->control = usb_ifnum_to_if(dev->udev, 0); |
236 | info->data = usb_ifnum_to_if(dev->udev, 1); | 236 | info->data = usb_ifnum_to_if(dev->udev, 1); |
237 | if (!info->control || !info->data) { | 237 | if (!info->control || !info->data) { |
238 | dev_dbg(&intf->dev, | 238 | dev_dbg(&intf->dev, |
239 | "activesync: master #0/%p slave #1/%p\n", | 239 | "rndis: master #0/%p slave #1/%p\n", |
240 | info->control, | 240 | info->control, |
241 | info->data); | 241 | info->data); |
242 | goto bad_desc; | 242 | goto bad_desc; |
@@ -316,7 +316,6 @@ void usbnet_cdc_unbind(struct usbnet *dev, struct usb_interface *intf) | |||
316 | } | 316 | } |
317 | EXPORT_SYMBOL_GPL(usbnet_cdc_unbind); | 317 | EXPORT_SYMBOL_GPL(usbnet_cdc_unbind); |
318 | 318 | ||
319 | |||
320 | /*------------------------------------------------------------------------- | 319 | /*------------------------------------------------------------------------- |
321 | * | 320 | * |
322 | * Communications Device Class, Ethernet Control model | 321 | * Communications Device Class, Ethernet Control model |
diff --git a/drivers/net/usb/cdc_subset.c b/drivers/net/usb/cdc_subset.c index 943988ed01d8..0ec7936cbe21 100644 --- a/drivers/net/usb/cdc_subset.c +++ b/drivers/net/usb/cdc_subset.c | |||
@@ -26,8 +26,7 @@ | |||
26 | #include <linux/workqueue.h> | 26 | #include <linux/workqueue.h> |
27 | #include <linux/mii.h> | 27 | #include <linux/mii.h> |
28 | #include <linux/usb.h> | 28 | #include <linux/usb.h> |
29 | 29 | #include <linux/usb/usbnet.h> | |
30 | #include "usbnet.h" | ||
31 | 30 | ||
32 | 31 | ||
33 | /* | 32 | /* |
diff --git a/drivers/net/usb/dm9601.c b/drivers/net/usb/dm9601.c index 633a511d6cb6..4b131a6c6b70 100644 --- a/drivers/net/usb/dm9601.c +++ b/drivers/net/usb/dm9601.c | |||
@@ -20,8 +20,7 @@ | |||
20 | #include <linux/mii.h> | 20 | #include <linux/mii.h> |
21 | #include <linux/usb.h> | 21 | #include <linux/usb.h> |
22 | #include <linux/crc32.h> | 22 | #include <linux/crc32.h> |
23 | 23 | #include <linux/usb/usbnet.h> | |
24 | #include "usbnet.h" | ||
25 | 24 | ||
26 | /* datasheet: | 25 | /* datasheet: |
27 | http://www.davicom.com.tw/big5/download/Data%20Sheet/DM9601-DS-P01-930914.pdf | 26 | http://www.davicom.com.tw/big5/download/Data%20Sheet/DM9601-DS-P01-930914.pdf |
diff --git a/drivers/net/usb/gl620a.c b/drivers/net/usb/gl620a.c index 031cf5ca4dbb..f7ccfad9384e 100644 --- a/drivers/net/usb/gl620a.c +++ b/drivers/net/usb/gl620a.c | |||
@@ -29,8 +29,7 @@ | |||
29 | #include <linux/workqueue.h> | 29 | #include <linux/workqueue.h> |
30 | #include <linux/mii.h> | 30 | #include <linux/mii.h> |
31 | #include <linux/usb.h> | 31 | #include <linux/usb.h> |
32 | 32 | #include <linux/usb/usbnet.h> | |
33 | #include "usbnet.h" | ||
34 | 33 | ||
35 | 34 | ||
36 | /* | 35 | /* |
diff --git a/drivers/net/usb/mcs7830.c b/drivers/net/usb/mcs7830.c index 5ea7411e1337..c3d119f997f5 100644 --- a/drivers/net/usb/mcs7830.c +++ b/drivers/net/usb/mcs7830.c | |||
@@ -31,8 +31,7 @@ | |||
31 | #include <linux/module.h> | 31 | #include <linux/module.h> |
32 | #include <linux/netdevice.h> | 32 | #include <linux/netdevice.h> |
33 | #include <linux/usb.h> | 33 | #include <linux/usb.h> |
34 | 34 | #include <linux/usb/usbnet.h> | |
35 | #include "usbnet.h" | ||
36 | 35 | ||
37 | /* requests */ | 36 | /* requests */ |
38 | #define MCS7830_RD_BMREQ (USB_DIR_IN | USB_TYPE_VENDOR | \ | 37 | #define MCS7830_RD_BMREQ (USB_DIR_IN | USB_TYPE_VENDOR | \ |
diff --git a/drivers/net/usb/net1080.c b/drivers/net/usb/net1080.c index 19bf8dae70c9..034e8a73ca6b 100644 --- a/drivers/net/usb/net1080.c +++ b/drivers/net/usb/net1080.c | |||
@@ -28,11 +28,10 @@ | |||
28 | #include <linux/workqueue.h> | 28 | #include <linux/workqueue.h> |
29 | #include <linux/mii.h> | 29 | #include <linux/mii.h> |
30 | #include <linux/usb.h> | 30 | #include <linux/usb.h> |
31 | #include <linux/usb/usbnet.h> | ||
31 | 32 | ||
32 | #include <asm/unaligned.h> | 33 | #include <asm/unaligned.h> |
33 | 34 | ||
34 | #include "usbnet.h" | ||
35 | |||
36 | 35 | ||
37 | /* | 36 | /* |
38 | * Netchip 1080 driver ... http://www.netchip.com | 37 | * Netchip 1080 driver ... http://www.netchip.com |
diff --git a/drivers/net/usb/plusb.c b/drivers/net/usb/plusb.c index 45300939d185..08555f8b15f4 100644 --- a/drivers/net/usb/plusb.c +++ b/drivers/net/usb/plusb.c | |||
@@ -28,8 +28,7 @@ | |||
28 | #include <linux/workqueue.h> | 28 | #include <linux/workqueue.h> |
29 | #include <linux/mii.h> | 29 | #include <linux/mii.h> |
30 | #include <linux/usb.h> | 30 | #include <linux/usb.h> |
31 | 31 | #include <linux/usb/usbnet.h> | |
32 | #include "usbnet.h" | ||
33 | 32 | ||
34 | 33 | ||
35 | /* | 34 | /* |
diff --git a/drivers/net/usb/rndis_host.c b/drivers/net/usb/rndis_host.c index 1ebe3259be0d..a61324757b17 100644 --- a/drivers/net/usb/rndis_host.c +++ b/drivers/net/usb/rndis_host.c | |||
@@ -29,8 +29,8 @@ | |||
29 | #include <linux/mii.h> | 29 | #include <linux/mii.h> |
30 | #include <linux/usb.h> | 30 | #include <linux/usb.h> |
31 | #include <linux/usb/cdc.h> | 31 | #include <linux/usb/cdc.h> |
32 | 32 | #include <linux/usb/usbnet.h> | |
33 | #include "usbnet.h" | 33 | #include <linux/usb/rndis_host.h> |
34 | 34 | ||
35 | 35 | ||
36 | /* | 36 | /* |
@@ -56,217 +56,17 @@ | |||
56 | */ | 56 | */ |
57 | 57 | ||
58 | /* | 58 | /* |
59 | * CONTROL uses CDC "encapsulated commands" with funky notifications. | ||
60 | * - control-out: SEND_ENCAPSULATED | ||
61 | * - interrupt-in: RESPONSE_AVAILABLE | ||
62 | * - control-in: GET_ENCAPSULATED | ||
63 | * | ||
64 | * We'll try to ignore the RESPONSE_AVAILABLE notifications. | ||
65 | * | ||
66 | * REVISIT some RNDIS implementations seem to have curious issues still | ||
67 | * to be resolved. | ||
68 | */ | ||
69 | struct rndis_msg_hdr { | ||
70 | __le32 msg_type; /* RNDIS_MSG_* */ | ||
71 | __le32 msg_len; | ||
72 | // followed by data that varies between messages | ||
73 | __le32 request_id; | ||
74 | __le32 status; | ||
75 | // ... and more | ||
76 | } __attribute__ ((packed)); | ||
77 | |||
78 | /* MS-Windows uses this strange size, but RNDIS spec says 1024 minimum */ | ||
79 | #define CONTROL_BUFFER_SIZE 1025 | ||
80 | |||
81 | /* RNDIS defines an (absurdly huge) 10 second control timeout, | ||
82 | * but ActiveSync seems to use a more usual 5 second timeout | ||
83 | * (which matches the USB 2.0 spec). | ||
84 | */ | ||
85 | #define RNDIS_CONTROL_TIMEOUT_MS (5 * 1000) | ||
86 | |||
87 | |||
88 | #define ccpu2 __constant_cpu_to_le32 | ||
89 | |||
90 | #define RNDIS_MSG_COMPLETION ccpu2(0x80000000) | ||
91 | |||
92 | /* codes for "msg_type" field of rndis messages; | ||
93 | * only the data channel uses packet messages (maybe batched); | ||
94 | * everything else goes on the control channel. | ||
95 | */ | ||
96 | #define RNDIS_MSG_PACKET ccpu2(0x00000001) /* 1-N packets */ | ||
97 | #define RNDIS_MSG_INIT ccpu2(0x00000002) | ||
98 | #define RNDIS_MSG_INIT_C (RNDIS_MSG_INIT|RNDIS_MSG_COMPLETION) | ||
99 | #define RNDIS_MSG_HALT ccpu2(0x00000003) | ||
100 | #define RNDIS_MSG_QUERY ccpu2(0x00000004) | ||
101 | #define RNDIS_MSG_QUERY_C (RNDIS_MSG_QUERY|RNDIS_MSG_COMPLETION) | ||
102 | #define RNDIS_MSG_SET ccpu2(0x00000005) | ||
103 | #define RNDIS_MSG_SET_C (RNDIS_MSG_SET|RNDIS_MSG_COMPLETION) | ||
104 | #define RNDIS_MSG_RESET ccpu2(0x00000006) | ||
105 | #define RNDIS_MSG_RESET_C (RNDIS_MSG_RESET|RNDIS_MSG_COMPLETION) | ||
106 | #define RNDIS_MSG_INDICATE ccpu2(0x00000007) | ||
107 | #define RNDIS_MSG_KEEPALIVE ccpu2(0x00000008) | ||
108 | #define RNDIS_MSG_KEEPALIVE_C (RNDIS_MSG_KEEPALIVE|RNDIS_MSG_COMPLETION) | ||
109 | |||
110 | /* codes for "status" field of completion messages */ | ||
111 | #define RNDIS_STATUS_SUCCESS ccpu2(0x00000000) | ||
112 | #define RNDIS_STATUS_FAILURE ccpu2(0xc0000001) | ||
113 | #define RNDIS_STATUS_INVALID_DATA ccpu2(0xc0010015) | ||
114 | #define RNDIS_STATUS_NOT_SUPPORTED ccpu2(0xc00000bb) | ||
115 | #define RNDIS_STATUS_MEDIA_CONNECT ccpu2(0x4001000b) | ||
116 | #define RNDIS_STATUS_MEDIA_DISCONNECT ccpu2(0x4001000c) | ||
117 | |||
118 | |||
119 | struct rndis_data_hdr { | ||
120 | __le32 msg_type; /* RNDIS_MSG_PACKET */ | ||
121 | __le32 msg_len; // rndis_data_hdr + data_len + pad | ||
122 | __le32 data_offset; // 36 -- right after header | ||
123 | __le32 data_len; // ... real packet size | ||
124 | |||
125 | __le32 oob_data_offset; // zero | ||
126 | __le32 oob_data_len; // zero | ||
127 | __le32 num_oob; // zero | ||
128 | __le32 packet_data_offset; // zero | ||
129 | |||
130 | __le32 packet_data_len; // zero | ||
131 | __le32 vc_handle; // zero | ||
132 | __le32 reserved; // zero | ||
133 | } __attribute__ ((packed)); | ||
134 | |||
135 | struct rndis_init { /* OUT */ | ||
136 | // header and: | ||
137 | __le32 msg_type; /* RNDIS_MSG_INIT */ | ||
138 | __le32 msg_len; // 24 | ||
139 | __le32 request_id; | ||
140 | __le32 major_version; // of rndis (1.0) | ||
141 | __le32 minor_version; | ||
142 | __le32 max_transfer_size; | ||
143 | } __attribute__ ((packed)); | ||
144 | |||
145 | struct rndis_init_c { /* IN */ | ||
146 | // header and: | ||
147 | __le32 msg_type; /* RNDIS_MSG_INIT_C */ | ||
148 | __le32 msg_len; | ||
149 | __le32 request_id; | ||
150 | __le32 status; | ||
151 | __le32 major_version; // of rndis (1.0) | ||
152 | __le32 minor_version; | ||
153 | __le32 device_flags; | ||
154 | __le32 medium; // zero == 802.3 | ||
155 | __le32 max_packets_per_message; | ||
156 | __le32 max_transfer_size; | ||
157 | __le32 packet_alignment; // max 7; (1<<n) bytes | ||
158 | __le32 af_list_offset; // zero | ||
159 | __le32 af_list_size; // zero | ||
160 | } __attribute__ ((packed)); | ||
161 | |||
162 | struct rndis_halt { /* OUT (no reply) */ | ||
163 | // header and: | ||
164 | __le32 msg_type; /* RNDIS_MSG_HALT */ | ||
165 | __le32 msg_len; | ||
166 | __le32 request_id; | ||
167 | } __attribute__ ((packed)); | ||
168 | |||
169 | struct rndis_query { /* OUT */ | ||
170 | // header and: | ||
171 | __le32 msg_type; /* RNDIS_MSG_QUERY */ | ||
172 | __le32 msg_len; | ||
173 | __le32 request_id; | ||
174 | __le32 oid; | ||
175 | __le32 len; | ||
176 | __le32 offset; | ||
177 | /*?*/ __le32 handle; // zero | ||
178 | } __attribute__ ((packed)); | ||
179 | |||
180 | struct rndis_query_c { /* IN */ | ||
181 | // header and: | ||
182 | __le32 msg_type; /* RNDIS_MSG_QUERY_C */ | ||
183 | __le32 msg_len; | ||
184 | __le32 request_id; | ||
185 | __le32 status; | ||
186 | __le32 len; | ||
187 | __le32 offset; | ||
188 | } __attribute__ ((packed)); | ||
189 | |||
190 | struct rndis_set { /* OUT */ | ||
191 | // header and: | ||
192 | __le32 msg_type; /* RNDIS_MSG_SET */ | ||
193 | __le32 msg_len; | ||
194 | __le32 request_id; | ||
195 | __le32 oid; | ||
196 | __le32 len; | ||
197 | __le32 offset; | ||
198 | /*?*/ __le32 handle; // zero | ||
199 | } __attribute__ ((packed)); | ||
200 | |||
201 | struct rndis_set_c { /* IN */ | ||
202 | // header and: | ||
203 | __le32 msg_type; /* RNDIS_MSG_SET_C */ | ||
204 | __le32 msg_len; | ||
205 | __le32 request_id; | ||
206 | __le32 status; | ||
207 | } __attribute__ ((packed)); | ||
208 | |||
209 | struct rndis_reset { /* IN */ | ||
210 | // header and: | ||
211 | __le32 msg_type; /* RNDIS_MSG_RESET */ | ||
212 | __le32 msg_len; | ||
213 | __le32 reserved; | ||
214 | } __attribute__ ((packed)); | ||
215 | |||
216 | struct rndis_reset_c { /* OUT */ | ||
217 | // header and: | ||
218 | __le32 msg_type; /* RNDIS_MSG_RESET_C */ | ||
219 | __le32 msg_len; | ||
220 | __le32 status; | ||
221 | __le32 addressing_lost; | ||
222 | } __attribute__ ((packed)); | ||
223 | |||
224 | struct rndis_indicate { /* IN (unrequested) */ | ||
225 | // header and: | ||
226 | __le32 msg_type; /* RNDIS_MSG_INDICATE */ | ||
227 | __le32 msg_len; | ||
228 | __le32 status; | ||
229 | __le32 length; | ||
230 | __le32 offset; | ||
231 | /**/ __le32 diag_status; | ||
232 | __le32 error_offset; | ||
233 | /**/ __le32 message; | ||
234 | } __attribute__ ((packed)); | ||
235 | |||
236 | struct rndis_keepalive { /* OUT (optionally IN) */ | ||
237 | // header and: | ||
238 | __le32 msg_type; /* RNDIS_MSG_KEEPALIVE */ | ||
239 | __le32 msg_len; | ||
240 | __le32 request_id; | ||
241 | } __attribute__ ((packed)); | ||
242 | |||
243 | struct rndis_keepalive_c { /* IN (optionally OUT) */ | ||
244 | // header and: | ||
245 | __le32 msg_type; /* RNDIS_MSG_KEEPALIVE_C */ | ||
246 | __le32 msg_len; | ||
247 | __le32 request_id; | ||
248 | __le32 status; | ||
249 | } __attribute__ ((packed)); | ||
250 | |||
251 | /* NOTE: about 30 OIDs are "mandatory" for peripherals to support ... and | ||
252 | * there are gobs more that may optionally be supported. We'll avoid as much | ||
253 | * of that mess as possible. | ||
254 | */ | ||
255 | #define OID_802_3_PERMANENT_ADDRESS ccpu2(0x01010101) | ||
256 | #define OID_GEN_MAXIMUM_FRAME_SIZE ccpu2(0x00010106) | ||
257 | #define OID_GEN_CURRENT_PACKET_FILTER ccpu2(0x0001010e) | ||
258 | |||
259 | /* | ||
260 | * RNDIS notifications from device: command completion; "reverse" | 59 | * RNDIS notifications from device: command completion; "reverse" |
261 | * keepalives; etc | 60 | * keepalives; etc |
262 | */ | 61 | */ |
263 | static void rndis_status(struct usbnet *dev, struct urb *urb) | 62 | void rndis_status(struct usbnet *dev, struct urb *urb) |
264 | { | 63 | { |
265 | devdbg(dev, "rndis status urb, len %d stat %d", | 64 | devdbg(dev, "rndis status urb, len %d stat %d", |
266 | urb->actual_length, urb->status); | 65 | urb->actual_length, urb->status); |
267 | // FIXME for keepalives, respond immediately (asynchronously) | 66 | // FIXME for keepalives, respond immediately (asynchronously) |
268 | // if not an RNDIS status, do like cdc_status(dev,urb) does | 67 | // if not an RNDIS status, do like cdc_status(dev,urb) does |
269 | } | 68 | } |
69 | EXPORT_SYMBOL_GPL(rndis_status); | ||
270 | 70 | ||
271 | /* | 71 | /* |
272 | * RPC done RNDIS-style. Caller guarantees: | 72 | * RPC done RNDIS-style. Caller guarantees: |
@@ -278,7 +78,7 @@ static void rndis_status(struct usbnet *dev, struct urb *urb) | |||
278 | * Call context is likely probe(), before interface name is known, | 78 | * Call context is likely probe(), before interface name is known, |
279 | * which is why we won't try to use it in the diagnostics. | 79 | * which is why we won't try to use it in the diagnostics. |
280 | */ | 80 | */ |
281 | static int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf) | 81 | int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf) |
282 | { | 82 | { |
283 | struct cdc_state *info = (void *) &dev->data; | 83 | struct cdc_state *info = (void *) &dev->data; |
284 | int master_ifnum; | 84 | int master_ifnum; |
@@ -347,10 +147,26 @@ static int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf) | |||
347 | request_id, xid); | 147 | request_id, xid); |
348 | /* then likely retry */ | 148 | /* then likely retry */ |
349 | } else switch (buf->msg_type) { | 149 | } else switch (buf->msg_type) { |
350 | case RNDIS_MSG_INDICATE: { /* fault */ | 150 | case RNDIS_MSG_INDICATE: { /* fault/event */ |
351 | // struct rndis_indicate *msg = (void *)buf; | 151 | struct rndis_indicate *msg = (void *)buf; |
352 | dev_info(&info->control->dev, | 152 | int state = 0; |
353 | "rndis fault indication\n"); | 153 | |
154 | switch (msg->status) { | ||
155 | case RNDIS_STATUS_MEDIA_CONNECT: | ||
156 | state = 1; | ||
157 | case RNDIS_STATUS_MEDIA_DISCONNECT: | ||
158 | dev_info(&info->control->dev, | ||
159 | "rndis media %sconnect\n", | ||
160 | !state?"dis":""); | ||
161 | if (dev->driver_info->link_change) | ||
162 | dev->driver_info->link_change( | ||
163 | dev, state); | ||
164 | break; | ||
165 | default: | ||
166 | dev_info(&info->control->dev, | ||
167 | "rndis indication: 0x%08x\n", | ||
168 | le32_to_cpu(msg->status)); | ||
169 | } | ||
354 | } | 170 | } |
355 | break; | 171 | break; |
356 | case RNDIS_MSG_KEEPALIVE: { /* ping */ | 172 | case RNDIS_MSG_KEEPALIVE: { /* ping */ |
@@ -387,6 +203,7 @@ static int rndis_command(struct usbnet *dev, struct rndis_msg_hdr *buf) | |||
387 | dev_dbg(&info->control->dev, "rndis response timeout\n"); | 203 | dev_dbg(&info->control->dev, "rndis response timeout\n"); |
388 | return -ETIMEDOUT; | 204 | return -ETIMEDOUT; |
389 | } | 205 | } |
206 | EXPORT_SYMBOL_GPL(rndis_command); | ||
390 | 207 | ||
391 | /* | 208 | /* |
392 | * rndis_query: | 209 | * rndis_query: |
@@ -453,7 +270,8 @@ response_error: | |||
453 | return -EDOM; | 270 | return -EDOM; |
454 | } | 271 | } |
455 | 272 | ||
456 | static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | 273 | int |
274 | generic_rndis_bind(struct usbnet *dev, struct usb_interface *intf, int flags) | ||
457 | { | 275 | { |
458 | int retval; | 276 | int retval; |
459 | struct net_device *net = dev->net; | 277 | struct net_device *net = dev->net; |
@@ -467,8 +285,9 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | |||
467 | struct rndis_query_c *get_c; | 285 | struct rndis_query_c *get_c; |
468 | struct rndis_set *set; | 286 | struct rndis_set *set; |
469 | struct rndis_set_c *set_c; | 287 | struct rndis_set_c *set_c; |
288 | struct rndis_halt *halt; | ||
470 | } u; | 289 | } u; |
471 | u32 tmp; | 290 | u32 tmp, *phym; |
472 | int reply_len; | 291 | int reply_len; |
473 | unsigned char *bp; | 292 | unsigned char *bp; |
474 | 293 | ||
@@ -517,7 +336,7 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | |||
517 | "dev can't take %u byte packets (max %u)\n", | 336 | "dev can't take %u byte packets (max %u)\n", |
518 | dev->hard_mtu, tmp); | 337 | dev->hard_mtu, tmp); |
519 | retval = -EINVAL; | 338 | retval = -EINVAL; |
520 | goto fail_and_release; | 339 | goto halt_fail_and_release; |
521 | } | 340 | } |
522 | dev->hard_mtu = tmp; | 341 | dev->hard_mtu = tmp; |
523 | net->mtu = dev->hard_mtu - net->hard_header_len; | 342 | net->mtu = dev->hard_mtu - net->hard_header_len; |
@@ -533,13 +352,43 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | |||
533 | dev->hard_mtu, tmp, dev->rx_urb_size, | 352 | dev->hard_mtu, tmp, dev->rx_urb_size, |
534 | 1 << le32_to_cpu(u.init_c->packet_alignment)); | 353 | 1 << le32_to_cpu(u.init_c->packet_alignment)); |
535 | 354 | ||
355 | /* module has some device initialization code needs to be done right | ||
356 | * after RNDIS_INIT */ | ||
357 | if (dev->driver_info->early_init && | ||
358 | dev->driver_info->early_init(dev) != 0) | ||
359 | goto halt_fail_and_release; | ||
360 | |||
361 | /* Check physical medium */ | ||
362 | reply_len = sizeof *phym; | ||
363 | retval = rndis_query(dev, intf, u.buf, OID_GEN_PHYSICAL_MEDIUM, | ||
364 | 0, (void **) &phym, &reply_len); | ||
365 | if (retval != 0) | ||
366 | /* OID is optional so don't fail here. */ | ||
367 | *phym = RNDIS_PHYSICAL_MEDIUM_UNSPECIFIED; | ||
368 | if ((flags & FLAG_RNDIS_PHYM_WIRELESS) && | ||
369 | *phym != RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN) { | ||
370 | if (netif_msg_probe(dev)) | ||
371 | dev_dbg(&intf->dev, "driver requires wireless " | ||
372 | "physical medium, but device is not.\n"); | ||
373 | retval = -ENODEV; | ||
374 | goto halt_fail_and_release; | ||
375 | } | ||
376 | if ((flags & FLAG_RNDIS_PHYM_NOT_WIRELESS) && | ||
377 | *phym == RNDIS_PHYSICAL_MEDIUM_WIRELESS_LAN) { | ||
378 | if (netif_msg_probe(dev)) | ||
379 | dev_dbg(&intf->dev, "driver requires non-wireless " | ||
380 | "physical medium, but device is wireless.\n"); | ||
381 | retval = -ENODEV; | ||
382 | goto halt_fail_and_release; | ||
383 | } | ||
384 | |||
536 | /* Get designated host ethernet address */ | 385 | /* Get designated host ethernet address */ |
537 | reply_len = ETH_ALEN; | 386 | reply_len = ETH_ALEN; |
538 | retval = rndis_query(dev, intf, u.buf, OID_802_3_PERMANENT_ADDRESS, | 387 | retval = rndis_query(dev, intf, u.buf, OID_802_3_PERMANENT_ADDRESS, |
539 | 48, (void **) &bp, &reply_len); | 388 | 48, (void **) &bp, &reply_len); |
540 | if (unlikely(retval< 0)) { | 389 | if (unlikely(retval< 0)) { |
541 | dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval); | 390 | dev_err(&intf->dev, "rndis get ethaddr, %d\n", retval); |
542 | goto fail_and_release; | 391 | goto halt_fail_and_release; |
543 | } | 392 | } |
544 | memcpy(net->dev_addr, bp, ETH_ALEN); | 393 | memcpy(net->dev_addr, bp, ETH_ALEN); |
545 | 394 | ||
@@ -550,12 +399,12 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | |||
550 | u.set->oid = OID_GEN_CURRENT_PACKET_FILTER; | 399 | u.set->oid = OID_GEN_CURRENT_PACKET_FILTER; |
551 | u.set->len = ccpu2(4); | 400 | u.set->len = ccpu2(4); |
552 | u.set->offset = ccpu2((sizeof *u.set) - 8); | 401 | u.set->offset = ccpu2((sizeof *u.set) - 8); |
553 | *(__le32 *)(u.buf + sizeof *u.set) = ccpu2(DEFAULT_FILTER); | 402 | *(__le32 *)(u.buf + sizeof *u.set) = RNDIS_DEFAULT_FILTER; |
554 | 403 | ||
555 | retval = rndis_command(dev, u.header); | 404 | retval = rndis_command(dev, u.header); |
556 | if (unlikely(retval < 0)) { | 405 | if (unlikely(retval < 0)) { |
557 | dev_err(&intf->dev, "rndis set packet filter, %d\n", retval); | 406 | dev_err(&intf->dev, "rndis set packet filter, %d\n", retval); |
558 | goto fail_and_release; | 407 | goto halt_fail_and_release; |
559 | } | 408 | } |
560 | 409 | ||
561 | retval = 0; | 410 | retval = 0; |
@@ -563,6 +412,11 @@ static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | |||
563 | kfree(u.buf); | 412 | kfree(u.buf); |
564 | return retval; | 413 | return retval; |
565 | 414 | ||
415 | halt_fail_and_release: | ||
416 | memset(u.halt, 0, sizeof *u.halt); | ||
417 | u.halt->msg_type = RNDIS_MSG_HALT; | ||
418 | u.halt->msg_len = ccpu2(sizeof *u.halt); | ||
419 | (void) rndis_command(dev, (void *)u.halt); | ||
566 | fail_and_release: | 420 | fail_and_release: |
567 | usb_set_intfdata(info->data, NULL); | 421 | usb_set_intfdata(info->data, NULL); |
568 | usb_driver_release_interface(driver_of(intf), info->data); | 422 | usb_driver_release_interface(driver_of(intf), info->data); |
@@ -571,13 +425,19 @@ fail: | |||
571 | kfree(u.buf); | 425 | kfree(u.buf); |
572 | return retval; | 426 | return retval; |
573 | } | 427 | } |
428 | EXPORT_SYMBOL_GPL(generic_rndis_bind); | ||
429 | |||
430 | static int rndis_bind(struct usbnet *dev, struct usb_interface *intf) | ||
431 | { | ||
432 | return generic_rndis_bind(dev, intf, FLAG_RNDIS_PHYM_NOT_WIRELESS); | ||
433 | } | ||
574 | 434 | ||
575 | static void rndis_unbind(struct usbnet *dev, struct usb_interface *intf) | 435 | void rndis_unbind(struct usbnet *dev, struct usb_interface *intf) |
576 | { | 436 | { |
577 | struct rndis_halt *halt; | 437 | struct rndis_halt *halt; |
578 | 438 | ||
579 | /* try to clear any rndis state/activity (no i/o from stack!) */ | 439 | /* try to clear any rndis state/activity (no i/o from stack!) */ |
580 | halt = kzalloc(sizeof *halt, GFP_KERNEL); | 440 | halt = kzalloc(CONTROL_BUFFER_SIZE, GFP_KERNEL); |
581 | if (halt) { | 441 | if (halt) { |
582 | halt->msg_type = RNDIS_MSG_HALT; | 442 | halt->msg_type = RNDIS_MSG_HALT; |
583 | halt->msg_len = ccpu2(sizeof *halt); | 443 | halt->msg_len = ccpu2(sizeof *halt); |
@@ -585,13 +445,14 @@ static void rndis_unbind(struct usbnet *dev, struct usb_interface *intf) | |||
585 | kfree(halt); | 445 | kfree(halt); |
586 | } | 446 | } |
587 | 447 | ||
588 | return usbnet_cdc_unbind(dev, intf); | 448 | usbnet_cdc_unbind(dev, intf); |
589 | } | 449 | } |
450 | EXPORT_SYMBOL_GPL(rndis_unbind); | ||
590 | 451 | ||
591 | /* | 452 | /* |
592 | * DATA -- host must not write zlps | 453 | * DATA -- host must not write zlps |
593 | */ | 454 | */ |
594 | static int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | 455 | int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb) |
595 | { | 456 | { |
596 | /* peripheral may have batched packets to us... */ | 457 | /* peripheral may have batched packets to us... */ |
597 | while (likely(skb->len)) { | 458 | while (likely(skb->len)) { |
@@ -633,8 +494,9 @@ static int rndis_rx_fixup(struct usbnet *dev, struct sk_buff *skb) | |||
633 | /* caller will usbnet_skb_return the remaining packet */ | 494 | /* caller will usbnet_skb_return the remaining packet */ |
634 | return 1; | 495 | return 1; |
635 | } | 496 | } |
497 | EXPORT_SYMBOL_GPL(rndis_rx_fixup); | ||
636 | 498 | ||
637 | static struct sk_buff * | 499 | struct sk_buff * |
638 | rndis_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) | 500 | rndis_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) |
639 | { | 501 | { |
640 | struct rndis_data_hdr *hdr; | 502 | struct rndis_data_hdr *hdr; |
@@ -679,6 +541,7 @@ fill: | |||
679 | /* FIXME make the last packet always be short ... */ | 541 | /* FIXME make the last packet always be short ... */ |
680 | return skb; | 542 | return skb; |
681 | } | 543 | } |
544 | EXPORT_SYMBOL_GPL(rndis_tx_fixup); | ||
682 | 545 | ||
683 | 546 | ||
684 | static const struct driver_info rndis_info = { | 547 | static const struct driver_info rndis_info = { |
diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c index 8ed1fc5cbc70..8463efb9e0b1 100644 --- a/drivers/net/usb/usbnet.c +++ b/drivers/net/usb/usbnet.c | |||
@@ -41,8 +41,7 @@ | |||
41 | #include <linux/workqueue.h> | 41 | #include <linux/workqueue.h> |
42 | #include <linux/mii.h> | 42 | #include <linux/mii.h> |
43 | #include <linux/usb.h> | 43 | #include <linux/usb.h> |
44 | 44 | #include <linux/usb/usbnet.h> | |
45 | #include "usbnet.h" | ||
46 | 45 | ||
47 | #define DRIVER_VERSION "22-Aug-2005" | 46 | #define DRIVER_VERSION "22-Aug-2005" |
48 | 47 | ||
@@ -1204,6 +1203,9 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod) | |||
1204 | if ((dev->driver_info->flags & FLAG_ETHER) != 0 | 1203 | if ((dev->driver_info->flags & FLAG_ETHER) != 0 |
1205 | && (net->dev_addr [0] & 0x02) == 0) | 1204 | && (net->dev_addr [0] & 0x02) == 0) |
1206 | strcpy (net->name, "eth%d"); | 1205 | strcpy (net->name, "eth%d"); |
1206 | /* WLAN devices should always be named "wlan%d" */ | ||
1207 | if ((dev->driver_info->flags & FLAG_WLAN) != 0) | ||
1208 | strcpy(net->name, "wlan%d"); | ||
1207 | 1209 | ||
1208 | /* maybe the remote can't receive an Ethernet MTU */ | 1210 | /* maybe the remote can't receive an Ethernet MTU */ |
1209 | if (net->mtu > (dev->hard_mtu - net->hard_header_len)) | 1211 | if (net->mtu > (dev->hard_mtu - net->hard_header_len)) |
diff --git a/drivers/net/usb/usbnet.h b/drivers/net/usb/usbnet.h deleted file mode 100644 index 1fae4347e831..000000000000 --- a/drivers/net/usb/usbnet.h +++ /dev/null | |||
@@ -1,202 +0,0 @@ | |||
1 | /* | ||
2 | * USB Networking Link Interface | ||
3 | * | ||
4 | * Copyright (C) 2000-2005 by David Brownell <dbrownell@users.sourceforge.net> | ||
5 | * Copyright (C) 2003-2005 David Hollis <dhollis@davehollis.com> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | */ | ||
21 | |||
22 | |||
23 | #ifndef __USBNET_H | ||
24 | #define __USBNET_H | ||
25 | |||
26 | |||
27 | /* interface from usbnet core to each USB networking link we handle */ | ||
28 | struct usbnet { | ||
29 | /* housekeeping */ | ||
30 | struct usb_device *udev; | ||
31 | struct usb_interface *intf; | ||
32 | struct driver_info *driver_info; | ||
33 | const char *driver_name; | ||
34 | wait_queue_head_t *wait; | ||
35 | struct mutex phy_mutex; | ||
36 | unsigned char suspend_count; | ||
37 | |||
38 | /* i/o info: pipes etc */ | ||
39 | unsigned in, out; | ||
40 | struct usb_host_endpoint *status; | ||
41 | unsigned maxpacket; | ||
42 | struct timer_list delay; | ||
43 | |||
44 | /* protocol/interface state */ | ||
45 | struct net_device *net; | ||
46 | struct net_device_stats stats; | ||
47 | int msg_enable; | ||
48 | unsigned long data [5]; | ||
49 | u32 xid; | ||
50 | u32 hard_mtu; /* count any extra framing */ | ||
51 | size_t rx_urb_size; /* size for rx urbs */ | ||
52 | struct mii_if_info mii; | ||
53 | |||
54 | /* various kinds of pending driver work */ | ||
55 | struct sk_buff_head rxq; | ||
56 | struct sk_buff_head txq; | ||
57 | struct sk_buff_head done; | ||
58 | struct urb *interrupt; | ||
59 | struct tasklet_struct bh; | ||
60 | |||
61 | struct work_struct kevent; | ||
62 | unsigned long flags; | ||
63 | # define EVENT_TX_HALT 0 | ||
64 | # define EVENT_RX_HALT 1 | ||
65 | # define EVENT_RX_MEMORY 2 | ||
66 | # define EVENT_STS_SPLIT 3 | ||
67 | # define EVENT_LINK_RESET 4 | ||
68 | }; | ||
69 | |||
70 | static inline struct usb_driver *driver_of(struct usb_interface *intf) | ||
71 | { | ||
72 | return to_usb_driver(intf->dev.driver); | ||
73 | } | ||
74 | |||
75 | /* interface from the device/framing level "minidriver" to core */ | ||
76 | struct driver_info { | ||
77 | char *description; | ||
78 | |||
79 | int flags; | ||
80 | /* framing is CDC Ethernet, not writing ZLPs (hw issues), or optionally: */ | ||
81 | #define FLAG_FRAMING_NC 0x0001 /* guard against device dropouts */ | ||
82 | #define FLAG_FRAMING_GL 0x0002 /* genelink batches packets */ | ||
83 | #define FLAG_FRAMING_Z 0x0004 /* zaurus adds a trailer */ | ||
84 | #define FLAG_FRAMING_RN 0x0008 /* RNDIS batches, plus huge header */ | ||
85 | |||
86 | #define FLAG_NO_SETINT 0x0010 /* device can't set_interface() */ | ||
87 | #define FLAG_ETHER 0x0020 /* maybe use "eth%d" names */ | ||
88 | |||
89 | #define FLAG_FRAMING_AX 0x0040 /* AX88772/178 packets */ | ||
90 | |||
91 | /* init device ... can sleep, or cause probe() failure */ | ||
92 | int (*bind)(struct usbnet *, struct usb_interface *); | ||
93 | |||
94 | /* cleanup device ... can sleep, but can't fail */ | ||
95 | void (*unbind)(struct usbnet *, struct usb_interface *); | ||
96 | |||
97 | /* reset device ... can sleep */ | ||
98 | int (*reset)(struct usbnet *); | ||
99 | |||
100 | /* see if peer is connected ... can sleep */ | ||
101 | int (*check_connect)(struct usbnet *); | ||
102 | |||
103 | /* for status polling */ | ||
104 | void (*status)(struct usbnet *, struct urb *); | ||
105 | |||
106 | /* link reset handling, called from defer_kevent */ | ||
107 | int (*link_reset)(struct usbnet *); | ||
108 | |||
109 | /* fixup rx packet (strip framing) */ | ||
110 | int (*rx_fixup)(struct usbnet *dev, struct sk_buff *skb); | ||
111 | |||
112 | /* fixup tx packet (add framing) */ | ||
113 | struct sk_buff *(*tx_fixup)(struct usbnet *dev, | ||
114 | struct sk_buff *skb, gfp_t flags); | ||
115 | |||
116 | /* for new devices, use the descriptor-reading code instead */ | ||
117 | int in; /* rx endpoint */ | ||
118 | int out; /* tx endpoint */ | ||
119 | |||
120 | unsigned long data; /* Misc driver specific data */ | ||
121 | }; | ||
122 | |||
123 | /* Minidrivers are just drivers using the "usbnet" core as a powerful | ||
124 | * network-specific subroutine library ... that happens to do pretty | ||
125 | * much everything except custom framing and chip-specific stuff. | ||
126 | */ | ||
127 | extern int usbnet_probe(struct usb_interface *, const struct usb_device_id *); | ||
128 | extern int usbnet_suspend (struct usb_interface *, pm_message_t ); | ||
129 | extern int usbnet_resume (struct usb_interface *); | ||
130 | extern void usbnet_disconnect(struct usb_interface *); | ||
131 | |||
132 | |||
133 | /* Drivers that reuse some of the standard USB CDC infrastructure | ||
134 | * (notably, using multiple interfaces according to the CDC | ||
135 | * union descriptor) get some helper code. | ||
136 | */ | ||
137 | struct cdc_state { | ||
138 | struct usb_cdc_header_desc *header; | ||
139 | struct usb_cdc_union_desc *u; | ||
140 | struct usb_cdc_ether_desc *ether; | ||
141 | struct usb_interface *control; | ||
142 | struct usb_interface *data; | ||
143 | }; | ||
144 | |||
145 | extern int usbnet_generic_cdc_bind (struct usbnet *, struct usb_interface *); | ||
146 | extern void usbnet_cdc_unbind (struct usbnet *, struct usb_interface *); | ||
147 | |||
148 | /* CDC and RNDIS support the same host-chosen packet filters for IN transfers */ | ||
149 | #define DEFAULT_FILTER (USB_CDC_PACKET_TYPE_BROADCAST \ | ||
150 | |USB_CDC_PACKET_TYPE_ALL_MULTICAST \ | ||
151 | |USB_CDC_PACKET_TYPE_PROMISCUOUS \ | ||
152 | |USB_CDC_PACKET_TYPE_DIRECTED) | ||
153 | |||
154 | |||
155 | /* we record the state for each of our queued skbs */ | ||
156 | enum skb_state { | ||
157 | illegal = 0, | ||
158 | tx_start, tx_done, | ||
159 | rx_start, rx_done, rx_cleanup | ||
160 | }; | ||
161 | |||
162 | struct skb_data { /* skb->cb is one of these */ | ||
163 | struct urb *urb; | ||
164 | struct usbnet *dev; | ||
165 | enum skb_state state; | ||
166 | size_t length; | ||
167 | }; | ||
168 | |||
169 | |||
170 | extern int usbnet_get_endpoints(struct usbnet *, struct usb_interface *); | ||
171 | extern void usbnet_defer_kevent (struct usbnet *, int); | ||
172 | extern void usbnet_skb_return (struct usbnet *, struct sk_buff *); | ||
173 | extern void usbnet_unlink_rx_urbs(struct usbnet *); | ||
174 | |||
175 | extern int usbnet_get_settings (struct net_device *net, struct ethtool_cmd *cmd); | ||
176 | extern int usbnet_set_settings (struct net_device *net, struct ethtool_cmd *cmd); | ||
177 | extern u32 usbnet_get_link (struct net_device *net); | ||
178 | extern u32 usbnet_get_msglevel (struct net_device *); | ||
179 | extern void usbnet_set_msglevel (struct net_device *, u32); | ||
180 | extern void usbnet_get_drvinfo (struct net_device *, struct ethtool_drvinfo *); | ||
181 | extern int usbnet_nway_reset(struct net_device *net); | ||
182 | |||
183 | /* messaging support includes the interface name, so it must not be | ||
184 | * used before it has one ... notably, in minidriver bind() calls. | ||
185 | */ | ||
186 | #ifdef DEBUG | ||
187 | #define devdbg(usbnet, fmt, arg...) \ | ||
188 | printk(KERN_DEBUG "%s: " fmt "\n" , (usbnet)->net->name , ## arg) | ||
189 | #else | ||
190 | #define devdbg(usbnet, fmt, arg...) do {} while(0) | ||
191 | #endif | ||
192 | |||
193 | #define deverr(usbnet, fmt, arg...) \ | ||
194 | printk(KERN_ERR "%s: " fmt "\n" , (usbnet)->net->name , ## arg) | ||
195 | #define devwarn(usbnet, fmt, arg...) \ | ||
196 | printk(KERN_WARNING "%s: " fmt "\n" , (usbnet)->net->name , ## arg) | ||
197 | |||
198 | #define devinfo(usbnet, fmt, arg...) \ | ||
199 | printk(KERN_INFO "%s: " fmt "\n" , (usbnet)->net->name , ## arg); \ | ||
200 | |||
201 | |||
202 | #endif /* __USBNET_H */ | ||
diff --git a/drivers/net/usb/zaurus.c b/drivers/net/usb/zaurus.c index 9f98e8ce487a..e24f7b3ace4b 100644 --- a/drivers/net/usb/zaurus.c +++ b/drivers/net/usb/zaurus.c | |||
@@ -29,8 +29,7 @@ | |||
29 | #include <linux/crc32.h> | 29 | #include <linux/crc32.h> |
30 | #include <linux/usb.h> | 30 | #include <linux/usb.h> |
31 | #include <linux/usb/cdc.h> | 31 | #include <linux/usb/cdc.h> |
32 | 32 | #include <linux/usb/usbnet.h> | |
33 | #include "usbnet.h" | ||
34 | 33 | ||
35 | 34 | ||
36 | /* | 35 | /* |
diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index f372960904b2..714a6ca30ad2 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig | |||
@@ -545,6 +545,34 @@ config USB_ZD1201 | |||
545 | To compile this driver as a module, choose M here: the | 545 | To compile this driver as a module, choose M here: the |
546 | module will be called zd1201. | 546 | module will be called zd1201. |
547 | 547 | ||
548 | config USB_NET_RNDIS_WLAN | ||
549 | tristate "Wireless RNDIS USB support" | ||
550 | depends on USB && WLAN_80211 && EXPERIMENTAL | ||
551 | select USB_USBNET | ||
552 | select USB_NET_CDCETHER | ||
553 | select USB_NET_RNDIS_HOST | ||
554 | select WIRELESS_EXT | ||
555 | ---help--- | ||
556 | This is a driver for wireless RNDIS devices. | ||
557 | These are USB based adapters found in devices such as: | ||
558 | |||
559 | Buffalo WLI-U2-KG125S | ||
560 | U.S. Robotics USR5421 | ||
561 | Belkin F5D7051 | ||
562 | Linksys WUSB54GSv2 | ||
563 | Linksys WUSB54GSC | ||
564 | Asus WL169gE | ||
565 | Eminent EM4045 | ||
566 | BT Voyager 1055 | ||
567 | Linksys WUSB54GSv1 | ||
568 | U.S. Robotics USR5420 | ||
569 | BUFFALO WLI-USB-G54 | ||
570 | |||
571 | All of these devices are based on Broadcom 4320 chip which is the | ||
572 | only wireless RNDIS chip known to date. | ||
573 | |||
574 | If you choose to build a module, it'll be called rndis_wlan. | ||
575 | |||
548 | config RTL8180 | 576 | config RTL8180 |
549 | tristate "Realtek 8180/8185 PCI support" | 577 | tristate "Realtek 8180/8185 PCI support" |
550 | depends on MAC80211 && PCI && WLAN_80211 && EXPERIMENTAL | 578 | depends on MAC80211 && PCI && WLAN_80211 && EXPERIMENTAL |
diff --git a/drivers/net/wireless/Makefile b/drivers/net/wireless/Makefile index 6af7b158624e..091dfe2e574e 100644 --- a/drivers/net/wireless/Makefile +++ b/drivers/net/wireless/Makefile | |||
@@ -44,6 +44,8 @@ obj-$(CONFIG_ZD1211RW) += zd1211rw/ | |||
44 | obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o | 44 | obj-$(CONFIG_PCMCIA_RAYCS) += ray_cs.o |
45 | obj-$(CONFIG_PCMCIA_WL3501) += wl3501_cs.o | 45 | obj-$(CONFIG_PCMCIA_WL3501) += wl3501_cs.o |
46 | 46 | ||
47 | obj-$(CONFIG_USB_NET_RNDIS_WLAN) += rndis_wlan.o | ||
48 | |||
47 | obj-$(CONFIG_USB_ZD1201) += zd1201.o | 49 | obj-$(CONFIG_USB_ZD1201) += zd1201.o |
48 | obj-$(CONFIG_LIBERTAS) += libertas/ | 50 | obj-$(CONFIG_LIBERTAS) += libertas/ |
49 | 51 | ||
diff --git a/drivers/net/wireless/ath5k/base.c b/drivers/net/wireless/ath5k/base.c index 72bcf321d1ce..d6599d219193 100644 --- a/drivers/net/wireless/ath5k/base.c +++ b/drivers/net/wireless/ath5k/base.c | |||
@@ -1980,7 +1980,7 @@ ath5k_beacon_send(struct ath5k_softc *sc) | |||
1980 | struct ath5k_buf *bf = sc->bbuf; | 1980 | struct ath5k_buf *bf = sc->bbuf; |
1981 | struct ath5k_hw *ah = sc->ah; | 1981 | struct ath5k_hw *ah = sc->ah; |
1982 | 1982 | ||
1983 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON_PROC, "in beacon_send\n"); | 1983 | ATH5K_DBG_UNLIMIT(sc, ATH5K_DEBUG_BEACON, "in beacon_send\n"); |
1984 | 1984 | ||
1985 | if (unlikely(bf->skb == NULL || sc->opmode == IEEE80211_IF_TYPE_STA || | 1985 | if (unlikely(bf->skb == NULL || sc->opmode == IEEE80211_IF_TYPE_STA || |
1986 | sc->opmode == IEEE80211_IF_TYPE_MNTR)) { | 1986 | sc->opmode == IEEE80211_IF_TYPE_MNTR)) { |
@@ -1996,10 +1996,10 @@ ath5k_beacon_send(struct ath5k_softc *sc) | |||
1996 | */ | 1996 | */ |
1997 | if (unlikely(ath5k_hw_num_tx_pending(ah, sc->bhalq) != 0)) { | 1997 | if (unlikely(ath5k_hw_num_tx_pending(ah, sc->bhalq) != 0)) { |
1998 | sc->bmisscount++; | 1998 | sc->bmisscount++; |
1999 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON_PROC, | 1999 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON, |
2000 | "missed %u consecutive beacons\n", sc->bmisscount); | 2000 | "missed %u consecutive beacons\n", sc->bmisscount); |
2001 | if (sc->bmisscount > 3) { /* NB: 3 is a guess */ | 2001 | if (sc->bmisscount > 3) { /* NB: 3 is a guess */ |
2002 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON_PROC, | 2002 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON, |
2003 | "stuck beacon time (%u missed)\n", | 2003 | "stuck beacon time (%u missed)\n", |
2004 | sc->bmisscount); | 2004 | sc->bmisscount); |
2005 | tasklet_schedule(&sc->restq); | 2005 | tasklet_schedule(&sc->restq); |
@@ -2007,7 +2007,7 @@ ath5k_beacon_send(struct ath5k_softc *sc) | |||
2007 | return; | 2007 | return; |
2008 | } | 2008 | } |
2009 | if (unlikely(sc->bmisscount != 0)) { | 2009 | if (unlikely(sc->bmisscount != 0)) { |
2010 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON_PROC, | 2010 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON, |
2011 | "resume beacon xmit after %u misses\n", | 2011 | "resume beacon xmit after %u misses\n", |
2012 | sc->bmisscount); | 2012 | sc->bmisscount); |
2013 | sc->bmisscount = 0; | 2013 | sc->bmisscount = 0; |
@@ -2027,7 +2027,7 @@ ath5k_beacon_send(struct ath5k_softc *sc) | |||
2027 | 2027 | ||
2028 | ath5k_hw_put_tx_buf(ah, sc->bhalq, bf->daddr); | 2028 | ath5k_hw_put_tx_buf(ah, sc->bhalq, bf->daddr); |
2029 | ath5k_hw_tx_start(ah, sc->bhalq); | 2029 | ath5k_hw_tx_start(ah, sc->bhalq); |
2030 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON_PROC, "TXDP[%u] = %llx (%p)\n", | 2030 | ATH5K_DBG(sc, ATH5K_DEBUG_BEACON, "TXDP[%u] = %llx (%p)\n", |
2031 | sc->bhalq, (unsigned long long)bf->daddr, bf->desc); | 2031 | sc->bhalq, (unsigned long long)bf->daddr, bf->desc); |
2032 | 2032 | ||
2033 | sc->bsent++; | 2033 | sc->bsent++; |
diff --git a/drivers/net/wireless/ath5k/debug.c b/drivers/net/wireless/ath5k/debug.c index 4ba649e20269..bb581ef6d1ef 100644 --- a/drivers/net/wireless/ath5k/debug.c +++ b/drivers/net/wireless/ath5k/debug.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2007 Bruno Randolf <bruno@thinktube.com> | 2 | * Copyright (c) 2007-2008 Bruno Randolf <bruno@thinktube.com> |
3 | * | 3 | * |
4 | * This file is free software: you may copy, redistribute and/or modify it | 4 | * This file is free software: you may copy, redistribute and/or modify it |
5 | * under the terms of the GNU General Public License as published by the | 5 | * under the terms of the GNU General Public License as published by the |
@@ -200,7 +200,7 @@ static ssize_t read_file_tsf(struct file *file, char __user *user_buf, | |||
200 | { | 200 | { |
201 | struct ath5k_softc *sc = file->private_data; | 201 | struct ath5k_softc *sc = file->private_data; |
202 | char buf[100]; | 202 | char buf[100]; |
203 | snprintf(buf, 100, "0x%016llx\n", ath5k_hw_get_tsf64(sc->ah)); | 203 | snprintf(buf, sizeof(buf), "0x%016llx\n", ath5k_hw_get_tsf64(sc->ah)); |
204 | return simple_read_from_buffer(user_buf, count, ppos, buf, 19); | 204 | return simple_read_from_buffer(user_buf, count, ppos, buf, 19); |
205 | } | 205 | } |
206 | 206 | ||
@@ -209,7 +209,12 @@ static ssize_t write_file_tsf(struct file *file, | |||
209 | size_t count, loff_t *ppos) | 209 | size_t count, loff_t *ppos) |
210 | { | 210 | { |
211 | struct ath5k_softc *sc = file->private_data; | 211 | struct ath5k_softc *sc = file->private_data; |
212 | if (strncmp(userbuf, "reset", 5) == 0) { | 212 | char buf[20]; |
213 | |||
214 | if (copy_from_user(buf, userbuf, min(count, sizeof(buf)))) | ||
215 | return -EFAULT; | ||
216 | |||
217 | if (strncmp(buf, "reset", 5) == 0) { | ||
213 | ath5k_hw_reset_tsf(sc->ah); | 218 | ath5k_hw_reset_tsf(sc->ah); |
214 | printk(KERN_INFO "debugfs reset TSF\n"); | 219 | printk(KERN_INFO "debugfs reset TSF\n"); |
215 | } | 220 | } |
@@ -231,8 +236,8 @@ static ssize_t read_file_beacon(struct file *file, char __user *user_buf, | |||
231 | { | 236 | { |
232 | struct ath5k_softc *sc = file->private_data; | 237 | struct ath5k_softc *sc = file->private_data; |
233 | struct ath5k_hw *ah = sc->ah; | 238 | struct ath5k_hw *ah = sc->ah; |
234 | char buf[1000]; | 239 | char buf[500]; |
235 | int len = 0; | 240 | unsigned int len = 0; |
236 | unsigned int v; | 241 | unsigned int v; |
237 | u64 tsf; | 242 | u64 tsf; |
238 | 243 | ||
@@ -277,11 +282,15 @@ static ssize_t write_file_beacon(struct file *file, | |||
277 | { | 282 | { |
278 | struct ath5k_softc *sc = file->private_data; | 283 | struct ath5k_softc *sc = file->private_data; |
279 | struct ath5k_hw *ah = sc->ah; | 284 | struct ath5k_hw *ah = sc->ah; |
285 | char buf[20]; | ||
286 | |||
287 | if (copy_from_user(buf, userbuf, min(count, sizeof(buf)))) | ||
288 | return -EFAULT; | ||
280 | 289 | ||
281 | if (strncmp(userbuf, "disable", 7) == 0) { | 290 | if (strncmp(buf, "disable", 7) == 0) { |
282 | AR5K_REG_DISABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_ENABLE); | 291 | AR5K_REG_DISABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_ENABLE); |
283 | printk(KERN_INFO "debugfs disable beacons\n"); | 292 | printk(KERN_INFO "debugfs disable beacons\n"); |
284 | } else if (strncmp(userbuf, "enable", 6) == 0) { | 293 | } else if (strncmp(buf, "enable", 6) == 0) { |
285 | AR5K_REG_ENABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_ENABLE); | 294 | AR5K_REG_ENABLE_BITS(ah, AR5K_BEACON, AR5K_BEACON_ENABLE); |
286 | printk(KERN_INFO "debugfs enable beacons\n"); | 295 | printk(KERN_INFO "debugfs enable beacons\n"); |
287 | } | 296 | } |
@@ -314,6 +323,82 @@ static const struct file_operations fops_reset = { | |||
314 | }; | 323 | }; |
315 | 324 | ||
316 | 325 | ||
326 | /* debugfs: debug level */ | ||
327 | |||
328 | static struct { | ||
329 | enum ath5k_debug_level level; | ||
330 | const char *name; | ||
331 | const char *desc; | ||
332 | } dbg_info[] = { | ||
333 | { ATH5K_DEBUG_RESET, "reset", "reset and initialization" }, | ||
334 | { ATH5K_DEBUG_INTR, "intr", "interrupt handling" }, | ||
335 | { ATH5K_DEBUG_MODE, "mode", "mode init/setup" }, | ||
336 | { ATH5K_DEBUG_XMIT, "xmit", "basic xmit operation" }, | ||
337 | { ATH5K_DEBUG_BEACON, "beacon", "beacon handling" }, | ||
338 | { ATH5K_DEBUG_CALIBRATE, "calib", "periodic calibration" }, | ||
339 | { ATH5K_DEBUG_TXPOWER, "txpower", "transmit power setting" }, | ||
340 | { ATH5K_DEBUG_LED, "led", "LED mamagement" }, | ||
341 | { ATH5K_DEBUG_DUMP_RX, "dumprx", "print received skb content" }, | ||
342 | { ATH5K_DEBUG_DUMP_TX, "dumptx", "print transmit skb content" }, | ||
343 | { ATH5K_DEBUG_DUMPMODES, "dumpmodes", "dump modes" }, | ||
344 | { ATH5K_DEBUG_TRACE, "trace", "trace function calls" }, | ||
345 | { ATH5K_DEBUG_ANY, "all", "show all debug levels" }, | ||
346 | }; | ||
347 | |||
348 | static ssize_t read_file_debug(struct file *file, char __user *user_buf, | ||
349 | size_t count, loff_t *ppos) | ||
350 | { | ||
351 | struct ath5k_softc *sc = file->private_data; | ||
352 | char buf[700]; | ||
353 | unsigned int len = 0; | ||
354 | unsigned int i; | ||
355 | |||
356 | len += snprintf(buf+len, sizeof(buf)-len, | ||
357 | "DEBUG LEVEL: 0x%08x\n\n", sc->debug.level); | ||
358 | |||
359 | for (i = 0; i < ARRAY_SIZE(dbg_info) - 1; i++) { | ||
360 | len += snprintf(buf+len, sizeof(buf)-len, | ||
361 | "%10s %c 0x%08x - %s\n", dbg_info[i].name, | ||
362 | sc->debug.level & dbg_info[i].level ? '+' : ' ', | ||
363 | dbg_info[i].level, dbg_info[i].desc); | ||
364 | } | ||
365 | len += snprintf(buf+len, sizeof(buf)-len, | ||
366 | "%10s %c 0x%08x - %s\n", dbg_info[i].name, | ||
367 | sc->debug.level == dbg_info[i].level ? '+' : ' ', | ||
368 | dbg_info[i].level, dbg_info[i].desc); | ||
369 | |||
370 | return simple_read_from_buffer(user_buf, count, ppos, buf, len); | ||
371 | } | ||
372 | |||
373 | static ssize_t write_file_debug(struct file *file, | ||
374 | const char __user *userbuf, | ||
375 | size_t count, loff_t *ppos) | ||
376 | { | ||
377 | struct ath5k_softc *sc = file->private_data; | ||
378 | unsigned int i; | ||
379 | char buf[20]; | ||
380 | |||
381 | if (copy_from_user(buf, userbuf, min(count, sizeof(buf)))) | ||
382 | return -EFAULT; | ||
383 | |||
384 | for (i = 0; i < ARRAY_SIZE(dbg_info); i++) { | ||
385 | if (strncmp(buf, dbg_info[i].name, | ||
386 | strlen(dbg_info[i].name)) == 0) { | ||
387 | sc->debug.level ^= dbg_info[i].level; /* toggle bit */ | ||
388 | break; | ||
389 | } | ||
390 | } | ||
391 | return count; | ||
392 | } | ||
393 | |||
394 | static const struct file_operations fops_debug = { | ||
395 | .read = read_file_debug, | ||
396 | .write = write_file_debug, | ||
397 | .open = ath5k_debugfs_open, | ||
398 | .owner = THIS_MODULE, | ||
399 | }; | ||
400 | |||
401 | |||
317 | /* init */ | 402 | /* init */ |
318 | 403 | ||
319 | void | 404 | void |
@@ -326,26 +411,24 @@ void | |||
326 | ath5k_debug_init_device(struct ath5k_softc *sc) | 411 | ath5k_debug_init_device(struct ath5k_softc *sc) |
327 | { | 412 | { |
328 | sc->debug.level = ath5k_debug; | 413 | sc->debug.level = ath5k_debug; |
414 | |||
329 | sc->debug.debugfs_phydir = debugfs_create_dir(wiphy_name(sc->hw->wiphy), | 415 | sc->debug.debugfs_phydir = debugfs_create_dir(wiphy_name(sc->hw->wiphy), |
330 | ath5k_global_debugfs); | 416 | ath5k_global_debugfs); |
331 | sc->debug.debugfs_debug = debugfs_create_u32("debug", | 417 | |
332 | 0666, sc->debug.debugfs_phydir, &sc->debug.level); | 418 | sc->debug.debugfs_debug = debugfs_create_file("debug", 0666, |
419 | sc->debug.debugfs_phydir, sc, &fops_debug); | ||
333 | 420 | ||
334 | sc->debug.debugfs_registers = debugfs_create_file("registers", 0444, | 421 | sc->debug.debugfs_registers = debugfs_create_file("registers", 0444, |
335 | sc->debug.debugfs_phydir, | 422 | sc->debug.debugfs_phydir, sc, &fops_registers); |
336 | sc, &fops_registers); | ||
337 | 423 | ||
338 | sc->debug.debugfs_tsf = debugfs_create_file("tsf", 0666, | 424 | sc->debug.debugfs_tsf = debugfs_create_file("tsf", 0666, |
339 | sc->debug.debugfs_phydir, | 425 | sc->debug.debugfs_phydir, sc, &fops_tsf); |
340 | sc, &fops_tsf); | ||
341 | 426 | ||
342 | sc->debug.debugfs_beacon = debugfs_create_file("beacon", 0666, | 427 | sc->debug.debugfs_beacon = debugfs_create_file("beacon", 0666, |
343 | sc->debug.debugfs_phydir, | 428 | sc->debug.debugfs_phydir, sc, &fops_beacon); |
344 | sc, &fops_beacon); | ||
345 | 429 | ||
346 | sc->debug.debugfs_reset = debugfs_create_file("reset", 0222, | 430 | sc->debug.debugfs_reset = debugfs_create_file("reset", 0222, |
347 | sc->debug.debugfs_phydir, | 431 | sc->debug.debugfs_phydir, sc, &fops_reset); |
348 | sc, &fops_reset); | ||
349 | } | 432 | } |
350 | 433 | ||
351 | void | 434 | void |
@@ -415,8 +498,7 @@ ath5k_debug_printrxbuffs(struct ath5k_softc *sc, struct ath5k_hw *ah) | |||
415 | struct ath5k_buf *bf; | 498 | struct ath5k_buf *bf; |
416 | int status; | 499 | int status; |
417 | 500 | ||
418 | if (likely(!(sc->debug.level & | 501 | if (likely(!(sc->debug.level & ATH5K_DEBUG_RESET))) |
419 | (ATH5K_DEBUG_RESET | ATH5K_DEBUG_FATAL)))) | ||
420 | return; | 502 | return; |
421 | 503 | ||
422 | printk(KERN_DEBUG "rx queue %x, link %p\n", | 504 | printk(KERN_DEBUG "rx queue %x, link %p\n", |
@@ -426,7 +508,7 @@ ath5k_debug_printrxbuffs(struct ath5k_softc *sc, struct ath5k_hw *ah) | |||
426 | list_for_each_entry(bf, &sc->rxbuf, list) { | 508 | list_for_each_entry(bf, &sc->rxbuf, list) { |
427 | ds = bf->desc; | 509 | ds = bf->desc; |
428 | status = ah->ah_proc_rx_desc(ah, ds); | 510 | status = ah->ah_proc_rx_desc(ah, ds); |
429 | if (!status || (sc->debug.level & ATH5K_DEBUG_FATAL)) | 511 | if (!status) |
430 | ath5k_debug_printrxbuf(bf, status == 0); | 512 | ath5k_debug_printrxbuf(bf, status == 0); |
431 | } | 513 | } |
432 | spin_unlock_bh(&sc->rxbuflock); | 514 | spin_unlock_bh(&sc->rxbuflock); |
diff --git a/drivers/net/wireless/ath5k/debug.h b/drivers/net/wireless/ath5k/debug.h index 2b491cbc8c80..c4fd8c43df0c 100644 --- a/drivers/net/wireless/ath5k/debug.h +++ b/drivers/net/wireless/ath5k/debug.h | |||
@@ -91,7 +91,6 @@ struct ath5k_dbg_info { | |||
91 | * @ATH5K_DEBUG_MODE: mode init/setup | 91 | * @ATH5K_DEBUG_MODE: mode init/setup |
92 | * @ATH5K_DEBUG_XMIT: basic xmit operation | 92 | * @ATH5K_DEBUG_XMIT: basic xmit operation |
93 | * @ATH5K_DEBUG_BEACON: beacon handling | 93 | * @ATH5K_DEBUG_BEACON: beacon handling |
94 | * @ATH5K_DEBUG_BEACON_PROC: beacon ISR proc | ||
95 | * @ATH5K_DEBUG_CALIBRATE: periodic calibration | 94 | * @ATH5K_DEBUG_CALIBRATE: periodic calibration |
96 | * @ATH5K_DEBUG_TXPOWER: transmit power setting | 95 | * @ATH5K_DEBUG_TXPOWER: transmit power setting |
97 | * @ATH5K_DEBUG_LED: led management | 96 | * @ATH5K_DEBUG_LED: led management |
@@ -99,7 +98,6 @@ struct ath5k_dbg_info { | |||
99 | * @ATH5K_DEBUG_DUMP_TX: print transmit skb content | 98 | * @ATH5K_DEBUG_DUMP_TX: print transmit skb content |
100 | * @ATH5K_DEBUG_DUMPMODES: dump modes | 99 | * @ATH5K_DEBUG_DUMPMODES: dump modes |
101 | * @ATH5K_DEBUG_TRACE: trace function calls | 100 | * @ATH5K_DEBUG_TRACE: trace function calls |
102 | * @ATH5K_DEBUG_FATAL: fatal errors | ||
103 | * @ATH5K_DEBUG_ANY: show at any debug level | 101 | * @ATH5K_DEBUG_ANY: show at any debug level |
104 | * | 102 | * |
105 | * The debug level is used to control the amount and type of debugging output | 103 | * The debug level is used to control the amount and type of debugging output |
@@ -115,15 +113,13 @@ enum ath5k_debug_level { | |||
115 | ATH5K_DEBUG_MODE = 0x00000004, | 113 | ATH5K_DEBUG_MODE = 0x00000004, |
116 | ATH5K_DEBUG_XMIT = 0x00000008, | 114 | ATH5K_DEBUG_XMIT = 0x00000008, |
117 | ATH5K_DEBUG_BEACON = 0x00000010, | 115 | ATH5K_DEBUG_BEACON = 0x00000010, |
118 | ATH5K_DEBUG_BEACON_PROC = 0x00000020, | 116 | ATH5K_DEBUG_CALIBRATE = 0x00000020, |
119 | ATH5K_DEBUG_CALIBRATE = 0x00000100, | 117 | ATH5K_DEBUG_TXPOWER = 0x00000040, |
120 | ATH5K_DEBUG_TXPOWER = 0x00000200, | 118 | ATH5K_DEBUG_LED = 0x00000080, |
121 | ATH5K_DEBUG_LED = 0x00000400, | 119 | ATH5K_DEBUG_DUMP_RX = 0x00000100, |
122 | ATH5K_DEBUG_DUMP_RX = 0x00001000, | 120 | ATH5K_DEBUG_DUMP_TX = 0x00000200, |
123 | ATH5K_DEBUG_DUMP_TX = 0x00002000, | 121 | ATH5K_DEBUG_DUMPMODES = 0x00000400, |
124 | ATH5K_DEBUG_DUMPMODES = 0x00004000, | 122 | ATH5K_DEBUG_TRACE = 0x00001000, |
125 | ATH5K_DEBUG_TRACE = 0x00010000, | ||
126 | ATH5K_DEBUG_FATAL = 0x80000000, | ||
127 | ATH5K_DEBUG_ANY = 0xffffffff | 123 | ATH5K_DEBUG_ANY = 0xffffffff |
128 | }; | 124 | }; |
129 | 125 | ||
diff --git a/drivers/net/wireless/b43/dma.c b/drivers/net/wireless/b43/dma.c index 3e73d2a523aa..8a708b77925d 100644 --- a/drivers/net/wireless/b43/dma.c +++ b/drivers/net/wireless/b43/dma.c | |||
@@ -1114,7 +1114,7 @@ static int dma_tx_fragment(struct b43_dmaring *ring, | |||
1114 | { | 1114 | { |
1115 | const struct b43_dma_ops *ops = ring->ops; | 1115 | const struct b43_dma_ops *ops = ring->ops; |
1116 | u8 *header; | 1116 | u8 *header; |
1117 | int slot; | 1117 | int slot, old_top_slot, old_used_slots; |
1118 | int err; | 1118 | int err; |
1119 | struct b43_dmadesc_generic *desc; | 1119 | struct b43_dmadesc_generic *desc; |
1120 | struct b43_dmadesc_meta *meta; | 1120 | struct b43_dmadesc_meta *meta; |
@@ -1126,6 +1126,9 @@ static int dma_tx_fragment(struct b43_dmaring *ring, | |||
1126 | #define SLOTS_PER_PACKET 2 | 1126 | #define SLOTS_PER_PACKET 2 |
1127 | B43_WARN_ON(skb_shinfo(skb)->nr_frags); | 1127 | B43_WARN_ON(skb_shinfo(skb)->nr_frags); |
1128 | 1128 | ||
1129 | old_top_slot = ring->current_slot; | ||
1130 | old_used_slots = ring->used_slots; | ||
1131 | |||
1129 | /* Get a slot for the header. */ | 1132 | /* Get a slot for the header. */ |
1130 | slot = request_slot(ring); | 1133 | slot = request_slot(ring); |
1131 | desc = ops->idx2desc(ring, slot, &meta_hdr); | 1134 | desc = ops->idx2desc(ring, slot, &meta_hdr); |
@@ -1133,13 +1136,21 @@ static int dma_tx_fragment(struct b43_dmaring *ring, | |||
1133 | 1136 | ||
1134 | header = &(ring->txhdr_cache[slot * hdrsize]); | 1137 | header = &(ring->txhdr_cache[slot * hdrsize]); |
1135 | cookie = generate_cookie(ring, slot); | 1138 | cookie = generate_cookie(ring, slot); |
1136 | b43_generate_txhdr(ring->dev, header, | 1139 | err = b43_generate_txhdr(ring->dev, header, |
1137 | skb->data, skb->len, ctl, cookie); | 1140 | skb->data, skb->len, ctl, cookie); |
1141 | if (unlikely(err)) { | ||
1142 | ring->current_slot = old_top_slot; | ||
1143 | ring->used_slots = old_used_slots; | ||
1144 | return err; | ||
1145 | } | ||
1138 | 1146 | ||
1139 | meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header, | 1147 | meta_hdr->dmaaddr = map_descbuffer(ring, (unsigned char *)header, |
1140 | hdrsize, 1); | 1148 | hdrsize, 1); |
1141 | if (dma_mapping_error(meta_hdr->dmaaddr)) | 1149 | if (dma_mapping_error(meta_hdr->dmaaddr)) { |
1150 | ring->current_slot = old_top_slot; | ||
1151 | ring->used_slots = old_used_slots; | ||
1142 | return -EIO; | 1152 | return -EIO; |
1153 | } | ||
1143 | ops->fill_descriptor(ring, desc, meta_hdr->dmaaddr, | 1154 | ops->fill_descriptor(ring, desc, meta_hdr->dmaaddr, |
1144 | hdrsize, 1, 0, 0); | 1155 | hdrsize, 1, 0, 0); |
1145 | 1156 | ||
@@ -1157,6 +1168,8 @@ static int dma_tx_fragment(struct b43_dmaring *ring, | |||
1157 | if (dma_mapping_error(meta->dmaaddr)) { | 1168 | if (dma_mapping_error(meta->dmaaddr)) { |
1158 | bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA); | 1169 | bounce_skb = __dev_alloc_skb(skb->len, GFP_ATOMIC | GFP_DMA); |
1159 | if (!bounce_skb) { | 1170 | if (!bounce_skb) { |
1171 | ring->current_slot = old_top_slot; | ||
1172 | ring->used_slots = old_used_slots; | ||
1160 | err = -ENOMEM; | 1173 | err = -ENOMEM; |
1161 | goto out_unmap_hdr; | 1174 | goto out_unmap_hdr; |
1162 | } | 1175 | } |
@@ -1167,6 +1180,8 @@ static int dma_tx_fragment(struct b43_dmaring *ring, | |||
1167 | meta->skb = skb; | 1180 | meta->skb = skb; |
1168 | meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); | 1181 | meta->dmaaddr = map_descbuffer(ring, skb->data, skb->len, 1); |
1169 | if (dma_mapping_error(meta->dmaaddr)) { | 1182 | if (dma_mapping_error(meta->dmaaddr)) { |
1183 | ring->current_slot = old_top_slot; | ||
1184 | ring->used_slots = old_used_slots; | ||
1170 | err = -EIO; | 1185 | err = -EIO; |
1171 | goto out_free_bounce; | 1186 | goto out_free_bounce; |
1172 | } | 1187 | } |
@@ -1252,6 +1267,13 @@ int b43_dma_tx(struct b43_wldev *dev, | |||
1252 | B43_WARN_ON(ring->stopped); | 1267 | B43_WARN_ON(ring->stopped); |
1253 | 1268 | ||
1254 | err = dma_tx_fragment(ring, skb, ctl); | 1269 | err = dma_tx_fragment(ring, skb, ctl); |
1270 | if (unlikely(err == -ENOKEY)) { | ||
1271 | /* Drop this packet, as we don't have the encryption key | ||
1272 | * anymore and must not transmit it unencrypted. */ | ||
1273 | dev_kfree_skb_any(skb); | ||
1274 | err = 0; | ||
1275 | goto out_unlock; | ||
1276 | } | ||
1255 | if (unlikely(err)) { | 1277 | if (unlikely(err)) { |
1256 | b43err(dev->wl, "DMA tx mapping failure\n"); | 1278 | b43err(dev->wl, "DMA tx mapping failure\n"); |
1257 | goto out_unlock; | 1279 | goto out_unlock; |
diff --git a/drivers/net/wireless/b43/main.c b/drivers/net/wireless/b43/main.c index 88d2c15d3fbe..64c154d080d8 100644 --- a/drivers/net/wireless/b43/main.c +++ b/drivers/net/wireless/b43/main.c | |||
@@ -3532,8 +3532,6 @@ static int b43_wireless_core_init(struct b43_wldev *dev) | |||
3532 | b43_bluetooth_coext_enable(dev); | 3532 | b43_bluetooth_coext_enable(dev); |
3533 | 3533 | ||
3534 | ssb_bus_powerup(bus, 1); /* Enable dynamic PCTL */ | 3534 | ssb_bus_powerup(bus, 1); /* Enable dynamic PCTL */ |
3535 | memset(wl->bssid, 0, ETH_ALEN); | ||
3536 | memset(wl->mac_addr, 0, ETH_ALEN); | ||
3537 | b43_upload_card_macaddress(dev); | 3535 | b43_upload_card_macaddress(dev); |
3538 | b43_security_init(dev); | 3536 | b43_security_init(dev); |
3539 | b43_rng_init(wl); | 3537 | b43_rng_init(wl); |
@@ -3630,6 +3628,15 @@ static int b43_op_start(struct ieee80211_hw *hw) | |||
3630 | struct b43_wldev *dev = wl->current_dev; | 3628 | struct b43_wldev *dev = wl->current_dev; |
3631 | int did_init = 0; | 3629 | int did_init = 0; |
3632 | int err = 0; | 3630 | int err = 0; |
3631 | bool do_rfkill_exit = 0; | ||
3632 | |||
3633 | /* Kill all old instance specific information to make sure | ||
3634 | * the card won't use it in the short timeframe between start | ||
3635 | * and mac80211 reconfiguring it. */ | ||
3636 | memset(wl->bssid, 0, ETH_ALEN); | ||
3637 | memset(wl->mac_addr, 0, ETH_ALEN); | ||
3638 | wl->filter_flags = 0; | ||
3639 | wl->radiotap_enabled = 0; | ||
3633 | 3640 | ||
3634 | /* First register RFkill. | 3641 | /* First register RFkill. |
3635 | * LEDs that are registered later depend on it. */ | 3642 | * LEDs that are registered later depend on it. */ |
@@ -3639,8 +3646,10 @@ static int b43_op_start(struct ieee80211_hw *hw) | |||
3639 | 3646 | ||
3640 | if (b43_status(dev) < B43_STAT_INITIALIZED) { | 3647 | if (b43_status(dev) < B43_STAT_INITIALIZED) { |
3641 | err = b43_wireless_core_init(dev); | 3648 | err = b43_wireless_core_init(dev); |
3642 | if (err) | 3649 | if (err) { |
3650 | do_rfkill_exit = 1; | ||
3643 | goto out_mutex_unlock; | 3651 | goto out_mutex_unlock; |
3652 | } | ||
3644 | did_init = 1; | 3653 | did_init = 1; |
3645 | } | 3654 | } |
3646 | 3655 | ||
@@ -3649,6 +3658,7 @@ static int b43_op_start(struct ieee80211_hw *hw) | |||
3649 | if (err) { | 3658 | if (err) { |
3650 | if (did_init) | 3659 | if (did_init) |
3651 | b43_wireless_core_exit(dev); | 3660 | b43_wireless_core_exit(dev); |
3661 | do_rfkill_exit = 1; | ||
3652 | goto out_mutex_unlock; | 3662 | goto out_mutex_unlock; |
3653 | } | 3663 | } |
3654 | } | 3664 | } |
@@ -3656,6 +3666,9 @@ static int b43_op_start(struct ieee80211_hw *hw) | |||
3656 | out_mutex_unlock: | 3666 | out_mutex_unlock: |
3657 | mutex_unlock(&wl->mutex); | 3667 | mutex_unlock(&wl->mutex); |
3658 | 3668 | ||
3669 | if (do_rfkill_exit) | ||
3670 | b43_rfkill_exit(dev); | ||
3671 | |||
3659 | return err; | 3672 | return err; |
3660 | } | 3673 | } |
3661 | 3674 | ||
diff --git a/drivers/net/wireless/b43/xmit.c b/drivers/net/wireless/b43/xmit.c index 3fc53e8b4416..7caa26eb4105 100644 --- a/drivers/net/wireless/b43/xmit.c +++ b/drivers/net/wireless/b43/xmit.c | |||
@@ -178,12 +178,12 @@ static u8 b43_calc_fallback_rate(u8 bitrate) | |||
178 | } | 178 | } |
179 | 179 | ||
180 | /* Generate a TX data header. */ | 180 | /* Generate a TX data header. */ |
181 | void b43_generate_txhdr(struct b43_wldev *dev, | 181 | int b43_generate_txhdr(struct b43_wldev *dev, |
182 | u8 *_txhdr, | 182 | u8 *_txhdr, |
183 | const unsigned char *fragment_data, | 183 | const unsigned char *fragment_data, |
184 | unsigned int fragment_len, | 184 | unsigned int fragment_len, |
185 | const struct ieee80211_tx_control *txctl, | 185 | const struct ieee80211_tx_control *txctl, |
186 | u16 cookie) | 186 | u16 cookie) |
187 | { | 187 | { |
188 | struct b43_txhdr *txhdr = (struct b43_txhdr *)_txhdr; | 188 | struct b43_txhdr *txhdr = (struct b43_txhdr *)_txhdr; |
189 | const struct b43_phy *phy = &dev->phy; | 189 | const struct b43_phy *phy = &dev->phy; |
@@ -237,7 +237,15 @@ void b43_generate_txhdr(struct b43_wldev *dev, | |||
237 | 237 | ||
238 | B43_WARN_ON(key_idx >= dev->max_nr_keys); | 238 | B43_WARN_ON(key_idx >= dev->max_nr_keys); |
239 | key = &(dev->key[key_idx]); | 239 | key = &(dev->key[key_idx]); |
240 | B43_WARN_ON(!key->keyconf); | 240 | |
241 | if (unlikely(!key->keyconf)) { | ||
242 | /* This key is invalid. This might only happen | ||
243 | * in a short timeframe after machine resume before | ||
244 | * we were able to reconfigure keys. | ||
245 | * Drop this packet completely. Do not transmit it | ||
246 | * unencrypted to avoid leaking information. */ | ||
247 | return -ENOKEY; | ||
248 | } | ||
241 | 249 | ||
242 | /* Hardware appends ICV. */ | 250 | /* Hardware appends ICV. */ |
243 | plcp_fragment_len += txctl->icv_len; | 251 | plcp_fragment_len += txctl->icv_len; |
@@ -408,6 +416,7 @@ void b43_generate_txhdr(struct b43_wldev *dev, | |||
408 | txhdr->phy_ctl = cpu_to_le16(phy_ctl); | 416 | txhdr->phy_ctl = cpu_to_le16(phy_ctl); |
409 | txhdr->extra_ft = extra_ft; | 417 | txhdr->extra_ft = extra_ft; |
410 | 418 | ||
419 | return 0; | ||
411 | } | 420 | } |
412 | 421 | ||
413 | static s8 b43_rssi_postprocess(struct b43_wldev *dev, | 422 | static s8 b43_rssi_postprocess(struct b43_wldev *dev, |
diff --git a/drivers/net/wireless/b43/xmit.h b/drivers/net/wireless/b43/xmit.h index ca2a2ab8654c..41765039552b 100644 --- a/drivers/net/wireless/b43/xmit.h +++ b/drivers/net/wireless/b43/xmit.h | |||
@@ -174,11 +174,11 @@ size_t b43_txhdr_size(struct b43_wldev *dev) | |||
174 | } | 174 | } |
175 | 175 | ||
176 | 176 | ||
177 | void b43_generate_txhdr(struct b43_wldev *dev, | 177 | int b43_generate_txhdr(struct b43_wldev *dev, |
178 | u8 * txhdr, | 178 | u8 * txhdr, |
179 | const unsigned char *fragment_data, | 179 | const unsigned char *fragment_data, |
180 | unsigned int fragment_len, | 180 | unsigned int fragment_len, |
181 | const struct ieee80211_tx_control *txctl, u16 cookie); | 181 | const struct ieee80211_tx_control *txctl, u16 cookie); |
182 | 182 | ||
183 | /* Transmit Status */ | 183 | /* Transmit Status */ |
184 | struct b43_txstatus { | 184 | struct b43_txstatus { |
diff --git a/drivers/net/wireless/b43legacy/b43legacy.h b/drivers/net/wireless/b43legacy/b43legacy.h index 93419adb925e..c80edd2b9044 100644 --- a/drivers/net/wireless/b43legacy/b43legacy.h +++ b/drivers/net/wireless/b43legacy/b43legacy.h | |||
@@ -23,7 +23,7 @@ | |||
23 | #include "phy.h" | 23 | #include "phy.h" |
24 | 24 | ||
25 | 25 | ||
26 | #define B43legacy_IRQWAIT_MAX_RETRIES 100 | 26 | #define B43legacy_IRQWAIT_MAX_RETRIES 20 |
27 | 27 | ||
28 | #define B43legacy_RX_MAX_SSI 60 /* best guess at max ssi */ | 28 | #define B43legacy_RX_MAX_SSI 60 /* best guess at max ssi */ |
29 | 29 | ||
@@ -40,9 +40,8 @@ | |||
40 | #define B43legacy_MMIO_DMA4_IRQ_MASK 0x44 | 40 | #define B43legacy_MMIO_DMA4_IRQ_MASK 0x44 |
41 | #define B43legacy_MMIO_DMA5_REASON 0x48 | 41 | #define B43legacy_MMIO_DMA5_REASON 0x48 |
42 | #define B43legacy_MMIO_DMA5_IRQ_MASK 0x4C | 42 | #define B43legacy_MMIO_DMA5_IRQ_MASK 0x4C |
43 | #define B43legacy_MMIO_MACCTL 0x120 | 43 | #define B43legacy_MMIO_MACCTL 0x120 /* MAC control */ |
44 | #define B43legacy_MMIO_STATUS_BITFIELD 0x120 | 44 | #define B43legacy_MMIO_MACCMD 0x124 /* MAC command */ |
45 | #define B43legacy_MMIO_STATUS2_BITFIELD 0x124 | ||
46 | #define B43legacy_MMIO_GEN_IRQ_REASON 0x128 | 45 | #define B43legacy_MMIO_GEN_IRQ_REASON 0x128 |
47 | #define B43legacy_MMIO_GEN_IRQ_MASK 0x12C | 46 | #define B43legacy_MMIO_GEN_IRQ_MASK 0x12C |
48 | #define B43legacy_MMIO_RAM_CONTROL 0x130 | 47 | #define B43legacy_MMIO_RAM_CONTROL 0x130 |
@@ -177,31 +176,25 @@ | |||
177 | #define B43legacy_RADIOCTL_ID 0x01 | 176 | #define B43legacy_RADIOCTL_ID 0x01 |
178 | 177 | ||
179 | /* MAC Control bitfield */ | 178 | /* MAC Control bitfield */ |
179 | #define B43legacy_MACCTL_ENABLED 0x00000001 /* MAC Enabled */ | ||
180 | #define B43legacy_MACCTL_PSM_RUN 0x00000002 /* Run Microcode */ | ||
181 | #define B43legacy_MACCTL_PSM_JMP0 0x00000004 /* Microcode jump to 0 */ | ||
182 | #define B43legacy_MACCTL_SHM_ENABLED 0x00000100 /* SHM Enabled */ | ||
180 | #define B43legacy_MACCTL_IHR_ENABLED 0x00000400 /* IHR Region Enabled */ | 183 | #define B43legacy_MACCTL_IHR_ENABLED 0x00000400 /* IHR Region Enabled */ |
184 | #define B43legacy_MACCTL_BE 0x00010000 /* Big Endian mode */ | ||
181 | #define B43legacy_MACCTL_INFRA 0x00020000 /* Infrastructure mode */ | 185 | #define B43legacy_MACCTL_INFRA 0x00020000 /* Infrastructure mode */ |
182 | #define B43legacy_MACCTL_AP 0x00040000 /* AccessPoint mode */ | 186 | #define B43legacy_MACCTL_AP 0x00040000 /* AccessPoint mode */ |
187 | #define B43legacy_MACCTL_RADIOLOCK 0x00080000 /* Radio lock */ | ||
183 | #define B43legacy_MACCTL_BEACPROMISC 0x00100000 /* Beacon Promiscuous */ | 188 | #define B43legacy_MACCTL_BEACPROMISC 0x00100000 /* Beacon Promiscuous */ |
184 | #define B43legacy_MACCTL_KEEP_BADPLCP 0x00200000 /* Keep bad PLCP frames */ | 189 | #define B43legacy_MACCTL_KEEP_BADPLCP 0x00200000 /* Keep bad PLCP frames */ |
185 | #define B43legacy_MACCTL_KEEP_CTL 0x00400000 /* Keep control frames */ | 190 | #define B43legacy_MACCTL_KEEP_CTL 0x00400000 /* Keep control frames */ |
186 | #define B43legacy_MACCTL_KEEP_BAD 0x00800000 /* Keep bad frames (FCS) */ | 191 | #define B43legacy_MACCTL_KEEP_BAD 0x00800000 /* Keep bad frames (FCS) */ |
187 | #define B43legacy_MACCTL_PROMISC 0x01000000 /* Promiscuous mode */ | 192 | #define B43legacy_MACCTL_PROMISC 0x01000000 /* Promiscuous mode */ |
193 | #define B43legacy_MACCTL_HWPS 0x02000000 /* Hardware Power Saving */ | ||
194 | #define B43legacy_MACCTL_AWAKE 0x04000000 /* Device is awake */ | ||
195 | #define B43legacy_MACCTL_TBTTHOLD 0x10000000 /* TBTT Hold */ | ||
188 | #define B43legacy_MACCTL_GMODE 0x80000000 /* G Mode */ | 196 | #define B43legacy_MACCTL_GMODE 0x80000000 /* G Mode */ |
189 | 197 | ||
190 | /* StatusBitField */ | ||
191 | #define B43legacy_SBF_MAC_ENABLED 0x00000001 | ||
192 | #define B43legacy_SBF_CORE_READY 0x00000004 | ||
193 | #define B43legacy_SBF_400 0x00000400 /*FIXME: fix name*/ | ||
194 | #define B43legacy_SBF_XFER_REG_BYTESWAP 0x00010000 | ||
195 | #define B43legacy_SBF_MODE_NOTADHOC 0x00020000 | ||
196 | #define B43legacy_SBF_MODE_AP 0x00040000 | ||
197 | #define B43legacy_SBF_RADIOREG_LOCK 0x00080000 | ||
198 | #define B43legacy_SBF_MODE_MONITOR 0x00400000 | ||
199 | #define B43legacy_SBF_MODE_PROMISC 0x01000000 | ||
200 | #define B43legacy_SBF_PS1 0x02000000 | ||
201 | #define B43legacy_SBF_PS2 0x04000000 | ||
202 | #define B43legacy_SBF_NO_SSID_BCAST 0x08000000 | ||
203 | #define B43legacy_SBF_TIME_UPDATE 0x10000000 | ||
204 | |||
205 | /* 802.11 core specific TM State Low flags */ | 198 | /* 802.11 core specific TM State Low flags */ |
206 | #define B43legacy_TMSLOW_GMODE 0x20000000 /* G Mode Enable */ | 199 | #define B43legacy_TMSLOW_GMODE 0x20000000 /* G Mode Enable */ |
207 | #define B43legacy_TMSLOW_PLLREFSEL 0x00200000 /* PLL Freq Ref Select */ | 200 | #define B43legacy_TMSLOW_PLLREFSEL 0x00200000 /* PLL Freq Ref Select */ |
diff --git a/drivers/net/wireless/b43legacy/main.c b/drivers/net/wireless/b43legacy/main.c index 4ed4243feeaa..aa20d5d56e2f 100644 --- a/drivers/net/wireless/b43legacy/main.c +++ b/drivers/net/wireless/b43legacy/main.c | |||
@@ -225,8 +225,8 @@ static void b43legacy_ram_write(struct b43legacy_wldev *dev, u16 offset, | |||
225 | 225 | ||
226 | B43legacy_WARN_ON(offset % 4 != 0); | 226 | B43legacy_WARN_ON(offset % 4 != 0); |
227 | 227 | ||
228 | status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 228 | status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
229 | if (status & B43legacy_SBF_XFER_REG_BYTESWAP) | 229 | if (status & B43legacy_MACCTL_BE) |
230 | val = swab32(val); | 230 | val = swab32(val); |
231 | 231 | ||
232 | b43legacy_write32(dev, B43legacy_MMIO_RAM_CONTROL, offset); | 232 | b43legacy_write32(dev, B43legacy_MMIO_RAM_CONTROL, offset); |
@@ -434,9 +434,9 @@ static void b43legacy_time_lock(struct b43legacy_wldev *dev) | |||
434 | { | 434 | { |
435 | u32 status; | 435 | u32 status; |
436 | 436 | ||
437 | status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 437 | status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
438 | status |= B43legacy_SBF_TIME_UPDATE; | 438 | status |= B43legacy_MACCTL_TBTTHOLD; |
439 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status); | 439 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status); |
440 | mmiowb(); | 440 | mmiowb(); |
441 | } | 441 | } |
442 | 442 | ||
@@ -444,9 +444,9 @@ static void b43legacy_time_unlock(struct b43legacy_wldev *dev) | |||
444 | { | 444 | { |
445 | u32 status; | 445 | u32 status; |
446 | 446 | ||
447 | status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 447 | status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
448 | status &= ~B43legacy_SBF_TIME_UPDATE; | 448 | status &= ~B43legacy_MACCTL_TBTTHOLD; |
449 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status); | 449 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status); |
450 | } | 450 | } |
451 | 451 | ||
452 | static void b43legacy_tsf_write_locked(struct b43legacy_wldev *dev, u64 tsf) | 452 | static void b43legacy_tsf_write_locked(struct b43legacy_wldev *dev, u64 tsf) |
@@ -647,7 +647,7 @@ void b43legacy_dummy_transmission(struct b43legacy_wldev *dev) | |||
647 | b43legacy_ram_write(dev, i * 4, buffer[i]); | 647 | b43legacy_ram_write(dev, i * 4, buffer[i]); |
648 | 648 | ||
649 | /* dummy read follows */ | 649 | /* dummy read follows */ |
650 | b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 650 | b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
651 | 651 | ||
652 | b43legacy_write16(dev, 0x0568, 0x0000); | 652 | b43legacy_write16(dev, 0x0568, 0x0000); |
653 | b43legacy_write16(dev, 0x07C0, 0x0000); | 653 | b43legacy_write16(dev, 0x07C0, 0x0000); |
@@ -794,9 +794,9 @@ static void b43legacy_jssi_write(struct b43legacy_wldev *dev, u32 jssi) | |||
794 | static void b43legacy_generate_noise_sample(struct b43legacy_wldev *dev) | 794 | static void b43legacy_generate_noise_sample(struct b43legacy_wldev *dev) |
795 | { | 795 | { |
796 | b43legacy_jssi_write(dev, 0x7F7F7F7F); | 796 | b43legacy_jssi_write(dev, 0x7F7F7F7F); |
797 | b43legacy_write32(dev, B43legacy_MMIO_STATUS2_BITFIELD, | 797 | b43legacy_write32(dev, B43legacy_MMIO_MACCMD, |
798 | b43legacy_read32(dev, | 798 | b43legacy_read32(dev, |
799 | B43legacy_MMIO_STATUS2_BITFIELD) | 799 | B43legacy_MMIO_MACCMD) |
800 | | (1 << 4)); | 800 | | (1 << 4)); |
801 | B43legacy_WARN_ON(dev->noisecalc.channel_at_start != | 801 | B43legacy_WARN_ON(dev->noisecalc.channel_at_start != |
802 | dev->phy.channel); | 802 | dev->phy.channel); |
@@ -895,8 +895,8 @@ static void handle_irq_atim_end(struct b43legacy_wldev *dev) | |||
895 | { | 895 | { |
896 | if (!dev->reg124_set_0x4) /*FIXME rename this variable*/ | 896 | if (!dev->reg124_set_0x4) /*FIXME rename this variable*/ |
897 | return; | 897 | return; |
898 | b43legacy_write32(dev, B43legacy_MMIO_STATUS2_BITFIELD, | 898 | b43legacy_write32(dev, B43legacy_MMIO_MACCMD, |
899 | b43legacy_read32(dev, B43legacy_MMIO_STATUS2_BITFIELD) | 899 | b43legacy_read32(dev, B43legacy_MMIO_MACCMD) |
900 | | 0x4); | 900 | | 0x4); |
901 | } | 901 | } |
902 | 902 | ||
@@ -1106,9 +1106,9 @@ static void b43legacy_update_templates(struct b43legacy_wldev *dev) | |||
1106 | b43legacy_write_probe_resp_template(dev, 0x268, 0x4A, | 1106 | b43legacy_write_probe_resp_template(dev, 0x268, 0x4A, |
1107 | B43legacy_CCK_RATE_11MB); | 1107 | B43legacy_CCK_RATE_11MB); |
1108 | 1108 | ||
1109 | status = b43legacy_read32(dev, B43legacy_MMIO_STATUS2_BITFIELD); | 1109 | status = b43legacy_read32(dev, B43legacy_MMIO_MACCMD); |
1110 | status |= 0x03; | 1110 | status |= 0x03; |
1111 | b43legacy_write32(dev, B43legacy_MMIO_STATUS2_BITFIELD, status); | 1111 | b43legacy_write32(dev, B43legacy_MMIO_MACCMD, status); |
1112 | } | 1112 | } |
1113 | 1113 | ||
1114 | static void b43legacy_refresh_templates(struct b43legacy_wldev *dev, | 1114 | static void b43legacy_refresh_templates(struct b43legacy_wldev *dev, |
@@ -1166,7 +1166,7 @@ static void handle_irq_beacon(struct b43legacy_wldev *dev) | |||
1166 | return; | 1166 | return; |
1167 | 1167 | ||
1168 | dev->irq_savedstate &= ~B43legacy_IRQ_BEACON; | 1168 | dev->irq_savedstate &= ~B43legacy_IRQ_BEACON; |
1169 | status = b43legacy_read32(dev, B43legacy_MMIO_STATUS2_BITFIELD); | 1169 | status = b43legacy_read32(dev, B43legacy_MMIO_MACCMD); |
1170 | 1170 | ||
1171 | if (!dev->cached_beacon || ((status & 0x1) && (status & 0x2))) { | 1171 | if (!dev->cached_beacon || ((status & 0x1) && (status & 0x2))) { |
1172 | /* ACK beacon IRQ. */ | 1172 | /* ACK beacon IRQ. */ |
@@ -1182,14 +1182,14 @@ static void handle_irq_beacon(struct b43legacy_wldev *dev) | |||
1182 | b43legacy_write_beacon_template(dev, 0x68, 0x18, | 1182 | b43legacy_write_beacon_template(dev, 0x68, 0x18, |
1183 | B43legacy_CCK_RATE_1MB); | 1183 | B43legacy_CCK_RATE_1MB); |
1184 | status |= 0x1; | 1184 | status |= 0x1; |
1185 | b43legacy_write32(dev, B43legacy_MMIO_STATUS2_BITFIELD, | 1185 | b43legacy_write32(dev, B43legacy_MMIO_MACCMD, |
1186 | status); | 1186 | status); |
1187 | } | 1187 | } |
1188 | if (!(status & 0x2)) { | 1188 | if (!(status & 0x2)) { |
1189 | b43legacy_write_beacon_template(dev, 0x468, 0x1A, | 1189 | b43legacy_write_beacon_template(dev, 0x468, 0x1A, |
1190 | B43legacy_CCK_RATE_1MB); | 1190 | B43legacy_CCK_RATE_1MB); |
1191 | status |= 0x2; | 1191 | status |= 0x2; |
1192 | b43legacy_write32(dev, B43legacy_MMIO_STATUS2_BITFIELD, | 1192 | b43legacy_write32(dev, B43legacy_MMIO_MACCMD, |
1193 | status); | 1193 | status); |
1194 | } | 1194 | } |
1195 | } | 1195 | } |
@@ -1548,9 +1548,20 @@ static int b43legacy_upload_microcode(struct b43legacy_wldev *dev) | |||
1548 | u16 fwpatch; | 1548 | u16 fwpatch; |
1549 | u16 fwdate; | 1549 | u16 fwdate; |
1550 | u16 fwtime; | 1550 | u16 fwtime; |
1551 | u32 tmp; | 1551 | u32 tmp, macctl; |
1552 | int err = 0; | 1552 | int err = 0; |
1553 | 1553 | ||
1554 | /* Jump the microcode PSM to offset 0 */ | ||
1555 | macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); | ||
1556 | B43legacy_WARN_ON(macctl & B43legacy_MACCTL_PSM_RUN); | ||
1557 | macctl |= B43legacy_MACCTL_PSM_JMP0; | ||
1558 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); | ||
1559 | /* Zero out all microcode PSM registers and shared memory. */ | ||
1560 | for (i = 0; i < 64; i++) | ||
1561 | b43legacy_shm_write16(dev, B43legacy_SHM_WIRELESS, i, 0); | ||
1562 | for (i = 0; i < 4096; i += 2) | ||
1563 | b43legacy_shm_write16(dev, B43legacy_SHM_SHARED, i, 0); | ||
1564 | |||
1554 | /* Upload Microcode. */ | 1565 | /* Upload Microcode. */ |
1555 | data = (__be32 *) (dev->fw.ucode->data + hdr_len); | 1566 | data = (__be32 *) (dev->fw.ucode->data + hdr_len); |
1556 | len = (dev->fw.ucode->size - hdr_len) / sizeof(__be32); | 1567 | len = (dev->fw.ucode->size - hdr_len) / sizeof(__be32); |
@@ -1581,7 +1592,12 @@ static int b43legacy_upload_microcode(struct b43legacy_wldev *dev) | |||
1581 | 1592 | ||
1582 | b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, | 1593 | b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, |
1583 | B43legacy_IRQ_ALL); | 1594 | B43legacy_IRQ_ALL); |
1584 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, 0x00020402); | 1595 | |
1596 | /* Start the microcode PSM */ | ||
1597 | macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); | ||
1598 | macctl &= ~B43legacy_MACCTL_PSM_JMP0; | ||
1599 | macctl |= B43legacy_MACCTL_PSM_RUN; | ||
1600 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); | ||
1585 | 1601 | ||
1586 | /* Wait for the microcode to load and respond */ | 1602 | /* Wait for the microcode to load and respond */ |
1587 | i = 0; | 1603 | i = 0; |
@@ -1594,9 +1610,13 @@ static int b43legacy_upload_microcode(struct b43legacy_wldev *dev) | |||
1594 | b43legacyerr(dev->wl, "Microcode not responding\n"); | 1610 | b43legacyerr(dev->wl, "Microcode not responding\n"); |
1595 | b43legacy_print_fw_helptext(dev->wl); | 1611 | b43legacy_print_fw_helptext(dev->wl); |
1596 | err = -ENODEV; | 1612 | err = -ENODEV; |
1597 | goto out; | 1613 | goto error; |
1614 | } | ||
1615 | msleep_interruptible(50); | ||
1616 | if (signal_pending(current)) { | ||
1617 | err = -EINTR; | ||
1618 | goto error; | ||
1598 | } | 1619 | } |
1599 | udelay(10); | ||
1600 | } | 1620 | } |
1601 | /* dummy read follows */ | 1621 | /* dummy read follows */ |
1602 | b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); | 1622 | b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); |
@@ -1617,9 +1637,8 @@ static int b43legacy_upload_microcode(struct b43legacy_wldev *dev) | |||
1617 | " is supported. You must change your firmware" | 1637 | " is supported. You must change your firmware" |
1618 | " files.\n"); | 1638 | " files.\n"); |
1619 | b43legacy_print_fw_helptext(dev->wl); | 1639 | b43legacy_print_fw_helptext(dev->wl); |
1620 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, 0); | ||
1621 | err = -EOPNOTSUPP; | 1640 | err = -EOPNOTSUPP; |
1622 | goto out; | 1641 | goto error; |
1623 | } | 1642 | } |
1624 | b43legacydbg(dev->wl, "Loading firmware version 0x%X, patch level %u " | 1643 | b43legacydbg(dev->wl, "Loading firmware version 0x%X, patch level %u " |
1625 | "(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n", fwrev, fwpatch, | 1644 | "(20%.2i-%.2i-%.2i %.2i:%.2i:%.2i)\n", fwrev, fwpatch, |
@@ -1629,7 +1648,14 @@ static int b43legacy_upload_microcode(struct b43legacy_wldev *dev) | |||
1629 | dev->fw.rev = fwrev; | 1648 | dev->fw.rev = fwrev; |
1630 | dev->fw.patch = fwpatch; | 1649 | dev->fw.patch = fwpatch; |
1631 | 1650 | ||
1632 | out: | 1651 | return 0; |
1652 | |||
1653 | error: | ||
1654 | macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); | ||
1655 | macctl &= ~B43legacy_MACCTL_PSM_RUN; | ||
1656 | macctl |= B43legacy_MACCTL_PSM_JMP0; | ||
1657 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); | ||
1658 | |||
1633 | return err; | 1659 | return err; |
1634 | } | 1660 | } |
1635 | 1661 | ||
@@ -1736,9 +1762,9 @@ static int b43legacy_gpio_init(struct b43legacy_wldev *dev) | |||
1736 | u32 mask; | 1762 | u32 mask; |
1737 | u32 set; | 1763 | u32 set; |
1738 | 1764 | ||
1739 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, | 1765 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, |
1740 | b43legacy_read32(dev, | 1766 | b43legacy_read32(dev, |
1741 | B43legacy_MMIO_STATUS_BITFIELD) | 1767 | B43legacy_MMIO_MACCTL) |
1742 | & 0xFFFF3FFF); | 1768 | & 0xFFFF3FFF); |
1743 | 1769 | ||
1744 | b43legacy_write16(dev, B43legacy_MMIO_GPIO_MASK, | 1770 | b43legacy_write16(dev, B43legacy_MMIO_GPIO_MASK, |
@@ -1798,14 +1824,14 @@ void b43legacy_mac_enable(struct b43legacy_wldev *dev) | |||
1798 | B43legacy_WARN_ON(dev->mac_suspended < 0); | 1824 | B43legacy_WARN_ON(dev->mac_suspended < 0); |
1799 | B43legacy_WARN_ON(irqs_disabled()); | 1825 | B43legacy_WARN_ON(irqs_disabled()); |
1800 | if (dev->mac_suspended == 0) { | 1826 | if (dev->mac_suspended == 0) { |
1801 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, | 1827 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, |
1802 | b43legacy_read32(dev, | 1828 | b43legacy_read32(dev, |
1803 | B43legacy_MMIO_STATUS_BITFIELD) | 1829 | B43legacy_MMIO_MACCTL) |
1804 | | B43legacy_SBF_MAC_ENABLED); | 1830 | | B43legacy_MACCTL_ENABLED); |
1805 | b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, | 1831 | b43legacy_write32(dev, B43legacy_MMIO_GEN_IRQ_REASON, |
1806 | B43legacy_IRQ_MAC_SUSPENDED); | 1832 | B43legacy_IRQ_MAC_SUSPENDED); |
1807 | /* the next two are dummy reads */ | 1833 | /* the next two are dummy reads */ |
1808 | b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 1834 | b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
1809 | b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); | 1835 | b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); |
1810 | b43legacy_power_saving_ctl_bits(dev, -1, -1); | 1836 | b43legacy_power_saving_ctl_bits(dev, -1, -1); |
1811 | 1837 | ||
@@ -1836,10 +1862,10 @@ void b43legacy_mac_suspend(struct b43legacy_wldev *dev) | |||
1836 | dev->irq_savedstate = tmp; | 1862 | dev->irq_savedstate = tmp; |
1837 | 1863 | ||
1838 | b43legacy_power_saving_ctl_bits(dev, -1, 1); | 1864 | b43legacy_power_saving_ctl_bits(dev, -1, 1); |
1839 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, | 1865 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, |
1840 | b43legacy_read32(dev, | 1866 | b43legacy_read32(dev, |
1841 | B43legacy_MMIO_STATUS_BITFIELD) | 1867 | B43legacy_MMIO_MACCTL) |
1842 | & ~B43legacy_SBF_MAC_ENABLED); | 1868 | & ~B43legacy_MACCTL_ENABLED); |
1843 | b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); | 1869 | b43legacy_read32(dev, B43legacy_MMIO_GEN_IRQ_REASON); |
1844 | for (i = 40; i; i--) { | 1870 | for (i = 40; i; i--) { |
1845 | tmp = b43legacy_read32(dev, | 1871 | tmp = b43legacy_read32(dev, |
@@ -2007,12 +2033,15 @@ static int b43legacy_chip_init(struct b43legacy_wldev *dev) | |||
2007 | struct b43legacy_phy *phy = &dev->phy; | 2033 | struct b43legacy_phy *phy = &dev->phy; |
2008 | int err; | 2034 | int err; |
2009 | int tmp; | 2035 | int tmp; |
2010 | u32 value32; | 2036 | u32 value32, macctl; |
2011 | u16 value16; | 2037 | u16 value16; |
2012 | 2038 | ||
2013 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, | 2039 | /* Initialize the MAC control */ |
2014 | B43legacy_SBF_CORE_READY | 2040 | macctl = B43legacy_MACCTL_IHR_ENABLED | B43legacy_MACCTL_SHM_ENABLED; |
2015 | | B43legacy_SBF_400); | 2041 | if (dev->phy.gmode) |
2042 | macctl |= B43legacy_MACCTL_GMODE; | ||
2043 | macctl |= B43legacy_MACCTL_INFRA; | ||
2044 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); | ||
2016 | 2045 | ||
2017 | err = b43legacy_request_firmware(dev); | 2046 | err = b43legacy_request_firmware(dev); |
2018 | if (err) | 2047 | if (err) |
@@ -2052,12 +2081,12 @@ static int b43legacy_chip_init(struct b43legacy_wldev *dev) | |||
2052 | if (dev->dev->id.revision < 5) | 2081 | if (dev->dev->id.revision < 5) |
2053 | b43legacy_write32(dev, 0x010C, 0x01000000); | 2082 | b43legacy_write32(dev, 0x010C, 0x01000000); |
2054 | 2083 | ||
2055 | value32 = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 2084 | value32 = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
2056 | value32 &= ~B43legacy_SBF_MODE_NOTADHOC; | 2085 | value32 &= ~B43legacy_MACCTL_INFRA; |
2057 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, value32); | 2086 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, value32); |
2058 | value32 = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 2087 | value32 = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
2059 | value32 |= B43legacy_SBF_MODE_NOTADHOC; | 2088 | value32 |= B43legacy_MACCTL_INFRA; |
2060 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, value32); | 2089 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, value32); |
2061 | 2090 | ||
2062 | if (b43legacy_using_pio(dev)) { | 2091 | if (b43legacy_using_pio(dev)) { |
2063 | b43legacy_write32(dev, 0x0210, 0x00000100); | 2092 | b43legacy_write32(dev, 0x0210, 0x00000100); |
@@ -2951,12 +2980,19 @@ static void b43legacy_wireless_core_exit(struct b43legacy_wldev *dev) | |||
2951 | { | 2980 | { |
2952 | struct b43legacy_wl *wl = dev->wl; | 2981 | struct b43legacy_wl *wl = dev->wl; |
2953 | struct b43legacy_phy *phy = &dev->phy; | 2982 | struct b43legacy_phy *phy = &dev->phy; |
2983 | u32 macctl; | ||
2954 | 2984 | ||
2955 | B43legacy_WARN_ON(b43legacy_status(dev) > B43legacy_STAT_INITIALIZED); | 2985 | B43legacy_WARN_ON(b43legacy_status(dev) > B43legacy_STAT_INITIALIZED); |
2956 | if (b43legacy_status(dev) != B43legacy_STAT_INITIALIZED) | 2986 | if (b43legacy_status(dev) != B43legacy_STAT_INITIALIZED) |
2957 | return; | 2987 | return; |
2958 | b43legacy_set_status(dev, B43legacy_STAT_UNINIT); | 2988 | b43legacy_set_status(dev, B43legacy_STAT_UNINIT); |
2959 | 2989 | ||
2990 | /* Stop the microcode PSM. */ | ||
2991 | macctl = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); | ||
2992 | macctl &= ~B43legacy_MACCTL_PSM_RUN; | ||
2993 | macctl |= B43legacy_MACCTL_PSM_JMP0; | ||
2994 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, macctl); | ||
2995 | |||
2960 | mutex_unlock(&wl->mutex); | 2996 | mutex_unlock(&wl->mutex); |
2961 | /* Must unlock as it would otherwise deadlock. No races here. | 2997 | /* Must unlock as it would otherwise deadlock. No races here. |
2962 | * Cancel possibly pending workqueues. */ | 2998 | * Cancel possibly pending workqueues. */ |
@@ -3221,6 +3257,7 @@ static int b43legacy_op_start(struct ieee80211_hw *hw) | |||
3221 | struct b43legacy_wldev *dev = wl->current_dev; | 3257 | struct b43legacy_wldev *dev = wl->current_dev; |
3222 | int did_init = 0; | 3258 | int did_init = 0; |
3223 | int err = 0; | 3259 | int err = 0; |
3260 | bool do_rfkill_exit = 0; | ||
3224 | 3261 | ||
3225 | /* First register RFkill. | 3262 | /* First register RFkill. |
3226 | * LEDs that are registered later depend on it. */ | 3263 | * LEDs that are registered later depend on it. */ |
@@ -3230,8 +3267,10 @@ static int b43legacy_op_start(struct ieee80211_hw *hw) | |||
3230 | 3267 | ||
3231 | if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) { | 3268 | if (b43legacy_status(dev) < B43legacy_STAT_INITIALIZED) { |
3232 | err = b43legacy_wireless_core_init(dev); | 3269 | err = b43legacy_wireless_core_init(dev); |
3233 | if (err) | 3270 | if (err) { |
3271 | do_rfkill_exit = 1; | ||
3234 | goto out_mutex_unlock; | 3272 | goto out_mutex_unlock; |
3273 | } | ||
3235 | did_init = 1; | 3274 | did_init = 1; |
3236 | } | 3275 | } |
3237 | 3276 | ||
@@ -3240,6 +3279,7 @@ static int b43legacy_op_start(struct ieee80211_hw *hw) | |||
3240 | if (err) { | 3279 | if (err) { |
3241 | if (did_init) | 3280 | if (did_init) |
3242 | b43legacy_wireless_core_exit(dev); | 3281 | b43legacy_wireless_core_exit(dev); |
3282 | do_rfkill_exit = 1; | ||
3243 | goto out_mutex_unlock; | 3283 | goto out_mutex_unlock; |
3244 | } | 3284 | } |
3245 | } | 3285 | } |
@@ -3247,6 +3287,9 @@ static int b43legacy_op_start(struct ieee80211_hw *hw) | |||
3247 | out_mutex_unlock: | 3287 | out_mutex_unlock: |
3248 | mutex_unlock(&wl->mutex); | 3288 | mutex_unlock(&wl->mutex); |
3249 | 3289 | ||
3290 | if (do_rfkill_exit) | ||
3291 | b43legacy_rfkill_exit(dev); | ||
3292 | |||
3250 | return err; | 3293 | return err; |
3251 | } | 3294 | } |
3252 | 3295 | ||
diff --git a/drivers/net/wireless/b43legacy/phy.c b/drivers/net/wireless/b43legacy/phy.c index c16febbdbf5d..8e5c09b81871 100644 --- a/drivers/net/wireless/b43legacy/phy.c +++ b/drivers/net/wireless/b43legacy/phy.c | |||
@@ -140,7 +140,7 @@ void b43legacy_phy_calibrate(struct b43legacy_wldev *dev) | |||
140 | { | 140 | { |
141 | struct b43legacy_phy *phy = &dev->phy; | 141 | struct b43legacy_phy *phy = &dev->phy; |
142 | 142 | ||
143 | b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); /* Dummy read. */ | 143 | b43legacy_read32(dev, B43legacy_MMIO_MACCTL); /* Dummy read. */ |
144 | if (phy->calibrated) | 144 | if (phy->calibrated) |
145 | return; | 145 | return; |
146 | if (phy->type == B43legacy_PHYTYPE_G && phy->rev == 1) { | 146 | if (phy->type == B43legacy_PHYTYPE_G && phy->rev == 1) { |
@@ -2231,16 +2231,16 @@ bit26 = 1; | |||
2231 | * or the latest PS-Poll packet sent was successful, | 2231 | * or the latest PS-Poll packet sent was successful, |
2232 | * set bit26 */ | 2232 | * set bit26 */ |
2233 | } | 2233 | } |
2234 | status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 2234 | status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
2235 | if (bit25) | 2235 | if (bit25) |
2236 | status |= B43legacy_SBF_PS1; | 2236 | status |= B43legacy_MACCTL_HWPS; |
2237 | else | 2237 | else |
2238 | status &= ~B43legacy_SBF_PS1; | 2238 | status &= ~B43legacy_MACCTL_HWPS; |
2239 | if (bit26) | 2239 | if (bit26) |
2240 | status |= B43legacy_SBF_PS2; | 2240 | status |= B43legacy_MACCTL_AWAKE; |
2241 | else | 2241 | else |
2242 | status &= ~B43legacy_SBF_PS2; | 2242 | status &= ~B43legacy_MACCTL_AWAKE; |
2243 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status); | 2243 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status); |
2244 | if (bit26 && dev->dev->id.revision >= 5) { | 2244 | if (bit26 && dev->dev->id.revision >= 5) { |
2245 | for (i = 0; i < 100; i++) { | 2245 | for (i = 0; i < 100; i++) { |
2246 | if (b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, | 2246 | if (b43legacy_shm_read32(dev, B43legacy_SHM_SHARED, |
diff --git a/drivers/net/wireless/b43legacy/pio.c b/drivers/net/wireless/b43legacy/pio.c index de843ac147ae..e4f4c5c39e33 100644 --- a/drivers/net/wireless/b43legacy/pio.c +++ b/drivers/net/wireless/b43legacy/pio.c | |||
@@ -334,9 +334,9 @@ struct b43legacy_pioqueue *b43legacy_setup_pioqueue(struct b43legacy_wldev *dev, | |||
334 | tasklet_init(&queue->txtask, tx_tasklet, | 334 | tasklet_init(&queue->txtask, tx_tasklet, |
335 | (unsigned long)queue); | 335 | (unsigned long)queue); |
336 | 336 | ||
337 | value = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 337 | value = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
338 | value &= ~B43legacy_SBF_XFER_REG_BYTESWAP; | 338 | value &= ~B43legacy_MACCTL_BE; |
339 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, value); | 339 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, value); |
340 | 340 | ||
341 | qsize = b43legacy_read16(dev, queue->mmio_base | 341 | qsize = b43legacy_read16(dev, queue->mmio_base |
342 | + B43legacy_PIO_TXQBUFSIZE); | 342 | + B43legacy_PIO_TXQBUFSIZE); |
diff --git a/drivers/net/wireless/b43legacy/radio.c b/drivers/net/wireless/b43legacy/radio.c index 318a270cf9b4..955832e8654f 100644 --- a/drivers/net/wireless/b43legacy/radio.c +++ b/drivers/net/wireless/b43legacy/radio.c | |||
@@ -91,10 +91,10 @@ void b43legacy_radio_lock(struct b43legacy_wldev *dev) | |||
91 | { | 91 | { |
92 | u32 status; | 92 | u32 status; |
93 | 93 | ||
94 | status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 94 | status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
95 | B43legacy_WARN_ON(status & B43legacy_SBF_RADIOREG_LOCK); | 95 | B43legacy_WARN_ON(status & B43legacy_MACCTL_RADIOLOCK); |
96 | status |= B43legacy_SBF_RADIOREG_LOCK; | 96 | status |= B43legacy_MACCTL_RADIOLOCK; |
97 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status); | 97 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status); |
98 | mmiowb(); | 98 | mmiowb(); |
99 | udelay(10); | 99 | udelay(10); |
100 | } | 100 | } |
@@ -104,10 +104,10 @@ void b43legacy_radio_unlock(struct b43legacy_wldev *dev) | |||
104 | u32 status; | 104 | u32 status; |
105 | 105 | ||
106 | b43legacy_read16(dev, B43legacy_MMIO_PHY_VER); /* dummy read */ | 106 | b43legacy_read16(dev, B43legacy_MMIO_PHY_VER); /* dummy read */ |
107 | status = b43legacy_read32(dev, B43legacy_MMIO_STATUS_BITFIELD); | 107 | status = b43legacy_read32(dev, B43legacy_MMIO_MACCTL); |
108 | B43legacy_WARN_ON(!(status & B43legacy_SBF_RADIOREG_LOCK)); | 108 | B43legacy_WARN_ON(!(status & B43legacy_MACCTL_RADIOLOCK)); |
109 | status &= ~B43legacy_SBF_RADIOREG_LOCK; | 109 | status &= ~B43legacy_MACCTL_RADIOLOCK; |
110 | b43legacy_write32(dev, B43legacy_MMIO_STATUS_BITFIELD, status); | 110 | b43legacy_write32(dev, B43legacy_MMIO_MACCTL, status); |
111 | mmiowb(); | 111 | mmiowb(); |
112 | } | 112 | } |
113 | 113 | ||
diff --git a/drivers/net/wireless/hostap/hostap_80211.h b/drivers/net/wireless/hostap/hostap_80211.h index d6b9362a3d5c..3694b1eba521 100644 --- a/drivers/net/wireless/hostap/hostap_80211.h +++ b/drivers/net/wireless/hostap/hostap_80211.h | |||
@@ -71,11 +71,6 @@ struct hostap_80211_rx_status { | |||
71 | u16 rate; /* in 100 kbps */ | 71 | u16 rate; /* in 100 kbps */ |
72 | }; | 72 | }; |
73 | 73 | ||
74 | |||
75 | void hostap_80211_rx(struct net_device *dev, struct sk_buff *skb, | ||
76 | struct hostap_80211_rx_status *rx_stats); | ||
77 | |||
78 | |||
79 | /* prism2_rx_80211 'type' argument */ | 74 | /* prism2_rx_80211 'type' argument */ |
80 | enum { | 75 | enum { |
81 | PRISM2_RX_MONITOR, PRISM2_RX_MGMT, PRISM2_RX_NON_ASSOC, | 76 | PRISM2_RX_MONITOR, PRISM2_RX_MGMT, PRISM2_RX_NON_ASSOC, |
diff --git a/drivers/net/wireless/hostap/hostap_cs.c b/drivers/net/wireless/hostap/hostap_cs.c index 07593803065a..437a9bcc9bd3 100644 --- a/drivers/net/wireless/hostap/hostap_cs.c +++ b/drivers/net/wireless/hostap/hostap_cs.c | |||
@@ -891,6 +891,9 @@ static struct pcmcia_device_id hostap_cs_ids[] = { | |||
891 | PCMCIA_DEVICE_PROD_ID123( | 891 | PCMCIA_DEVICE_PROD_ID123( |
892 | "The Linksys Group, Inc.", "Wireless Network CF Card", "ISL37300P", | 892 | "The Linksys Group, Inc.", "Wireless Network CF Card", "ISL37300P", |
893 | 0xa5f472c2, 0x9c05598d, 0xc9049a39), | 893 | 0xa5f472c2, 0x9c05598d, 0xc9049a39), |
894 | PCMCIA_DEVICE_PROD_ID123( | ||
895 | "Wireless LAN" , "11Mbps PC Card", "Version 01.02", | ||
896 | 0x4b8870ff, 0x70e946d1, 0x4b74baa0), | ||
894 | PCMCIA_DEVICE_NULL | 897 | PCMCIA_DEVICE_NULL |
895 | }; | 898 | }; |
896 | MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); | 899 | MODULE_DEVICE_TABLE(pcmcia, hostap_cs_ids); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h index 6e0187393af4..571815d7e8bf 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945-hw.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945-hw.h | |||
@@ -373,7 +373,7 @@ struct iwl3945_eeprom { | |||
373 | #define CSR_INT_BIT_HW_ERR (1 << 29) /* DMA hardware error FH_INT[31] */ | 373 | #define CSR_INT_BIT_HW_ERR (1 << 29) /* DMA hardware error FH_INT[31] */ |
374 | #define CSR_INT_BIT_DNLD (1 << 28) /* uCode Download */ | 374 | #define CSR_INT_BIT_DNLD (1 << 28) /* uCode Download */ |
375 | #define CSR_INT_BIT_FH_TX (1 << 27) /* Tx DMA FH_INT[1:0] */ | 375 | #define CSR_INT_BIT_FH_TX (1 << 27) /* Tx DMA FH_INT[1:0] */ |
376 | #define CSR_INT_BIT_MAC_CLK_ACTV (1 << 26) /* NIC controller's clock toggled on/off */ | 376 | #define CSR_INT_BIT_SCD (1 << 26) /* TXQ pointer advanced */ |
377 | #define CSR_INT_BIT_SW_ERR (1 << 25) /* uCode error */ | 377 | #define CSR_INT_BIT_SW_ERR (1 << 25) /* uCode error */ |
378 | #define CSR_INT_BIT_RF_KILL (1 << 7) /* HW RFKILL switch GP_CNTRL[27] toggled */ | 378 | #define CSR_INT_BIT_RF_KILL (1 << 7) /* HW RFKILL switch GP_CNTRL[27] toggled */ |
379 | #define CSR_INT_BIT_CT_KILL (1 << 6) /* Critical temp (chip too hot) rfkill */ | 379 | #define CSR_INT_BIT_CT_KILL (1 << 6) /* Critical temp (chip too hot) rfkill */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index 76c4ed1135f2..4fdeb5323248 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -2369,18 +2369,4 @@ struct pci_device_id iwl3945_hw_card_ids[] = { | |||
2369 | {0} | 2369 | {0} |
2370 | }; | 2370 | }; |
2371 | 2371 | ||
2372 | /* | ||
2373 | * Clear the OWNER_MSK, to establish driver (instead of uCode running on | ||
2374 | * embedded controller) as EEPROM reader; each read is a series of pulses | ||
2375 | * to/from the EEPROM chip, not a single event, so even reads could conflict | ||
2376 | * if they weren't arbitrated by some ownership mechanism. Here, the driver | ||
2377 | * simply claims ownership, which should be safe when this function is called | ||
2378 | * (i.e. before loading uCode!). | ||
2379 | */ | ||
2380 | inline int iwl3945_eeprom_acquire_semaphore(struct iwl3945_priv *priv) | ||
2381 | { | ||
2382 | _iwl3945_clear_bit(priv, CSR_EEPROM_GP, CSR_EEPROM_GP_IF_OWNER_MSK); | ||
2383 | return 0; | ||
2384 | } | ||
2385 | |||
2386 | MODULE_DEVICE_TABLE(pci, iwl3945_hw_card_ids); | 2372 | MODULE_DEVICE_TABLE(pci, iwl3945_hw_card_ids); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h index 20b925f57e35..1da14f9bbe0f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945.h | |||
@@ -671,7 +671,6 @@ extern int iwl3945_hw_channel_switch(struct iwl3945_priv *priv, u16 channel); | |||
671 | /* | 671 | /* |
672 | * Forward declare iwl-3945.c functions for iwl-base.c | 672 | * Forward declare iwl-3945.c functions for iwl-base.c |
673 | */ | 673 | */ |
674 | extern int iwl3945_eeprom_acquire_semaphore(struct iwl3945_priv *priv); | ||
675 | extern __le32 iwl3945_get_antenna_flags(const struct iwl3945_priv *priv); | 674 | extern __le32 iwl3945_get_antenna_flags(const struct iwl3945_priv *priv); |
676 | extern int iwl3945_init_hw_rate_table(struct iwl3945_priv *priv); | 675 | extern int iwl3945_init_hw_rate_table(struct iwl3945_priv *priv); |
677 | extern void iwl3945_reg_txpower_periodic(struct iwl3945_priv *priv); | 676 | extern void iwl3945_reg_txpower_periodic(struct iwl3945_priv *priv); |
@@ -791,7 +790,6 @@ struct iwl3945_priv { | |||
791 | u16 active_rate_basic; | 790 | u16 active_rate_basic; |
792 | 791 | ||
793 | u8 call_post_assoc_from_beacon; | 792 | u8 call_post_assoc_from_beacon; |
794 | u8 assoc_station_added; | ||
795 | /* Rate scaling data */ | 793 | /* Rate scaling data */ |
796 | s8 data_retry_limit; | 794 | s8 data_retry_limit; |
797 | u8 retry_rate; | 795 | u8 retry_rate; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965-hw.h b/drivers/net/wireless/iwlwifi/iwl-4965-hw.h index ff71c09ab1a7..ffe1e9dfdec7 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965-hw.h +++ b/drivers/net/wireless/iwlwifi/iwl-4965-hw.h | |||
@@ -465,7 +465,7 @@ struct iwl4965_eeprom { | |||
465 | #define CSR_INT_BIT_HW_ERR (1 << 29) /* DMA hardware error FH_INT[31] */ | 465 | #define CSR_INT_BIT_HW_ERR (1 << 29) /* DMA hardware error FH_INT[31] */ |
466 | #define CSR_INT_BIT_DNLD (1 << 28) /* uCode Download */ | 466 | #define CSR_INT_BIT_DNLD (1 << 28) /* uCode Download */ |
467 | #define CSR_INT_BIT_FH_TX (1 << 27) /* Tx DMA FH_INT[1:0] */ | 467 | #define CSR_INT_BIT_FH_TX (1 << 27) /* Tx DMA FH_INT[1:0] */ |
468 | #define CSR_INT_BIT_MAC_CLK_ACTV (1 << 26) /* NIC controller's clock toggled on/off */ | 468 | #define CSR_INT_BIT_SCD (1 << 26) /* TXQ pointer advanced */ |
469 | #define CSR_INT_BIT_SW_ERR (1 << 25) /* uCode error */ | 469 | #define CSR_INT_BIT_SW_ERR (1 << 25) /* uCode error */ |
470 | #define CSR_INT_BIT_RF_KILL (1 << 7) /* HW RFKILL switch GP_CNTRL[27] toggled */ | 470 | #define CSR_INT_BIT_RF_KILL (1 << 7) /* HW RFKILL switch GP_CNTRL[27] toggled */ |
471 | #define CSR_INT_BIT_CT_KILL (1 << 6) /* Critical temp (chip too hot) rfkill */ | 471 | #define CSR_INT_BIT_CT_KILL (1 << 6) /* Critical temp (chip too hot) rfkill */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 04db34ba814b..569347ff377b 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -4961,11 +4961,4 @@ int iwl4965_eeprom_acquire_semaphore(struct iwl4965_priv *priv) | |||
4961 | return rc; | 4961 | return rc; |
4962 | } | 4962 | } |
4963 | 4963 | ||
4964 | inline void iwl4965_eeprom_release_semaphore(struct iwl4965_priv *priv) | ||
4965 | { | ||
4966 | iwl4965_clear_bit(priv, CSR_HW_IF_CONFIG_REG, | ||
4967 | CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM); | ||
4968 | } | ||
4969 | |||
4970 | |||
4971 | MODULE_DEVICE_TABLE(pci, iwl4965_hw_card_ids); | 4964 | MODULE_DEVICE_TABLE(pci, iwl4965_hw_card_ids); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.h b/drivers/net/wireless/iwlwifi/iwl-4965.h index 78bc148c9f7f..9cb82be0ff80 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.h +++ b/drivers/net/wireless/iwlwifi/iwl-4965.h | |||
@@ -750,7 +750,6 @@ struct iwl4965_priv; | |||
750 | * Forward declare iwl-4965.c functions for iwl-base.c | 750 | * Forward declare iwl-4965.c functions for iwl-base.c |
751 | */ | 751 | */ |
752 | extern int iwl4965_eeprom_acquire_semaphore(struct iwl4965_priv *priv); | 752 | extern int iwl4965_eeprom_acquire_semaphore(struct iwl4965_priv *priv); |
753 | extern void iwl4965_eeprom_release_semaphore(struct iwl4965_priv *priv); | ||
754 | 753 | ||
755 | extern int iwl4965_tx_queue_update_wr_ptr(struct iwl4965_priv *priv, | 754 | extern int iwl4965_tx_queue_update_wr_ptr(struct iwl4965_priv *priv, |
756 | struct iwl4965_tx_queue *txq, | 755 | struct iwl4965_tx_queue *txq, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-helpers.h b/drivers/net/wireless/iwlwifi/iwl-helpers.h index cd2eb1848310..cb009f4c401f 100644 --- a/drivers/net/wireless/iwlwifi/iwl-helpers.h +++ b/drivers/net/wireless/iwlwifi/iwl-helpers.h | |||
@@ -246,10 +246,10 @@ static inline int iwl_check_bits(unsigned long field, unsigned long mask) | |||
246 | static inline unsigned long elapsed_jiffies(unsigned long start, | 246 | static inline unsigned long elapsed_jiffies(unsigned long start, |
247 | unsigned long end) | 247 | unsigned long end) |
248 | { | 248 | { |
249 | if (end > start) | 249 | if (end >= start) |
250 | return end - start; | 250 | return end - start; |
251 | 251 | ||
252 | return end + (MAX_JIFFY_OFFSET - start); | 252 | return end + (MAX_JIFFY_OFFSET - start) + 1; |
253 | } | 253 | } |
254 | 254 | ||
255 | static inline u8 iwl_get_dma_hi_address(dma_addr_t addr) | 255 | static inline u8 iwl_get_dma_hi_address(dma_addr_t addr) |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 748ac1222abb..33239f197984 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -1557,6 +1557,20 @@ static void get_eeprom_mac(struct iwl3945_priv *priv, u8 *mac) | |||
1557 | memcpy(mac, priv->eeprom.mac_address, 6); | 1557 | memcpy(mac, priv->eeprom.mac_address, 6); |
1558 | } | 1558 | } |
1559 | 1559 | ||
1560 | /* | ||
1561 | * Clear the OWNER_MSK, to establish driver (instead of uCode running on | ||
1562 | * embedded controller) as EEPROM reader; each read is a series of pulses | ||
1563 | * to/from the EEPROM chip, not a single event, so even reads could conflict | ||
1564 | * if they weren't arbitrated by some ownership mechanism. Here, the driver | ||
1565 | * simply claims ownership, which should be safe when this function is called | ||
1566 | * (i.e. before loading uCode!). | ||
1567 | */ | ||
1568 | static inline int iwl3945_eeprom_acquire_semaphore(struct iwl3945_priv *priv) | ||
1569 | { | ||
1570 | _iwl3945_clear_bit(priv, CSR_EEPROM_GP, CSR_EEPROM_GP_IF_OWNER_MSK); | ||
1571 | return 0; | ||
1572 | } | ||
1573 | |||
1560 | /** | 1574 | /** |
1561 | * iwl3945_eeprom_init - read EEPROM contents | 1575 | * iwl3945_eeprom_init - read EEPROM contents |
1562 | * | 1576 | * |
@@ -2792,7 +2806,7 @@ static int iwl3945_tx_skb(struct iwl3945_priv *priv, | |||
2792 | #endif | 2806 | #endif |
2793 | 2807 | ||
2794 | /* drop all data frame if we are not associated */ | 2808 | /* drop all data frame if we are not associated */ |
2795 | if (!iwl3945_is_associated(priv) && !priv->assoc_id && | 2809 | if ((!iwl3945_is_associated(priv) || !priv->assoc_id) && |
2796 | ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)) { | 2810 | ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)) { |
2797 | IWL_DEBUG_DROP("Dropping - !iwl3945_is_associated\n"); | 2811 | IWL_DEBUG_DROP("Dropping - !iwl3945_is_associated\n"); |
2798 | goto drop_unlock; | 2812 | goto drop_unlock; |
@@ -4745,8 +4759,9 @@ static void iwl3945_irq_tasklet(struct iwl3945_priv *priv) | |||
4745 | #ifdef CONFIG_IWL3945_DEBUG | 4759 | #ifdef CONFIG_IWL3945_DEBUG |
4746 | if (iwl3945_debug_level & (IWL_DL_ISR)) { | 4760 | if (iwl3945_debug_level & (IWL_DL_ISR)) { |
4747 | /* NIC fires this, but we don't use it, redundant with WAKEUP */ | 4761 | /* NIC fires this, but we don't use it, redundant with WAKEUP */ |
4748 | if (inta & CSR_INT_BIT_MAC_CLK_ACTV) | 4762 | if (inta & CSR_INT_BIT_SCD) |
4749 | IWL_DEBUG_ISR("Microcode started or stopped.\n"); | 4763 | IWL_DEBUG_ISR("Scheduler finished to transmit " |
4764 | "the frame/frames.\n"); | ||
4750 | 4765 | ||
4751 | /* Alive notification via Rx interrupt will do the real work */ | 4766 | /* Alive notification via Rx interrupt will do the real work */ |
4752 | if (inta & CSR_INT_BIT_ALIVE) | 4767 | if (inta & CSR_INT_BIT_ALIVE) |
@@ -4754,7 +4769,7 @@ static void iwl3945_irq_tasklet(struct iwl3945_priv *priv) | |||
4754 | } | 4769 | } |
4755 | #endif | 4770 | #endif |
4756 | /* Safely ignore these bits for debug checks below */ | 4771 | /* Safely ignore these bits for debug checks below */ |
4757 | inta &= ~(CSR_INT_BIT_MAC_CLK_ACTV | CSR_INT_BIT_ALIVE); | 4772 | inta &= ~(CSR_INT_BIT_SCD | CSR_INT_BIT_ALIVE); |
4758 | 4773 | ||
4759 | /* HW RF KILL switch toggled (4965 only) */ | 4774 | /* HW RF KILL switch toggled (4965 only) */ |
4760 | if (inta & CSR_INT_BIT_RF_KILL) { | 4775 | if (inta & CSR_INT_BIT_RF_KILL) { |
@@ -4890,8 +4905,11 @@ static irqreturn_t iwl3945_isr(int irq, void *data) | |||
4890 | IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n", | 4905 | IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n", |
4891 | inta, inta_mask, inta_fh); | 4906 | inta, inta_mask, inta_fh); |
4892 | 4907 | ||
4908 | inta &= ~CSR_INT_BIT_SCD; | ||
4909 | |||
4893 | /* iwl3945_irq_tasklet() will service interrupts and re-enable them */ | 4910 | /* iwl3945_irq_tasklet() will service interrupts and re-enable them */ |
4894 | tasklet_schedule(&priv->irq_tasklet); | 4911 | if (likely(inta || inta_fh)) |
4912 | tasklet_schedule(&priv->irq_tasklet); | ||
4895 | unplugged: | 4913 | unplugged: |
4896 | spin_unlock(&priv->lock); | 4914 | spin_unlock(&priv->lock); |
4897 | 4915 | ||
@@ -5146,6 +5164,15 @@ static int iwl3945_init_channel_map(struct iwl3945_priv *priv) | |||
5146 | return 0; | 5164 | return 0; |
5147 | } | 5165 | } |
5148 | 5166 | ||
5167 | /* | ||
5168 | * iwl3945_free_channel_map - undo allocations in iwl3945_init_channel_map | ||
5169 | */ | ||
5170 | static void iwl3945_free_channel_map(struct iwl3945_priv *priv) | ||
5171 | { | ||
5172 | kfree(priv->channel_info); | ||
5173 | priv->channel_count = 0; | ||
5174 | } | ||
5175 | |||
5149 | /* For active scan, listen ACTIVE_DWELL_TIME (msec) on each channel after | 5176 | /* For active scan, listen ACTIVE_DWELL_TIME (msec) on each channel after |
5150 | * sending probe req. This should be set long enough to hear probe responses | 5177 | * sending probe req. This should be set long enough to hear probe responses |
5151 | * from more than one AP. */ | 5178 | * from more than one AP. */ |
@@ -5471,6 +5498,17 @@ static int iwl3945_init_geos(struct iwl3945_priv *priv) | |||
5471 | return 0; | 5498 | return 0; |
5472 | } | 5499 | } |
5473 | 5500 | ||
5501 | /* | ||
5502 | * iwl3945_free_geos - undo allocations in iwl3945_init_geos | ||
5503 | */ | ||
5504 | static void iwl3945_free_geos(struct iwl3945_priv *priv) | ||
5505 | { | ||
5506 | kfree(priv->modes); | ||
5507 | kfree(priv->ieee_channels); | ||
5508 | kfree(priv->ieee_rates); | ||
5509 | clear_bit(STATUS_GEO_CONFIGURED, &priv->status); | ||
5510 | } | ||
5511 | |||
5474 | /****************************************************************************** | 5512 | /****************************************************************************** |
5475 | * | 5513 | * |
5476 | * uCode download functions | 5514 | * uCode download functions |
@@ -6130,15 +6168,6 @@ static void iwl3945_alive_start(struct iwl3945_priv *priv) | |||
6130 | /* Clear out the uCode error bit if it is set */ | 6168 | /* Clear out the uCode error bit if it is set */ |
6131 | clear_bit(STATUS_FW_ERROR, &priv->status); | 6169 | clear_bit(STATUS_FW_ERROR, &priv->status); |
6132 | 6170 | ||
6133 | rc = iwl3945_init_channel_map(priv); | ||
6134 | if (rc) { | ||
6135 | IWL_ERROR("initializing regulatory failed: %d\n", rc); | ||
6136 | return; | ||
6137 | } | ||
6138 | |||
6139 | iwl3945_init_geos(priv); | ||
6140 | iwl3945_reset_channel_flag(priv); | ||
6141 | |||
6142 | if (iwl3945_is_rfkill(priv)) | 6171 | if (iwl3945_is_rfkill(priv)) |
6143 | return; | 6172 | return; |
6144 | 6173 | ||
@@ -6599,7 +6628,7 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
6599 | * that based on the direct_mask added to each channel entry */ | 6628 | * that based on the direct_mask added to each channel entry */ |
6600 | scan->tx_cmd.len = cpu_to_le16( | 6629 | scan->tx_cmd.len = cpu_to_le16( |
6601 | iwl3945_fill_probe_req(priv, (struct ieee80211_mgmt *)scan->data, | 6630 | iwl3945_fill_probe_req(priv, (struct ieee80211_mgmt *)scan->data, |
6602 | IWL_MAX_SCAN_SIZE - sizeof(scan), 0)); | 6631 | IWL_MAX_SCAN_SIZE - sizeof(*scan), 0)); |
6603 | scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK; | 6632 | scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK; |
6604 | scan->tx_cmd.sta_id = priv->hw_setting.bcast_sta_id; | 6633 | scan->tx_cmd.sta_id = priv->hw_setting.bcast_sta_id; |
6605 | scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; | 6634 | scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; |
@@ -7120,7 +7149,7 @@ static void iwl3945_config_ap(struct iwl3945_priv *priv) | |||
7120 | { | 7149 | { |
7121 | int rc = 0; | 7150 | int rc = 0; |
7122 | 7151 | ||
7123 | if (priv->status & STATUS_EXIT_PENDING) | 7152 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
7124 | return; | 7153 | return; |
7125 | 7154 | ||
7126 | /* The following should be done only at AP bring up */ | 7155 | /* The following should be done only at AP bring up */ |
@@ -8614,11 +8643,24 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
8614 | IWL_DEBUG_INFO("MAC address: %s\n", print_mac(mac, priv->mac_addr)); | 8643 | IWL_DEBUG_INFO("MAC address: %s\n", print_mac(mac, priv->mac_addr)); |
8615 | SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr); | 8644 | SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr); |
8616 | 8645 | ||
8646 | err = iwl3945_init_channel_map(priv); | ||
8647 | if (err) { | ||
8648 | IWL_ERROR("initializing regulatory failed: %d\n", err); | ||
8649 | goto out_remove_sysfs; | ||
8650 | } | ||
8651 | |||
8652 | err = iwl3945_init_geos(priv); | ||
8653 | if (err) { | ||
8654 | IWL_ERROR("initializing geos failed: %d\n", err); | ||
8655 | goto out_free_channel_map; | ||
8656 | } | ||
8657 | iwl3945_reset_channel_flag(priv); | ||
8658 | |||
8617 | iwl3945_rate_control_register(priv->hw); | 8659 | iwl3945_rate_control_register(priv->hw); |
8618 | err = ieee80211_register_hw(priv->hw); | 8660 | err = ieee80211_register_hw(priv->hw); |
8619 | if (err) { | 8661 | if (err) { |
8620 | IWL_ERROR("Failed to register network device (error %d)\n", err); | 8662 | IWL_ERROR("Failed to register network device (error %d)\n", err); |
8621 | goto out_remove_sysfs; | 8663 | goto out_free_geos; |
8622 | } | 8664 | } |
8623 | 8665 | ||
8624 | priv->hw->conf.beacon_int = 100; | 8666 | priv->hw->conf.beacon_int = 100; |
@@ -8628,6 +8670,10 @@ static int iwl3945_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
8628 | 8670 | ||
8629 | return 0; | 8671 | return 0; |
8630 | 8672 | ||
8673 | out_free_geos: | ||
8674 | iwl3945_free_geos(priv); | ||
8675 | out_free_channel_map: | ||
8676 | iwl3945_free_channel_map(priv); | ||
8631 | out_remove_sysfs: | 8677 | out_remove_sysfs: |
8632 | sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group); | 8678 | sysfs_remove_group(&pdev->dev.kobj, &iwl3945_attribute_group); |
8633 | 8679 | ||
@@ -8702,10 +8748,8 @@ static void iwl3945_pci_remove(struct pci_dev *pdev) | |||
8702 | pci_disable_device(pdev); | 8748 | pci_disable_device(pdev); |
8703 | pci_set_drvdata(pdev, NULL); | 8749 | pci_set_drvdata(pdev, NULL); |
8704 | 8750 | ||
8705 | kfree(priv->channel_info); | 8751 | iwl3945_free_channel_map(priv); |
8706 | 8752 | iwl3945_free_geos(priv); | |
8707 | kfree(priv->ieee_channels); | ||
8708 | kfree(priv->ieee_rates); | ||
8709 | 8753 | ||
8710 | if (priv->ibss_beacon) | 8754 | if (priv->ibss_beacon) |
8711 | dev_kfree_skb(priv->ibss_beacon); | 8755 | dev_kfree_skb(priv->ibss_beacon); |
diff --git a/drivers/net/wireless/iwlwifi/iwl4965-base.c b/drivers/net/wireless/iwlwifi/iwl4965-base.c index c86da5cd1df1..bf3a60c037aa 100644 --- a/drivers/net/wireless/iwlwifi/iwl4965-base.c +++ b/drivers/net/wireless/iwlwifi/iwl4965-base.c | |||
@@ -1639,6 +1639,12 @@ static void get_eeprom_mac(struct iwl4965_priv *priv, u8 *mac) | |||
1639 | memcpy(mac, priv->eeprom.mac_address, 6); | 1639 | memcpy(mac, priv->eeprom.mac_address, 6); |
1640 | } | 1640 | } |
1641 | 1641 | ||
1642 | static inline void iwl4965_eeprom_release_semaphore(struct iwl4965_priv *priv) | ||
1643 | { | ||
1644 | iwl4965_clear_bit(priv, CSR_HW_IF_CONFIG_REG, | ||
1645 | CSR_HW_IF_CONFIG_REG_BIT_EEPROM_OWN_SEM); | ||
1646 | } | ||
1647 | |||
1642 | /** | 1648 | /** |
1643 | * iwl4965_eeprom_init - read EEPROM contents | 1649 | * iwl4965_eeprom_init - read EEPROM contents |
1644 | * | 1650 | * |
@@ -2927,8 +2933,10 @@ static int iwl4965_tx_skb(struct iwl4965_priv *priv, | |||
2927 | #endif | 2933 | #endif |
2928 | 2934 | ||
2929 | /* drop all data frame if we are not associated */ | 2935 | /* drop all data frame if we are not associated */ |
2930 | if (!iwl4965_is_associated(priv) && !priv->assoc_id && | 2936 | if (((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA) && |
2931 | ((fc & IEEE80211_FCTL_FTYPE) == IEEE80211_FTYPE_DATA)) { | 2937 | (!iwl4965_is_associated(priv) || |
2938 | !priv->assoc_id || | ||
2939 | !priv->assoc_station_added)) { | ||
2932 | IWL_DEBUG_DROP("Dropping - !iwl4965_is_associated\n"); | 2940 | IWL_DEBUG_DROP("Dropping - !iwl4965_is_associated\n"); |
2933 | goto drop_unlock; | 2941 | goto drop_unlock; |
2934 | } | 2942 | } |
@@ -5131,8 +5139,9 @@ static void iwl4965_irq_tasklet(struct iwl4965_priv *priv) | |||
5131 | #ifdef CONFIG_IWL4965_DEBUG | 5139 | #ifdef CONFIG_IWL4965_DEBUG |
5132 | if (iwl4965_debug_level & (IWL_DL_ISR)) { | 5140 | if (iwl4965_debug_level & (IWL_DL_ISR)) { |
5133 | /* NIC fires this, but we don't use it, redundant with WAKEUP */ | 5141 | /* NIC fires this, but we don't use it, redundant with WAKEUP */ |
5134 | if (inta & CSR_INT_BIT_MAC_CLK_ACTV) | 5142 | if (inta & CSR_INT_BIT_SCD) |
5135 | IWL_DEBUG_ISR("Microcode started or stopped.\n"); | 5143 | IWL_DEBUG_ISR("Scheduler finished to transmit " |
5144 | "the frame/frames.\n"); | ||
5136 | 5145 | ||
5137 | /* Alive notification via Rx interrupt will do the real work */ | 5146 | /* Alive notification via Rx interrupt will do the real work */ |
5138 | if (inta & CSR_INT_BIT_ALIVE) | 5147 | if (inta & CSR_INT_BIT_ALIVE) |
@@ -5140,7 +5149,7 @@ static void iwl4965_irq_tasklet(struct iwl4965_priv *priv) | |||
5140 | } | 5149 | } |
5141 | #endif | 5150 | #endif |
5142 | /* Safely ignore these bits for debug checks below */ | 5151 | /* Safely ignore these bits for debug checks below */ |
5143 | inta &= ~(CSR_INT_BIT_MAC_CLK_ACTV | CSR_INT_BIT_ALIVE); | 5152 | inta &= ~(CSR_INT_BIT_SCD | CSR_INT_BIT_ALIVE); |
5144 | 5153 | ||
5145 | /* HW RF KILL switch toggled */ | 5154 | /* HW RF KILL switch toggled */ |
5146 | if (inta & CSR_INT_BIT_RF_KILL) { | 5155 | if (inta & CSR_INT_BIT_RF_KILL) { |
@@ -5269,8 +5278,11 @@ static irqreturn_t iwl4965_isr(int irq, void *data) | |||
5269 | IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n", | 5278 | IWL_DEBUG_ISR("ISR inta 0x%08x, enabled 0x%08x, fh 0x%08x\n", |
5270 | inta, inta_mask, inta_fh); | 5279 | inta, inta_mask, inta_fh); |
5271 | 5280 | ||
5281 | inta &= ~CSR_INT_BIT_SCD; | ||
5282 | |||
5272 | /* iwl4965_irq_tasklet() will service interrupts and re-enable them */ | 5283 | /* iwl4965_irq_tasklet() will service interrupts and re-enable them */ |
5273 | tasklet_schedule(&priv->irq_tasklet); | 5284 | if (likely(inta || inta_fh)) |
5285 | tasklet_schedule(&priv->irq_tasklet); | ||
5274 | 5286 | ||
5275 | unplugged: | 5287 | unplugged: |
5276 | spin_unlock(&priv->lock); | 5288 | spin_unlock(&priv->lock); |
@@ -5576,6 +5588,15 @@ static int iwl4965_init_channel_map(struct iwl4965_priv *priv) | |||
5576 | return 0; | 5588 | return 0; |
5577 | } | 5589 | } |
5578 | 5590 | ||
5591 | /* | ||
5592 | * iwl4965_free_channel_map - undo allocations in iwl4965_init_channel_map | ||
5593 | */ | ||
5594 | static void iwl4965_free_channel_map(struct iwl4965_priv *priv) | ||
5595 | { | ||
5596 | kfree(priv->channel_info); | ||
5597 | priv->channel_count = 0; | ||
5598 | } | ||
5599 | |||
5579 | /* For active scan, listen ACTIVE_DWELL_TIME (msec) on each channel after | 5600 | /* For active scan, listen ACTIVE_DWELL_TIME (msec) on each channel after |
5580 | * sending probe req. This should be set long enough to hear probe responses | 5601 | * sending probe req. This should be set long enough to hear probe responses |
5581 | * from more than one AP. */ | 5602 | * from more than one AP. */ |
@@ -5909,6 +5930,17 @@ static int iwl4965_init_geos(struct iwl4965_priv *priv) | |||
5909 | return 0; | 5930 | return 0; |
5910 | } | 5931 | } |
5911 | 5932 | ||
5933 | /* | ||
5934 | * iwl4965_free_geos - undo allocations in iwl4965_init_geos | ||
5935 | */ | ||
5936 | static void iwl4965_free_geos(struct iwl4965_priv *priv) | ||
5937 | { | ||
5938 | kfree(priv->modes); | ||
5939 | kfree(priv->ieee_channels); | ||
5940 | kfree(priv->ieee_rates); | ||
5941 | clear_bit(STATUS_GEO_CONFIGURED, &priv->status); | ||
5942 | } | ||
5943 | |||
5912 | /****************************************************************************** | 5944 | /****************************************************************************** |
5913 | * | 5945 | * |
5914 | * uCode download functions | 5946 | * uCode download functions |
@@ -6560,15 +6592,6 @@ static void iwl4965_alive_start(struct iwl4965_priv *priv) | |||
6560 | /* Clear out the uCode error bit if it is set */ | 6592 | /* Clear out the uCode error bit if it is set */ |
6561 | clear_bit(STATUS_FW_ERROR, &priv->status); | 6593 | clear_bit(STATUS_FW_ERROR, &priv->status); |
6562 | 6594 | ||
6563 | rc = iwl4965_init_channel_map(priv); | ||
6564 | if (rc) { | ||
6565 | IWL_ERROR("initializing regulatory failed: %d\n", rc); | ||
6566 | return; | ||
6567 | } | ||
6568 | |||
6569 | iwl4965_init_geos(priv); | ||
6570 | iwl4965_reset_channel_flag(priv); | ||
6571 | |||
6572 | if (iwl4965_is_rfkill(priv)) | 6595 | if (iwl4965_is_rfkill(priv)) |
6573 | return; | 6596 | return; |
6574 | 6597 | ||
@@ -7023,7 +7046,7 @@ static void iwl4965_bg_request_scan(struct work_struct *data) | |||
7023 | * that based on the direct_mask added to each channel entry */ | 7046 | * that based on the direct_mask added to each channel entry */ |
7024 | scan->tx_cmd.len = cpu_to_le16( | 7047 | scan->tx_cmd.len = cpu_to_le16( |
7025 | iwl4965_fill_probe_req(priv, (struct ieee80211_mgmt *)scan->data, | 7048 | iwl4965_fill_probe_req(priv, (struct ieee80211_mgmt *)scan->data, |
7026 | IWL_MAX_SCAN_SIZE - sizeof(scan), 0)); | 7049 | IWL_MAX_SCAN_SIZE - sizeof(*scan), 0)); |
7027 | scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK; | 7050 | scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK; |
7028 | scan->tx_cmd.sta_id = priv->hw_setting.bcast_sta_id; | 7051 | scan->tx_cmd.sta_id = priv->hw_setting.bcast_sta_id; |
7029 | scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; | 7052 | scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; |
@@ -7448,7 +7471,7 @@ static int iwl4965_mac_add_interface(struct ieee80211_hw *hw, | |||
7448 | 7471 | ||
7449 | if (priv->vif) { | 7472 | if (priv->vif) { |
7450 | IWL_DEBUG_MAC80211("leave - vif != NULL\n"); | 7473 | IWL_DEBUG_MAC80211("leave - vif != NULL\n"); |
7451 | return 0; | 7474 | return -EOPNOTSUPP; |
7452 | } | 7475 | } |
7453 | 7476 | ||
7454 | spin_lock_irqsave(&priv->lock, flags); | 7477 | spin_lock_irqsave(&priv->lock, flags); |
@@ -7580,7 +7603,7 @@ static void iwl4965_config_ap(struct iwl4965_priv *priv) | |||
7580 | { | 7603 | { |
7581 | int rc = 0; | 7604 | int rc = 0; |
7582 | 7605 | ||
7583 | if (priv->status & STATUS_EXIT_PENDING) | 7606 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) |
7584 | return; | 7607 | return; |
7585 | 7608 | ||
7586 | /* The following should be done only at AP bring up */ | 7609 | /* The following should be done only at AP bring up */ |
@@ -9198,11 +9221,24 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
9198 | IWL_DEBUG_INFO("MAC address: %s\n", print_mac(mac, priv->mac_addr)); | 9221 | IWL_DEBUG_INFO("MAC address: %s\n", print_mac(mac, priv->mac_addr)); |
9199 | SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr); | 9222 | SET_IEEE80211_PERM_ADDR(priv->hw, priv->mac_addr); |
9200 | 9223 | ||
9224 | err = iwl4965_init_channel_map(priv); | ||
9225 | if (err) { | ||
9226 | IWL_ERROR("initializing regulatory failed: %d\n", err); | ||
9227 | goto out_remove_sysfs; | ||
9228 | } | ||
9229 | |||
9230 | err = iwl4965_init_geos(priv); | ||
9231 | if (err) { | ||
9232 | IWL_ERROR("initializing geos failed: %d\n", err); | ||
9233 | goto out_free_channel_map; | ||
9234 | } | ||
9235 | iwl4965_reset_channel_flag(priv); | ||
9236 | |||
9201 | iwl4965_rate_control_register(priv->hw); | 9237 | iwl4965_rate_control_register(priv->hw); |
9202 | err = ieee80211_register_hw(priv->hw); | 9238 | err = ieee80211_register_hw(priv->hw); |
9203 | if (err) { | 9239 | if (err) { |
9204 | IWL_ERROR("Failed to register network device (error %d)\n", err); | 9240 | IWL_ERROR("Failed to register network device (error %d)\n", err); |
9205 | goto out_remove_sysfs; | 9241 | goto out_free_geos; |
9206 | } | 9242 | } |
9207 | 9243 | ||
9208 | priv->hw->conf.beacon_int = 100; | 9244 | priv->hw->conf.beacon_int = 100; |
@@ -9212,6 +9248,10 @@ static int iwl4965_pci_probe(struct pci_dev *pdev, const struct pci_device_id *e | |||
9212 | 9248 | ||
9213 | return 0; | 9249 | return 0; |
9214 | 9250 | ||
9251 | out_free_geos: | ||
9252 | iwl4965_free_geos(priv); | ||
9253 | out_free_channel_map: | ||
9254 | iwl4965_free_channel_map(priv); | ||
9215 | out_remove_sysfs: | 9255 | out_remove_sysfs: |
9216 | sysfs_remove_group(&pdev->dev.kobj, &iwl4965_attribute_group); | 9256 | sysfs_remove_group(&pdev->dev.kobj, &iwl4965_attribute_group); |
9217 | 9257 | ||
@@ -9286,10 +9326,8 @@ static void iwl4965_pci_remove(struct pci_dev *pdev) | |||
9286 | pci_disable_device(pdev); | 9326 | pci_disable_device(pdev); |
9287 | pci_set_drvdata(pdev, NULL); | 9327 | pci_set_drvdata(pdev, NULL); |
9288 | 9328 | ||
9289 | kfree(priv->channel_info); | 9329 | iwl4965_free_channel_map(priv); |
9290 | 9330 | iwl4965_free_geos(priv); | |
9291 | kfree(priv->ieee_channels); | ||
9292 | kfree(priv->ieee_rates); | ||
9293 | 9331 | ||
9294 | if (priv->ibss_beacon) | 9332 | if (priv->ibss_beacon) |
9295 | dev_kfree_skb(priv->ibss_beacon); | 9333 | dev_kfree_skb(priv->ibss_beacon); |
diff --git a/drivers/net/wireless/libertas/assoc.c b/drivers/net/wireless/libertas/assoc.c index c622e9b63cd1..87e145ffe8f1 100644 --- a/drivers/net/wireless/libertas/assoc.c +++ b/drivers/net/wireless/libertas/assoc.c | |||
@@ -12,8 +12,10 @@ | |||
12 | #include "cmd.h" | 12 | #include "cmd.h" |
13 | 13 | ||
14 | 14 | ||
15 | static const u8 bssid_any[ETH_ALEN] = { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; | 15 | static const u8 bssid_any[ETH_ALEN] __attribute__ ((aligned (2))) = |
16 | static const u8 bssid_off[ETH_ALEN] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; | 16 | { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF }; |
17 | static const u8 bssid_off[ETH_ALEN] __attribute__ ((aligned (2))) = | ||
18 | { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; | ||
17 | 19 | ||
18 | 20 | ||
19 | static int assoc_helper_essid(struct lbs_private *priv, | 21 | static int assoc_helper_essid(struct lbs_private *priv, |
diff --git a/drivers/net/wireless/libertas/dev.h b/drivers/net/wireless/libertas/dev.h index 58d7ef6b5ff5..5a69f2b60865 100644 --- a/drivers/net/wireless/libertas/dev.h +++ b/drivers/net/wireless/libertas/dev.h | |||
@@ -349,7 +349,7 @@ struct assoc_request { | |||
349 | u8 channel; | 349 | u8 channel; |
350 | u8 band; | 350 | u8 band; |
351 | u8 mode; | 351 | u8 mode; |
352 | u8 bssid[ETH_ALEN]; | 352 | u8 bssid[ETH_ALEN] __attribute__ ((aligned (2))); |
353 | 353 | ||
354 | /** WEP keys */ | 354 | /** WEP keys */ |
355 | struct enc_key wep_keys[4]; | 355 | struct enc_key wep_keys[4]; |
diff --git a/drivers/net/wireless/libertas/if_cs.c b/drivers/net/wireless/libertas/if_cs.c index 4b5ab9a6b97b..5a9cadb97503 100644 --- a/drivers/net/wireless/libertas/if_cs.c +++ b/drivers/net/wireless/libertas/if_cs.c | |||
@@ -249,14 +249,14 @@ static irqreturn_t if_cs_interrupt(int irq, void *data) | |||
249 | lbs_deb_enter(LBS_DEB_CS); | 249 | lbs_deb_enter(LBS_DEB_CS); |
250 | 250 | ||
251 | int_cause = if_cs_read16(card, IF_CS_C_INT_CAUSE); | 251 | int_cause = if_cs_read16(card, IF_CS_C_INT_CAUSE); |
252 | if(int_cause == 0x0) { | 252 | if (int_cause == 0x0) { |
253 | /* Not for us */ | 253 | /* Not for us */ |
254 | return IRQ_NONE; | 254 | return IRQ_NONE; |
255 | 255 | ||
256 | } else if (int_cause == 0xffff) { | 256 | } else if (int_cause == 0xffff) { |
257 | /* Read in junk, the card has probably been removed */ | 257 | /* Read in junk, the card has probably been removed */ |
258 | card->priv->surpriseremoved = 1; | 258 | card->priv->surpriseremoved = 1; |
259 | 259 | return IRQ_HANDLED; | |
260 | } else { | 260 | } else { |
261 | if (int_cause & IF_CS_H_IC_TX_OVER) | 261 | if (int_cause & IF_CS_H_IC_TX_OVER) |
262 | lbs_host_to_card_done(card->priv); | 262 | lbs_host_to_card_done(card->priv); |
@@ -717,8 +717,8 @@ static void if_cs_release(struct pcmcia_device *p_dev) | |||
717 | 717 | ||
718 | lbs_deb_enter(LBS_DEB_CS); | 718 | lbs_deb_enter(LBS_DEB_CS); |
719 | 719 | ||
720 | pcmcia_disable_device(p_dev); | ||
721 | free_irq(p_dev->irq.AssignedIRQ, card); | 720 | free_irq(p_dev->irq.AssignedIRQ, card); |
721 | pcmcia_disable_device(p_dev); | ||
722 | if (card->iobase) | 722 | if (card->iobase) |
723 | ioport_unmap(card->iobase); | 723 | ioport_unmap(card->iobase); |
724 | 724 | ||
diff --git a/drivers/net/wireless/rndis_wlan.c b/drivers/net/wireless/rndis_wlan.c new file mode 100644 index 000000000000..d3ecf89abd93 --- /dev/null +++ b/drivers/net/wireless/rndis_wlan.c | |||
@@ -0,0 +1,2757 @@ | |||
1 | /* | ||
2 | * Driver for RNDIS based wireless USB devices. | ||
3 | * | ||
4 | * Copyright (C) 2007 by Bjorge Dijkstra <bjd@jooz.net> | ||
5 | * Copyright (C) 2008 by Jussi Kivilinna <jussi.kivilinna@mbnet.fi> | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of the GNU General Public License as published by | ||
9 | * the Free Software Foundation; either version 2 of the License, or | ||
10 | * (at your option) any later version. | ||
11 | * | ||
12 | * This program is distributed in the hope that it will be useful, | ||
13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
15 | * GNU General Public License for more details. | ||
16 | * | ||
17 | * You should have received a copy of the GNU General Public License | ||
18 | * along with this program; if not, write to the Free Software | ||
19 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
20 | * | ||
21 | * Portions of this file are based on NDISwrapper project, | ||
22 | * Copyright (C) 2003-2005 Pontus Fuchs, Giridhar Pemmasani | ||
23 | * http://ndiswrapper.sourceforge.net/ | ||
24 | */ | ||
25 | |||
26 | // #define DEBUG // error path messages, extra info | ||
27 | // #define VERBOSE // more; success messages | ||
28 | |||
29 | #include <linux/module.h> | ||
30 | #include <linux/init.h> | ||
31 | #include <linux/netdevice.h> | ||
32 | #include <linux/etherdevice.h> | ||
33 | #include <linux/ethtool.h> | ||
34 | #include <linux/workqueue.h> | ||
35 | #include <linux/mutex.h> | ||
36 | #include <linux/mii.h> | ||
37 | #include <linux/usb.h> | ||
38 | #include <linux/usb/cdc.h> | ||
39 | #include <linux/wireless.h> | ||
40 | #include <linux/if_arp.h> | ||
41 | #include <linux/ctype.h> | ||
42 | #include <linux/spinlock.h> | ||
43 | #include <net/iw_handler.h> | ||
44 | #include <net/ieee80211.h> | ||
45 | #include <linux/usb/usbnet.h> | ||
46 | #include <linux/usb/rndis_host.h> | ||
47 | |||
48 | |||
49 | /* NOTE: All these are settings for Broadcom chipset */ | ||
50 | static char modparam_country[4] = "EU"; | ||
51 | module_param_string(country, modparam_country, 4, 0444); | ||
52 | MODULE_PARM_DESC(country, "Country code (ISO 3166-1 alpha-2), default: EU"); | ||
53 | |||
54 | static int modparam_frameburst = 1; | ||
55 | module_param_named(frameburst, modparam_frameburst, int, 0444); | ||
56 | MODULE_PARM_DESC(frameburst, "enable frame bursting (default: on)"); | ||
57 | |||
58 | static int modparam_afterburner = 0; | ||
59 | module_param_named(afterburner, modparam_afterburner, int, 0444); | ||
60 | MODULE_PARM_DESC(afterburner, | ||
61 | "enable afterburner aka '125 High Speed Mode' (default: off)"); | ||
62 | |||
63 | static int modparam_power_save = 0; | ||
64 | module_param_named(power_save, modparam_power_save, int, 0444); | ||
65 | MODULE_PARM_DESC(power_save, | ||
66 | "set power save mode: 0=off, 1=on, 2=fast (default: off)"); | ||
67 | |||
68 | static int modparam_power_output = 3; | ||
69 | module_param_named(power_output, modparam_power_output, int, 0444); | ||
70 | MODULE_PARM_DESC(power_output, | ||
71 | "set power output: 0=25%, 1=50%, 2=75%, 3=100% (default: 100%)"); | ||
72 | |||
73 | static int modparam_roamtrigger = -70; | ||
74 | module_param_named(roamtrigger, modparam_roamtrigger, int, 0444); | ||
75 | MODULE_PARM_DESC(roamtrigger, | ||
76 | "set roaming dBm trigger: -80=optimize for distance, " | ||
77 | "-60=bandwidth (default: -70)"); | ||
78 | |||
79 | static int modparam_roamdelta = 1; | ||
80 | module_param_named(roamdelta, modparam_roamdelta, int, 0444); | ||
81 | MODULE_PARM_DESC(roamdelta, | ||
82 | "set roaming tendency: 0=aggressive, 1=moderate, " | ||
83 | "2=conservative (default: moderate)"); | ||
84 | |||
85 | static int modparam_workaround_interval = 500; | ||
86 | module_param_named(workaround_interval, modparam_workaround_interval, | ||
87 | int, 0444); | ||
88 | MODULE_PARM_DESC(workaround_interval, | ||
89 | "set stall workaround interval in msecs (default: 500)"); | ||
90 | |||
91 | |||
92 | /* various RNDIS OID defs */ | ||
93 | #define OID_GEN_LINK_SPEED ccpu2(0x00010107) | ||
94 | #define OID_GEN_RNDIS_CONFIG_PARAMETER ccpu2(0x0001021b) | ||
95 | |||
96 | #define OID_GEN_XMIT_OK ccpu2(0x00020101) | ||
97 | #define OID_GEN_RCV_OK ccpu2(0x00020102) | ||
98 | #define OID_GEN_XMIT_ERROR ccpu2(0x00020103) | ||
99 | #define OID_GEN_RCV_ERROR ccpu2(0x00020104) | ||
100 | #define OID_GEN_RCV_NO_BUFFER ccpu2(0x00020105) | ||
101 | |||
102 | #define OID_802_3_PERMANENT_ADDRESS ccpu2(0x01010101) | ||
103 | #define OID_802_3_CURRENT_ADDRESS ccpu2(0x01010102) | ||
104 | #define OID_802_3_MULTICAST_LIST ccpu2(0x01010103) | ||
105 | #define OID_802_3_MAXIMUM_LIST_SIZE ccpu2(0x01010104) | ||
106 | |||
107 | #define OID_802_11_BSSID ccpu2(0x0d010101) | ||
108 | #define OID_802_11_SSID ccpu2(0x0d010102) | ||
109 | #define OID_802_11_INFRASTRUCTURE_MODE ccpu2(0x0d010108) | ||
110 | #define OID_802_11_ADD_WEP ccpu2(0x0d010113) | ||
111 | #define OID_802_11_REMOVE_WEP ccpu2(0x0d010114) | ||
112 | #define OID_802_11_DISASSOCIATE ccpu2(0x0d010115) | ||
113 | #define OID_802_11_AUTHENTICATION_MODE ccpu2(0x0d010118) | ||
114 | #define OID_802_11_PRIVACY_FILTER ccpu2(0x0d010119) | ||
115 | #define OID_802_11_BSSID_LIST_SCAN ccpu2(0x0d01011a) | ||
116 | #define OID_802_11_ENCRYPTION_STATUS ccpu2(0x0d01011b) | ||
117 | #define OID_802_11_ADD_KEY ccpu2(0x0d01011d) | ||
118 | #define OID_802_11_REMOVE_KEY ccpu2(0x0d01011e) | ||
119 | #define OID_802_11_PMKID ccpu2(0x0d010123) | ||
120 | #define OID_802_11_NETWORK_TYPES_SUPPORTED ccpu2(0x0d010203) | ||
121 | #define OID_802_11_NETWORK_TYPE_IN_USE ccpu2(0x0d010204) | ||
122 | #define OID_802_11_TX_POWER_LEVEL ccpu2(0x0d010205) | ||
123 | #define OID_802_11_RSSI ccpu2(0x0d010206) | ||
124 | #define OID_802_11_RSSI_TRIGGER ccpu2(0x0d010207) | ||
125 | #define OID_802_11_FRAGMENTATION_THRESHOLD ccpu2(0x0d010209) | ||
126 | #define OID_802_11_RTS_THRESHOLD ccpu2(0x0d01020a) | ||
127 | #define OID_802_11_SUPPORTED_RATES ccpu2(0x0d01020e) | ||
128 | #define OID_802_11_CONFIGURATION ccpu2(0x0d010211) | ||
129 | #define OID_802_11_BSSID_LIST ccpu2(0x0d010217) | ||
130 | |||
131 | |||
132 | /* Typical noise/maximum signal level values taken from ndiswrapper iw_ndis.h */ | ||
133 | #define WL_NOISE -96 /* typical noise level in dBm */ | ||
134 | #define WL_SIGMAX -32 /* typical maximum signal level in dBm */ | ||
135 | |||
136 | |||
137 | /* Assume that Broadcom 4320 (only chipset at time of writing known to be | ||
138 | * based on wireless rndis) has default txpower of 13dBm. | ||
139 | * This value is from Linksys WUSB54GSC User Guide, Appendix F: Specifications. | ||
140 | * 13dBm == 19.9mW | ||
141 | */ | ||
142 | #define BCM4320_DEFAULT_TXPOWER 20 | ||
143 | |||
144 | |||
145 | /* codes for "status" field of completion messages */ | ||
146 | #define RNDIS_STATUS_ADAPTER_NOT_READY ccpu2(0xc0010011) | ||
147 | #define RNDIS_STATUS_ADAPTER_NOT_OPEN ccpu2(0xc0010012) | ||
148 | |||
149 | |||
150 | /* NDIS data structures. Taken from wpa_supplicant driver_ndis.c | ||
151 | * slightly modified for datatype endianess, etc | ||
152 | */ | ||
153 | #define NDIS_802_11_LENGTH_SSID 32 | ||
154 | #define NDIS_802_11_LENGTH_RATES 8 | ||
155 | #define NDIS_802_11_LENGTH_RATES_EX 16 | ||
156 | |||
157 | struct NDIS_802_11_SSID { | ||
158 | __le32 SsidLength; | ||
159 | u8 Ssid[NDIS_802_11_LENGTH_SSID]; | ||
160 | } __attribute__((packed)); | ||
161 | |||
162 | enum NDIS_802_11_NETWORK_TYPE { | ||
163 | Ndis802_11FH, | ||
164 | Ndis802_11DS, | ||
165 | Ndis802_11OFDM5, | ||
166 | Ndis802_11OFDM24, | ||
167 | Ndis802_11NetworkTypeMax | ||
168 | }; | ||
169 | |||
170 | struct NDIS_802_11_CONFIGURATION_FH { | ||
171 | __le32 Length; | ||
172 | __le32 HopPattern; | ||
173 | __le32 HopSet; | ||
174 | __le32 DwellTime; | ||
175 | } __attribute__((packed)); | ||
176 | |||
177 | struct NDIS_802_11_CONFIGURATION { | ||
178 | __le32 Length; | ||
179 | __le32 BeaconPeriod; | ||
180 | __le32 ATIMWindow; | ||
181 | __le32 DSConfig; | ||
182 | struct NDIS_802_11_CONFIGURATION_FH FHConfig; | ||
183 | } __attribute__((packed)); | ||
184 | |||
185 | enum NDIS_802_11_NETWORK_INFRASTRUCTURE { | ||
186 | Ndis802_11IBSS, | ||
187 | Ndis802_11Infrastructure, | ||
188 | Ndis802_11AutoUnknown, | ||
189 | Ndis802_11InfrastructureMax | ||
190 | }; | ||
191 | |||
192 | enum NDIS_802_11_AUTHENTICATION_MODE { | ||
193 | Ndis802_11AuthModeOpen, | ||
194 | Ndis802_11AuthModeShared, | ||
195 | Ndis802_11AuthModeAutoSwitch, | ||
196 | Ndis802_11AuthModeWPA, | ||
197 | Ndis802_11AuthModeWPAPSK, | ||
198 | Ndis802_11AuthModeWPANone, | ||
199 | Ndis802_11AuthModeWPA2, | ||
200 | Ndis802_11AuthModeWPA2PSK, | ||
201 | Ndis802_11AuthModeMax | ||
202 | }; | ||
203 | |||
204 | enum NDIS_802_11_ENCRYPTION_STATUS { | ||
205 | Ndis802_11WEPEnabled, | ||
206 | Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled, | ||
207 | Ndis802_11WEPDisabled, | ||
208 | Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled, | ||
209 | Ndis802_11WEPKeyAbsent, | ||
210 | Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent, | ||
211 | Ndis802_11WEPNotSupported, | ||
212 | Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported, | ||
213 | Ndis802_11Encryption2Enabled, | ||
214 | Ndis802_11Encryption2KeyAbsent, | ||
215 | Ndis802_11Encryption3Enabled, | ||
216 | Ndis802_11Encryption3KeyAbsent | ||
217 | }; | ||
218 | |||
219 | enum NDIS_802_11_PRIVACY_FILTER { | ||
220 | Ndis802_11PrivFilterAcceptAll, | ||
221 | Ndis802_11PrivFilter8021xWEP | ||
222 | }; | ||
223 | |||
224 | struct NDIS_WLAN_BSSID_EX { | ||
225 | __le32 Length; | ||
226 | u8 MacAddress[6]; | ||
227 | u8 Padding[2]; | ||
228 | struct NDIS_802_11_SSID Ssid; | ||
229 | __le32 Privacy; | ||
230 | __le32 Rssi; | ||
231 | enum NDIS_802_11_NETWORK_TYPE NetworkTypeInUse; | ||
232 | struct NDIS_802_11_CONFIGURATION Configuration; | ||
233 | enum NDIS_802_11_NETWORK_INFRASTRUCTURE InfrastructureMode; | ||
234 | u8 SupportedRates[NDIS_802_11_LENGTH_RATES_EX]; | ||
235 | __le32 IELength; | ||
236 | u8 IEs[0]; | ||
237 | } __attribute__((packed)); | ||
238 | |||
239 | struct NDIS_802_11_BSSID_LIST_EX { | ||
240 | __le32 NumberOfItems; | ||
241 | struct NDIS_WLAN_BSSID_EX Bssid[0]; | ||
242 | } __attribute__((packed)); | ||
243 | |||
244 | struct NDIS_802_11_FIXED_IEs { | ||
245 | u8 Timestamp[8]; | ||
246 | __le16 BeaconInterval; | ||
247 | __le16 Capabilities; | ||
248 | } __attribute__((packed)); | ||
249 | |||
250 | struct NDIS_802_11_WEP { | ||
251 | __le32 Length; | ||
252 | __le32 KeyIndex; | ||
253 | __le32 KeyLength; | ||
254 | u8 KeyMaterial[32]; | ||
255 | } __attribute__((packed)); | ||
256 | |||
257 | struct NDIS_802_11_KEY { | ||
258 | __le32 Length; | ||
259 | __le32 KeyIndex; | ||
260 | __le32 KeyLength; | ||
261 | u8 Bssid[6]; | ||
262 | u8 Padding[6]; | ||
263 | __le64 KeyRSC; | ||
264 | u8 KeyMaterial[32]; | ||
265 | } __attribute__((packed)); | ||
266 | |||
267 | struct NDIS_802_11_REMOVE_KEY { | ||
268 | __le32 Length; | ||
269 | __le32 KeyIndex; | ||
270 | u8 Bssid[6]; | ||
271 | } __attribute__((packed)); | ||
272 | |||
273 | struct RNDIS_CONFIG_PARAMETER_INFOBUFFER { | ||
274 | __le32 ParameterNameOffset; | ||
275 | __le32 ParameterNameLength; | ||
276 | __le32 ParameterType; | ||
277 | __le32 ParameterValueOffset; | ||
278 | __le32 ParameterValueLength; | ||
279 | } __attribute__((packed)); | ||
280 | |||
281 | /* these have to match what is in wpa_supplicant */ | ||
282 | enum { WPA_ALG_NONE, WPA_ALG_WEP, WPA_ALG_TKIP, WPA_ALG_CCMP } wpa_alg; | ||
283 | enum { CIPHER_NONE, CIPHER_WEP40, CIPHER_TKIP, CIPHER_CCMP, CIPHER_WEP104 } | ||
284 | wpa_cipher; | ||
285 | enum { KEY_MGMT_802_1X, KEY_MGMT_PSK, KEY_MGMT_NONE, KEY_MGMT_802_1X_NO_WPA, | ||
286 | KEY_MGMT_WPA_NONE } wpa_key_mgmt; | ||
287 | |||
288 | /* | ||
289 | * private data | ||
290 | */ | ||
291 | #define NET_TYPE_11FB 0 | ||
292 | |||
293 | #define CAP_MODE_80211A 1 | ||
294 | #define CAP_MODE_80211B 2 | ||
295 | #define CAP_MODE_80211G 4 | ||
296 | #define CAP_MODE_MASK 7 | ||
297 | #define CAP_SUPPORT_TXPOWER 8 | ||
298 | |||
299 | #define WORK_CONNECTION_EVENT (1<<0) | ||
300 | #define WORK_SET_MULTICAST_LIST (1<<1) | ||
301 | |||
302 | /* RNDIS device private data */ | ||
303 | struct rndis_wext_private { | ||
304 | char name[32]; | ||
305 | |||
306 | struct usbnet *usbdev; | ||
307 | |||
308 | struct workqueue_struct *workqueue; | ||
309 | struct delayed_work stats_work; | ||
310 | struct work_struct work; | ||
311 | struct mutex command_lock; | ||
312 | spinlock_t stats_lock; | ||
313 | unsigned long work_pending; | ||
314 | |||
315 | struct iw_statistics iwstats; | ||
316 | struct iw_statistics privstats; | ||
317 | |||
318 | int nick_len; | ||
319 | char nick[32]; | ||
320 | |||
321 | int caps; | ||
322 | int multicast_size; | ||
323 | |||
324 | /* module parameters */ | ||
325 | char param_country[4]; | ||
326 | int param_frameburst; | ||
327 | int param_afterburner; | ||
328 | int param_power_save; | ||
329 | int param_power_output; | ||
330 | int param_roamtrigger; | ||
331 | int param_roamdelta; | ||
332 | u32 param_workaround_interval; | ||
333 | |||
334 | /* hardware state */ | ||
335 | int radio_on; | ||
336 | int infra_mode; | ||
337 | struct NDIS_802_11_SSID essid; | ||
338 | |||
339 | /* encryption stuff */ | ||
340 | int encr_tx_key_index; | ||
341 | char encr_keys[4][32]; | ||
342 | int encr_key_len[4]; | ||
343 | int wpa_version; | ||
344 | int wpa_keymgmt; | ||
345 | int wpa_authalg; | ||
346 | int wpa_ie_len; | ||
347 | u8 *wpa_ie; | ||
348 | int wpa_cipher_pair; | ||
349 | int wpa_cipher_group; | ||
350 | }; | ||
351 | |||
352 | |||
353 | static const int freq_chan[] = { 2412, 2417, 2422, 2427, 2432, 2437, 2442, | ||
354 | 2447, 2452, 2457, 2462, 2467, 2472, 2484 }; | ||
355 | |||
356 | static const int rates_80211g[8] = { 6, 9, 12, 18, 24, 36, 48, 54 }; | ||
357 | |||
358 | static const int bcm4320_power_output[4] = { 25, 50, 75, 100 }; | ||
359 | |||
360 | static const unsigned char zero_bssid[ETH_ALEN] = {0,}; | ||
361 | static const unsigned char ffff_bssid[ETH_ALEN] = { 0xff, 0xff, 0xff, | ||
362 | 0xff, 0xff, 0xff }; | ||
363 | |||
364 | |||
365 | static struct rndis_wext_private *get_rndis_wext_priv(struct usbnet *dev) | ||
366 | { | ||
367 | return (struct rndis_wext_private *)dev->driver_priv; | ||
368 | } | ||
369 | |||
370 | |||
371 | static u32 get_bcm4320_power(struct rndis_wext_private *priv) | ||
372 | { | ||
373 | return BCM4320_DEFAULT_TXPOWER * | ||
374 | bcm4320_power_output[priv->param_power_output] / 100; | ||
375 | } | ||
376 | |||
377 | |||
378 | /* translate error code */ | ||
379 | static int rndis_error_status(__le32 rndis_status) | ||
380 | { | ||
381 | int ret = -EINVAL; | ||
382 | switch (rndis_status) { | ||
383 | case RNDIS_STATUS_SUCCESS: | ||
384 | ret = 0; | ||
385 | break; | ||
386 | case RNDIS_STATUS_FAILURE: | ||
387 | case RNDIS_STATUS_INVALID_DATA: | ||
388 | ret = -EINVAL; | ||
389 | break; | ||
390 | case RNDIS_STATUS_NOT_SUPPORTED: | ||
391 | ret = -EOPNOTSUPP; | ||
392 | break; | ||
393 | case RNDIS_STATUS_ADAPTER_NOT_READY: | ||
394 | case RNDIS_STATUS_ADAPTER_NOT_OPEN: | ||
395 | ret = -EBUSY; | ||
396 | break; | ||
397 | } | ||
398 | return ret; | ||
399 | } | ||
400 | |||
401 | |||
402 | static int rndis_query_oid(struct usbnet *dev, __le32 oid, void *data, int *len) | ||
403 | { | ||
404 | struct rndis_wext_private *priv = get_rndis_wext_priv(dev); | ||
405 | union { | ||
406 | void *buf; | ||
407 | struct rndis_msg_hdr *header; | ||
408 | struct rndis_query *get; | ||
409 | struct rndis_query_c *get_c; | ||
410 | } u; | ||
411 | int ret, buflen; | ||
412 | |||
413 | buflen = *len + sizeof(*u.get); | ||
414 | if (buflen < CONTROL_BUFFER_SIZE) | ||
415 | buflen = CONTROL_BUFFER_SIZE; | ||
416 | u.buf = kmalloc(buflen, GFP_KERNEL); | ||
417 | if (!u.buf) | ||
418 | return -ENOMEM; | ||
419 | memset(u.get, 0, sizeof *u.get); | ||
420 | u.get->msg_type = RNDIS_MSG_QUERY; | ||
421 | u.get->msg_len = ccpu2(sizeof *u.get); | ||
422 | u.get->oid = oid; | ||
423 | |||
424 | mutex_lock(&priv->command_lock); | ||
425 | ret = rndis_command(dev, u.header); | ||
426 | mutex_unlock(&priv->command_lock); | ||
427 | |||
428 | if (ret == 0) { | ||
429 | ret = le32_to_cpu(u.get_c->len); | ||
430 | *len = (*len > ret) ? ret : *len; | ||
431 | memcpy(data, u.buf + le32_to_cpu(u.get_c->offset) + 8, *len); | ||
432 | ret = rndis_error_status(u.get_c->status); | ||
433 | } | ||
434 | |||
435 | kfree(u.buf); | ||
436 | return ret; | ||
437 | } | ||
438 | |||
439 | |||
440 | static int rndis_set_oid(struct usbnet *dev, __le32 oid, void *data, int len) | ||
441 | { | ||
442 | struct rndis_wext_private *priv = get_rndis_wext_priv(dev); | ||
443 | union { | ||
444 | void *buf; | ||
445 | struct rndis_msg_hdr *header; | ||
446 | struct rndis_set *set; | ||
447 | struct rndis_set_c *set_c; | ||
448 | } u; | ||
449 | int ret, buflen; | ||
450 | |||
451 | buflen = len + sizeof(*u.set); | ||
452 | if (buflen < CONTROL_BUFFER_SIZE) | ||
453 | buflen = CONTROL_BUFFER_SIZE; | ||
454 | u.buf = kmalloc(buflen, GFP_KERNEL); | ||
455 | if (!u.buf) | ||
456 | return -ENOMEM; | ||
457 | |||
458 | memset(u.set, 0, sizeof *u.set); | ||
459 | u.set->msg_type = RNDIS_MSG_SET; | ||
460 | u.set->msg_len = cpu_to_le32(sizeof(*u.set) + len); | ||
461 | u.set->oid = oid; | ||
462 | u.set->len = cpu_to_le32(len); | ||
463 | u.set->offset = ccpu2(sizeof(*u.set) - 8); | ||
464 | u.set->handle = ccpu2(0); | ||
465 | memcpy(u.buf + sizeof(*u.set), data, len); | ||
466 | |||
467 | mutex_lock(&priv->command_lock); | ||
468 | ret = rndis_command(dev, u.header); | ||
469 | mutex_unlock(&priv->command_lock); | ||
470 | |||
471 | if (ret == 0) | ||
472 | ret = rndis_error_status(u.set_c->status); | ||
473 | |||
474 | kfree(u.buf); | ||
475 | return ret; | ||
476 | } | ||
477 | |||
478 | |||
479 | /* | ||
480 | * Specs say that we can only set config parameters only soon after device | ||
481 | * initialization. | ||
482 | * value_type: 0 = u32, 2 = unicode string | ||
483 | */ | ||
484 | static int rndis_set_config_parameter(struct usbnet *dev, char *param, | ||
485 | int value_type, void *value) | ||
486 | { | ||
487 | struct RNDIS_CONFIG_PARAMETER_INFOBUFFER *infobuf; | ||
488 | int value_len, info_len, param_len, ret, i; | ||
489 | __le16 *unibuf; | ||
490 | __le32 *dst_value; | ||
491 | |||
492 | if (value_type == 0) | ||
493 | value_len = sizeof(__le32); | ||
494 | else if (value_type == 2) | ||
495 | value_len = strlen(value) * sizeof(__le16); | ||
496 | else | ||
497 | return -EINVAL; | ||
498 | |||
499 | param_len = strlen(param) * sizeof(__le16); | ||
500 | info_len = sizeof(*infobuf) + param_len + value_len; | ||
501 | |||
502 | #ifdef DEBUG | ||
503 | info_len += 12; | ||
504 | #endif | ||
505 | infobuf = kmalloc(info_len, GFP_KERNEL); | ||
506 | if (!infobuf) | ||
507 | return -ENOMEM; | ||
508 | |||
509 | #ifdef DEBUG | ||
510 | info_len -= 12; | ||
511 | /* extra 12 bytes are for padding (debug output) */ | ||
512 | memset(infobuf, 0xCC, info_len + 12); | ||
513 | #endif | ||
514 | |||
515 | if (value_type == 2) | ||
516 | devdbg(dev, "setting config parameter: %s, value: %s", | ||
517 | param, (u8 *)value); | ||
518 | else | ||
519 | devdbg(dev, "setting config parameter: %s, value: %d", | ||
520 | param, *(u32 *)value); | ||
521 | |||
522 | infobuf->ParameterNameOffset = cpu_to_le32(sizeof(*infobuf)); | ||
523 | infobuf->ParameterNameLength = cpu_to_le32(param_len); | ||
524 | infobuf->ParameterType = cpu_to_le32(value_type); | ||
525 | infobuf->ParameterValueOffset = cpu_to_le32(sizeof(*infobuf) + | ||
526 | param_len); | ||
527 | infobuf->ParameterValueLength = cpu_to_le32(value_len); | ||
528 | |||
529 | /* simple string to unicode string conversion */ | ||
530 | unibuf = (void *)infobuf + sizeof(*infobuf); | ||
531 | for (i = 0; i < param_len / sizeof(__le16); i++) | ||
532 | unibuf[i] = cpu_to_le16(param[i]); | ||
533 | |||
534 | if (value_type == 2) { | ||
535 | unibuf = (void *)infobuf + sizeof(*infobuf) + param_len; | ||
536 | for (i = 0; i < value_len / sizeof(__le16); i++) | ||
537 | unibuf[i] = cpu_to_le16(((u8 *)value)[i]); | ||
538 | } else { | ||
539 | dst_value = (void *)infobuf + sizeof(*infobuf) + param_len; | ||
540 | *dst_value = cpu_to_le32(*(u32 *)value); | ||
541 | } | ||
542 | |||
543 | #ifdef DEBUG | ||
544 | devdbg(dev, "info buffer (len: %d):", info_len); | ||
545 | for (i = 0; i < info_len; i += 12) { | ||
546 | u32 *tmp = (u32 *)((u8 *)infobuf + i); | ||
547 | devdbg(dev, "%08X:%08X:%08X", | ||
548 | cpu_to_be32(tmp[0]), | ||
549 | cpu_to_be32(tmp[1]), | ||
550 | cpu_to_be32(tmp[2])); | ||
551 | } | ||
552 | #endif | ||
553 | |||
554 | ret = rndis_set_oid(dev, OID_GEN_RNDIS_CONFIG_PARAMETER, | ||
555 | infobuf, info_len); | ||
556 | if (ret != 0) | ||
557 | devdbg(dev, "setting rndis config paramater failed, %d.", ret); | ||
558 | |||
559 | kfree(infobuf); | ||
560 | return ret; | ||
561 | } | ||
562 | |||
563 | static int rndis_set_config_parameter_str(struct usbnet *dev, | ||
564 | char *param, char *value) | ||
565 | { | ||
566 | return(rndis_set_config_parameter(dev, param, 2, value)); | ||
567 | } | ||
568 | |||
569 | /*static int rndis_set_config_parameter_u32(struct usbnet *dev, | ||
570 | char *param, u32 value) | ||
571 | { | ||
572 | return(rndis_set_config_parameter(dev, param, 0, &value)); | ||
573 | }*/ | ||
574 | |||
575 | |||
576 | /* | ||
577 | * data conversion functions | ||
578 | */ | ||
579 | static int level_to_qual(int level) | ||
580 | { | ||
581 | int qual = 100 * (level - WL_NOISE) / (WL_SIGMAX - WL_NOISE); | ||
582 | return qual >= 0 ? (qual <= 100 ? qual : 100) : 0; | ||
583 | } | ||
584 | |||
585 | |||
586 | static void dsconfig_to_freq(unsigned int dsconfig, struct iw_freq *freq) | ||
587 | { | ||
588 | freq->e = 0; | ||
589 | freq->i = 0; | ||
590 | freq->flags = 0; | ||
591 | |||
592 | /* see comment in wireless.h above the "struct iw_freq" | ||
593 | * definition for an explanation of this if | ||
594 | * NOTE: 1000000 is due to the kHz | ||
595 | */ | ||
596 | if (dsconfig > 1000000) { | ||
597 | freq->m = dsconfig / 10; | ||
598 | freq->e = 1; | ||
599 | } else | ||
600 | freq->m = dsconfig; | ||
601 | |||
602 | /* convert from kHz to Hz */ | ||
603 | freq->e += 3; | ||
604 | } | ||
605 | |||
606 | |||
607 | static int freq_to_dsconfig(struct iw_freq *freq, unsigned int *dsconfig) | ||
608 | { | ||
609 | if (freq->m < 1000 && freq->e == 0) { | ||
610 | if (freq->m >= 1 && | ||
611 | freq->m <= (sizeof(freq_chan) / sizeof(freq_chan[0]))) | ||
612 | *dsconfig = freq_chan[freq->m - 1] * 1000; | ||
613 | else | ||
614 | return -1; | ||
615 | } else { | ||
616 | int i; | ||
617 | *dsconfig = freq->m; | ||
618 | for (i = freq->e; i > 0; i--) | ||
619 | *dsconfig *= 10; | ||
620 | *dsconfig /= 1000; | ||
621 | } | ||
622 | |||
623 | return 0; | ||
624 | } | ||
625 | |||
626 | |||
627 | /* | ||
628 | * common functions | ||
629 | */ | ||
630 | static int | ||
631 | add_wep_key(struct usbnet *usbdev, char *key, int key_len, int index); | ||
632 | |||
633 | static int get_essid(struct usbnet *usbdev, struct NDIS_802_11_SSID *ssid) | ||
634 | { | ||
635 | int ret, len; | ||
636 | |||
637 | len = sizeof(*ssid); | ||
638 | ret = rndis_query_oid(usbdev, OID_802_11_SSID, ssid, &len); | ||
639 | |||
640 | if (ret != 0) | ||
641 | ssid->SsidLength = 0; | ||
642 | |||
643 | #ifdef DEBUG | ||
644 | { | ||
645 | unsigned char tmp[NDIS_802_11_LENGTH_SSID + 1]; | ||
646 | |||
647 | memcpy(tmp, ssid->Ssid, le32_to_cpu(ssid->SsidLength)); | ||
648 | tmp[le32_to_cpu(ssid->SsidLength)] = 0; | ||
649 | devdbg(usbdev, "get_essid: '%s', ret: %d", tmp, ret); | ||
650 | } | ||
651 | #endif | ||
652 | return ret; | ||
653 | } | ||
654 | |||
655 | |||
656 | static int set_essid(struct usbnet *usbdev, struct NDIS_802_11_SSID *ssid) | ||
657 | { | ||
658 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
659 | int ret; | ||
660 | |||
661 | ret = rndis_set_oid(usbdev, OID_802_11_SSID, ssid, sizeof(*ssid)); | ||
662 | if (ret == 0) { | ||
663 | memcpy(&priv->essid, ssid, sizeof(priv->essid)); | ||
664 | priv->radio_on = 1; | ||
665 | devdbg(usbdev, "set_essid: radio_on = 1"); | ||
666 | } | ||
667 | |||
668 | return ret; | ||
669 | } | ||
670 | |||
671 | |||
672 | static int get_bssid(struct usbnet *usbdev, u8 bssid[ETH_ALEN]) | ||
673 | { | ||
674 | int ret, len; | ||
675 | |||
676 | len = ETH_ALEN; | ||
677 | ret = rndis_query_oid(usbdev, OID_802_11_BSSID, bssid, &len); | ||
678 | |||
679 | if (ret != 0) | ||
680 | memset(bssid, 0, ETH_ALEN); | ||
681 | |||
682 | return ret; | ||
683 | } | ||
684 | |||
685 | |||
686 | static int is_associated(struct usbnet *usbdev) | ||
687 | { | ||
688 | u8 bssid[ETH_ALEN]; | ||
689 | int ret; | ||
690 | |||
691 | ret = get_bssid(usbdev, bssid); | ||
692 | |||
693 | return(ret == 0 && memcmp(bssid, zero_bssid, ETH_ALEN) != 0); | ||
694 | } | ||
695 | |||
696 | |||
697 | static int disassociate(struct usbnet *usbdev, int reset_ssid) | ||
698 | { | ||
699 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
700 | struct NDIS_802_11_SSID ssid; | ||
701 | int i, ret = 0; | ||
702 | |||
703 | if (priv->radio_on) { | ||
704 | ret = rndis_set_oid(usbdev, OID_802_11_DISASSOCIATE, NULL, 0); | ||
705 | if (ret == 0) { | ||
706 | priv->radio_on = 0; | ||
707 | devdbg(usbdev, "disassociate: radio_on = 0"); | ||
708 | |||
709 | if (reset_ssid) | ||
710 | msleep(100); | ||
711 | } | ||
712 | } | ||
713 | |||
714 | /* disassociate causes radio to be turned off; if reset_ssid | ||
715 | * is given, set random ssid to enable radio */ | ||
716 | if (reset_ssid) { | ||
717 | ssid.SsidLength = cpu_to_le32(sizeof(ssid.Ssid)); | ||
718 | get_random_bytes(&ssid.Ssid[2], sizeof(ssid.Ssid)-2); | ||
719 | ssid.Ssid[0] = 0x1; | ||
720 | ssid.Ssid[1] = 0xff; | ||
721 | for (i = 2; i < sizeof(ssid.Ssid); i++) | ||
722 | ssid.Ssid[i] = 0x1 + (ssid.Ssid[i] * 0xfe / 0xff); | ||
723 | ret = set_essid(usbdev, &ssid); | ||
724 | } | ||
725 | return ret; | ||
726 | } | ||
727 | |||
728 | |||
729 | static int set_auth_mode(struct usbnet *usbdev, int wpa_version, int authalg) | ||
730 | { | ||
731 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
732 | __le32 tmp; | ||
733 | int auth_mode, ret; | ||
734 | |||
735 | devdbg(usbdev, "set_auth_mode: wpa_version=0x%x authalg=0x%x " | ||
736 | "keymgmt=0x%x", wpa_version, authalg, priv->wpa_keymgmt); | ||
737 | |||
738 | if (wpa_version & IW_AUTH_WPA_VERSION_WPA2) { | ||
739 | if (priv->wpa_keymgmt & IW_AUTH_KEY_MGMT_802_1X) | ||
740 | auth_mode = Ndis802_11AuthModeWPA2; | ||
741 | else | ||
742 | auth_mode = Ndis802_11AuthModeWPA2PSK; | ||
743 | } else if (wpa_version & IW_AUTH_WPA_VERSION_WPA) { | ||
744 | if (priv->wpa_keymgmt & IW_AUTH_KEY_MGMT_802_1X) | ||
745 | auth_mode = Ndis802_11AuthModeWPA; | ||
746 | else if (priv->wpa_keymgmt & IW_AUTH_KEY_MGMT_PSK) | ||
747 | auth_mode = Ndis802_11AuthModeWPAPSK; | ||
748 | else | ||
749 | auth_mode = Ndis802_11AuthModeWPANone; | ||
750 | } else if (authalg & IW_AUTH_ALG_SHARED_KEY) { | ||
751 | if (authalg & IW_AUTH_ALG_OPEN_SYSTEM) | ||
752 | auth_mode = Ndis802_11AuthModeAutoSwitch; | ||
753 | else | ||
754 | auth_mode = Ndis802_11AuthModeShared; | ||
755 | } else | ||
756 | auth_mode = Ndis802_11AuthModeOpen; | ||
757 | |||
758 | tmp = cpu_to_le32(auth_mode); | ||
759 | ret = rndis_set_oid(usbdev, OID_802_11_AUTHENTICATION_MODE, &tmp, | ||
760 | sizeof(tmp)); | ||
761 | if (ret != 0) { | ||
762 | devwarn(usbdev, "setting auth mode failed (%08X)", ret); | ||
763 | return ret; | ||
764 | } | ||
765 | |||
766 | priv->wpa_version = wpa_version; | ||
767 | priv->wpa_authalg = authalg; | ||
768 | return 0; | ||
769 | } | ||
770 | |||
771 | |||
772 | static int set_priv_filter(struct usbnet *usbdev) | ||
773 | { | ||
774 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
775 | __le32 tmp; | ||
776 | |||
777 | devdbg(usbdev, "set_priv_filter: wpa_version=0x%x", priv->wpa_version); | ||
778 | |||
779 | if (priv->wpa_version & IW_AUTH_WPA_VERSION_WPA2 || | ||
780 | priv->wpa_version & IW_AUTH_WPA_VERSION_WPA) | ||
781 | tmp = cpu_to_le32(Ndis802_11PrivFilter8021xWEP); | ||
782 | else | ||
783 | tmp = cpu_to_le32(Ndis802_11PrivFilterAcceptAll); | ||
784 | |||
785 | return rndis_set_oid(usbdev, OID_802_11_PRIVACY_FILTER, &tmp, | ||
786 | sizeof(tmp)); | ||
787 | } | ||
788 | |||
789 | |||
790 | static int set_encr_mode(struct usbnet *usbdev, int pairwise, int groupwise) | ||
791 | { | ||
792 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
793 | __le32 tmp; | ||
794 | int encr_mode, ret; | ||
795 | |||
796 | devdbg(usbdev, "set_encr_mode: cipher_pair=0x%x cipher_group=0x%x", | ||
797 | pairwise, | ||
798 | groupwise); | ||
799 | |||
800 | if (pairwise & IW_AUTH_CIPHER_CCMP) | ||
801 | encr_mode = Ndis802_11Encryption3Enabled; | ||
802 | else if (pairwise & IW_AUTH_CIPHER_TKIP) | ||
803 | encr_mode = Ndis802_11Encryption2Enabled; | ||
804 | else if (pairwise & | ||
805 | (IW_AUTH_CIPHER_WEP40 | IW_AUTH_CIPHER_WEP104)) | ||
806 | encr_mode = Ndis802_11Encryption1Enabled; | ||
807 | else if (groupwise & IW_AUTH_CIPHER_CCMP) | ||
808 | encr_mode = Ndis802_11Encryption3Enabled; | ||
809 | else if (groupwise & IW_AUTH_CIPHER_TKIP) | ||
810 | encr_mode = Ndis802_11Encryption2Enabled; | ||
811 | else | ||
812 | encr_mode = Ndis802_11EncryptionDisabled; | ||
813 | |||
814 | tmp = cpu_to_le32(encr_mode); | ||
815 | ret = rndis_set_oid(usbdev, OID_802_11_ENCRYPTION_STATUS, &tmp, | ||
816 | sizeof(tmp)); | ||
817 | if (ret != 0) { | ||
818 | devwarn(usbdev, "setting encr mode failed (%08X)", ret); | ||
819 | return ret; | ||
820 | } | ||
821 | |||
822 | priv->wpa_cipher_pair = pairwise; | ||
823 | priv->wpa_cipher_group = groupwise; | ||
824 | return 0; | ||
825 | } | ||
826 | |||
827 | |||
828 | static int set_assoc_params(struct usbnet *usbdev) | ||
829 | { | ||
830 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
831 | |||
832 | set_auth_mode(usbdev, priv->wpa_version, priv->wpa_authalg); | ||
833 | set_priv_filter(usbdev); | ||
834 | set_encr_mode(usbdev, priv->wpa_cipher_pair, priv->wpa_cipher_group); | ||
835 | |||
836 | return 0; | ||
837 | } | ||
838 | |||
839 | |||
840 | static int set_infra_mode(struct usbnet *usbdev, int mode) | ||
841 | { | ||
842 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
843 | __le32 tmp; | ||
844 | int ret, i; | ||
845 | |||
846 | devdbg(usbdev, "set_infra_mode: infra_mode=0x%x", priv->infra_mode); | ||
847 | |||
848 | tmp = cpu_to_le32(mode); | ||
849 | ret = rndis_set_oid(usbdev, OID_802_11_INFRASTRUCTURE_MODE, &tmp, | ||
850 | sizeof(tmp)); | ||
851 | if (ret != 0) { | ||
852 | devwarn(usbdev, "setting infra mode failed (%08X)", ret); | ||
853 | return ret; | ||
854 | } | ||
855 | |||
856 | /* NDIS drivers clear keys when infrastructure mode is | ||
857 | * changed. But Linux tools assume otherwise. So set the | ||
858 | * keys */ | ||
859 | if (priv->wpa_keymgmt == 0 || | ||
860 | priv->wpa_keymgmt == IW_AUTH_KEY_MGMT_802_1X) { | ||
861 | for (i = 0; i < 4; i++) { | ||
862 | if (priv->encr_key_len[i] > 0) | ||
863 | add_wep_key(usbdev, priv->encr_keys[i], | ||
864 | priv->encr_key_len[i], i); | ||
865 | } | ||
866 | } | ||
867 | |||
868 | priv->infra_mode = mode; | ||
869 | return 0; | ||
870 | } | ||
871 | |||
872 | |||
873 | static void set_default_iw_params(struct usbnet *usbdev) | ||
874 | { | ||
875 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
876 | |||
877 | priv->wpa_keymgmt = 0; | ||
878 | priv->wpa_version = 0; | ||
879 | |||
880 | set_infra_mode(usbdev, Ndis802_11Infrastructure); | ||
881 | set_auth_mode(usbdev, IW_AUTH_WPA_VERSION_DISABLED, | ||
882 | IW_AUTH_ALG_OPEN_SYSTEM); | ||
883 | set_priv_filter(usbdev); | ||
884 | set_encr_mode(usbdev, IW_AUTH_CIPHER_NONE, IW_AUTH_CIPHER_NONE); | ||
885 | } | ||
886 | |||
887 | |||
888 | static int deauthenticate(struct usbnet *usbdev) | ||
889 | { | ||
890 | int ret; | ||
891 | |||
892 | ret = disassociate(usbdev, 1); | ||
893 | set_default_iw_params(usbdev); | ||
894 | return ret; | ||
895 | } | ||
896 | |||
897 | |||
898 | /* index must be 0 - N, as per NDIS */ | ||
899 | static int add_wep_key(struct usbnet *usbdev, char *key, int key_len, int index) | ||
900 | { | ||
901 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
902 | struct NDIS_802_11_WEP ndis_key; | ||
903 | int ret; | ||
904 | |||
905 | if (key_len <= 0 || key_len > 32 || index < 0 || index >= 4) | ||
906 | return -EINVAL; | ||
907 | |||
908 | memset(&ndis_key, 0, sizeof(ndis_key)); | ||
909 | |||
910 | ndis_key.Length = cpu_to_le32(sizeof(ndis_key)); | ||
911 | ndis_key.KeyLength = cpu_to_le32(key_len); | ||
912 | ndis_key.KeyIndex = cpu_to_le32(index); | ||
913 | memcpy(&ndis_key.KeyMaterial, key, key_len); | ||
914 | |||
915 | if (index == priv->encr_tx_key_index) { | ||
916 | ndis_key.KeyIndex |= cpu_to_le32(1 << 31); | ||
917 | ret = set_encr_mode(usbdev, IW_AUTH_CIPHER_WEP104, | ||
918 | IW_AUTH_CIPHER_NONE); | ||
919 | if (ret) | ||
920 | devwarn(usbdev, "encryption couldn't be enabled (%08X)", | ||
921 | ret); | ||
922 | } | ||
923 | |||
924 | ret = rndis_set_oid(usbdev, OID_802_11_ADD_WEP, &ndis_key, | ||
925 | sizeof(ndis_key)); | ||
926 | if (ret != 0) { | ||
927 | devwarn(usbdev, "adding encryption key %d failed (%08X)", | ||
928 | index+1, ret); | ||
929 | return ret; | ||
930 | } | ||
931 | |||
932 | priv->encr_key_len[index] = key_len; | ||
933 | memcpy(&priv->encr_keys[index], key, key_len); | ||
934 | |||
935 | return 0; | ||
936 | } | ||
937 | |||
938 | |||
939 | /* remove_key is for both wep and wpa */ | ||
940 | static int remove_key(struct usbnet *usbdev, int index, u8 bssid[ETH_ALEN]) | ||
941 | { | ||
942 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
943 | struct NDIS_802_11_REMOVE_KEY remove_key; | ||
944 | __le32 keyindex; | ||
945 | int ret; | ||
946 | |||
947 | if (priv->encr_key_len[index] == 0) | ||
948 | return 0; | ||
949 | |||
950 | priv->encr_key_len[index] = 0; | ||
951 | memset(&priv->encr_keys[index], 0, sizeof(priv->encr_keys[index])); | ||
952 | |||
953 | if (priv->wpa_cipher_pair == IW_AUTH_CIPHER_TKIP || | ||
954 | priv->wpa_cipher_pair == IW_AUTH_CIPHER_CCMP || | ||
955 | priv->wpa_cipher_group == IW_AUTH_CIPHER_TKIP || | ||
956 | priv->wpa_cipher_group == IW_AUTH_CIPHER_CCMP) { | ||
957 | remove_key.Length = cpu_to_le32(sizeof(remove_key)); | ||
958 | remove_key.KeyIndex = cpu_to_le32(index); | ||
959 | if (bssid) { | ||
960 | /* pairwise key */ | ||
961 | if (memcmp(bssid, ffff_bssid, ETH_ALEN) != 0) | ||
962 | remove_key.KeyIndex |= cpu_to_le32(1 << 30); | ||
963 | memcpy(remove_key.Bssid, bssid, | ||
964 | sizeof(remove_key.Bssid)); | ||
965 | } else | ||
966 | memset(remove_key.Bssid, 0xff, | ||
967 | sizeof(remove_key.Bssid)); | ||
968 | |||
969 | ret = rndis_set_oid(usbdev, OID_802_11_REMOVE_KEY, &remove_key, | ||
970 | sizeof(remove_key)); | ||
971 | if (ret != 0) | ||
972 | return ret; | ||
973 | } else { | ||
974 | keyindex = cpu_to_le32(index); | ||
975 | ret = rndis_set_oid(usbdev, OID_802_11_REMOVE_WEP, &keyindex, | ||
976 | sizeof(keyindex)); | ||
977 | if (ret != 0) { | ||
978 | devwarn(usbdev, | ||
979 | "removing encryption key %d failed (%08X)", | ||
980 | index, ret); | ||
981 | return ret; | ||
982 | } | ||
983 | } | ||
984 | |||
985 | /* if it is transmit key, disable encryption */ | ||
986 | if (index == priv->encr_tx_key_index) | ||
987 | set_encr_mode(usbdev, IW_AUTH_CIPHER_NONE, IW_AUTH_CIPHER_NONE); | ||
988 | |||
989 | return 0; | ||
990 | } | ||
991 | |||
992 | |||
993 | static void set_multicast_list(struct usbnet *usbdev) | ||
994 | { | ||
995 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
996 | struct dev_mc_list *mclist; | ||
997 | __le32 filter; | ||
998 | int ret, i, size; | ||
999 | char *buf; | ||
1000 | |||
1001 | filter = RNDIS_PACKET_TYPE_DIRECTED | RNDIS_PACKET_TYPE_BROADCAST; | ||
1002 | |||
1003 | if (usbdev->net->flags & IFF_PROMISC) { | ||
1004 | filter |= RNDIS_PACKET_TYPE_PROMISCUOUS | | ||
1005 | RNDIS_PACKET_TYPE_ALL_LOCAL; | ||
1006 | } else if (usbdev->net->flags & IFF_ALLMULTI || | ||
1007 | usbdev->net->mc_count > priv->multicast_size) { | ||
1008 | filter |= RNDIS_PACKET_TYPE_ALL_MULTICAST; | ||
1009 | } else if (usbdev->net->mc_count > 0) { | ||
1010 | size = min(priv->multicast_size, usbdev->net->mc_count); | ||
1011 | buf = kmalloc(size * ETH_ALEN, GFP_KERNEL); | ||
1012 | if (!buf) { | ||
1013 | devwarn(usbdev, | ||
1014 | "couldn't alloc %d bytes of memory", | ||
1015 | size * ETH_ALEN); | ||
1016 | return; | ||
1017 | } | ||
1018 | |||
1019 | mclist = usbdev->net->mc_list; | ||
1020 | for (i = 0; i < size && mclist; mclist = mclist->next) { | ||
1021 | if (mclist->dmi_addrlen != ETH_ALEN) | ||
1022 | continue; | ||
1023 | |||
1024 | memcpy(buf + i * ETH_ALEN, mclist->dmi_addr, ETH_ALEN); | ||
1025 | i++; | ||
1026 | } | ||
1027 | |||
1028 | ret = rndis_set_oid(usbdev, OID_802_3_MULTICAST_LIST, buf, | ||
1029 | i * ETH_ALEN); | ||
1030 | if (ret == 0 && i > 0) | ||
1031 | filter |= RNDIS_PACKET_TYPE_MULTICAST; | ||
1032 | else | ||
1033 | filter |= RNDIS_PACKET_TYPE_ALL_MULTICAST; | ||
1034 | |||
1035 | devdbg(usbdev, "OID_802_3_MULTICAST_LIST(%d, max: %d) -> %d", | ||
1036 | i, priv->multicast_size, ret); | ||
1037 | |||
1038 | kfree(buf); | ||
1039 | } | ||
1040 | |||
1041 | ret = rndis_set_oid(usbdev, OID_GEN_CURRENT_PACKET_FILTER, &filter, | ||
1042 | sizeof(filter)); | ||
1043 | if (ret < 0) { | ||
1044 | devwarn(usbdev, "couldn't set packet filter: %08x", | ||
1045 | le32_to_cpu(filter)); | ||
1046 | } | ||
1047 | |||
1048 | devdbg(usbdev, "OID_GEN_CURRENT_PACKET_FILTER(%08x) -> %d", | ||
1049 | le32_to_cpu(filter), ret); | ||
1050 | } | ||
1051 | |||
1052 | |||
1053 | /* | ||
1054 | * wireless extension handlers | ||
1055 | */ | ||
1056 | |||
1057 | static int rndis_iw_commit(struct net_device *dev, | ||
1058 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1059 | { | ||
1060 | /* dummy op */ | ||
1061 | return 0; | ||
1062 | } | ||
1063 | |||
1064 | |||
1065 | static int rndis_iw_get_range(struct net_device *dev, | ||
1066 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1067 | { | ||
1068 | struct iw_range *range = (struct iw_range *)extra; | ||
1069 | struct usbnet *usbdev = dev->priv; | ||
1070 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1071 | int len, ret, i, j, num, has_80211g_rates; | ||
1072 | u8 rates[8]; | ||
1073 | __le32 tx_power; | ||
1074 | |||
1075 | devdbg(usbdev, "SIOCGIWRANGE"); | ||
1076 | |||
1077 | /* clear iw_range struct */ | ||
1078 | memset(range, 0, sizeof(*range)); | ||
1079 | wrqu->data.length = sizeof(*range); | ||
1080 | |||
1081 | range->txpower_capa = IW_TXPOW_MWATT; | ||
1082 | range->num_txpower = 1; | ||
1083 | if (priv->caps & CAP_SUPPORT_TXPOWER) { | ||
1084 | len = sizeof(tx_power); | ||
1085 | ret = rndis_query_oid(usbdev, OID_802_11_TX_POWER_LEVEL, | ||
1086 | &tx_power, &len); | ||
1087 | if (ret == 0 && le32_to_cpu(tx_power) != 0xFF) | ||
1088 | range->txpower[0] = le32_to_cpu(tx_power); | ||
1089 | else | ||
1090 | range->txpower[0] = get_bcm4320_power(priv); | ||
1091 | } else | ||
1092 | range->txpower[0] = get_bcm4320_power(priv); | ||
1093 | |||
1094 | len = sizeof(rates); | ||
1095 | ret = rndis_query_oid(usbdev, OID_802_11_SUPPORTED_RATES, &rates, | ||
1096 | &len); | ||
1097 | has_80211g_rates = 0; | ||
1098 | if (ret == 0) { | ||
1099 | j = 0; | ||
1100 | for (i = 0; i < len; i++) { | ||
1101 | if (rates[i] == 0) | ||
1102 | break; | ||
1103 | range->bitrate[j] = (rates[i] & 0x7f) * 500000; | ||
1104 | /* check for non 802.11b rates */ | ||
1105 | if (range->bitrate[j] == 6000000 || | ||
1106 | range->bitrate[j] == 9000000 || | ||
1107 | (range->bitrate[j] >= 12000000 && | ||
1108 | range->bitrate[j] != 22000000)) | ||
1109 | has_80211g_rates = 1; | ||
1110 | j++; | ||
1111 | } | ||
1112 | range->num_bitrates = j; | ||
1113 | } else | ||
1114 | range->num_bitrates = 0; | ||
1115 | |||
1116 | /* fill in 802.11g rates */ | ||
1117 | if (has_80211g_rates) { | ||
1118 | num = range->num_bitrates; | ||
1119 | for (i = 0; i < sizeof(rates_80211g); i++) { | ||
1120 | for (j = 0; j < num; j++) { | ||
1121 | if (range->bitrate[j] == | ||
1122 | rates_80211g[i] * 1000000) | ||
1123 | break; | ||
1124 | } | ||
1125 | if (j == num) | ||
1126 | range->bitrate[range->num_bitrates++] = | ||
1127 | rates_80211g[i] * 1000000; | ||
1128 | if (range->num_bitrates == IW_MAX_BITRATES) | ||
1129 | break; | ||
1130 | } | ||
1131 | |||
1132 | /* estimated max real througput in bps */ | ||
1133 | range->throughput = 54 * 1000 * 1000 / 2; | ||
1134 | |||
1135 | /* ~35% more with afterburner */ | ||
1136 | if (priv->param_afterburner) | ||
1137 | range->throughput = range->throughput / 100 * 135; | ||
1138 | } else { | ||
1139 | /* estimated max real througput in bps */ | ||
1140 | range->throughput = 11 * 1000 * 1000 / 2; | ||
1141 | } | ||
1142 | |||
1143 | range->num_channels = (sizeof(freq_chan)/sizeof(freq_chan[0])); | ||
1144 | |||
1145 | for (i = 0; i < (sizeof(freq_chan)/sizeof(freq_chan[0])) && | ||
1146 | i < IW_MAX_FREQUENCIES; i++) { | ||
1147 | range->freq[i].i = i + 1; | ||
1148 | range->freq[i].m = freq_chan[i] * 100000; | ||
1149 | range->freq[i].e = 1; | ||
1150 | } | ||
1151 | range->num_frequency = i; | ||
1152 | |||
1153 | range->min_rts = 0; | ||
1154 | range->max_rts = 2347; | ||
1155 | range->min_frag = 256; | ||
1156 | range->max_frag = 2346; | ||
1157 | |||
1158 | range->max_qual.qual = 100; | ||
1159 | range->max_qual.level = 154; | ||
1160 | range->max_qual.updated = IW_QUAL_QUAL_UPDATED | ||
1161 | | IW_QUAL_LEVEL_UPDATED | ||
1162 | | IW_QUAL_NOISE_INVALID; | ||
1163 | |||
1164 | range->we_version_compiled = WIRELESS_EXT; | ||
1165 | range->we_version_source = WIRELESS_EXT; | ||
1166 | |||
1167 | range->enc_capa = IW_ENC_CAPA_WPA | IW_ENC_CAPA_WPA2 | | ||
1168 | IW_ENC_CAPA_CIPHER_TKIP | IW_ENC_CAPA_CIPHER_CCMP; | ||
1169 | return 0; | ||
1170 | } | ||
1171 | |||
1172 | |||
1173 | static int rndis_iw_get_name(struct net_device *dev, | ||
1174 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1175 | { | ||
1176 | struct usbnet *usbdev = dev->priv; | ||
1177 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1178 | |||
1179 | strcpy(wrqu->name, priv->name); | ||
1180 | return 0; | ||
1181 | } | ||
1182 | |||
1183 | |||
1184 | static int rndis_iw_set_essid(struct net_device *dev, | ||
1185 | struct iw_request_info *info, union iwreq_data *wrqu, char *essid) | ||
1186 | { | ||
1187 | struct NDIS_802_11_SSID ssid; | ||
1188 | int length = wrqu->essid.length; | ||
1189 | struct usbnet *usbdev = dev->priv; | ||
1190 | |||
1191 | devdbg(usbdev, "SIOCSIWESSID: [flags:%d,len:%d] '%.32s'", | ||
1192 | wrqu->essid.flags, wrqu->essid.length, essid); | ||
1193 | |||
1194 | if (length > NDIS_802_11_LENGTH_SSID) | ||
1195 | length = NDIS_802_11_LENGTH_SSID; | ||
1196 | |||
1197 | ssid.SsidLength = cpu_to_le32(length); | ||
1198 | if (length > 0) | ||
1199 | memcpy(ssid.Ssid, essid, length); | ||
1200 | else | ||
1201 | memset(ssid.Ssid, 0, NDIS_802_11_LENGTH_SSID); | ||
1202 | |||
1203 | set_assoc_params(usbdev); | ||
1204 | |||
1205 | if (!wrqu->essid.flags || length == 0) | ||
1206 | return disassociate(usbdev, 1); | ||
1207 | else | ||
1208 | return set_essid(usbdev, &ssid); | ||
1209 | } | ||
1210 | |||
1211 | |||
1212 | static int rndis_iw_get_essid(struct net_device *dev, | ||
1213 | struct iw_request_info *info, union iwreq_data *wrqu, char *essid) | ||
1214 | { | ||
1215 | struct NDIS_802_11_SSID ssid; | ||
1216 | struct usbnet *usbdev = dev->priv; | ||
1217 | int ret; | ||
1218 | |||
1219 | ret = get_essid(usbdev, &ssid); | ||
1220 | |||
1221 | if (ret == 0 && le32_to_cpu(ssid.SsidLength) > 0) { | ||
1222 | wrqu->essid.flags = 1; | ||
1223 | wrqu->essid.length = le32_to_cpu(ssid.SsidLength); | ||
1224 | memcpy(essid, ssid.Ssid, wrqu->essid.length); | ||
1225 | essid[wrqu->essid.length] = 0; | ||
1226 | } else { | ||
1227 | memset(essid, 0, sizeof(NDIS_802_11_LENGTH_SSID)); | ||
1228 | wrqu->essid.flags = 0; | ||
1229 | wrqu->essid.length = 0; | ||
1230 | } | ||
1231 | devdbg(usbdev, "SIOCGIWESSID: %s", essid); | ||
1232 | return ret; | ||
1233 | } | ||
1234 | |||
1235 | |||
1236 | static int rndis_iw_get_bssid(struct net_device *dev, | ||
1237 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1238 | { | ||
1239 | struct usbnet *usbdev = dev->priv; | ||
1240 | unsigned char bssid[ETH_ALEN]; | ||
1241 | int ret; | ||
1242 | DECLARE_MAC_BUF(mac); | ||
1243 | |||
1244 | ret = get_bssid(usbdev, bssid); | ||
1245 | |||
1246 | if (ret == 0) | ||
1247 | devdbg(usbdev, "SIOCGIWAP: %s", print_mac(mac, bssid)); | ||
1248 | else | ||
1249 | devdbg(usbdev, "SIOCGIWAP: <not associated>"); | ||
1250 | |||
1251 | wrqu->ap_addr.sa_family = ARPHRD_ETHER; | ||
1252 | memcpy(wrqu->ap_addr.sa_data, bssid, ETH_ALEN); | ||
1253 | |||
1254 | return ret; | ||
1255 | } | ||
1256 | |||
1257 | |||
1258 | static int rndis_iw_set_bssid(struct net_device *dev, | ||
1259 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1260 | { | ||
1261 | struct usbnet *usbdev = dev->priv; | ||
1262 | u8 *bssid = (u8 *)wrqu->ap_addr.sa_data; | ||
1263 | DECLARE_MAC_BUF(mac); | ||
1264 | int ret; | ||
1265 | |||
1266 | devdbg(usbdev, "SIOCSIWAP: %s", print_mac(mac, bssid)); | ||
1267 | |||
1268 | ret = rndis_set_oid(usbdev, OID_802_11_BSSID, bssid, ETH_ALEN); | ||
1269 | |||
1270 | /* user apps may set ap's mac address, which is not required; | ||
1271 | * they may fail to work if this function fails, so return | ||
1272 | * success */ | ||
1273 | if (ret) | ||
1274 | devwarn(usbdev, "setting AP mac address failed (%08X)", ret); | ||
1275 | |||
1276 | return 0; | ||
1277 | } | ||
1278 | |||
1279 | |||
1280 | static int rndis_iw_set_auth(struct net_device *dev, | ||
1281 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1282 | { | ||
1283 | struct iw_param *p = &wrqu->param; | ||
1284 | struct usbnet *usbdev = dev->priv; | ||
1285 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1286 | int ret = -ENOTSUPP; | ||
1287 | |||
1288 | switch (p->flags & IW_AUTH_INDEX) { | ||
1289 | case IW_AUTH_WPA_VERSION: | ||
1290 | devdbg(usbdev, "SIOCSIWAUTH: WPA_VERSION, %08x", p->value); | ||
1291 | priv->wpa_version = p->value; | ||
1292 | ret = 0; | ||
1293 | break; | ||
1294 | |||
1295 | case IW_AUTH_CIPHER_PAIRWISE: | ||
1296 | devdbg(usbdev, "SIOCSIWAUTH: CIPHER_PAIRWISE, %08x", p->value); | ||
1297 | priv->wpa_cipher_pair = p->value; | ||
1298 | ret = 0; | ||
1299 | break; | ||
1300 | |||
1301 | case IW_AUTH_CIPHER_GROUP: | ||
1302 | devdbg(usbdev, "SIOCSIWAUTH: CIPHER_GROUP, %08x", p->value); | ||
1303 | priv->wpa_cipher_group = p->value; | ||
1304 | ret = 0; | ||
1305 | break; | ||
1306 | |||
1307 | case IW_AUTH_KEY_MGMT: | ||
1308 | devdbg(usbdev, "SIOCSIWAUTH: KEY_MGMT, %08x", p->value); | ||
1309 | priv->wpa_keymgmt = p->value; | ||
1310 | ret = 0; | ||
1311 | break; | ||
1312 | |||
1313 | case IW_AUTH_TKIP_COUNTERMEASURES: | ||
1314 | devdbg(usbdev, "SIOCSIWAUTH: TKIP_COUNTERMEASURES, %08x", | ||
1315 | p->value); | ||
1316 | ret = 0; | ||
1317 | break; | ||
1318 | |||
1319 | case IW_AUTH_DROP_UNENCRYPTED: | ||
1320 | devdbg(usbdev, "SIOCSIWAUTH: DROP_UNENCRYPTED, %08x", p->value); | ||
1321 | ret = 0; | ||
1322 | break; | ||
1323 | |||
1324 | case IW_AUTH_80211_AUTH_ALG: | ||
1325 | devdbg(usbdev, "SIOCSIWAUTH: 80211_AUTH_ALG, %08x", p->value); | ||
1326 | priv->wpa_authalg = p->value; | ||
1327 | ret = 0; | ||
1328 | break; | ||
1329 | |||
1330 | case IW_AUTH_WPA_ENABLED: | ||
1331 | devdbg(usbdev, "SIOCSIWAUTH: WPA_ENABLED, %08x", p->value); | ||
1332 | if (wrqu->param.value) | ||
1333 | deauthenticate(usbdev); | ||
1334 | ret = 0; | ||
1335 | break; | ||
1336 | |||
1337 | case IW_AUTH_RX_UNENCRYPTED_EAPOL: | ||
1338 | devdbg(usbdev, "SIOCSIWAUTH: RX_UNENCRYPTED_EAPOL, %08x", | ||
1339 | p->value); | ||
1340 | ret = 0; | ||
1341 | break; | ||
1342 | |||
1343 | case IW_AUTH_ROAMING_CONTROL: | ||
1344 | devdbg(usbdev, "SIOCSIWAUTH: ROAMING_CONTROL, %08x", p->value); | ||
1345 | ret = 0; | ||
1346 | break; | ||
1347 | |||
1348 | case IW_AUTH_PRIVACY_INVOKED: | ||
1349 | devdbg(usbdev, "SIOCSIWAUTH: invalid cmd %d", | ||
1350 | wrqu->param.flags & IW_AUTH_INDEX); | ||
1351 | return -EOPNOTSUPP; | ||
1352 | |||
1353 | default: | ||
1354 | devdbg(usbdev, "SIOCSIWAUTH: UNKNOWN %08x, %08x", | ||
1355 | p->flags & IW_AUTH_INDEX, p->value); | ||
1356 | } | ||
1357 | return ret; | ||
1358 | } | ||
1359 | |||
1360 | |||
1361 | static int rndis_iw_get_auth(struct net_device *dev, | ||
1362 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1363 | { | ||
1364 | struct iw_param *p = &wrqu->param; | ||
1365 | struct usbnet *usbdev = dev->priv; | ||
1366 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1367 | |||
1368 | switch (p->flags & IW_AUTH_INDEX) { | ||
1369 | case IW_AUTH_WPA_VERSION: | ||
1370 | p->value = priv->wpa_version; | ||
1371 | break; | ||
1372 | case IW_AUTH_CIPHER_PAIRWISE: | ||
1373 | p->value = priv->wpa_cipher_pair; | ||
1374 | break; | ||
1375 | case IW_AUTH_CIPHER_GROUP: | ||
1376 | p->value = priv->wpa_cipher_group; | ||
1377 | break; | ||
1378 | case IW_AUTH_KEY_MGMT: | ||
1379 | p->value = priv->wpa_keymgmt; | ||
1380 | break; | ||
1381 | case IW_AUTH_80211_AUTH_ALG: | ||
1382 | p->value = priv->wpa_authalg; | ||
1383 | break; | ||
1384 | default: | ||
1385 | devdbg(usbdev, "SIOCGIWAUTH: invalid cmd %d", | ||
1386 | wrqu->param.flags & IW_AUTH_INDEX); | ||
1387 | return -EOPNOTSUPP; | ||
1388 | } | ||
1389 | return 0; | ||
1390 | } | ||
1391 | |||
1392 | |||
1393 | static int rndis_iw_get_mode(struct net_device *dev, | ||
1394 | struct iw_request_info *info, | ||
1395 | union iwreq_data *wrqu, char *extra) | ||
1396 | { | ||
1397 | struct usbnet *usbdev = dev->priv; | ||
1398 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1399 | |||
1400 | switch (priv->infra_mode) { | ||
1401 | case Ndis802_11IBSS: | ||
1402 | wrqu->mode = IW_MODE_ADHOC; | ||
1403 | break; | ||
1404 | case Ndis802_11Infrastructure: | ||
1405 | wrqu->mode = IW_MODE_INFRA; | ||
1406 | break; | ||
1407 | /*case Ndis802_11AutoUnknown:*/ | ||
1408 | default: | ||
1409 | wrqu->mode = IW_MODE_AUTO; | ||
1410 | break; | ||
1411 | } | ||
1412 | devdbg(usbdev, "SIOCGIWMODE: %08x", wrqu->mode); | ||
1413 | return 0; | ||
1414 | } | ||
1415 | |||
1416 | |||
1417 | static int rndis_iw_set_mode(struct net_device *dev, | ||
1418 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1419 | { | ||
1420 | struct usbnet *usbdev = dev->priv; | ||
1421 | int mode; | ||
1422 | |||
1423 | devdbg(usbdev, "SIOCSIWMODE: %08x", wrqu->mode); | ||
1424 | |||
1425 | switch (wrqu->mode) { | ||
1426 | case IW_MODE_ADHOC: | ||
1427 | mode = Ndis802_11IBSS; | ||
1428 | break; | ||
1429 | case IW_MODE_INFRA: | ||
1430 | mode = Ndis802_11Infrastructure; | ||
1431 | break; | ||
1432 | /*case IW_MODE_AUTO:*/ | ||
1433 | default: | ||
1434 | mode = Ndis802_11AutoUnknown; | ||
1435 | break; | ||
1436 | } | ||
1437 | |||
1438 | return set_infra_mode(usbdev, mode); | ||
1439 | } | ||
1440 | |||
1441 | |||
1442 | static int rndis_iw_set_encode(struct net_device *dev, | ||
1443 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1444 | { | ||
1445 | struct usbnet *usbdev = dev->priv; | ||
1446 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1447 | int ret, index, key_len; | ||
1448 | u8 *key; | ||
1449 | |||
1450 | index = (wrqu->encoding.flags & IW_ENCODE_INDEX); | ||
1451 | |||
1452 | /* iwconfig gives index as 1 - N */ | ||
1453 | if (index > 0) | ||
1454 | index--; | ||
1455 | else | ||
1456 | index = priv->encr_tx_key_index; | ||
1457 | |||
1458 | if (index < 0 || index >= 4) { | ||
1459 | devwarn(usbdev, "encryption index out of range (%u)", index); | ||
1460 | return -EINVAL; | ||
1461 | } | ||
1462 | |||
1463 | /* remove key if disabled */ | ||
1464 | if (wrqu->data.flags & IW_ENCODE_DISABLED) { | ||
1465 | if (remove_key(usbdev, index, NULL)) | ||
1466 | return -EINVAL; | ||
1467 | else | ||
1468 | return 0; | ||
1469 | } | ||
1470 | |||
1471 | /* global encryption state (for all keys) */ | ||
1472 | if (wrqu->data.flags & IW_ENCODE_OPEN) | ||
1473 | ret = set_auth_mode(usbdev, IW_AUTH_WPA_VERSION_DISABLED, | ||
1474 | IW_AUTH_ALG_OPEN_SYSTEM); | ||
1475 | else /*if (wrqu->data.flags & IW_ENCODE_RESTRICTED)*/ | ||
1476 | ret = set_auth_mode(usbdev, IW_AUTH_WPA_VERSION_DISABLED, | ||
1477 | IW_AUTH_ALG_SHARED_KEY); | ||
1478 | if (ret != 0) | ||
1479 | return ret; | ||
1480 | |||
1481 | if (wrqu->data.length > 0) { | ||
1482 | key_len = wrqu->data.length; | ||
1483 | key = extra; | ||
1484 | } else { | ||
1485 | /* must be set as tx key */ | ||
1486 | if (priv->encr_key_len[index] == 0) | ||
1487 | return -EINVAL; | ||
1488 | key_len = priv->encr_key_len[index]; | ||
1489 | key = priv->encr_keys[index]; | ||
1490 | priv->encr_tx_key_index = index; | ||
1491 | } | ||
1492 | |||
1493 | if (add_wep_key(usbdev, key, key_len, index) != 0) | ||
1494 | return -EINVAL; | ||
1495 | |||
1496 | if (index == priv->encr_tx_key_index) | ||
1497 | /* ndis drivers want essid to be set after setting encr */ | ||
1498 | set_essid(usbdev, &priv->essid); | ||
1499 | |||
1500 | return 0; | ||
1501 | } | ||
1502 | |||
1503 | |||
1504 | static int rndis_iw_set_encode_ext(struct net_device *dev, | ||
1505 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1506 | { | ||
1507 | struct iw_encode_ext *ext = (struct iw_encode_ext *)extra; | ||
1508 | struct usbnet *usbdev = dev->priv; | ||
1509 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1510 | struct NDIS_802_11_KEY ndis_key; | ||
1511 | int i, keyidx, ret; | ||
1512 | u8 *addr; | ||
1513 | |||
1514 | keyidx = wrqu->encoding.flags & IW_ENCODE_INDEX; | ||
1515 | |||
1516 | /* iwconfig gives index as 1 - N */ | ||
1517 | if (keyidx) | ||
1518 | keyidx--; | ||
1519 | else | ||
1520 | keyidx = priv->encr_tx_key_index; | ||
1521 | |||
1522 | if (keyidx < 0 || keyidx >= 4) | ||
1523 | return -EINVAL; | ||
1524 | |||
1525 | if (ext->alg == WPA_ALG_WEP) { | ||
1526 | if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) | ||
1527 | priv->encr_tx_key_index = keyidx; | ||
1528 | return add_wep_key(usbdev, ext->key, ext->key_len, keyidx); | ||
1529 | } | ||
1530 | |||
1531 | if ((wrqu->encoding.flags & IW_ENCODE_DISABLED) || | ||
1532 | ext->alg == IW_ENCODE_ALG_NONE || ext->key_len == 0) | ||
1533 | return remove_key(usbdev, keyidx, NULL); | ||
1534 | |||
1535 | if (ext->key_len > sizeof(ndis_key.KeyMaterial)) | ||
1536 | return -1; | ||
1537 | |||
1538 | memset(&ndis_key, 0, sizeof(ndis_key)); | ||
1539 | |||
1540 | ndis_key.Length = cpu_to_le32(sizeof(ndis_key) - | ||
1541 | sizeof(ndis_key.KeyMaterial) + ext->key_len); | ||
1542 | ndis_key.KeyLength = cpu_to_le32(ext->key_len); | ||
1543 | ndis_key.KeyIndex = cpu_to_le32(keyidx); | ||
1544 | |||
1545 | if (ext->ext_flags & IW_ENCODE_EXT_RX_SEQ_VALID) { | ||
1546 | for (i = 0; i < 6; i++) | ||
1547 | ndis_key.KeyRSC |= | ||
1548 | cpu_to_le64(ext->rx_seq[i] << (i * 8)); | ||
1549 | ndis_key.KeyIndex |= cpu_to_le32(1 << 29); | ||
1550 | } | ||
1551 | |||
1552 | addr = ext->addr.sa_data; | ||
1553 | if (ext->ext_flags & IW_ENCODE_EXT_GROUP_KEY) { | ||
1554 | /* group key */ | ||
1555 | if (priv->infra_mode == Ndis802_11IBSS) | ||
1556 | memset(ndis_key.Bssid, 0xff, ETH_ALEN); | ||
1557 | else | ||
1558 | get_bssid(usbdev, ndis_key.Bssid); | ||
1559 | } else { | ||
1560 | /* pairwise key */ | ||
1561 | ndis_key.KeyIndex |= cpu_to_le32(1 << 30); | ||
1562 | memcpy(ndis_key.Bssid, addr, ETH_ALEN); | ||
1563 | } | ||
1564 | |||
1565 | if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) | ||
1566 | ndis_key.KeyIndex |= cpu_to_le32(1 << 31); | ||
1567 | |||
1568 | if (ext->alg == IW_ENCODE_ALG_TKIP && ext->key_len == 32) { | ||
1569 | /* wpa_supplicant gives us the Michael MIC RX/TX keys in | ||
1570 | * different order than NDIS spec, so swap the order here. */ | ||
1571 | memcpy(ndis_key.KeyMaterial, ext->key, 16); | ||
1572 | memcpy(ndis_key.KeyMaterial + 16, ext->key + 24, 8); | ||
1573 | memcpy(ndis_key.KeyMaterial + 24, ext->key + 16, 8); | ||
1574 | } else | ||
1575 | memcpy(ndis_key.KeyMaterial, ext->key, ext->key_len); | ||
1576 | |||
1577 | ret = rndis_set_oid(usbdev, OID_802_11_ADD_KEY, &ndis_key, | ||
1578 | le32_to_cpu(ndis_key.Length)); | ||
1579 | devdbg(usbdev, "SIOCSIWENCODEEXT: OID_802_11_ADD_KEY -> %08X", ret); | ||
1580 | if (ret != 0) | ||
1581 | return ret; | ||
1582 | |||
1583 | priv->encr_key_len[keyidx] = ext->key_len; | ||
1584 | memcpy(&priv->encr_keys[keyidx], ndis_key.KeyMaterial, ext->key_len); | ||
1585 | if (ext->ext_flags & IW_ENCODE_EXT_SET_TX_KEY) | ||
1586 | priv->encr_tx_key_index = keyidx; | ||
1587 | |||
1588 | return 0; | ||
1589 | } | ||
1590 | |||
1591 | |||
1592 | static int rndis_iw_set_scan(struct net_device *dev, | ||
1593 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1594 | { | ||
1595 | struct iw_param *param = &wrqu->param; | ||
1596 | struct usbnet *usbdev = dev->priv; | ||
1597 | union iwreq_data evt; | ||
1598 | int ret = -EINVAL; | ||
1599 | __le32 tmp; | ||
1600 | |||
1601 | devdbg(usbdev, "SIOCSIWSCAN"); | ||
1602 | |||
1603 | if (param->flags == 0) { | ||
1604 | tmp = ccpu2(1); | ||
1605 | ret = rndis_set_oid(usbdev, OID_802_11_BSSID_LIST_SCAN, &tmp, | ||
1606 | sizeof(tmp)); | ||
1607 | evt.data.flags = 0; | ||
1608 | evt.data.length = 0; | ||
1609 | wireless_send_event(dev, SIOCGIWSCAN, &evt, NULL); | ||
1610 | } | ||
1611 | return ret; | ||
1612 | } | ||
1613 | |||
1614 | |||
1615 | static char *rndis_translate_scan(struct net_device *dev, | ||
1616 | char *cev, char *end_buf, struct NDIS_WLAN_BSSID_EX *bssid) | ||
1617 | { | ||
1618 | #ifdef DEBUG | ||
1619 | struct usbnet *usbdev = dev->priv; | ||
1620 | #endif | ||
1621 | struct ieee80211_info_element *ie; | ||
1622 | char *current_val; | ||
1623 | int bssid_len, ie_len, i; | ||
1624 | u32 beacon, atim; | ||
1625 | struct iw_event iwe; | ||
1626 | unsigned char sbuf[32]; | ||
1627 | DECLARE_MAC_BUF(mac); | ||
1628 | |||
1629 | bssid_len = le32_to_cpu(bssid->Length); | ||
1630 | |||
1631 | devdbg(usbdev, "BSSID %s", print_mac(mac, bssid->MacAddress)); | ||
1632 | iwe.cmd = SIOCGIWAP; | ||
1633 | iwe.u.ap_addr.sa_family = ARPHRD_ETHER; | ||
1634 | memcpy(iwe.u.ap_addr.sa_data, bssid->MacAddress, ETH_ALEN); | ||
1635 | cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_ADDR_LEN); | ||
1636 | |||
1637 | devdbg(usbdev, "SSID(%d) %s", | ||
1638 | le32_to_cpu(bssid->Ssid.SsidLength), | ||
1639 | bssid->Ssid.Ssid); | ||
1640 | iwe.cmd = SIOCGIWESSID; | ||
1641 | iwe.u.essid.length = le32_to_cpu(bssid->Ssid.SsidLength); | ||
1642 | iwe.u.essid.flags = 1; | ||
1643 | cev = iwe_stream_add_point(cev, end_buf, &iwe, | ||
1644 | bssid->Ssid.Ssid); | ||
1645 | |||
1646 | devdbg(usbdev, "MODE %d", | ||
1647 | le32_to_cpu(bssid->InfrastructureMode)); | ||
1648 | iwe.cmd = SIOCGIWMODE; | ||
1649 | switch (le32_to_cpu(bssid->InfrastructureMode)) { | ||
1650 | case Ndis802_11IBSS: | ||
1651 | iwe.u.mode = IW_MODE_ADHOC; | ||
1652 | break; | ||
1653 | case Ndis802_11Infrastructure: | ||
1654 | iwe.u.mode = IW_MODE_INFRA; | ||
1655 | break; | ||
1656 | /*case Ndis802_11AutoUnknown:*/ | ||
1657 | default: | ||
1658 | iwe.u.mode = IW_MODE_AUTO; | ||
1659 | break; | ||
1660 | } | ||
1661 | cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_UINT_LEN); | ||
1662 | |||
1663 | devdbg(usbdev, "FREQ %d kHz", | ||
1664 | le32_to_cpu(bssid->Configuration.DSConfig)); | ||
1665 | iwe.cmd = SIOCGIWFREQ; | ||
1666 | dsconfig_to_freq(le32_to_cpu(bssid->Configuration.DSConfig), | ||
1667 | &iwe.u.freq); | ||
1668 | cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_FREQ_LEN); | ||
1669 | |||
1670 | devdbg(usbdev, "QUAL %d", le32_to_cpu(bssid->Rssi)); | ||
1671 | iwe.cmd = IWEVQUAL; | ||
1672 | iwe.u.qual.qual = level_to_qual(le32_to_cpu(bssid->Rssi)); | ||
1673 | iwe.u.qual.level = le32_to_cpu(bssid->Rssi); | ||
1674 | iwe.u.qual.updated = IW_QUAL_QUAL_UPDATED | ||
1675 | | IW_QUAL_LEVEL_UPDATED | ||
1676 | | IW_QUAL_NOISE_INVALID; | ||
1677 | cev = iwe_stream_add_event(cev, end_buf, &iwe, IW_EV_QUAL_LEN); | ||
1678 | |||
1679 | devdbg(usbdev, "ENCODE %d", le32_to_cpu(bssid->Privacy)); | ||
1680 | iwe.cmd = SIOCGIWENCODE; | ||
1681 | iwe.u.data.length = 0; | ||
1682 | if (le32_to_cpu(bssid->Privacy) == Ndis802_11PrivFilterAcceptAll) | ||
1683 | iwe.u.data.flags = IW_ENCODE_DISABLED; | ||
1684 | else | ||
1685 | iwe.u.data.flags = IW_ENCODE_ENABLED | IW_ENCODE_NOKEY; | ||
1686 | |||
1687 | cev = iwe_stream_add_point(cev, end_buf, &iwe, NULL); | ||
1688 | |||
1689 | devdbg(usbdev, "RATES:"); | ||
1690 | current_val = cev + IW_EV_LCP_LEN; | ||
1691 | iwe.cmd = SIOCGIWRATE; | ||
1692 | for (i = 0; i < sizeof(bssid->SupportedRates); i++) { | ||
1693 | if (bssid->SupportedRates[i] & 0x7f) { | ||
1694 | iwe.u.bitrate.value = | ||
1695 | ((bssid->SupportedRates[i] & 0x7f) * | ||
1696 | 500000); | ||
1697 | devdbg(usbdev, " %d", iwe.u.bitrate.value); | ||
1698 | current_val = iwe_stream_add_value(cev, | ||
1699 | current_val, end_buf, &iwe, | ||
1700 | IW_EV_PARAM_LEN); | ||
1701 | } | ||
1702 | } | ||
1703 | |||
1704 | if ((current_val - cev) > IW_EV_LCP_LEN) | ||
1705 | cev = current_val; | ||
1706 | |||
1707 | beacon = le32_to_cpu(bssid->Configuration.BeaconPeriod); | ||
1708 | devdbg(usbdev, "BCN_INT %d", beacon); | ||
1709 | iwe.cmd = IWEVCUSTOM; | ||
1710 | snprintf(sbuf, sizeof(sbuf), "bcn_int=%d", beacon); | ||
1711 | iwe.u.data.length = strlen(sbuf); | ||
1712 | cev = iwe_stream_add_point(cev, end_buf, &iwe, sbuf); | ||
1713 | |||
1714 | atim = le32_to_cpu(bssid->Configuration.ATIMWindow); | ||
1715 | devdbg(usbdev, "ATIM %d", atim); | ||
1716 | iwe.cmd = IWEVCUSTOM; | ||
1717 | snprintf(sbuf, sizeof(sbuf), "atim=%u", atim); | ||
1718 | iwe.u.data.length = strlen(sbuf); | ||
1719 | cev = iwe_stream_add_point(cev, end_buf, &iwe, sbuf); | ||
1720 | |||
1721 | ie = (void *)(bssid->IEs + sizeof(struct NDIS_802_11_FIXED_IEs)); | ||
1722 | ie_len = min(bssid_len - (int)sizeof(*bssid), | ||
1723 | (int)le32_to_cpu(bssid->IELength)); | ||
1724 | ie_len -= sizeof(struct NDIS_802_11_FIXED_IEs); | ||
1725 | while (ie_len >= sizeof(*ie) && sizeof(*ie) + ie->len <= ie_len) { | ||
1726 | if ((ie->id == MFIE_TYPE_GENERIC && ie->len >= 4 && | ||
1727 | memcmp(ie->data, "\x00\x50\xf2\x01", 4) == 0) || | ||
1728 | ie->id == MFIE_TYPE_RSN) { | ||
1729 | devdbg(usbdev, "IE: WPA%d", | ||
1730 | (ie->id == MFIE_TYPE_RSN) ? 2 : 1); | ||
1731 | iwe.cmd = IWEVGENIE; | ||
1732 | iwe.u.data.length = min(ie->len + 2, MAX_WPA_IE_LEN); | ||
1733 | cev = iwe_stream_add_point(cev, end_buf, &iwe, | ||
1734 | (u8 *)ie); | ||
1735 | } | ||
1736 | |||
1737 | ie_len -= sizeof(*ie) + ie->len; | ||
1738 | ie = (struct ieee80211_info_element *)&ie->data[ie->len]; | ||
1739 | } | ||
1740 | |||
1741 | return cev; | ||
1742 | } | ||
1743 | |||
1744 | |||
1745 | static int rndis_iw_get_scan(struct net_device *dev, | ||
1746 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1747 | { | ||
1748 | struct usbnet *usbdev = dev->priv; | ||
1749 | void *buf = NULL; | ||
1750 | char *cev = extra; | ||
1751 | struct NDIS_802_11_BSSID_LIST_EX *bssid_list; | ||
1752 | struct NDIS_WLAN_BSSID_EX *bssid; | ||
1753 | int ret = -EINVAL, len, count, bssid_len; | ||
1754 | |||
1755 | devdbg(usbdev, "SIOCGIWSCAN"); | ||
1756 | |||
1757 | len = CONTROL_BUFFER_SIZE; | ||
1758 | buf = kmalloc(len, GFP_KERNEL); | ||
1759 | if (!buf) { | ||
1760 | ret = -ENOMEM; | ||
1761 | goto out; | ||
1762 | } | ||
1763 | |||
1764 | ret = rndis_query_oid(usbdev, OID_802_11_BSSID_LIST, buf, &len); | ||
1765 | |||
1766 | if (ret != 0) | ||
1767 | goto out; | ||
1768 | |||
1769 | bssid_list = buf; | ||
1770 | bssid = bssid_list->Bssid; | ||
1771 | bssid_len = le32_to_cpu(bssid->Length); | ||
1772 | count = le32_to_cpu(bssid_list->NumberOfItems); | ||
1773 | devdbg(usbdev, "SIOCGIWSCAN: %d BSSIDs found", count); | ||
1774 | |||
1775 | while (count && ((void *)bssid + bssid_len) <= (buf + len)) { | ||
1776 | cev = rndis_translate_scan(dev, cev, extra + IW_SCAN_MAX_DATA, | ||
1777 | bssid); | ||
1778 | bssid = (void *)bssid + bssid_len; | ||
1779 | bssid_len = le32_to_cpu(bssid->Length); | ||
1780 | count--; | ||
1781 | } | ||
1782 | |||
1783 | out: | ||
1784 | wrqu->data.length = cev - extra; | ||
1785 | wrqu->data.flags = 0; | ||
1786 | kfree(buf); | ||
1787 | return ret; | ||
1788 | } | ||
1789 | |||
1790 | |||
1791 | static int rndis_iw_set_genie(struct net_device *dev, | ||
1792 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1793 | { | ||
1794 | struct usbnet *usbdev = dev->priv; | ||
1795 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1796 | int ret = 0; | ||
1797 | |||
1798 | #ifdef DEBUG | ||
1799 | int j; | ||
1800 | u8 *gie = extra; | ||
1801 | for (j = 0; j < wrqu->data.length; j += 8) | ||
1802 | devdbg(usbdev, | ||
1803 | "SIOCSIWGENIE %04x - " | ||
1804 | "%02x %02x %02x %02x %02x %02x %02x %02x", j, | ||
1805 | gie[j + 0], gie[j + 1], gie[j + 2], gie[j + 3], | ||
1806 | gie[j + 4], gie[j + 5], gie[j + 6], gie[j + 7]); | ||
1807 | #endif | ||
1808 | /* clear existing IEs */ | ||
1809 | if (priv->wpa_ie_len) { | ||
1810 | kfree(priv->wpa_ie); | ||
1811 | priv->wpa_ie_len = 0; | ||
1812 | } | ||
1813 | |||
1814 | /* set new IEs */ | ||
1815 | priv->wpa_ie = kmalloc(wrqu->data.length, GFP_KERNEL); | ||
1816 | if (priv->wpa_ie) { | ||
1817 | priv->wpa_ie_len = wrqu->data.length; | ||
1818 | memcpy(priv->wpa_ie, extra, priv->wpa_ie_len); | ||
1819 | } else | ||
1820 | ret = -ENOMEM; | ||
1821 | return ret; | ||
1822 | } | ||
1823 | |||
1824 | |||
1825 | static int rndis_iw_get_genie(struct net_device *dev, | ||
1826 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1827 | { | ||
1828 | struct usbnet *usbdev = dev->priv; | ||
1829 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1830 | |||
1831 | devdbg(usbdev, "SIOCGIWGENIE"); | ||
1832 | |||
1833 | if (priv->wpa_ie_len == 0 || priv->wpa_ie == NULL) { | ||
1834 | wrqu->data.length = 0; | ||
1835 | return 0; | ||
1836 | } | ||
1837 | |||
1838 | if (wrqu->data.length < priv->wpa_ie_len) | ||
1839 | return -E2BIG; | ||
1840 | |||
1841 | wrqu->data.length = priv->wpa_ie_len; | ||
1842 | memcpy(extra, priv->wpa_ie, priv->wpa_ie_len); | ||
1843 | |||
1844 | return 0; | ||
1845 | } | ||
1846 | |||
1847 | |||
1848 | static int rndis_iw_set_rts(struct net_device *dev, | ||
1849 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1850 | { | ||
1851 | struct usbnet *usbdev = dev->priv; | ||
1852 | __le32 tmp; | ||
1853 | devdbg(usbdev, "SIOCSIWRTS"); | ||
1854 | |||
1855 | tmp = cpu_to_le32(wrqu->rts.value); | ||
1856 | return rndis_set_oid(usbdev, OID_802_11_RTS_THRESHOLD, &tmp, | ||
1857 | sizeof(tmp)); | ||
1858 | } | ||
1859 | |||
1860 | |||
1861 | static int rndis_iw_get_rts(struct net_device *dev, | ||
1862 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1863 | { | ||
1864 | struct usbnet *usbdev = dev->priv; | ||
1865 | __le32 tmp; | ||
1866 | int len, ret; | ||
1867 | |||
1868 | len = sizeof(tmp); | ||
1869 | ret = rndis_query_oid(usbdev, OID_802_11_RTS_THRESHOLD, &tmp, &len); | ||
1870 | if (ret == 0) { | ||
1871 | wrqu->rts.value = le32_to_cpu(tmp); | ||
1872 | wrqu->rts.flags = 1; | ||
1873 | wrqu->rts.disabled = 0; | ||
1874 | } | ||
1875 | |||
1876 | devdbg(usbdev, "SIOCGIWRTS: %d", wrqu->rts.value); | ||
1877 | |||
1878 | return ret; | ||
1879 | } | ||
1880 | |||
1881 | |||
1882 | static int rndis_iw_set_frag(struct net_device *dev, | ||
1883 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1884 | { | ||
1885 | struct usbnet *usbdev = dev->priv; | ||
1886 | __le32 tmp; | ||
1887 | |||
1888 | devdbg(usbdev, "SIOCSIWFRAG"); | ||
1889 | |||
1890 | tmp = cpu_to_le32(wrqu->frag.value); | ||
1891 | return rndis_set_oid(usbdev, OID_802_11_FRAGMENTATION_THRESHOLD, &tmp, | ||
1892 | sizeof(tmp)); | ||
1893 | } | ||
1894 | |||
1895 | |||
1896 | static int rndis_iw_get_frag(struct net_device *dev, | ||
1897 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1898 | { | ||
1899 | struct usbnet *usbdev = dev->priv; | ||
1900 | __le32 tmp; | ||
1901 | int len, ret; | ||
1902 | |||
1903 | len = sizeof(tmp); | ||
1904 | ret = rndis_query_oid(usbdev, OID_802_11_FRAGMENTATION_THRESHOLD, &tmp, | ||
1905 | &len); | ||
1906 | if (ret == 0) { | ||
1907 | wrqu->frag.value = le32_to_cpu(tmp); | ||
1908 | wrqu->frag.flags = 1; | ||
1909 | wrqu->frag.disabled = 0; | ||
1910 | } | ||
1911 | devdbg(usbdev, "SIOCGIWFRAG: %d", wrqu->frag.value); | ||
1912 | return ret; | ||
1913 | } | ||
1914 | |||
1915 | |||
1916 | static int rndis_iw_set_nick(struct net_device *dev, | ||
1917 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1918 | { | ||
1919 | struct usbnet *usbdev = dev->priv; | ||
1920 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1921 | |||
1922 | devdbg(usbdev, "SIOCSIWNICK"); | ||
1923 | |||
1924 | priv->nick_len = wrqu->data.length; | ||
1925 | if (priv->nick_len > 32) | ||
1926 | priv->nick_len = 32; | ||
1927 | |||
1928 | memcpy(priv->nick, extra, priv->nick_len); | ||
1929 | return 0; | ||
1930 | } | ||
1931 | |||
1932 | |||
1933 | static int rndis_iw_get_nick(struct net_device *dev, | ||
1934 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1935 | { | ||
1936 | struct usbnet *usbdev = dev->priv; | ||
1937 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
1938 | |||
1939 | wrqu->data.flags = 1; | ||
1940 | wrqu->data.length = priv->nick_len; | ||
1941 | memcpy(extra, priv->nick, priv->nick_len); | ||
1942 | |||
1943 | devdbg(usbdev, "SIOCGIWNICK: '%s'", priv->nick); | ||
1944 | |||
1945 | return 0; | ||
1946 | } | ||
1947 | |||
1948 | |||
1949 | static int rndis_iw_set_freq(struct net_device *dev, | ||
1950 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1951 | { | ||
1952 | struct usbnet *usbdev = dev->priv; | ||
1953 | struct NDIS_802_11_CONFIGURATION config; | ||
1954 | unsigned int dsconfig; | ||
1955 | int len, ret; | ||
1956 | |||
1957 | /* this OID is valid only when not associated */ | ||
1958 | if (is_associated(usbdev)) | ||
1959 | return 0; | ||
1960 | |||
1961 | dsconfig = 0; | ||
1962 | if (freq_to_dsconfig(&wrqu->freq, &dsconfig)) | ||
1963 | return -EINVAL; | ||
1964 | |||
1965 | len = sizeof(config); | ||
1966 | ret = rndis_query_oid(usbdev, OID_802_11_CONFIGURATION, &config, &len); | ||
1967 | if (ret != 0) { | ||
1968 | devdbg(usbdev, "SIOCSIWFREQ: querying configuration failed"); | ||
1969 | return 0; | ||
1970 | } | ||
1971 | |||
1972 | config.DSConfig = cpu_to_le32(dsconfig); | ||
1973 | |||
1974 | devdbg(usbdev, "SIOCSIWFREQ: %d * 10^%d", wrqu->freq.m, wrqu->freq.e); | ||
1975 | return rndis_set_oid(usbdev, OID_802_11_CONFIGURATION, &config, | ||
1976 | sizeof(config)); | ||
1977 | } | ||
1978 | |||
1979 | |||
1980 | static int rndis_iw_get_freq(struct net_device *dev, | ||
1981 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1982 | { | ||
1983 | struct usbnet *usbdev = dev->priv; | ||
1984 | struct NDIS_802_11_CONFIGURATION config; | ||
1985 | int len, ret; | ||
1986 | |||
1987 | len = sizeof(config); | ||
1988 | ret = rndis_query_oid(usbdev, OID_802_11_CONFIGURATION, &config, &len); | ||
1989 | if (ret == 0) | ||
1990 | dsconfig_to_freq(le32_to_cpu(config.DSConfig), &wrqu->freq); | ||
1991 | |||
1992 | devdbg(usbdev, "SIOCGIWFREQ: %d", wrqu->freq.m); | ||
1993 | return ret; | ||
1994 | } | ||
1995 | |||
1996 | |||
1997 | static int rndis_iw_get_txpower(struct net_device *dev, | ||
1998 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
1999 | { | ||
2000 | struct usbnet *usbdev = dev->priv; | ||
2001 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
2002 | __le32 tx_power; | ||
2003 | int ret = 0, len; | ||
2004 | |||
2005 | if (priv->radio_on) { | ||
2006 | if (priv->caps & CAP_SUPPORT_TXPOWER) { | ||
2007 | len = sizeof(tx_power); | ||
2008 | ret = rndis_query_oid(usbdev, OID_802_11_TX_POWER_LEVEL, | ||
2009 | &tx_power, &len); | ||
2010 | if (ret != 0) | ||
2011 | return ret; | ||
2012 | } else | ||
2013 | /* fake incase not supported */ | ||
2014 | tx_power = cpu_to_le32(get_bcm4320_power(priv)); | ||
2015 | |||
2016 | wrqu->txpower.flags = IW_TXPOW_MWATT; | ||
2017 | wrqu->txpower.value = le32_to_cpu(tx_power); | ||
2018 | wrqu->txpower.disabled = 0; | ||
2019 | } else { | ||
2020 | wrqu->txpower.flags = IW_TXPOW_MWATT; | ||
2021 | wrqu->txpower.value = 0; | ||
2022 | wrqu->txpower.disabled = 1; | ||
2023 | } | ||
2024 | |||
2025 | devdbg(usbdev, "SIOCGIWTXPOW: %d", wrqu->txpower.value); | ||
2026 | |||
2027 | return ret; | ||
2028 | } | ||
2029 | |||
2030 | |||
2031 | static int rndis_iw_set_txpower(struct net_device *dev, | ||
2032 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
2033 | { | ||
2034 | struct usbnet *usbdev = dev->priv; | ||
2035 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
2036 | __le32 tx_power = 0; | ||
2037 | int ret = 0; | ||
2038 | |||
2039 | if (!wrqu->txpower.disabled) { | ||
2040 | if (wrqu->txpower.flags == IW_TXPOW_MWATT) | ||
2041 | tx_power = cpu_to_le32(wrqu->txpower.value); | ||
2042 | else { /* wrqu->txpower.flags == IW_TXPOW_DBM */ | ||
2043 | if (wrqu->txpower.value > 20) | ||
2044 | tx_power = cpu_to_le32(128); | ||
2045 | else if (wrqu->txpower.value < -43) | ||
2046 | tx_power = cpu_to_le32(127); | ||
2047 | else { | ||
2048 | signed char tmp; | ||
2049 | tmp = wrqu->txpower.value; | ||
2050 | tmp = -12 - tmp; | ||
2051 | tmp <<= 2; | ||
2052 | tx_power = cpu_to_le32((unsigned char)tmp); | ||
2053 | } | ||
2054 | } | ||
2055 | } | ||
2056 | |||
2057 | devdbg(usbdev, "SIOCSIWTXPOW: %d", le32_to_cpu(tx_power)); | ||
2058 | |||
2059 | if (le32_to_cpu(tx_power) != 0) { | ||
2060 | if (priv->caps & CAP_SUPPORT_TXPOWER) { | ||
2061 | /* turn radio on first */ | ||
2062 | if (!priv->radio_on) | ||
2063 | disassociate(usbdev, 1); | ||
2064 | |||
2065 | ret = rndis_set_oid(usbdev, OID_802_11_TX_POWER_LEVEL, | ||
2066 | &tx_power, sizeof(tx_power)); | ||
2067 | if (ret != 0) | ||
2068 | ret = -EOPNOTSUPP; | ||
2069 | return ret; | ||
2070 | } else { | ||
2071 | /* txpower unsupported, just turn radio on */ | ||
2072 | if (!priv->radio_on) | ||
2073 | return disassociate(usbdev, 1); | ||
2074 | return 0; /* all ready on */ | ||
2075 | } | ||
2076 | } | ||
2077 | |||
2078 | /* tx_power == 0, turn off radio */ | ||
2079 | return disassociate(usbdev, 0); | ||
2080 | } | ||
2081 | |||
2082 | |||
2083 | static int rndis_iw_get_rate(struct net_device *dev, | ||
2084 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
2085 | { | ||
2086 | struct usbnet *usbdev = dev->priv; | ||
2087 | __le32 tmp; | ||
2088 | int ret, len; | ||
2089 | |||
2090 | len = sizeof(tmp); | ||
2091 | ret = rndis_query_oid(usbdev, OID_GEN_LINK_SPEED, &tmp, &len); | ||
2092 | if (ret == 0) { | ||
2093 | wrqu->bitrate.value = le32_to_cpu(tmp) * 100; | ||
2094 | wrqu->bitrate.disabled = 0; | ||
2095 | wrqu->bitrate.flags = 1; | ||
2096 | } | ||
2097 | return ret; | ||
2098 | } | ||
2099 | |||
2100 | |||
2101 | static int rndis_iw_set_mlme(struct net_device *dev, | ||
2102 | struct iw_request_info *info, union iwreq_data *wrqu, char *extra) | ||
2103 | { | ||
2104 | struct usbnet *usbdev = dev->priv; | ||
2105 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
2106 | struct iw_mlme *mlme = (struct iw_mlme *)extra; | ||
2107 | unsigned char bssid[ETH_ALEN]; | ||
2108 | |||
2109 | get_bssid(usbdev, bssid); | ||
2110 | |||
2111 | if (memcmp(bssid, mlme->addr.sa_data, ETH_ALEN)) | ||
2112 | return -EINVAL; | ||
2113 | |||
2114 | switch (mlme->cmd) { | ||
2115 | case IW_MLME_DEAUTH: | ||
2116 | return deauthenticate(usbdev); | ||
2117 | case IW_MLME_DISASSOC: | ||
2118 | return disassociate(usbdev, priv->radio_on); | ||
2119 | default: | ||
2120 | return -EOPNOTSUPP; | ||
2121 | } | ||
2122 | |||
2123 | return 0; | ||
2124 | } | ||
2125 | |||
2126 | |||
2127 | static struct iw_statistics *rndis_get_wireless_stats(struct net_device *dev) | ||
2128 | { | ||
2129 | struct usbnet *usbdev = dev->priv; | ||
2130 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
2131 | unsigned long flags; | ||
2132 | |||
2133 | spin_lock_irqsave(&priv->stats_lock, flags); | ||
2134 | memcpy(&priv->iwstats, &priv->privstats, sizeof(priv->iwstats)); | ||
2135 | spin_unlock_irqrestore(&priv->stats_lock, flags); | ||
2136 | |||
2137 | return &priv->iwstats; | ||
2138 | } | ||
2139 | |||
2140 | |||
2141 | #define IW_IOCTL(x) [(x) - SIOCSIWCOMMIT] | ||
2142 | static const iw_handler rndis_iw_handler[] = | ||
2143 | { | ||
2144 | IW_IOCTL(SIOCSIWCOMMIT) = rndis_iw_commit, | ||
2145 | IW_IOCTL(SIOCGIWNAME) = rndis_iw_get_name, | ||
2146 | IW_IOCTL(SIOCSIWFREQ) = rndis_iw_set_freq, | ||
2147 | IW_IOCTL(SIOCGIWFREQ) = rndis_iw_get_freq, | ||
2148 | IW_IOCTL(SIOCSIWMODE) = rndis_iw_set_mode, | ||
2149 | IW_IOCTL(SIOCGIWMODE) = rndis_iw_get_mode, | ||
2150 | IW_IOCTL(SIOCGIWRANGE) = rndis_iw_get_range, | ||
2151 | IW_IOCTL(SIOCSIWAP) = rndis_iw_set_bssid, | ||
2152 | IW_IOCTL(SIOCGIWAP) = rndis_iw_get_bssid, | ||
2153 | IW_IOCTL(SIOCSIWSCAN) = rndis_iw_set_scan, | ||
2154 | IW_IOCTL(SIOCGIWSCAN) = rndis_iw_get_scan, | ||
2155 | IW_IOCTL(SIOCSIWESSID) = rndis_iw_set_essid, | ||
2156 | IW_IOCTL(SIOCGIWESSID) = rndis_iw_get_essid, | ||
2157 | IW_IOCTL(SIOCSIWNICKN) = rndis_iw_set_nick, | ||
2158 | IW_IOCTL(SIOCGIWNICKN) = rndis_iw_get_nick, | ||
2159 | IW_IOCTL(SIOCGIWRATE) = rndis_iw_get_rate, | ||
2160 | IW_IOCTL(SIOCSIWRTS) = rndis_iw_set_rts, | ||
2161 | IW_IOCTL(SIOCGIWRTS) = rndis_iw_get_rts, | ||
2162 | IW_IOCTL(SIOCSIWFRAG) = rndis_iw_set_frag, | ||
2163 | IW_IOCTL(SIOCGIWFRAG) = rndis_iw_get_frag, | ||
2164 | IW_IOCTL(SIOCSIWTXPOW) = rndis_iw_set_txpower, | ||
2165 | IW_IOCTL(SIOCGIWTXPOW) = rndis_iw_get_txpower, | ||
2166 | IW_IOCTL(SIOCSIWENCODE) = rndis_iw_set_encode, | ||
2167 | IW_IOCTL(SIOCSIWENCODEEXT) = rndis_iw_set_encode_ext, | ||
2168 | IW_IOCTL(SIOCSIWAUTH) = rndis_iw_set_auth, | ||
2169 | IW_IOCTL(SIOCGIWAUTH) = rndis_iw_get_auth, | ||
2170 | IW_IOCTL(SIOCSIWGENIE) = rndis_iw_set_genie, | ||
2171 | IW_IOCTL(SIOCGIWGENIE) = rndis_iw_get_genie, | ||
2172 | IW_IOCTL(SIOCSIWMLME) = rndis_iw_set_mlme, | ||
2173 | }; | ||
2174 | |||
2175 | static const iw_handler rndis_wext_private_handler[] = { | ||
2176 | }; | ||
2177 | |||
2178 | static const struct iw_priv_args rndis_wext_private_args[] = { | ||
2179 | }; | ||
2180 | |||
2181 | |||
2182 | static const struct iw_handler_def rndis_iw_handlers = { | ||
2183 | .num_standard = ARRAY_SIZE(rndis_iw_handler), | ||
2184 | .num_private = ARRAY_SIZE(rndis_wext_private_handler), | ||
2185 | .num_private_args = ARRAY_SIZE(rndis_wext_private_args), | ||
2186 | .standard = (iw_handler *)rndis_iw_handler, | ||
2187 | .private = (iw_handler *)rndis_wext_private_handler, | ||
2188 | .private_args = (struct iw_priv_args *)rndis_wext_private_args, | ||
2189 | .get_wireless_stats = rndis_get_wireless_stats, | ||
2190 | }; | ||
2191 | |||
2192 | |||
2193 | static void rndis_wext_worker(struct work_struct *work) | ||
2194 | { | ||
2195 | struct rndis_wext_private *priv = | ||
2196 | container_of(work, struct rndis_wext_private, work); | ||
2197 | struct usbnet *usbdev = priv->usbdev; | ||
2198 | union iwreq_data evt; | ||
2199 | unsigned char bssid[ETH_ALEN]; | ||
2200 | int ret; | ||
2201 | |||
2202 | if (test_and_clear_bit(WORK_CONNECTION_EVENT, &priv->work_pending)) { | ||
2203 | ret = get_bssid(usbdev, bssid); | ||
2204 | |||
2205 | if (!ret) { | ||
2206 | evt.data.flags = 0; | ||
2207 | evt.data.length = 0; | ||
2208 | memcpy(evt.ap_addr.sa_data, bssid, ETH_ALEN); | ||
2209 | wireless_send_event(usbdev->net, SIOCGIWAP, &evt, NULL); | ||
2210 | } | ||
2211 | } | ||
2212 | |||
2213 | if (test_and_clear_bit(WORK_SET_MULTICAST_LIST, &priv->work_pending)) | ||
2214 | set_multicast_list(usbdev); | ||
2215 | } | ||
2216 | |||
2217 | static void rndis_wext_set_multicast_list(struct net_device *dev) | ||
2218 | { | ||
2219 | struct usbnet *usbdev = dev->priv; | ||
2220 | struct rndis_wext_private *priv = get_rndis_wext_priv(usbdev); | ||
2221 | |||
2222 | set_bit(WORK_SET_MULTICAST_LIST, &priv->work_pending); | ||
2223 | queue_work(priv->workqueue, &priv->work); | ||
2224 | } | ||
2225 | |||
2226 | static void rndis_wext_link_change(struct usbnet *dev, int state) | ||
2227 | { | ||
2228 | struct rndis_wext_private *priv = get_rndis_wext_priv(dev); | ||
2229 | union iwreq_data evt; | ||
2230 | |||
2231 | if (state) { | ||
2232 | /* queue work to avoid recursive calls into rndis_command */ | ||
2233 | set_bit(WORK_CONNECTION_EVENT, &priv->work_pending); | ||
2234 | queue_work(priv->workqueue, &priv->work); | ||
2235 | } else { | ||
2236 | evt.data.flags = 0; | ||
2237 | evt.data.length = 0; | ||
2238 | memset(evt.ap_addr.sa_data, 0, ETH_ALEN); | ||
2239 | wireless_send_event(dev->net, SIOCGIWAP, &evt, NULL); | ||
2240 | } | ||
2241 | } | ||
2242 | |||
2243 | |||
2244 | static int rndis_wext_get_caps(struct usbnet *dev) | ||
2245 | { | ||
2246 | struct { | ||
2247 | __le32 num_items; | ||
2248 | __le32 items[8]; | ||
2249 | } networks_supported; | ||
2250 | int len, retval, i, n; | ||
2251 | __le32 tx_power; | ||
2252 | struct rndis_wext_private *priv = get_rndis_wext_priv(dev); | ||
2253 | |||
2254 | /* determine if supports setting txpower */ | ||
2255 | len = sizeof(tx_power); | ||
2256 | retval = rndis_query_oid(dev, OID_802_11_TX_POWER_LEVEL, &tx_power, | ||
2257 | &len); | ||
2258 | if (retval == 0 && le32_to_cpu(tx_power) != 0xFF) | ||
2259 | priv->caps |= CAP_SUPPORT_TXPOWER; | ||
2260 | |||
2261 | /* determine supported modes */ | ||
2262 | len = sizeof(networks_supported); | ||
2263 | retval = rndis_query_oid(dev, OID_802_11_NETWORK_TYPES_SUPPORTED, | ||
2264 | &networks_supported, &len); | ||
2265 | if (retval >= 0) { | ||
2266 | n = le32_to_cpu(networks_supported.num_items); | ||
2267 | if (n > 8) | ||
2268 | n = 8; | ||
2269 | for (i = 0; i < n; i++) { | ||
2270 | switch (le32_to_cpu(networks_supported.items[i])) { | ||
2271 | case Ndis802_11FH: | ||
2272 | case Ndis802_11DS: | ||
2273 | priv->caps |= CAP_MODE_80211B; | ||
2274 | break; | ||
2275 | case Ndis802_11OFDM5: | ||
2276 | priv->caps |= CAP_MODE_80211A; | ||
2277 | break; | ||
2278 | case Ndis802_11OFDM24: | ||
2279 | priv->caps |= CAP_MODE_80211G; | ||
2280 | break; | ||
2281 | } | ||
2282 | } | ||
2283 | if (priv->caps & CAP_MODE_80211A) | ||
2284 | strcat(priv->name, "a"); | ||
2285 | if (priv->caps & CAP_MODE_80211B) | ||
2286 | strcat(priv->name, "b"); | ||
2287 | if (priv->caps & CAP_MODE_80211G) | ||
2288 | strcat(priv->name, "g"); | ||
2289 | } | ||
2290 | |||
2291 | return retval; | ||
2292 | } | ||
2293 | |||
2294 | |||
2295 | #define STATS_UPDATE_JIFFIES (HZ) | ||
2296 | static void rndis_update_wireless_stats(struct work_struct *work) | ||
2297 | { | ||
2298 | struct rndis_wext_private *priv = | ||
2299 | container_of(work, struct rndis_wext_private, stats_work.work); | ||
2300 | struct usbnet *usbdev = priv->usbdev; | ||
2301 | struct iw_statistics iwstats; | ||
2302 | __le32 rssi, tmp; | ||
2303 | int len, ret, bitrate, j; | ||
2304 | unsigned long flags; | ||
2305 | int update_jiffies = STATS_UPDATE_JIFFIES; | ||
2306 | void *buf; | ||
2307 | |||
2308 | spin_lock_irqsave(&priv->stats_lock, flags); | ||
2309 | memcpy(&iwstats, &priv->privstats, sizeof(iwstats)); | ||
2310 | spin_unlock_irqrestore(&priv->stats_lock, flags); | ||
2311 | |||
2312 | /* only update stats when connected */ | ||
2313 | if (!is_associated(usbdev)) { | ||
2314 | iwstats.qual.qual = 0; | ||
2315 | iwstats.qual.level = 0; | ||
2316 | iwstats.qual.updated = IW_QUAL_QUAL_UPDATED | ||
2317 | | IW_QUAL_LEVEL_UPDATED | ||
2318 | | IW_QUAL_NOISE_INVALID | ||
2319 | | IW_QUAL_QUAL_INVALID | ||
2320 | | IW_QUAL_LEVEL_INVALID; | ||
2321 | goto end; | ||
2322 | } | ||
2323 | |||
2324 | len = sizeof(rssi); | ||
2325 | ret = rndis_query_oid(usbdev, OID_802_11_RSSI, &rssi, &len); | ||
2326 | |||
2327 | devdbg(usbdev, "stats: OID_802_11_RSSI -> %d, rssi:%d", ret, | ||
2328 | le32_to_cpu(rssi)); | ||
2329 | if (ret == 0) { | ||
2330 | memset(&iwstats.qual, 0, sizeof(iwstats.qual)); | ||
2331 | iwstats.qual.qual = level_to_qual(le32_to_cpu(rssi)); | ||
2332 | iwstats.qual.level = le32_to_cpu(rssi); | ||
2333 | iwstats.qual.updated = IW_QUAL_QUAL_UPDATED | ||
2334 | | IW_QUAL_LEVEL_UPDATED | ||
2335 | | IW_QUAL_NOISE_INVALID; | ||
2336 | } | ||
2337 | |||
2338 | memset(&iwstats.discard, 0, sizeof(iwstats.discard)); | ||
2339 | |||
2340 | len = sizeof(tmp); | ||
2341 | ret = rndis_query_oid(usbdev, OID_GEN_XMIT_ERROR, &tmp, &len); | ||
2342 | if (ret == 0) | ||
2343 | iwstats.discard.misc += le32_to_cpu(tmp); | ||
2344 | |||
2345 | len = sizeof(tmp); | ||
2346 | ret = rndis_query_oid(usbdev, OID_GEN_RCV_ERROR, &tmp, &len); | ||
2347 | if (ret == 0) | ||
2348 | iwstats.discard.misc += le32_to_cpu(tmp); | ||
2349 | |||
2350 | len = sizeof(tmp); | ||
2351 | ret = rndis_query_oid(usbdev, OID_GEN_RCV_NO_BUFFER, &tmp, &len); | ||
2352 | if (ret == 0) | ||
2353 | iwstats.discard.misc += le32_to_cpu(tmp); | ||
2354 | |||
2355 | /* Workaround transfer stalls on poor quality links. */ | ||
2356 | len = sizeof(tmp); | ||
2357 | ret = rndis_query_oid(usbdev, OID_GEN_LINK_SPEED, &tmp, &len); | ||
2358 | if (ret == 0) { | ||
2359 | bitrate = le32_to_cpu(tmp) * 100; | ||
2360 | if (bitrate > 11000000) | ||
2361 | goto end; | ||
2362 | |||
2363 | /* Decrease stats worker interval to catch stalls. | ||
2364 | * faster. Faster than 400-500ms causes packet loss, | ||
2365 | * Slower doesn't catch stalls fast enough. | ||
2366 | */ | ||
2367 | j = msecs_to_jiffies(priv->param_workaround_interval); | ||
2368 | if (j > STATS_UPDATE_JIFFIES) | ||
2369 | j = STATS_UPDATE_JIFFIES; | ||
2370 | else if (j <= 0) | ||
2371 | j = 1; | ||
2372 | update_jiffies = j; | ||
2373 | |||
2374 | /* Send scan OID. Use of both OIDs is required to get device | ||
2375 | * working. | ||
2376 | */ | ||
2377 | tmp = ccpu2(1); | ||
2378 | rndis_set_oid(usbdev, OID_802_11_BSSID_LIST_SCAN, &tmp, | ||
2379 | sizeof(tmp)); | ||
2380 | |||
2381 | len = CONTROL_BUFFER_SIZE; | ||
2382 | buf = kmalloc(len, GFP_KERNEL); | ||
2383 | if (!buf) | ||
2384 | goto end; | ||
2385 | |||
2386 | rndis_query_oid(usbdev, OID_802_11_BSSID_LIST, buf, &len); | ||
2387 | kfree(buf); | ||
2388 | } | ||
2389 | end: | ||
2390 | spin_lock_irqsave(&priv->stats_lock, flags); | ||
2391 | memcpy(&priv->privstats, &iwstats, sizeof(iwstats)); | ||
2392 | spin_unlock_irqrestore(&priv->stats_lock, flags); | ||
2393 | |||
2394 | if (update_jiffies >= HZ) | ||
2395 | update_jiffies = round_jiffies_relative(update_jiffies); | ||
2396 | else { | ||
2397 | j = round_jiffies_relative(update_jiffies); | ||
2398 | if (abs(j - update_jiffies) <= 10) | ||
2399 | update_jiffies = j; | ||
2400 | } | ||
2401 | |||
2402 | queue_delayed_work(priv->workqueue, &priv->stats_work, update_jiffies); | ||
2403 | } | ||
2404 | |||
2405 | |||
2406 | static int bcm4320_early_init(struct usbnet *dev) | ||
2407 | { | ||
2408 | struct rndis_wext_private *priv = get_rndis_wext_priv(dev); | ||
2409 | char buf[8]; | ||
2410 | |||
2411 | /* Early initialization settings, setting these won't have effect | ||
2412 | * if called after generic_rndis_bind(). | ||
2413 | */ | ||
2414 | |||
2415 | priv->param_country[0] = modparam_country[0]; | ||
2416 | priv->param_country[1] = modparam_country[1]; | ||
2417 | priv->param_country[2] = 0; | ||
2418 | priv->param_frameburst = modparam_frameburst; | ||
2419 | priv->param_afterburner = modparam_afterburner; | ||
2420 | priv->param_power_save = modparam_power_save; | ||
2421 | priv->param_power_output = modparam_power_output; | ||
2422 | priv->param_roamtrigger = modparam_roamtrigger; | ||
2423 | priv->param_roamdelta = modparam_roamdelta; | ||
2424 | priv->param_workaround_interval = modparam_workaround_interval; | ||
2425 | |||
2426 | priv->param_country[0] = toupper(priv->param_country[0]); | ||
2427 | priv->param_country[1] = toupper(priv->param_country[1]); | ||
2428 | /* doesn't support EU as country code, use FI instead */ | ||
2429 | if (!strcmp(priv->param_country, "EU")) | ||
2430 | strcpy(priv->param_country, "FI"); | ||
2431 | |||
2432 | if (priv->param_power_save < 0) | ||
2433 | priv->param_power_save = 0; | ||
2434 | else if (priv->param_power_save > 2) | ||
2435 | priv->param_power_save = 2; | ||
2436 | |||
2437 | if (priv->param_roamtrigger < -80) | ||
2438 | priv->param_roamtrigger = -80; | ||
2439 | else if (priv->param_roamtrigger > -60) | ||
2440 | priv->param_roamtrigger = -60; | ||
2441 | |||
2442 | if (priv->param_roamdelta < 0) | ||
2443 | priv->param_roamdelta = 0; | ||
2444 | else if (priv->param_roamdelta > 2) | ||
2445 | priv->param_roamdelta = 2; | ||
2446 | |||
2447 | if (priv->param_workaround_interval < 0) | ||
2448 | priv->param_workaround_interval = 500; | ||
2449 | |||
2450 | rndis_set_config_parameter_str(dev, "Country", priv->param_country); | ||
2451 | rndis_set_config_parameter_str(dev, "FrameBursting", | ||
2452 | priv->param_frameburst ? "1" : "0"); | ||
2453 | rndis_set_config_parameter_str(dev, "Afterburner", | ||
2454 | priv->param_afterburner ? "1" : "0"); | ||
2455 | sprintf(buf, "%d", priv->param_power_save); | ||
2456 | rndis_set_config_parameter_str(dev, "PowerSaveMode", buf); | ||
2457 | sprintf(buf, "%d", priv->param_power_output); | ||
2458 | rndis_set_config_parameter_str(dev, "PwrOut", buf); | ||
2459 | sprintf(buf, "%d", priv->param_roamtrigger); | ||
2460 | rndis_set_config_parameter_str(dev, "RoamTrigger", buf); | ||
2461 | sprintf(buf, "%d", priv->param_roamdelta); | ||
2462 | rndis_set_config_parameter_str(dev, "RoamDelta", buf); | ||
2463 | |||
2464 | return 0; | ||
2465 | } | ||
2466 | |||
2467 | |||
2468 | static int rndis_wext_bind(struct usbnet *dev, struct usb_interface *intf) | ||
2469 | { | ||
2470 | struct net_device *net = dev->net; | ||
2471 | struct rndis_wext_private *priv; | ||
2472 | int retval, len; | ||
2473 | __le32 tmp; | ||
2474 | |||
2475 | /* allocate rndis private data */ | ||
2476 | priv = kmalloc(sizeof(struct rndis_wext_private), GFP_KERNEL); | ||
2477 | if (!priv) | ||
2478 | return -ENOMEM; | ||
2479 | |||
2480 | /* These have to be initialized before calling generic_rndis_bind(). | ||
2481 | * Otherwise we'll be in big trouble in rndis_wext_early_init(). | ||
2482 | */ | ||
2483 | dev->driver_priv = priv; | ||
2484 | memset(priv, 0, sizeof(*priv)); | ||
2485 | memset(priv->name, 0, sizeof(priv->name)); | ||
2486 | strcpy(priv->name, "IEEE802.11"); | ||
2487 | net->wireless_handlers = &rndis_iw_handlers; | ||
2488 | priv->usbdev = dev; | ||
2489 | |||
2490 | mutex_init(&priv->command_lock); | ||
2491 | spin_lock_init(&priv->stats_lock); | ||
2492 | |||
2493 | /* try bind rndis_host */ | ||
2494 | retval = generic_rndis_bind(dev, intf, FLAG_RNDIS_PHYM_WIRELESS); | ||
2495 | if (retval < 0) | ||
2496 | goto fail; | ||
2497 | |||
2498 | /* generic_rndis_bind set packet filter to multicast_all+ | ||
2499 | * promisc mode which doesn't work well for our devices (device | ||
2500 | * picks up rssi to closest station instead of to access point). | ||
2501 | * | ||
2502 | * rndis_host wants to avoid all OID as much as possible | ||
2503 | * so do promisc/multicast handling in rndis_wext. | ||
2504 | */ | ||
2505 | dev->net->set_multicast_list = rndis_wext_set_multicast_list; | ||
2506 | tmp = RNDIS_PACKET_TYPE_DIRECTED | RNDIS_PACKET_TYPE_BROADCAST; | ||
2507 | retval = rndis_set_oid(dev, OID_GEN_CURRENT_PACKET_FILTER, &tmp, | ||
2508 | sizeof(tmp)); | ||
2509 | |||
2510 | len = sizeof(tmp); | ||
2511 | retval = rndis_query_oid(dev, OID_802_3_MAXIMUM_LIST_SIZE, &tmp, &len); | ||
2512 | priv->multicast_size = le32_to_cpu(tmp); | ||
2513 | if (retval < 0 || priv->multicast_size < 0) | ||
2514 | priv->multicast_size = 0; | ||
2515 | if (priv->multicast_size > 0) | ||
2516 | dev->net->flags |= IFF_MULTICAST; | ||
2517 | else | ||
2518 | dev->net->flags &= ~IFF_MULTICAST; | ||
2519 | |||
2520 | priv->iwstats.qual.qual = 0; | ||
2521 | priv->iwstats.qual.level = 0; | ||
2522 | priv->iwstats.qual.updated = IW_QUAL_QUAL_UPDATED | ||
2523 | | IW_QUAL_LEVEL_UPDATED | ||
2524 | | IW_QUAL_NOISE_INVALID | ||
2525 | | IW_QUAL_QUAL_INVALID | ||
2526 | | IW_QUAL_LEVEL_INVALID; | ||
2527 | |||
2528 | rndis_wext_get_caps(dev); | ||
2529 | set_default_iw_params(dev); | ||
2530 | |||
2531 | /* turn radio on */ | ||
2532 | priv->radio_on = 1; | ||
2533 | disassociate(dev, 1); | ||
2534 | |||
2535 | /* because rndis_command() sleeps we need to use workqueue */ | ||
2536 | priv->workqueue = create_singlethread_workqueue("rndis_wlan"); | ||
2537 | INIT_DELAYED_WORK(&priv->stats_work, rndis_update_wireless_stats); | ||
2538 | queue_delayed_work(priv->workqueue, &priv->stats_work, | ||
2539 | round_jiffies_relative(STATS_UPDATE_JIFFIES)); | ||
2540 | INIT_WORK(&priv->work, rndis_wext_worker); | ||
2541 | |||
2542 | return 0; | ||
2543 | |||
2544 | fail: | ||
2545 | kfree(priv); | ||
2546 | return retval; | ||
2547 | } | ||
2548 | |||
2549 | |||
2550 | static void rndis_wext_unbind(struct usbnet *dev, struct usb_interface *intf) | ||
2551 | { | ||
2552 | struct rndis_wext_private *priv = get_rndis_wext_priv(dev); | ||
2553 | |||
2554 | /* turn radio off */ | ||
2555 | disassociate(dev, 0); | ||
2556 | |||
2557 | cancel_delayed_work_sync(&priv->stats_work); | ||
2558 | cancel_work_sync(&priv->work); | ||
2559 | flush_workqueue(priv->workqueue); | ||
2560 | destroy_workqueue(priv->workqueue); | ||
2561 | |||
2562 | if (priv && priv->wpa_ie_len) | ||
2563 | kfree(priv->wpa_ie); | ||
2564 | kfree(priv); | ||
2565 | |||
2566 | rndis_unbind(dev, intf); | ||
2567 | } | ||
2568 | |||
2569 | |||
2570 | static int rndis_wext_reset(struct usbnet *dev) | ||
2571 | { | ||
2572 | return deauthenticate(dev); | ||
2573 | } | ||
2574 | |||
2575 | |||
2576 | static const struct driver_info bcm4320b_info = { | ||
2577 | .description = "Wireless RNDIS device, BCM4320b based", | ||
2578 | .flags = FLAG_WLAN | FLAG_FRAMING_RN | FLAG_NO_SETINT, | ||
2579 | .bind = rndis_wext_bind, | ||
2580 | .unbind = rndis_wext_unbind, | ||
2581 | .status = rndis_status, | ||
2582 | .rx_fixup = rndis_rx_fixup, | ||
2583 | .tx_fixup = rndis_tx_fixup, | ||
2584 | .reset = rndis_wext_reset, | ||
2585 | .early_init = bcm4320_early_init, | ||
2586 | .link_change = rndis_wext_link_change, | ||
2587 | }; | ||
2588 | |||
2589 | static const struct driver_info bcm4320a_info = { | ||
2590 | .description = "Wireless RNDIS device, BCM4320a based", | ||
2591 | .flags = FLAG_WLAN | FLAG_FRAMING_RN | FLAG_NO_SETINT, | ||
2592 | .bind = rndis_wext_bind, | ||
2593 | .unbind = rndis_wext_unbind, | ||
2594 | .status = rndis_status, | ||
2595 | .rx_fixup = rndis_rx_fixup, | ||
2596 | .tx_fixup = rndis_tx_fixup, | ||
2597 | .reset = rndis_wext_reset, | ||
2598 | .early_init = bcm4320_early_init, | ||
2599 | .link_change = rndis_wext_link_change, | ||
2600 | }; | ||
2601 | |||
2602 | static const struct driver_info rndis_wext_info = { | ||
2603 | .description = "Wireless RNDIS device", | ||
2604 | .flags = FLAG_WLAN | FLAG_FRAMING_RN | FLAG_NO_SETINT, | ||
2605 | .bind = rndis_wext_bind, | ||
2606 | .unbind = rndis_wext_unbind, | ||
2607 | .status = rndis_status, | ||
2608 | .rx_fixup = rndis_rx_fixup, | ||
2609 | .tx_fixup = rndis_tx_fixup, | ||
2610 | .reset = rndis_wext_reset, | ||
2611 | .early_init = bcm4320_early_init, | ||
2612 | .link_change = rndis_wext_link_change, | ||
2613 | }; | ||
2614 | |||
2615 | /*-------------------------------------------------------------------------*/ | ||
2616 | |||
2617 | static const struct usb_device_id products [] = { | ||
2618 | #define RNDIS_MASTER_INTERFACE \ | ||
2619 | .bInterfaceClass = USB_CLASS_COMM, \ | ||
2620 | .bInterfaceSubClass = 2 /* ACM */, \ | ||
2621 | .bInterfaceProtocol = 0x0ff | ||
2622 | |||
2623 | /* INF driver for these devices have DriverVer >= 4.xx.xx.xx and many custom | ||
2624 | * parameters available. Chipset marked as 'BCM4320SKFBG' in NDISwrapper-wiki. | ||
2625 | */ | ||
2626 | { | ||
2627 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2628 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2629 | .idVendor = 0x0411, | ||
2630 | .idProduct = 0x00bc, /* Buffalo WLI-U2-KG125S */ | ||
2631 | RNDIS_MASTER_INTERFACE, | ||
2632 | .driver_info = (unsigned long) &bcm4320b_info, | ||
2633 | }, { | ||
2634 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2635 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2636 | .idVendor = 0x0baf, | ||
2637 | .idProduct = 0x011b, /* U.S. Robotics USR5421 */ | ||
2638 | RNDIS_MASTER_INTERFACE, | ||
2639 | .driver_info = (unsigned long) &bcm4320b_info, | ||
2640 | }, { | ||
2641 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2642 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2643 | .idVendor = 0x050d, | ||
2644 | .idProduct = 0x011b, /* Belkin F5D7051 */ | ||
2645 | RNDIS_MASTER_INTERFACE, | ||
2646 | .driver_info = (unsigned long) &bcm4320b_info, | ||
2647 | }, { | ||
2648 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2649 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2650 | .idVendor = 0x1799, /* Belkin has two vendor ids */ | ||
2651 | .idProduct = 0x011b, /* Belkin F5D7051 */ | ||
2652 | RNDIS_MASTER_INTERFACE, | ||
2653 | .driver_info = (unsigned long) &bcm4320b_info, | ||
2654 | }, { | ||
2655 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2656 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2657 | .idVendor = 0x13b1, | ||
2658 | .idProduct = 0x0014, /* Linksys WUSB54GSv2 */ | ||
2659 | RNDIS_MASTER_INTERFACE, | ||
2660 | .driver_info = (unsigned long) &bcm4320b_info, | ||
2661 | }, { | ||
2662 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2663 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2664 | .idVendor = 0x13b1, | ||
2665 | .idProduct = 0x0026, /* Linksys WUSB54GSC */ | ||
2666 | RNDIS_MASTER_INTERFACE, | ||
2667 | .driver_info = (unsigned long) &bcm4320b_info, | ||
2668 | }, { | ||
2669 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2670 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2671 | .idVendor = 0x0b05, | ||
2672 | .idProduct = 0x1717, /* Asus WL169gE */ | ||
2673 | RNDIS_MASTER_INTERFACE, | ||
2674 | .driver_info = (unsigned long) &bcm4320b_info, | ||
2675 | }, { | ||
2676 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2677 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2678 | .idVendor = 0x0a5c, | ||
2679 | .idProduct = 0xd11b, /* Eminent EM4045 */ | ||
2680 | RNDIS_MASTER_INTERFACE, | ||
2681 | .driver_info = (unsigned long) &bcm4320b_info, | ||
2682 | }, { | ||
2683 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2684 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2685 | .idVendor = 0x1690, | ||
2686 | .idProduct = 0x0715, /* BT Voyager 1055 */ | ||
2687 | RNDIS_MASTER_INTERFACE, | ||
2688 | .driver_info = (unsigned long) &bcm4320b_info, | ||
2689 | }, | ||
2690 | /* These devices have DriverVer < 4.xx.xx.xx and do not have any custom | ||
2691 | * parameters available, hardware probably contain older firmware version with | ||
2692 | * no way of updating. Chipset marked as 'BCM4320????' in NDISwrapper-wiki. | ||
2693 | */ | ||
2694 | { | ||
2695 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2696 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2697 | .idVendor = 0x13b1, | ||
2698 | .idProduct = 0x000e, /* Linksys WUSB54GSv1 */ | ||
2699 | RNDIS_MASTER_INTERFACE, | ||
2700 | .driver_info = (unsigned long) &bcm4320a_info, | ||
2701 | }, { | ||
2702 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2703 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2704 | .idVendor = 0x0baf, | ||
2705 | .idProduct = 0x0111, /* U.S. Robotics USR5420 */ | ||
2706 | RNDIS_MASTER_INTERFACE, | ||
2707 | .driver_info = (unsigned long) &bcm4320a_info, | ||
2708 | }, { | ||
2709 | .match_flags = USB_DEVICE_ID_MATCH_INT_INFO | ||
2710 | | USB_DEVICE_ID_MATCH_DEVICE, | ||
2711 | .idVendor = 0x0411, | ||
2712 | .idProduct = 0x004b, /* BUFFALO WLI-USB-G54 */ | ||
2713 | RNDIS_MASTER_INTERFACE, | ||
2714 | .driver_info = (unsigned long) &bcm4320a_info, | ||
2715 | }, | ||
2716 | /* Generic Wireless RNDIS devices that we don't have exact | ||
2717 | * idVendor/idProduct/chip yet. | ||
2718 | */ | ||
2719 | { | ||
2720 | /* RNDIS is MSFT's un-official variant of CDC ACM */ | ||
2721 | USB_INTERFACE_INFO(USB_CLASS_COMM, 2 /* ACM */, 0x0ff), | ||
2722 | .driver_info = (unsigned long) &rndis_wext_info, | ||
2723 | }, { | ||
2724 | /* "ActiveSync" is an undocumented variant of RNDIS, used in WM5 */ | ||
2725 | USB_INTERFACE_INFO(USB_CLASS_MISC, 1, 1), | ||
2726 | .driver_info = (unsigned long) &rndis_wext_info, | ||
2727 | }, | ||
2728 | { }, // END | ||
2729 | }; | ||
2730 | MODULE_DEVICE_TABLE(usb, products); | ||
2731 | |||
2732 | static struct usb_driver rndis_wlan_driver = { | ||
2733 | .name = "rndis_wlan", | ||
2734 | .id_table = products, | ||
2735 | .probe = usbnet_probe, | ||
2736 | .disconnect = usbnet_disconnect, | ||
2737 | .suspend = usbnet_suspend, | ||
2738 | .resume = usbnet_resume, | ||
2739 | }; | ||
2740 | |||
2741 | static int __init rndis_wlan_init(void) | ||
2742 | { | ||
2743 | return usb_register(&rndis_wlan_driver); | ||
2744 | } | ||
2745 | module_init(rndis_wlan_init); | ||
2746 | |||
2747 | static void __exit rndis_wlan_exit(void) | ||
2748 | { | ||
2749 | usb_deregister(&rndis_wlan_driver); | ||
2750 | } | ||
2751 | module_exit(rndis_wlan_exit); | ||
2752 | |||
2753 | MODULE_AUTHOR("Bjorge Dijkstra"); | ||
2754 | MODULE_AUTHOR("Jussi Kivilinna"); | ||
2755 | MODULE_DESCRIPTION("Driver for RNDIS based USB Wireless adapters"); | ||
2756 | MODULE_LICENSE("GPL"); | ||
2757 | |||
diff --git a/drivers/net/wireless/rt2x00/rt61pci.c b/drivers/net/wireless/rt2x00/rt61pci.c index ab52f221cd71..b31f0c26c32b 100644 --- a/drivers/net/wireless/rt2x00/rt61pci.c +++ b/drivers/net/wireless/rt2x00/rt61pci.c | |||
@@ -1736,7 +1736,8 @@ static void rt61pci_txdone(struct rt2x00_dev *rt2x00dev) | |||
1736 | WARNING(rt2x00dev, | 1736 | WARNING(rt2x00dev, |
1737 | "TX status report missed for entry %p\n", | 1737 | "TX status report missed for entry %p\n", |
1738 | entry_done); | 1738 | entry_done); |
1739 | rt2x00lib_txdone(entry_done, TX_FAIL_OTHER, 0); | 1739 | rt2x00pci_txdone(rt2x00dev, entry_done, TX_FAIL_OTHER, |
1740 | 0); | ||
1740 | entry_done = rt2x00_get_data_entry_done(ring); | 1741 | entry_done = rt2x00_get_data_entry_done(ring); |
1741 | } | 1742 | } |
1742 | 1743 | ||
diff --git a/drivers/net/wireless/rtl8180_dev.c b/drivers/net/wireless/rtl8180_dev.c index 07f37b0ccf91..27ebd689aa21 100644 --- a/drivers/net/wireless/rtl8180_dev.c +++ b/drivers/net/wireless/rtl8180_dev.c | |||
@@ -36,6 +36,7 @@ MODULE_LICENSE("GPL"); | |||
36 | static struct pci_device_id rtl8180_table[] __devinitdata = { | 36 | static struct pci_device_id rtl8180_table[] __devinitdata = { |
37 | /* rtl8185 */ | 37 | /* rtl8185 */ |
38 | { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8185) }, | 38 | { PCI_DEVICE(PCI_VENDOR_ID_REALTEK, 0x8185) }, |
39 | { PCI_DEVICE(PCI_VENDOR_ID_BELKIN, 0x700f) }, | ||
39 | { PCI_DEVICE(PCI_VENDOR_ID_BELKIN, 0x701f) }, | 40 | { PCI_DEVICE(PCI_VENDOR_ID_BELKIN, 0x701f) }, |
40 | 41 | ||
41 | /* rtl8180 */ | 42 | /* rtl8180 */ |