diff options
author | Dmitry Kravkov <dmitry@broadcom.com> | 2010-10-05 23:28:26 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2010-10-06 17:10:37 -0400 |
commit | f2e0899f0f275cc3f5e9c9726178d7d0ac19b2db (patch) | |
tree | 436144046a751427bdd2e3fd284688582d2efe61 /drivers/net/bnx2x/bnx2x_cmn.c | |
parent | 8fe23fbd94af5a4c117fd0eb2f1c3f492f79efe8 (diff) |
bnx2x: Add 57712 support
57712 HW supported with same set of features as for 57710/57711
Signed-off-by: Dmitry Kravkov <dmitry@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/bnx2x/bnx2x_cmn.c')
-rw-r--r-- | drivers/net/bnx2x/bnx2x_cmn.c | 275 |
1 files changed, 181 insertions, 94 deletions
diff --git a/drivers/net/bnx2x/bnx2x_cmn.c b/drivers/net/bnx2x/bnx2x_cmn.c index ae05987e647e..cffa778ec5bf 100644 --- a/drivers/net/bnx2x/bnx2x_cmn.c +++ b/drivers/net/bnx2x/bnx2x_cmn.c | |||
@@ -18,7 +18,7 @@ | |||
18 | 18 | ||
19 | #include <linux/etherdevice.h> | 19 | #include <linux/etherdevice.h> |
20 | #include <linux/ip.h> | 20 | #include <linux/ip.h> |
21 | #include <linux/ipv6.h> | 21 | #include <net/ipv6.h> |
22 | #include <net/ip6_checksum.h> | 22 | #include <net/ip6_checksum.h> |
23 | #include <linux/firmware.h> | 23 | #include <linux/firmware.h> |
24 | #include "bnx2x_cmn.h" | 24 | #include "bnx2x_cmn.h" |
@@ -118,16 +118,10 @@ int bnx2x_tx_int(struct bnx2x_fastpath *fp) | |||
118 | 118 | ||
119 | pkt_cons = TX_BD(sw_cons); | 119 | pkt_cons = TX_BD(sw_cons); |
120 | 120 | ||
121 | /* prefetch(bp->tx_buf_ring[pkt_cons].skb); */ | 121 | DP(NETIF_MSG_TX_DONE, "queue[%d]: hw_cons %u sw_cons %u " |
122 | " pkt_cons %u\n", | ||
123 | fp->index, hw_cons, sw_cons, pkt_cons); | ||
122 | 124 | ||
123 | DP(NETIF_MSG_TX_DONE, "hw_cons %u sw_cons %u pkt_cons %u\n", | ||
124 | hw_cons, sw_cons, pkt_cons); | ||
125 | |||
126 | /* if (NEXT_TX_IDX(sw_cons) != hw_cons) { | ||
127 | rmb(); | ||
128 | prefetch(fp->tx_buf_ring[NEXT_TX_IDX(sw_cons)].skb); | ||
129 | } | ||
130 | */ | ||
131 | bd_cons = bnx2x_free_tx_pkt(bp, fp, pkt_cons); | 125 | bd_cons = bnx2x_free_tx_pkt(bp, fp, pkt_cons); |
132 | sw_cons++; | 126 | sw_cons++; |
133 | } | 127 | } |
@@ -749,8 +743,9 @@ void bnx2x_link_report(struct bnx2x *bp) | |||
749 | u16 vn_max_rate; | 743 | u16 vn_max_rate; |
750 | 744 | ||
751 | vn_max_rate = | 745 | vn_max_rate = |
752 | ((bp->mf_config & FUNC_MF_CFG_MAX_BW_MASK) >> | 746 | ((bp->mf_config[BP_VN(bp)] & |
753 | FUNC_MF_CFG_MAX_BW_SHIFT) * 100; | 747 | FUNC_MF_CFG_MAX_BW_MASK) >> |
748 | FUNC_MF_CFG_MAX_BW_SHIFT) * 100; | ||
754 | if (vn_max_rate < line_speed) | 749 | if (vn_max_rate < line_speed) |
755 | line_speed = vn_max_rate; | 750 | line_speed = vn_max_rate; |
756 | } | 751 | } |
@@ -912,14 +907,15 @@ void bnx2x_init_rx_rings(struct bnx2x *bp) | |||
912 | if (j != 0) | 907 | if (j != 0) |
913 | continue; | 908 | continue; |
914 | 909 | ||
915 | REG_WR(bp, BAR_USTRORM_INTMEM + | 910 | if (!CHIP_IS_E2(bp)) { |
916 | USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(func), | 911 | REG_WR(bp, BAR_USTRORM_INTMEM + |
917 | U64_LO(fp->rx_comp_mapping)); | 912 | USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(func), |
918 | REG_WR(bp, BAR_USTRORM_INTMEM + | 913 | U64_LO(fp->rx_comp_mapping)); |
919 | USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(func) + 4, | 914 | REG_WR(bp, BAR_USTRORM_INTMEM + |
920 | U64_HI(fp->rx_comp_mapping)); | 915 | USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(func) + 4, |
916 | U64_HI(fp->rx_comp_mapping)); | ||
917 | } | ||
921 | } | 918 | } |
922 | |||
923 | } | 919 | } |
924 | static void bnx2x_free_tx_skbs(struct bnx2x *bp) | 920 | static void bnx2x_free_tx_skbs(struct bnx2x *bp) |
925 | { | 921 | { |
@@ -1308,23 +1304,27 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
1308 | } | 1304 | } |
1309 | 1305 | ||
1310 | } else { | 1306 | } else { |
1307 | int path = BP_PATH(bp); | ||
1311 | int port = BP_PORT(bp); | 1308 | int port = BP_PORT(bp); |
1312 | 1309 | ||
1313 | DP(NETIF_MSG_IFUP, "NO MCP - load counts %d, %d, %d\n", | 1310 | DP(NETIF_MSG_IFUP, "NO MCP - load counts[%d] %d, %d, %d\n", |
1314 | load_count[0], load_count[1], load_count[2]); | 1311 | path, load_count[path][0], load_count[path][1], |
1315 | load_count[0]++; | 1312 | load_count[path][2]); |
1316 | load_count[1 + port]++; | 1313 | load_count[path][0]++; |
1317 | DP(NETIF_MSG_IFUP, "NO MCP - new load counts %d, %d, %d\n", | 1314 | load_count[path][1 + port]++; |
1318 | load_count[0], load_count[1], load_count[2]); | 1315 | DP(NETIF_MSG_IFUP, "NO MCP - new load counts[%d] %d, %d, %d\n", |
1319 | if (load_count[0] == 1) | 1316 | path, load_count[path][0], load_count[path][1], |
1317 | load_count[path][2]); | ||
1318 | if (load_count[path][0] == 1) | ||
1320 | load_code = FW_MSG_CODE_DRV_LOAD_COMMON; | 1319 | load_code = FW_MSG_CODE_DRV_LOAD_COMMON; |
1321 | else if (load_count[1 + port] == 1) | 1320 | else if (load_count[path][1 + port] == 1) |
1322 | load_code = FW_MSG_CODE_DRV_LOAD_PORT; | 1321 | load_code = FW_MSG_CODE_DRV_LOAD_PORT; |
1323 | else | 1322 | else |
1324 | load_code = FW_MSG_CODE_DRV_LOAD_FUNCTION; | 1323 | load_code = FW_MSG_CODE_DRV_LOAD_FUNCTION; |
1325 | } | 1324 | } |
1326 | 1325 | ||
1327 | if ((load_code == FW_MSG_CODE_DRV_LOAD_COMMON) || | 1326 | if ((load_code == FW_MSG_CODE_DRV_LOAD_COMMON) || |
1327 | (load_code == FW_MSG_CODE_DRV_LOAD_COMMON_CHIP) || | ||
1328 | (load_code == FW_MSG_CODE_DRV_LOAD_PORT)) | 1328 | (load_code == FW_MSG_CODE_DRV_LOAD_PORT)) |
1329 | bp->port.pmf = 1; | 1329 | bp->port.pmf = 1; |
1330 | else | 1330 | else |
@@ -1349,7 +1349,8 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
1349 | /* Setup NIC internals and enable interrupts */ | 1349 | /* Setup NIC internals and enable interrupts */ |
1350 | bnx2x_nic_init(bp, load_code); | 1350 | bnx2x_nic_init(bp, load_code); |
1351 | 1351 | ||
1352 | if ((load_code == FW_MSG_CODE_DRV_LOAD_COMMON) && | 1352 | if (((load_code == FW_MSG_CODE_DRV_LOAD_COMMON) || |
1353 | (load_code == FW_MSG_CODE_DRV_LOAD_COMMON_CHIP)) && | ||
1353 | (bp->common.shmem2_base)) | 1354 | (bp->common.shmem2_base)) |
1354 | SHMEM2_WR(bp, dcc_support, | 1355 | SHMEM2_WR(bp, dcc_support, |
1355 | (SHMEM_DCC_SUPPORT_DISABLE_ENABLE_PF_TLV | | 1356 | (SHMEM_DCC_SUPPORT_DISABLE_ENABLE_PF_TLV | |
@@ -1389,11 +1390,11 @@ int bnx2x_nic_load(struct bnx2x *bp, int load_mode) | |||
1389 | #endif | 1390 | #endif |
1390 | } | 1391 | } |
1391 | 1392 | ||
1392 | if (CHIP_IS_E1H(bp)) | 1393 | if (!CHIP_IS_E1(bp) && |
1393 | if (bp->mf_config & FUNC_MF_CFG_FUNC_DISABLED) { | 1394 | (bp->mf_config[BP_VN(bp)] & FUNC_MF_CFG_FUNC_DISABLED)) { |
1394 | DP(NETIF_MSG_IFUP, "mf_cfg function disabled\n"); | 1395 | DP(NETIF_MSG_IFUP, "mf_cfg function disabled\n"); |
1395 | bp->flags |= MF_FUNC_DIS; | 1396 | bp->flags |= MF_FUNC_DIS; |
1396 | } | 1397 | } |
1397 | 1398 | ||
1398 | #ifdef BCM_CNIC | 1399 | #ifdef BCM_CNIC |
1399 | /* Enable Timer scan */ | 1400 | /* Enable Timer scan */ |
@@ -1527,8 +1528,10 @@ int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode) | |||
1527 | bp->rx_mode = BNX2X_RX_MODE_NONE; | 1528 | bp->rx_mode = BNX2X_RX_MODE_NONE; |
1528 | bnx2x_set_storm_rx_mode(bp); | 1529 | bnx2x_set_storm_rx_mode(bp); |
1529 | 1530 | ||
1531 | /* Stop Tx */ | ||
1532 | bnx2x_tx_disable(bp); | ||
1530 | del_timer_sync(&bp->timer); | 1533 | del_timer_sync(&bp->timer); |
1531 | SHMEM_WR(bp, func_mb[BP_FUNC(bp)].drv_pulse_mb, | 1534 | SHMEM_WR(bp, func_mb[BP_FW_MB_IDX(bp)].drv_pulse_mb, |
1532 | (DRV_PULSE_ALWAYS_ALIVE | bp->fw_drv_pulse_wr_seq)); | 1535 | (DRV_PULSE_ALWAYS_ALIVE | bp->fw_drv_pulse_wr_seq)); |
1533 | bnx2x_stats_handle(bp, STATS_EVENT_STOP); | 1536 | bnx2x_stats_handle(bp, STATS_EVENT_STOP); |
1534 | 1537 | ||
@@ -1855,6 +1858,120 @@ exit_lbl: | |||
1855 | } | 1858 | } |
1856 | #endif | 1859 | #endif |
1857 | 1860 | ||
1861 | static inline void bnx2x_set_pbd_gso_e2(struct sk_buff *skb, | ||
1862 | struct eth_tx_parse_bd_e2 *pbd, | ||
1863 | u32 xmit_type) | ||
1864 | { | ||
1865 | pbd->parsing_data |= cpu_to_le16(skb_shinfo(skb)->gso_size) << | ||
1866 | ETH_TX_PARSE_BD_E2_LSO_MSS_SHIFT; | ||
1867 | if ((xmit_type & XMIT_GSO_V6) && | ||
1868 | (ipv6_hdr(skb)->nexthdr == NEXTHDR_IPV6)) | ||
1869 | pbd->parsing_data |= ETH_TX_PARSE_BD_E2_IPV6_WITH_EXT_HDR; | ||
1870 | } | ||
1871 | |||
1872 | /** | ||
1873 | * Update PBD in GSO case. | ||
1874 | * | ||
1875 | * @param skb | ||
1876 | * @param tx_start_bd | ||
1877 | * @param pbd | ||
1878 | * @param xmit_type | ||
1879 | */ | ||
1880 | static inline void bnx2x_set_pbd_gso(struct sk_buff *skb, | ||
1881 | struct eth_tx_parse_bd_e1x *pbd, | ||
1882 | u32 xmit_type) | ||
1883 | { | ||
1884 | pbd->lso_mss = cpu_to_le16(skb_shinfo(skb)->gso_size); | ||
1885 | pbd->tcp_send_seq = swab32(tcp_hdr(skb)->seq); | ||
1886 | pbd->tcp_flags = pbd_tcp_flags(skb); | ||
1887 | |||
1888 | if (xmit_type & XMIT_GSO_V4) { | ||
1889 | pbd->ip_id = swab16(ip_hdr(skb)->id); | ||
1890 | pbd->tcp_pseudo_csum = | ||
1891 | swab16(~csum_tcpudp_magic(ip_hdr(skb)->saddr, | ||
1892 | ip_hdr(skb)->daddr, | ||
1893 | 0, IPPROTO_TCP, 0)); | ||
1894 | |||
1895 | } else | ||
1896 | pbd->tcp_pseudo_csum = | ||
1897 | swab16(~csum_ipv6_magic(&ipv6_hdr(skb)->saddr, | ||
1898 | &ipv6_hdr(skb)->daddr, | ||
1899 | 0, IPPROTO_TCP, 0)); | ||
1900 | |||
1901 | pbd->global_data |= ETH_TX_PARSE_BD_E1X_PSEUDO_CS_WITHOUT_LEN; | ||
1902 | } | ||
1903 | /** | ||
1904 | * | ||
1905 | * @param skb | ||
1906 | * @param tx_start_bd | ||
1907 | * @param pbd_e2 | ||
1908 | * @param xmit_type | ||
1909 | * | ||
1910 | * @return header len | ||
1911 | */ | ||
1912 | static inline u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb, | ||
1913 | struct eth_tx_parse_bd_e2 *pbd, | ||
1914 | u32 xmit_type) | ||
1915 | { | ||
1916 | pbd->parsing_data |= cpu_to_le16(tcp_hdrlen(skb)/4) << | ||
1917 | ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT; | ||
1918 | |||
1919 | pbd->parsing_data |= cpu_to_le16(((unsigned char *)tcp_hdr(skb) - | ||
1920 | skb->data) / 2) << | ||
1921 | ETH_TX_PARSE_BD_E2_TCP_HDR_START_OFFSET_W_SHIFT; | ||
1922 | |||
1923 | return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data; | ||
1924 | } | ||
1925 | |||
1926 | /** | ||
1927 | * | ||
1928 | * @param skb | ||
1929 | * @param tx_start_bd | ||
1930 | * @param pbd | ||
1931 | * @param xmit_type | ||
1932 | * | ||
1933 | * @return Header length | ||
1934 | */ | ||
1935 | static inline u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb, | ||
1936 | struct eth_tx_parse_bd_e1x *pbd, | ||
1937 | u32 xmit_type) | ||
1938 | { | ||
1939 | u8 hlen = (skb_network_header(skb) - skb->data) / 2; | ||
1940 | |||
1941 | /* for now NS flag is not used in Linux */ | ||
1942 | pbd->global_data = | ||
1943 | (hlen | ((skb->protocol == cpu_to_be16(ETH_P_8021Q)) << | ||
1944 | ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT)); | ||
1945 | |||
1946 | pbd->ip_hlen_w = (skb_transport_header(skb) - | ||
1947 | skb_network_header(skb)) / 2; | ||
1948 | |||
1949 | hlen += pbd->ip_hlen_w + tcp_hdrlen(skb) / 2; | ||
1950 | |||
1951 | pbd->total_hlen_w = cpu_to_le16(hlen); | ||
1952 | hlen = hlen*2; | ||
1953 | |||
1954 | if (xmit_type & XMIT_CSUM_TCP) { | ||
1955 | pbd->tcp_pseudo_csum = swab16(tcp_hdr(skb)->check); | ||
1956 | |||
1957 | } else { | ||
1958 | s8 fix = SKB_CS_OFF(skb); /* signed! */ | ||
1959 | |||
1960 | DP(NETIF_MSG_TX_QUEUED, | ||
1961 | "hlen %d fix %d csum before fix %x\n", | ||
1962 | le16_to_cpu(pbd->total_hlen_w), fix, SKB_CS(skb)); | ||
1963 | |||
1964 | /* HW bug: fixup the CSUM */ | ||
1965 | pbd->tcp_pseudo_csum = | ||
1966 | bnx2x_csum_fix(skb_transport_header(skb), | ||
1967 | SKB_CS(skb), fix); | ||
1968 | |||
1969 | DP(NETIF_MSG_TX_QUEUED, "csum after fix %x\n", | ||
1970 | pbd->tcp_pseudo_csum); | ||
1971 | } | ||
1972 | |||
1973 | return hlen; | ||
1974 | } | ||
1858 | /* called with netif_tx_lock | 1975 | /* called with netif_tx_lock |
1859 | * bnx2x_tx_int() runs without netif_tx_lock unless it needs to call | 1976 | * bnx2x_tx_int() runs without netif_tx_lock unless it needs to call |
1860 | * netif_wake_queue() | 1977 | * netif_wake_queue() |
@@ -1868,6 +1985,7 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1868 | struct eth_tx_start_bd *tx_start_bd; | 1985 | struct eth_tx_start_bd *tx_start_bd; |
1869 | struct eth_tx_bd *tx_data_bd, *total_pkt_bd = NULL; | 1986 | struct eth_tx_bd *tx_data_bd, *total_pkt_bd = NULL; |
1870 | struct eth_tx_parse_bd_e1x *pbd_e1x = NULL; | 1987 | struct eth_tx_parse_bd_e1x *pbd_e1x = NULL; |
1988 | struct eth_tx_parse_bd_e2 *pbd_e2 = NULL; | ||
1871 | u16 pkt_prod, bd_prod; | 1989 | u16 pkt_prod, bd_prod; |
1872 | int nbd, fp_index; | 1990 | int nbd, fp_index; |
1873 | dma_addr_t mapping; | 1991 | dma_addr_t mapping; |
@@ -1895,9 +2013,9 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1895 | return NETDEV_TX_BUSY; | 2013 | return NETDEV_TX_BUSY; |
1896 | } | 2014 | } |
1897 | 2015 | ||
1898 | DP(NETIF_MSG_TX_QUEUED, "SKB: summed %x protocol %x protocol(%x,%x)" | 2016 | DP(NETIF_MSG_TX_QUEUED, "queue[%d]: SKB: summed %x protocol %x " |
1899 | " gso type %x xmit_type %x\n", | 2017 | "protocol(%x,%x) gso type %x xmit_type %x\n", |
1900 | skb->ip_summed, skb->protocol, ipv6_hdr(skb)->nexthdr, | 2018 | fp_index, skb->ip_summed, skb->protocol, ipv6_hdr(skb)->nexthdr, |
1901 | ip_hdr(skb)->protocol, skb_shinfo(skb)->gso_type, xmit_type); | 2019 | ip_hdr(skb)->protocol, skb_shinfo(skb)->gso_type, xmit_type); |
1902 | 2020 | ||
1903 | eth = (struct ethhdr *)skb->data; | 2021 | eth = (struct ethhdr *)skb->data; |
@@ -1988,44 +2106,21 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
1988 | tx_start_bd->bd_flags.as_bitfield |= | 2106 | tx_start_bd->bd_flags.as_bitfield |= |
1989 | ETH_TX_BD_FLAGS_IS_UDP; | 2107 | ETH_TX_BD_FLAGS_IS_UDP; |
1990 | } | 2108 | } |
1991 | pbd_e1x = &fp->tx_desc_ring[bd_prod].parse_bd_e1x; | ||
1992 | memset(pbd_e1x, 0, sizeof(struct eth_tx_parse_bd_e1x)); | ||
1993 | /* Set PBD in checksum offload case */ | ||
1994 | if (xmit_type & XMIT_CSUM) { | ||
1995 | hlen = (skb_network_header(skb) - skb->data) / 2; | ||
1996 | 2109 | ||
1997 | /* for now NS flag is not used in Linux */ | 2110 | if (CHIP_IS_E2(bp)) { |
1998 | pbd_e1x->global_data = | 2111 | pbd_e2 = &fp->tx_desc_ring[bd_prod].parse_bd_e2; |
1999 | (hlen | ((skb->protocol == cpu_to_be16(ETH_P_8021Q)) << | 2112 | memset(pbd_e2, 0, sizeof(struct eth_tx_parse_bd_e2)); |
2000 | ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT)); | 2113 | /* Set PBD in checksum offload case */ |
2001 | 2114 | if (xmit_type & XMIT_CSUM) | |
2002 | pbd_e1x->ip_hlen_w = (skb_transport_header(skb) - | 2115 | hlen = bnx2x_set_pbd_csum_e2(bp, |
2003 | skb_network_header(skb)) / 2; | 2116 | skb, pbd_e2, xmit_type); |
2004 | 2117 | } else { | |
2005 | hlen += pbd_e1x->ip_hlen_w + tcp_hdrlen(skb) / 2; | 2118 | pbd_e1x = &fp->tx_desc_ring[bd_prod].parse_bd_e1x; |
2006 | 2119 | memset(pbd_e1x, 0, sizeof(struct eth_tx_parse_bd_e1x)); | |
2007 | pbd_e1x->total_hlen_w = cpu_to_le16(hlen); | 2120 | /* Set PBD in checksum offload case */ |
2008 | hlen = hlen*2; | 2121 | if (xmit_type & XMIT_CSUM) |
2009 | 2122 | hlen = bnx2x_set_pbd_csum(bp, skb, pbd_e1x, xmit_type); | |
2010 | if (xmit_type & XMIT_CSUM_TCP) { | ||
2011 | pbd_e1x->tcp_pseudo_csum = swab16(tcp_hdr(skb)->check); | ||
2012 | |||
2013 | } else { | ||
2014 | s8 fix = SKB_CS_OFF(skb); /* signed! */ | ||
2015 | |||
2016 | DP(NETIF_MSG_TX_QUEUED, | ||
2017 | "hlen %d fix %d csum before fix %x\n", | ||
2018 | le16_to_cpu(pbd_e1x->total_hlen_w), | ||
2019 | fix, SKB_CS(skb)); | ||
2020 | |||
2021 | /* HW bug: fixup the CSUM */ | ||
2022 | pbd_e1x->tcp_pseudo_csum = | ||
2023 | bnx2x_csum_fix(skb_transport_header(skb), | ||
2024 | SKB_CS(skb), fix); | ||
2025 | 2123 | ||
2026 | DP(NETIF_MSG_TX_QUEUED, "csum after fix %x\n", | ||
2027 | pbd_e1x->tcp_pseudo_csum); | ||
2028 | } | ||
2029 | } | 2124 | } |
2030 | 2125 | ||
2031 | mapping = dma_map_single(&bp->pdev->dev, skb->data, | 2126 | mapping = dma_map_single(&bp->pdev->dev, skb->data, |
@@ -2057,26 +2152,10 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2057 | if (unlikely(skb_headlen(skb) > hlen)) | 2152 | if (unlikely(skb_headlen(skb) > hlen)) |
2058 | bd_prod = bnx2x_tx_split(bp, fp, tx_buf, &tx_start_bd, | 2153 | bd_prod = bnx2x_tx_split(bp, fp, tx_buf, &tx_start_bd, |
2059 | hlen, bd_prod, ++nbd); | 2154 | hlen, bd_prod, ++nbd); |
2060 | 2155 | if (CHIP_IS_E2(bp)) | |
2061 | pbd_e1x->lso_mss = cpu_to_le16(skb_shinfo(skb)->gso_size); | 2156 | bnx2x_set_pbd_gso_e2(skb, pbd_e2, xmit_type); |
2062 | pbd_e1x->tcp_send_seq = swab32(tcp_hdr(skb)->seq); | 2157 | else |
2063 | pbd_e1x->tcp_flags = pbd_tcp_flags(skb); | 2158 | bnx2x_set_pbd_gso(skb, pbd_e1x, xmit_type); |
2064 | |||
2065 | if (xmit_type & XMIT_GSO_V4) { | ||
2066 | pbd_e1x->ip_id = swab16(ip_hdr(skb)->id); | ||
2067 | pbd_e1x->tcp_pseudo_csum = | ||
2068 | swab16(~csum_tcpudp_magic(ip_hdr(skb)->saddr, | ||
2069 | ip_hdr(skb)->daddr, | ||
2070 | 0, IPPROTO_TCP, 0)); | ||
2071 | |||
2072 | } else | ||
2073 | pbd_e1x->tcp_pseudo_csum = | ||
2074 | swab16(~csum_ipv6_magic(&ipv6_hdr(skb)->saddr, | ||
2075 | &ipv6_hdr(skb)->daddr, | ||
2076 | 0, IPPROTO_TCP, 0)); | ||
2077 | |||
2078 | pbd_e1x->global_data |= | ||
2079 | ETH_TX_PARSE_BD_E1X_PSEUDO_CS_WITHOUT_LEN; | ||
2080 | } | 2159 | } |
2081 | tx_data_bd = (struct eth_tx_bd *)tx_start_bd; | 2160 | tx_data_bd = (struct eth_tx_bd *)tx_start_bd; |
2082 | 2161 | ||
@@ -2124,7 +2203,13 @@ netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev) | |||
2124 | pbd_e1x->ip_id, pbd_e1x->lso_mss, pbd_e1x->tcp_flags, | 2203 | pbd_e1x->ip_id, pbd_e1x->lso_mss, pbd_e1x->tcp_flags, |
2125 | pbd_e1x->tcp_pseudo_csum, pbd_e1x->tcp_send_seq, | 2204 | pbd_e1x->tcp_pseudo_csum, pbd_e1x->tcp_send_seq, |
2126 | le16_to_cpu(pbd_e1x->total_hlen_w)); | 2205 | le16_to_cpu(pbd_e1x->total_hlen_w)); |
2127 | 2206 | if (pbd_e2) | |
2207 | DP(NETIF_MSG_TX_QUEUED, | ||
2208 | "PBD (E2) @%p dst %x %x %x src %x %x %x parsing_data %x\n", | ||
2209 | pbd_e2, pbd_e2->dst_mac_addr_hi, pbd_e2->dst_mac_addr_mid, | ||
2210 | pbd_e2->dst_mac_addr_lo, pbd_e2->src_mac_addr_hi, | ||
2211 | pbd_e2->src_mac_addr_mid, pbd_e2->src_mac_addr_lo, | ||
2212 | pbd_e2->parsing_data); | ||
2128 | DP(NETIF_MSG_TX_QUEUED, "doorbell: nbd %d bd %u\n", nbd, bd_prod); | 2213 | DP(NETIF_MSG_TX_QUEUED, "doorbell: nbd %d bd %u\n", nbd, bd_prod); |
2129 | 2214 | ||
2130 | /* | 2215 | /* |
@@ -2327,6 +2412,8 @@ int bnx2x_resume(struct pci_dev *pdev) | |||
2327 | bnx2x_set_power_state(bp, PCI_D0); | 2412 | bnx2x_set_power_state(bp, PCI_D0); |
2328 | netif_device_attach(dev); | 2413 | netif_device_attach(dev); |
2329 | 2414 | ||
2415 | /* Since the chip was reset, clear the FW sequence number */ | ||
2416 | bp->fw_seq = 0; | ||
2330 | rc = bnx2x_nic_load(bp, LOAD_OPEN); | 2417 | rc = bnx2x_nic_load(bp, LOAD_OPEN); |
2331 | 2418 | ||
2332 | rtnl_unlock(); | 2419 | rtnl_unlock(); |