aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/benet
diff options
context:
space:
mode:
authorSathya Perla <sathya.perla@emulex.com>2011-03-10 21:49:26 -0500
committerDavid S. Miller <davem@davemloft.net>2011-03-14 18:17:09 -0400
commit2e588f84f254cca0fc3b9f01297d06799b8c85d3 (patch)
treed21f7eb9b0bb97b1860bf0cd6fd7c5bbddad8893 /drivers/net/benet
parentd478af0d6bb38c971d1172e99c5046025a9167c9 (diff)
be2net: changes for BE3 native mode support
So far be2net has been using BE3 in legacy mode. It now checks for native mode capability and if available it sets it. In native mode, the RX_COMPL structure is different from that in legacy mode. Signed-off-by: Sathya Perla <sathya.perla@emulex.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/benet')
-rw-r--r--drivers/net/benet/be.h23
-rw-r--r--drivers/net/benet/be_cmds.c39
-rw-r--r--drivers/net/benet/be_cmds.h20
-rw-r--r--drivers/net/benet/be_hw.h41
-rw-r--r--drivers/net/benet/be_main.c279
5 files changed, 252 insertions, 150 deletions
diff --git a/drivers/net/benet/be.h b/drivers/net/benet/be.h
index 4ac0d72660f..62af70716f8 100644
--- a/drivers/net/benet/be.h
+++ b/drivers/net/benet/be.h
@@ -67,7 +67,7 @@ static inline char *nic_name(struct pci_dev *pdev)
67} 67}
68 68
69/* Number of bytes of an RX frame that are copied to skb->data */ 69/* Number of bytes of an RX frame that are copied to skb->data */
70#define BE_HDR_LEN 64 70#define BE_HDR_LEN ((u16) 64)
71#define BE_MAX_JUMBO_FRAME_SIZE 9018 71#define BE_MAX_JUMBO_FRAME_SIZE 9018
72#define BE_MIN_MTU 256 72#define BE_MIN_MTU 256
73 73
@@ -211,10 +211,30 @@ struct be_rx_stats {
211 u32 rx_fps; /* Rx frags per second */ 211 u32 rx_fps; /* Rx frags per second */
212}; 212};
213 213
214struct be_rx_compl_info {
215 u32 rss_hash;
216 u16 vid;
217 u16 pkt_size;
218 u16 rxq_idx;
219 u16 mac_id;
220 u8 vlanf;
221 u8 num_rcvd;
222 u8 err;
223 u8 ipf;
224 u8 tcpf;
225 u8 udpf;
226 u8 ip_csum;
227 u8 l4_csum;
228 u8 ipv6;
229 u8 vtm;
230 u8 pkt_type;
231};
232
214struct be_rx_obj { 233struct be_rx_obj {
215 struct be_adapter *adapter; 234 struct be_adapter *adapter;
216 struct be_queue_info q; 235 struct be_queue_info q;
217 struct be_queue_info cq; 236 struct be_queue_info cq;
237 struct be_rx_compl_info rxcp;
218 struct be_rx_page_info page_info_tbl[RX_Q_LEN]; 238 struct be_rx_page_info page_info_tbl[RX_Q_LEN];
219 struct be_eq_obj rx_eq; 239 struct be_eq_obj rx_eq;
220 struct be_rx_stats stats; 240 struct be_rx_stats stats;
@@ -312,6 +332,7 @@ struct be_adapter {
312 u32 flash_status; 332 u32 flash_status;
313 struct completion flash_compl; 333 struct completion flash_compl;
314 334
335 bool be3_native;
315 bool sriov_enabled; 336 bool sriov_enabled;
316 struct be_vf_cfg vf_cfg[BE_MAX_VF]; 337 struct be_vf_cfg vf_cfg[BE_MAX_VF];
317 u8 is_virtfn; 338 u8 is_virtfn;
diff --git a/drivers/net/benet/be_cmds.c b/drivers/net/benet/be_cmds.c
index cc3a235475b..e1124c89181 100644
--- a/drivers/net/benet/be_cmds.c
+++ b/drivers/net/benet/be_cmds.c
@@ -2014,3 +2014,42 @@ err:
2014 attribs_cmd.dma); 2014 attribs_cmd.dma);
2015 return status; 2015 return status;
2016} 2016}
2017
2018/* Uses mbox */
2019int be_cmd_check_native_mode(struct be_adapter *adapter)
2020{
2021 struct be_mcc_wrb *wrb;
2022 struct be_cmd_req_set_func_cap *req;
2023 int status;
2024
2025 if (mutex_lock_interruptible(&adapter->mbox_lock))
2026 return -1;
2027
2028 wrb = wrb_from_mbox(adapter);
2029 if (!wrb) {
2030 status = -EBUSY;
2031 goto err;
2032 }
2033
2034 req = embedded_payload(wrb);
2035
2036 be_wrb_hdr_prepare(wrb, sizeof(*req), true, 0,
2037 OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP);
2038
2039 be_cmd_hdr_prepare(&req->hdr, CMD_SUBSYSTEM_COMMON,
2040 OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP, sizeof(*req));
2041
2042 req->valid_cap_flags = cpu_to_le32(CAPABILITY_SW_TIMESTAMPS |
2043 CAPABILITY_BE3_NATIVE_ERX_API);
2044 req->cap_flags = cpu_to_le32(CAPABILITY_BE3_NATIVE_ERX_API);
2045
2046 status = be_mbox_notify_wait(adapter);
2047 if (!status) {
2048 struct be_cmd_resp_set_func_cap *resp = embedded_payload(wrb);
2049 adapter->be3_native = le32_to_cpu(resp->cap_flags) &
2050 CAPABILITY_BE3_NATIVE_ERX_API;
2051 }
2052err:
2053 mutex_unlock(&adapter->mbox_lock);
2054 return status;
2055}
diff --git a/drivers/net/benet/be_cmds.h b/drivers/net/benet/be_cmds.h
index b4ac3938b29..e41fcbaed00 100644
--- a/drivers/net/benet/be_cmds.h
+++ b/drivers/net/benet/be_cmds.h
@@ -190,6 +190,7 @@ struct be_mcc_mailbox {
190#define OPCODE_COMMON_GET_BEACON_STATE 70 190#define OPCODE_COMMON_GET_BEACON_STATE 70
191#define OPCODE_COMMON_READ_TRANSRECV_DATA 73 191#define OPCODE_COMMON_READ_TRANSRECV_DATA 73
192#define OPCODE_COMMON_GET_PHY_DETAILS 102 192#define OPCODE_COMMON_GET_PHY_DETAILS 102
193#define OPCODE_COMMON_SET_DRIVER_FUNCTION_CAP 103
193#define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121 194#define OPCODE_COMMON_GET_CNTL_ADDITIONAL_ATTRIBUTES 121
194 195
195#define OPCODE_ETH_RSS_CONFIG 1 196#define OPCODE_ETH_RSS_CONFIG 1
@@ -1042,6 +1043,24 @@ struct be_cmd_resp_cntl_attribs {
1042 struct mgmt_controller_attrib attribs; 1043 struct mgmt_controller_attrib attribs;
1043}; 1044};
1044 1045
1046/*********************** Set driver function ***********************/
1047#define CAPABILITY_SW_TIMESTAMPS 2
1048#define CAPABILITY_BE3_NATIVE_ERX_API 4
1049
1050struct be_cmd_req_set_func_cap {
1051 struct be_cmd_req_hdr hdr;
1052 u32 valid_cap_flags;
1053 u32 cap_flags;
1054 u8 rsvd[212];
1055};
1056
1057struct be_cmd_resp_set_func_cap {
1058 struct be_cmd_resp_hdr hdr;
1059 u32 valid_cap_flags;
1060 u32 cap_flags;
1061 u8 rsvd[212];
1062};
1063
1045extern int be_pci_fnum_get(struct be_adapter *adapter); 1064extern int be_pci_fnum_get(struct be_adapter *adapter);
1046extern int be_cmd_POST(struct be_adapter *adapter); 1065extern int be_cmd_POST(struct be_adapter *adapter);
1047extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr, 1066extern int be_cmd_mac_addr_query(struct be_adapter *adapter, u8 *mac_addr,
@@ -1128,4 +1147,5 @@ extern int be_cmd_set_qos(struct be_adapter *adapter, u32 bps, u32 domain);
1128extern void be_detect_dump_ue(struct be_adapter *adapter); 1147extern void be_detect_dump_ue(struct be_adapter *adapter);
1129extern int be_cmd_get_die_temperature(struct be_adapter *adapter); 1148extern int be_cmd_get_die_temperature(struct be_adapter *adapter);
1130extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter); 1149extern int be_cmd_get_cntl_attributes(struct be_adapter *adapter);
1150extern int be_cmd_check_native_mode(struct be_adapter *adapter);
1131 1151
diff --git a/drivers/net/benet/be_hw.h b/drivers/net/benet/be_hw.h
index dbe67f353e8..e06aa1567b2 100644
--- a/drivers/net/benet/be_hw.h
+++ b/drivers/net/benet/be_hw.h
@@ -301,10 +301,10 @@ struct be_eth_rx_d {
301 301
302/* RX Compl Queue Descriptor */ 302/* RX Compl Queue Descriptor */
303 303
304/* Pseudo amap definition for eth_rx_compl in which each bit of the 304/* Pseudo amap definition for BE2 and BE3 legacy mode eth_rx_compl in which
305 * actual structure is defined as a byte: used to calculate 305 * each bit of the actual structure is defined as a byte: used to calculate
306 * offset/shift/mask of each field */ 306 * offset/shift/mask of each field */
307struct amap_eth_rx_compl { 307struct amap_eth_rx_compl_v0 {
308 u8 vlan_tag[16]; /* dword 0 */ 308 u8 vlan_tag[16]; /* dword 0 */
309 u8 pktsize[14]; /* dword 0 */ 309 u8 pktsize[14]; /* dword 0 */
310 u8 port; /* dword 0 */ 310 u8 port; /* dword 0 */
@@ -335,6 +335,41 @@ struct amap_eth_rx_compl {
335 u8 rsshash[32]; /* dword 3 */ 335 u8 rsshash[32]; /* dword 3 */
336} __packed; 336} __packed;
337 337
338/* Pseudo amap definition for BE3 native mode eth_rx_compl in which
339 * each bit of the actual structure is defined as a byte: used to calculate
340 * offset/shift/mask of each field */
341struct amap_eth_rx_compl_v1 {
342 u8 vlan_tag[16]; /* dword 0 */
343 u8 pktsize[14]; /* dword 0 */
344 u8 vtp; /* dword 0 */
345 u8 ip_opt; /* dword 0 */
346 u8 err; /* dword 1 */
347 u8 rsshp; /* dword 1 */
348 u8 ipf; /* dword 1 */
349 u8 tcpf; /* dword 1 */
350 u8 udpf; /* dword 1 */
351 u8 ipcksm; /* dword 1 */
352 u8 l4_cksm; /* dword 1 */
353 u8 ip_version; /* dword 1 */
354 u8 macdst[7]; /* dword 1 */
355 u8 rsvd0; /* dword 1 */
356 u8 fragndx[10]; /* dword 1 */
357 u8 ct[2]; /* dword 1 */
358 u8 sw; /* dword 1 */
359 u8 numfrags[3]; /* dword 1 */
360 u8 rss_flush; /* dword 2 */
361 u8 cast_enc[2]; /* dword 2 */
362 u8 vtm; /* dword 2 */
363 u8 rss_bank; /* dword 2 */
364 u8 port[2]; /* dword 2 */
365 u8 vntagp; /* dword 2 */
366 u8 header_len[8]; /* dword 2 */
367 u8 header_split[2]; /* dword 2 */
368 u8 rsvd1[13]; /* dword 2 */
369 u8 valid; /* dword 2 */
370 u8 rsshash[32]; /* dword 3 */
371} __packed;
372
338struct be_eth_rx_compl { 373struct be_eth_rx_compl {
339 u32 dw[4]; 374 u32 dw[4];
340}; 375};
diff --git a/drivers/net/benet/be_main.c b/drivers/net/benet/be_main.c
index 68f10781732..3cb5f4e5a06 100644
--- a/drivers/net/benet/be_main.c
+++ b/drivers/net/benet/be_main.c
@@ -25,9 +25,9 @@ MODULE_DESCRIPTION(DRV_DESC " " DRV_VER);
25MODULE_AUTHOR("ServerEngines Corporation"); 25MODULE_AUTHOR("ServerEngines Corporation");
26MODULE_LICENSE("GPL"); 26MODULE_LICENSE("GPL");
27 27
28static unsigned int rx_frag_size = 2048; 28static ushort rx_frag_size = 2048;
29static unsigned int num_vfs; 29static unsigned int num_vfs;
30module_param(rx_frag_size, uint, S_IRUGO); 30module_param(rx_frag_size, ushort, S_IRUGO);
31module_param(num_vfs, uint, S_IRUGO); 31module_param(num_vfs, uint, S_IRUGO);
32MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data."); 32MODULE_PARM_DESC(rx_frag_size, "Size of a fragment that holds rcvd data.");
33MODULE_PARM_DESC(num_vfs, "Number of PCI VFs to initialize"); 33MODULE_PARM_DESC(num_vfs, "Number of PCI VFs to initialize");
@@ -851,31 +851,26 @@ static void be_rx_rate_update(struct be_rx_obj *rxo)
851} 851}
852 852
853static void be_rx_stats_update(struct be_rx_obj *rxo, 853static void be_rx_stats_update(struct be_rx_obj *rxo,
854 u32 pktsize, u16 numfrags, u8 pkt_type) 854 struct be_rx_compl_info *rxcp)
855{ 855{
856 struct be_rx_stats *stats = &rxo->stats; 856 struct be_rx_stats *stats = &rxo->stats;
857 857
858 stats->rx_compl++; 858 stats->rx_compl++;
859 stats->rx_frags += numfrags; 859 stats->rx_frags += rxcp->num_rcvd;
860 stats->rx_bytes += pktsize; 860 stats->rx_bytes += rxcp->pkt_size;
861 stats->rx_pkts++; 861 stats->rx_pkts++;
862 if (pkt_type == BE_MULTICAST_PACKET) 862 if (rxcp->pkt_type == BE_MULTICAST_PACKET)
863 stats->rx_mcast_pkts++; 863 stats->rx_mcast_pkts++;
864 if (rxcp->err)
865 stats->rxcp_err++;
864} 866}
865 867
866static inline bool csum_passed(struct be_eth_rx_compl *rxcp) 868static inline bool csum_passed(struct be_rx_compl_info *rxcp)
867{ 869{
868 u8 l4_cksm, ipv6, ipcksm, tcpf, udpf;
869
870 l4_cksm = AMAP_GET_BITS(struct amap_eth_rx_compl, l4_cksm, rxcp);
871 ipcksm = AMAP_GET_BITS(struct amap_eth_rx_compl, ipcksm, rxcp);
872 ipv6 = AMAP_GET_BITS(struct amap_eth_rx_compl, ip_version, rxcp);
873 tcpf = AMAP_GET_BITS(struct amap_eth_rx_compl, tcpf, rxcp);
874 udpf = AMAP_GET_BITS(struct amap_eth_rx_compl, udpf, rxcp);
875
876 /* L4 checksum is not reliable for non TCP/UDP packets. 870 /* L4 checksum is not reliable for non TCP/UDP packets.
877 * Also ignore ipcksm for ipv6 pkts */ 871 * Also ignore ipcksm for ipv6 pkts */
878 return (tcpf || udpf) && l4_cksm && (ipcksm || ipv6); 872 return (rxcp->tcpf || rxcp->udpf) && rxcp->l4_csum &&
873 (rxcp->ip_csum || rxcp->ipv6);
879} 874}
880 875
881static struct be_rx_page_info * 876static struct be_rx_page_info *
@@ -903,20 +898,17 @@ get_rx_page_info(struct be_adapter *adapter,
903/* Throwaway the data in the Rx completion */ 898/* Throwaway the data in the Rx completion */
904static void be_rx_compl_discard(struct be_adapter *adapter, 899static void be_rx_compl_discard(struct be_adapter *adapter,
905 struct be_rx_obj *rxo, 900 struct be_rx_obj *rxo,
906 struct be_eth_rx_compl *rxcp) 901 struct be_rx_compl_info *rxcp)
907{ 902{
908 struct be_queue_info *rxq = &rxo->q; 903 struct be_queue_info *rxq = &rxo->q;
909 struct be_rx_page_info *page_info; 904 struct be_rx_page_info *page_info;
910 u16 rxq_idx, i, num_rcvd; 905 u16 i, num_rcvd = rxcp->num_rcvd;
911
912 rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
913 num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp);
914 906
915 for (i = 0; i < num_rcvd; i++) { 907 for (i = 0; i < num_rcvd; i++) {
916 page_info = get_rx_page_info(adapter, rxo, rxq_idx); 908 page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx);
917 put_page(page_info->page); 909 put_page(page_info->page);
918 memset(page_info, 0, sizeof(*page_info)); 910 memset(page_info, 0, sizeof(*page_info));
919 index_inc(&rxq_idx, rxq->len); 911 index_inc(&rxcp->rxq_idx, rxq->len);
920 } 912 }
921} 913}
922 914
@@ -925,30 +917,23 @@ static void be_rx_compl_discard(struct be_adapter *adapter,
925 * indicated by rxcp. 917 * indicated by rxcp.
926 */ 918 */
927static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo, 919static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo,
928 struct sk_buff *skb, struct be_eth_rx_compl *rxcp, 920 struct sk_buff *skb, struct be_rx_compl_info *rxcp)
929 u16 num_rcvd)
930{ 921{
931 struct be_queue_info *rxq = &rxo->q; 922 struct be_queue_info *rxq = &rxo->q;
932 struct be_rx_page_info *page_info; 923 struct be_rx_page_info *page_info;
933 u16 rxq_idx, i, j; 924 u16 i, j;
934 u32 pktsize, hdr_len, curr_frag_len, size; 925 u16 hdr_len, curr_frag_len, remaining;
935 u8 *start; 926 u8 *start;
936 u8 pkt_type;
937
938 rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
939 pktsize = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp);
940 pkt_type = AMAP_GET_BITS(struct amap_eth_rx_compl, cast_enc, rxcp);
941
942 page_info = get_rx_page_info(adapter, rxo, rxq_idx);
943 927
928 page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx);
944 start = page_address(page_info->page) + page_info->page_offset; 929 start = page_address(page_info->page) + page_info->page_offset;
945 prefetch(start); 930 prefetch(start);
946 931
947 /* Copy data in the first descriptor of this completion */ 932 /* Copy data in the first descriptor of this completion */
948 curr_frag_len = min(pktsize, rx_frag_size); 933 curr_frag_len = min(rxcp->pkt_size, rx_frag_size);
949 934
950 /* Copy the header portion into skb_data */ 935 /* Copy the header portion into skb_data */
951 hdr_len = min((u32)BE_HDR_LEN, curr_frag_len); 936 hdr_len = min(BE_HDR_LEN, curr_frag_len);
952 memcpy(skb->data, start, hdr_len); 937 memcpy(skb->data, start, hdr_len);
953 skb->len = curr_frag_len; 938 skb->len = curr_frag_len;
954 if (curr_frag_len <= BE_HDR_LEN) { /* tiny packet */ 939 if (curr_frag_len <= BE_HDR_LEN) { /* tiny packet */
@@ -967,19 +952,17 @@ static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo,
967 } 952 }
968 page_info->page = NULL; 953 page_info->page = NULL;
969 954
970 if (pktsize <= rx_frag_size) { 955 if (rxcp->pkt_size <= rx_frag_size) {
971 BUG_ON(num_rcvd != 1); 956 BUG_ON(rxcp->num_rcvd != 1);
972 goto done; 957 return;
973 } 958 }
974 959
975 /* More frags present for this completion */ 960 /* More frags present for this completion */
976 size = pktsize; 961 index_inc(&rxcp->rxq_idx, rxq->len);
977 for (i = 1, j = 0; i < num_rcvd; i++) { 962 remaining = rxcp->pkt_size - curr_frag_len;
978 size -= curr_frag_len; 963 for (i = 1, j = 0; i < rxcp->num_rcvd; i++) {
979 index_inc(&rxq_idx, rxq->len); 964 page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx);
980 page_info = get_rx_page_info(adapter, rxo, rxq_idx); 965 curr_frag_len = min(remaining, rx_frag_size);
981
982 curr_frag_len = min(size, rx_frag_size);
983 966
984 /* Coalesce all frags from the same physical page in one slot */ 967 /* Coalesce all frags from the same physical page in one slot */
985 if (page_info->page_offset == 0) { 968 if (page_info->page_offset == 0) {
@@ -998,25 +981,19 @@ static void skb_fill_rx_data(struct be_adapter *adapter, struct be_rx_obj *rxo,
998 skb->len += curr_frag_len; 981 skb->len += curr_frag_len;
999 skb->data_len += curr_frag_len; 982 skb->data_len += curr_frag_len;
1000 983
984 remaining -= curr_frag_len;
985 index_inc(&rxcp->rxq_idx, rxq->len);
1001 page_info->page = NULL; 986 page_info->page = NULL;
1002 } 987 }
1003 BUG_ON(j > MAX_SKB_FRAGS); 988 BUG_ON(j > MAX_SKB_FRAGS);
1004
1005done:
1006 be_rx_stats_update(rxo, pktsize, num_rcvd, pkt_type);
1007} 989}
1008 990
1009/* Process the RX completion indicated by rxcp when GRO is disabled */ 991/* Process the RX completion indicated by rxcp when GRO is disabled */
1010static void be_rx_compl_process(struct be_adapter *adapter, 992static void be_rx_compl_process(struct be_adapter *adapter,
1011 struct be_rx_obj *rxo, 993 struct be_rx_obj *rxo,
1012 struct be_eth_rx_compl *rxcp) 994 struct be_rx_compl_info *rxcp)
1013{ 995{
1014 struct sk_buff *skb; 996 struct sk_buff *skb;
1015 u32 vlanf, vid;
1016 u16 num_rcvd;
1017 u8 vtm;
1018
1019 num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp);
1020 997
1021 skb = netdev_alloc_skb_ip_align(adapter->netdev, BE_HDR_LEN); 998 skb = netdev_alloc_skb_ip_align(adapter->netdev, BE_HDR_LEN);
1022 if (unlikely(!skb)) { 999 if (unlikely(!skb)) {
@@ -1026,7 +1003,7 @@ static void be_rx_compl_process(struct be_adapter *adapter,
1026 return; 1003 return;
1027 } 1004 }
1028 1005
1029 skb_fill_rx_data(adapter, rxo, skb, rxcp, num_rcvd); 1006 skb_fill_rx_data(adapter, rxo, skb, rxcp);
1030 1007
1031 if (likely(adapter->rx_csum && csum_passed(rxcp))) 1008 if (likely(adapter->rx_csum && csum_passed(rxcp)))
1032 skb->ip_summed = CHECKSUM_UNNECESSARY; 1009 skb->ip_summed = CHECKSUM_UNNECESSARY;
@@ -1036,26 +1013,12 @@ static void be_rx_compl_process(struct be_adapter *adapter,
1036 skb->truesize = skb->len + sizeof(struct sk_buff); 1013 skb->truesize = skb->len + sizeof(struct sk_buff);
1037 skb->protocol = eth_type_trans(skb, adapter->netdev); 1014 skb->protocol = eth_type_trans(skb, adapter->netdev);
1038 1015
1039 vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp); 1016 if (unlikely(rxcp->vlanf)) {
1040 vtm = AMAP_GET_BITS(struct amap_eth_rx_compl, vtm, rxcp);
1041
1042 /* vlanf could be wrongly set in some cards.
1043 * ignore if vtm is not set */
1044 if ((adapter->function_mode & 0x400) && !vtm)
1045 vlanf = 0;
1046
1047 if ((adapter->pvid == vlanf) && !adapter->vlan_tag[vlanf])
1048 vlanf = 0;
1049
1050 if (unlikely(vlanf)) {
1051 if (!adapter->vlan_grp || adapter->vlans_added == 0) { 1017 if (!adapter->vlan_grp || adapter->vlans_added == 0) {
1052 kfree_skb(skb); 1018 kfree_skb(skb);
1053 return; 1019 return;
1054 } 1020 }
1055 vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp); 1021 vlan_hwaccel_receive_skb(skb, adapter->vlan_grp, rxcp->vid);
1056 if (!lancer_chip(adapter))
1057 vid = swab16(vid);
1058 vlan_hwaccel_receive_skb(skb, adapter->vlan_grp, vid);
1059 } else { 1022 } else {
1060 netif_receive_skb(skb); 1023 netif_receive_skb(skb);
1061 } 1024 }
@@ -1064,31 +1027,14 @@ static void be_rx_compl_process(struct be_adapter *adapter,
1064/* Process the RX completion indicated by rxcp when GRO is enabled */ 1027/* Process the RX completion indicated by rxcp when GRO is enabled */
1065static void be_rx_compl_process_gro(struct be_adapter *adapter, 1028static void be_rx_compl_process_gro(struct be_adapter *adapter,
1066 struct be_rx_obj *rxo, 1029 struct be_rx_obj *rxo,
1067 struct be_eth_rx_compl *rxcp) 1030 struct be_rx_compl_info *rxcp)
1068{ 1031{
1069 struct be_rx_page_info *page_info; 1032 struct be_rx_page_info *page_info;
1070 struct sk_buff *skb = NULL; 1033 struct sk_buff *skb = NULL;
1071 struct be_queue_info *rxq = &rxo->q; 1034 struct be_queue_info *rxq = &rxo->q;
1072 struct be_eq_obj *eq_obj = &rxo->rx_eq; 1035 struct be_eq_obj *eq_obj = &rxo->rx_eq;
1073 u32 num_rcvd, pkt_size, remaining, vlanf, curr_frag_len; 1036 u16 remaining, curr_frag_len;
1074 u16 i, rxq_idx = 0, vid, j; 1037 u16 i, j;
1075 u8 vtm;
1076 u8 pkt_type;
1077
1078 num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags, rxcp);
1079 pkt_size = AMAP_GET_BITS(struct amap_eth_rx_compl, pktsize, rxcp);
1080 vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl, vtp, rxcp);
1081 rxq_idx = AMAP_GET_BITS(struct amap_eth_rx_compl, fragndx, rxcp);
1082 vtm = AMAP_GET_BITS(struct amap_eth_rx_compl, vtm, rxcp);
1083 pkt_type = AMAP_GET_BITS(struct amap_eth_rx_compl, cast_enc, rxcp);
1084
1085 /* vlanf could be wrongly set in some cards.
1086 * ignore if vtm is not set */
1087 if ((adapter->function_mode & 0x400) && !vtm)
1088 vlanf = 0;
1089
1090 if ((adapter->pvid == vlanf) && !adapter->vlan_tag[vlanf])
1091 vlanf = 0;
1092 1038
1093 skb = napi_get_frags(&eq_obj->napi); 1039 skb = napi_get_frags(&eq_obj->napi);
1094 if (!skb) { 1040 if (!skb) {
@@ -1096,9 +1042,9 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter,
1096 return; 1042 return;
1097 } 1043 }
1098 1044
1099 remaining = pkt_size; 1045 remaining = rxcp->pkt_size;
1100 for (i = 0, j = -1; i < num_rcvd; i++) { 1046 for (i = 0, j = -1; i < rxcp->num_rcvd; i++) {
1101 page_info = get_rx_page_info(adapter, rxo, rxq_idx); 1047 page_info = get_rx_page_info(adapter, rxo, rxcp->rxq_idx);
1102 1048
1103 curr_frag_len = min(remaining, rx_frag_size); 1049 curr_frag_len = min(remaining, rx_frag_size);
1104 1050
@@ -1116,56 +1062,109 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter,
1116 skb_shinfo(skb)->frags[j].size += curr_frag_len; 1062 skb_shinfo(skb)->frags[j].size += curr_frag_len;
1117 1063
1118 remaining -= curr_frag_len; 1064 remaining -= curr_frag_len;
1119 index_inc(&rxq_idx, rxq->len); 1065 index_inc(&rxcp->rxq_idx, rxq->len);
1120 memset(page_info, 0, sizeof(*page_info)); 1066 memset(page_info, 0, sizeof(*page_info));
1121 } 1067 }
1122 BUG_ON(j > MAX_SKB_FRAGS); 1068 BUG_ON(j > MAX_SKB_FRAGS);
1123 1069
1124 skb_shinfo(skb)->nr_frags = j + 1; 1070 skb_shinfo(skb)->nr_frags = j + 1;
1125 skb->len = pkt_size; 1071 skb->len = rxcp->pkt_size;
1126 skb->data_len = pkt_size; 1072 skb->data_len = rxcp->pkt_size;
1127 skb->truesize += pkt_size; 1073 skb->truesize += rxcp->pkt_size;
1128 skb->ip_summed = CHECKSUM_UNNECESSARY; 1074 skb->ip_summed = CHECKSUM_UNNECESSARY;
1129 1075
1130 if (likely(!vlanf)) { 1076 if (likely(!rxcp->vlanf))
1131 napi_gro_frags(&eq_obj->napi); 1077 napi_gro_frags(&eq_obj->napi);
1132 } else { 1078 else
1133 vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp); 1079 vlan_gro_frags(&eq_obj->napi, adapter->vlan_grp, rxcp->vid);
1134 if (!lancer_chip(adapter)) 1080}
1135 vid = swab16(vid); 1081
1082static void be_parse_rx_compl_v1(struct be_adapter *adapter,
1083 struct be_eth_rx_compl *compl,
1084 struct be_rx_compl_info *rxcp)
1085{
1086 rxcp->pkt_size =
1087 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, pktsize, compl);
1088 rxcp->vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vtp, compl);
1089 rxcp->err = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, err, compl);
1090 rxcp->tcpf = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, tcpf, compl);
1091 rxcp->ip_csum =
1092 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, ipcksm, compl);
1093 rxcp->l4_csum =
1094 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, l4_cksm, compl);
1095 rxcp->ipv6 =
1096 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, ip_version, compl);
1097 rxcp->rxq_idx =
1098 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, fragndx, compl);
1099 rxcp->num_rcvd =
1100 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, numfrags, compl);
1101 rxcp->pkt_type =
1102 AMAP_GET_BITS(struct amap_eth_rx_compl_v1, cast_enc, compl);
1103 rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vtm, compl);
1104 rxcp->vid = AMAP_GET_BITS(struct amap_eth_rx_compl_v1, vlan_tag, compl);
1105}
1106
1107static void be_parse_rx_compl_v0(struct be_adapter *adapter,
1108 struct be_eth_rx_compl *compl,
1109 struct be_rx_compl_info *rxcp)
1110{
1111 rxcp->pkt_size =
1112 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, pktsize, compl);
1113 rxcp->vlanf = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vtp, compl);
1114 rxcp->err = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, err, compl);
1115 rxcp->tcpf = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, tcpf, compl);
1116 rxcp->ip_csum =
1117 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, ipcksm, compl);
1118 rxcp->l4_csum =
1119 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, l4_cksm, compl);
1120 rxcp->ipv6 =
1121 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, ip_version, compl);
1122 rxcp->rxq_idx =
1123 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, fragndx, compl);
1124 rxcp->num_rcvd =
1125 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, numfrags, compl);
1126 rxcp->pkt_type =
1127 AMAP_GET_BITS(struct amap_eth_rx_compl_v0, cast_enc, compl);
1128 rxcp->vtm = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vtm, compl);
1129 rxcp->vid = AMAP_GET_BITS(struct amap_eth_rx_compl_v0, vlan_tag, compl);
1130}
1131
1132static struct be_rx_compl_info *be_rx_compl_get(struct be_rx_obj *rxo)
1133{
1134 struct be_eth_rx_compl *compl = queue_tail_node(&rxo->cq);
1135 struct be_rx_compl_info *rxcp = &rxo->rxcp;
1136 struct be_adapter *adapter = rxo->adapter;
1136 1137
1137 if (!adapter->vlan_grp || adapter->vlans_added == 0) 1138 /* For checking the valid bit it is Ok to use either definition as the
1138 return; 1139 * valid bit is at the same position in both v0 and v1 Rx compl */
1140 if (compl->dw[offsetof(struct amap_eth_rx_compl_v1, valid) / 32] == 0)
1141 return NULL;
1139 1142
1140 vlan_gro_frags(&eq_obj->napi, adapter->vlan_grp, vid); 1143 rmb();
1141 } 1144 be_dws_le_to_cpu(compl, sizeof(*compl));
1142 1145
1143 be_rx_stats_update(rxo, pkt_size, num_rcvd, pkt_type); 1146 if (adapter->be3_native)
1144} 1147 be_parse_rx_compl_v1(adapter, compl, rxcp);
1148 else
1149 be_parse_rx_compl_v0(adapter, compl, rxcp);
1145 1150
1146static struct be_eth_rx_compl *be_rx_compl_get(struct be_rx_obj *rxo) 1151 /* vlanf could be wrongly set in some cards. ignore if vtm is not set */
1147{ 1152 if ((adapter->function_mode & 0x400) && !rxcp->vtm)
1148 struct be_eth_rx_compl *rxcp = queue_tail_node(&rxo->cq); 1153 rxcp->vlanf = 0;
1149 1154
1150 if (rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] == 0) 1155 if (!lancer_chip(adapter))
1151 return NULL; 1156 rxcp->vid = swab16(rxcp->vid);
1152 1157
1153 rmb(); 1158 if ((adapter->pvid == rxcp->vid) && !adapter->vlan_tag[rxcp->vid])
1154 be_dws_le_to_cpu(rxcp, sizeof(*rxcp)); 1159 rxcp->vlanf = 0;
1160
1161 /* As the compl has been parsed, reset it; we wont touch it again */
1162 compl->dw[offsetof(struct amap_eth_rx_compl_v1, valid) / 32] = 0;
1155 1163
1156 queue_tail_inc(&rxo->cq); 1164 queue_tail_inc(&rxo->cq);
1157 return rxcp; 1165 return rxcp;
1158} 1166}
1159 1167
1160/* To reset the valid bit, we need to reset the whole word as
1161 * when walking the queue the valid entries are little-endian
1162 * and invalid entries are host endian
1163 */
1164static inline void be_rx_compl_reset(struct be_eth_rx_compl *rxcp)
1165{
1166 rxcp->dw[offsetof(struct amap_eth_rx_compl, valid) / 32] = 0;
1167}
1168
1169static inline struct page *be_alloc_pages(u32 size, gfp_t gfp) 1168static inline struct page *be_alloc_pages(u32 size, gfp_t gfp)
1170{ 1169{
1171 u32 order = get_order(size); 1170 u32 order = get_order(size);
@@ -1342,13 +1341,12 @@ static void be_rx_q_clean(struct be_adapter *adapter, struct be_rx_obj *rxo)
1342 struct be_rx_page_info *page_info; 1341 struct be_rx_page_info *page_info;
1343 struct be_queue_info *rxq = &rxo->q; 1342 struct be_queue_info *rxq = &rxo->q;
1344 struct be_queue_info *rx_cq = &rxo->cq; 1343 struct be_queue_info *rx_cq = &rxo->cq;
1345 struct be_eth_rx_compl *rxcp; 1344 struct be_rx_compl_info *rxcp;
1346 u16 tail; 1345 u16 tail;
1347 1346
1348 /* First cleanup pending rx completions */ 1347 /* First cleanup pending rx completions */
1349 while ((rxcp = be_rx_compl_get(rxo)) != NULL) { 1348 while ((rxcp = be_rx_compl_get(rxo)) != NULL) {
1350 be_rx_compl_discard(adapter, rxo, rxcp); 1349 be_rx_compl_discard(adapter, rxo, rxcp);
1351 be_rx_compl_reset(rxcp);
1352 be_cq_notify(adapter, rx_cq->id, false, 1); 1350 be_cq_notify(adapter, rx_cq->id, false, 1);
1353 } 1351 }
1354 1352
@@ -1697,15 +1695,9 @@ static irqreturn_t be_msix_tx_mcc(int irq, void *dev)
1697 return IRQ_HANDLED; 1695 return IRQ_HANDLED;
1698} 1696}
1699 1697
1700static inline bool do_gro(struct be_rx_obj *rxo, 1698static inline bool do_gro(struct be_rx_compl_info *rxcp)
1701 struct be_eth_rx_compl *rxcp, u8 err)
1702{ 1699{
1703 int tcp_frame = AMAP_GET_BITS(struct amap_eth_rx_compl, tcpf, rxcp); 1700 return (rxcp->tcpf && !rxcp->err) ? true : false;
1704
1705 if (err)
1706 rxo->stats.rxcp_err++;
1707
1708 return (tcp_frame && !err) ? true : false;
1709} 1701}
1710 1702
1711static int be_poll_rx(struct napi_struct *napi, int budget) 1703static int be_poll_rx(struct napi_struct *napi, int budget)
@@ -1714,10 +1706,8 @@ static int be_poll_rx(struct napi_struct *napi, int budget)
1714 struct be_rx_obj *rxo = container_of(rx_eq, struct be_rx_obj, rx_eq); 1706 struct be_rx_obj *rxo = container_of(rx_eq, struct be_rx_obj, rx_eq);
1715 struct be_adapter *adapter = rxo->adapter; 1707 struct be_adapter *adapter = rxo->adapter;
1716 struct be_queue_info *rx_cq = &rxo->cq; 1708 struct be_queue_info *rx_cq = &rxo->cq;
1717 struct be_eth_rx_compl *rxcp; 1709 struct be_rx_compl_info *rxcp;
1718 u32 work_done; 1710 u32 work_done;
1719 u16 num_rcvd;
1720 u8 err;
1721 1711
1722 rxo->stats.rx_polls++; 1712 rxo->stats.rx_polls++;
1723 for (work_done = 0; work_done < budget; work_done++) { 1713 for (work_done = 0; work_done < budget; work_done++) {
@@ -1725,18 +1715,14 @@ static int be_poll_rx(struct napi_struct *napi, int budget)
1725 if (!rxcp) 1715 if (!rxcp)
1726 break; 1716 break;
1727 1717
1728 err = AMAP_GET_BITS(struct amap_eth_rx_compl, err, rxcp);
1729 num_rcvd = AMAP_GET_BITS(struct amap_eth_rx_compl, numfrags,
1730 rxcp);
1731 /* Ignore flush completions */ 1718 /* Ignore flush completions */
1732 if (num_rcvd) { 1719 if (rxcp->num_rcvd) {
1733 if (do_gro(rxo, rxcp, err)) 1720 if (do_gro(rxcp))
1734 be_rx_compl_process_gro(adapter, rxo, rxcp); 1721 be_rx_compl_process_gro(adapter, rxo, rxcp);
1735 else 1722 else
1736 be_rx_compl_process(adapter, rxo, rxcp); 1723 be_rx_compl_process(adapter, rxo, rxcp);
1737 } 1724 }
1738 1725 be_rx_stats_update(rxo, rxcp);
1739 be_rx_compl_reset(rxcp);
1740 } 1726 }
1741 1727
1742 /* Refill the queue */ 1728 /* Refill the queue */
@@ -2868,6 +2854,7 @@ static int be_get_config(struct be_adapter *adapter)
2868 if (status) 2854 if (status)
2869 return status; 2855 return status;
2870 2856
2857 be_cmd_check_native_mode(adapter);
2871 return 0; 2858 return 0;
2872} 2859}
2873 2860