1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
21
22#include <linux/etherdevice.h>
23#include <linux/if_vlan.h>
24#include <linux/interrupt.h>
25#include <linux/ip.h>
26#include <linux/crash_dump.h>
27#include <net/tcp.h>
28#include <net/ipv6.h>
29#include <net/ip6_checksum.h>
30#include <net/busy_poll.h>
31#include <linux/prefetch.h>
32#include "bnx2x_cmn.h"
33#include "bnx2x_init.h"
34#include "bnx2x_sp.h"
35
36static void bnx2x_free_fp_mem_cnic(struct bnx2x *bp);
37static int bnx2x_alloc_fp_mem_cnic(struct bnx2x *bp);
38static int bnx2x_alloc_fp_mem(struct bnx2x *bp);
39static int bnx2x_poll(struct napi_struct *napi, int budget);
40
41static void bnx2x_add_all_napi_cnic(struct bnx2x *bp)
42{
43 int i;
44
45
46 for_each_rx_queue_cnic(bp, i) {
47 netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi),
48 bnx2x_poll, NAPI_POLL_WEIGHT);
49 }
50}
51
52static void bnx2x_add_all_napi(struct bnx2x *bp)
53{
54 int i;
55
56
57 for_each_eth_queue(bp, i) {
58 netif_napi_add(bp->dev, &bnx2x_fp(bp, i, napi),
59 bnx2x_poll, NAPI_POLL_WEIGHT);
60 }
61}
62
63static int bnx2x_calc_num_queues(struct bnx2x *bp)
64{
65 int nq = bnx2x_num_queues ? : netif_get_num_default_rss_queues();
66
67
68 if (is_kdump_kernel())
69 nq = 1;
70
71 nq = clamp(nq, 1, BNX2X_MAX_QUEUES(bp));
72 return nq;
73}
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88static inline void bnx2x_move_fp(struct bnx2x *bp, int from, int to)
89{
90 struct bnx2x_fastpath *from_fp = &bp->fp[from];
91 struct bnx2x_fastpath *to_fp = &bp->fp[to];
92 struct bnx2x_sp_objs *from_sp_objs = &bp->sp_objs[from];
93 struct bnx2x_sp_objs *to_sp_objs = &bp->sp_objs[to];
94 struct bnx2x_fp_stats *from_fp_stats = &bp->fp_stats[from];
95 struct bnx2x_fp_stats *to_fp_stats = &bp->fp_stats[to];
96 int old_max_eth_txqs, new_max_eth_txqs;
97 int old_txdata_index = 0, new_txdata_index = 0;
98 struct bnx2x_agg_info *old_tpa_info = to_fp->tpa_info;
99
100
101 from_fp->napi = to_fp->napi;
102
103
104 memcpy(to_fp, from_fp, sizeof(*to_fp));
105 to_fp->index = to;
106
107
108
109
110 to_fp->tpa_info = old_tpa_info;
111
112
113 memcpy(to_sp_objs, from_sp_objs, sizeof(*to_sp_objs));
114
115
116 memcpy(to_fp_stats, from_fp_stats, sizeof(*to_fp_stats));
117
118
119
120
121
122
123 old_max_eth_txqs = BNX2X_NUM_ETH_QUEUES(bp) * (bp)->max_cos;
124 new_max_eth_txqs = (BNX2X_NUM_ETH_QUEUES(bp) - from + to) *
125 (bp)->max_cos;
126 if (from == FCOE_IDX(bp)) {
127 old_txdata_index = old_max_eth_txqs + FCOE_TXQ_IDX_OFFSET;
128 new_txdata_index = new_max_eth_txqs + FCOE_TXQ_IDX_OFFSET;
129 }
130
131 memcpy(&bp->bnx2x_txq[new_txdata_index],
132 &bp->bnx2x_txq[old_txdata_index],
133 sizeof(struct bnx2x_fp_txdata));
134 to_fp->txdata_ptr[0] = &bp->bnx2x_txq[new_txdata_index];
135}
136
137
138
139
140
141
142
143
144
145void bnx2x_fill_fw_str(struct bnx2x *bp, char *buf, size_t buf_len)
146{
147 if (IS_PF(bp)) {
148 u8 phy_fw_ver[PHY_FW_VER_LEN];
149
150 phy_fw_ver[0] = '\0';
151 bnx2x_get_ext_phy_fw_version(&bp->link_params,
152 phy_fw_ver, PHY_FW_VER_LEN);
153 strlcpy(buf, bp->fw_ver, buf_len);
154 snprintf(buf + strlen(bp->fw_ver), 32 - strlen(bp->fw_ver),
155 "bc %d.%d.%d%s%s",
156 (bp->common.bc_ver & 0xff0000) >> 16,
157 (bp->common.bc_ver & 0xff00) >> 8,
158 (bp->common.bc_ver & 0xff),
159 ((phy_fw_ver[0] != '\0') ? " phy " : ""), phy_fw_ver);
160 } else {
161 bnx2x_vf_fill_fw_str(bp, buf, buf_len);
162 }
163}
164
165
166
167
168
169
170
171static void bnx2x_shrink_eth_fp(struct bnx2x *bp, int delta)
172{
173 int i, cos, old_eth_num = BNX2X_NUM_ETH_QUEUES(bp);
174
175
176
177
178 for (cos = 1; cos < bp->max_cos; cos++) {
179 for (i = 0; i < old_eth_num - delta; i++) {
180 struct bnx2x_fastpath *fp = &bp->fp[i];
181 int new_idx = cos * (old_eth_num - delta) + i;
182
183 memcpy(&bp->bnx2x_txq[new_idx], fp->txdata_ptr[cos],
184 sizeof(struct bnx2x_fp_txdata));
185 fp->txdata_ptr[cos] = &bp->bnx2x_txq[new_idx];
186 }
187 }
188}
189
190int bnx2x_load_count[2][3] = { {0} };
191
192
193
194
195static u16 bnx2x_free_tx_pkt(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata,
196 u16 idx, unsigned int *pkts_compl,
197 unsigned int *bytes_compl)
198{
199 struct sw_tx_bd *tx_buf = &txdata->tx_buf_ring[idx];
200 struct eth_tx_start_bd *tx_start_bd;
201 struct eth_tx_bd *tx_data_bd;
202 struct sk_buff *skb = tx_buf->skb;
203 u16 bd_idx = TX_BD(tx_buf->first_bd), new_cons;
204 int nbd;
205 u16 split_bd_len = 0;
206
207
208 prefetch(&skb->end);
209
210 DP(NETIF_MSG_TX_DONE, "fp[%d]: pkt_idx %d buff @(%p)->skb %p\n",
211 txdata->txq_index, idx, tx_buf, skb);
212
213 tx_start_bd = &txdata->tx_desc_ring[bd_idx].start_bd;
214
215 nbd = le16_to_cpu(tx_start_bd->nbd) - 1;
216#ifdef BNX2X_STOP_ON_ERROR
217 if ((nbd - 1) > (MAX_SKB_FRAGS + 2)) {
218 BNX2X_ERR("BAD nbd!\n");
219 bnx2x_panic();
220 }
221#endif
222 new_cons = nbd + tx_buf->first_bd;
223
224
225 bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
226
227
228 --nbd;
229 bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
230
231 if (tx_buf->flags & BNX2X_HAS_SECOND_PBD) {
232
233 --nbd;
234 bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
235 }
236
237
238 if (tx_buf->flags & BNX2X_TSO_SPLIT_BD) {
239 tx_data_bd = &txdata->tx_desc_ring[bd_idx].reg_bd;
240 split_bd_len = BD_UNMAP_LEN(tx_data_bd);
241 --nbd;
242 bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
243 }
244
245
246 dma_unmap_single(&bp->pdev->dev, BD_UNMAP_ADDR(tx_start_bd),
247 BD_UNMAP_LEN(tx_start_bd) + split_bd_len,
248 DMA_TO_DEVICE);
249
250
251 while (nbd > 0) {
252
253 tx_data_bd = &txdata->tx_desc_ring[bd_idx].reg_bd;
254 dma_unmap_page(&bp->pdev->dev, BD_UNMAP_ADDR(tx_data_bd),
255 BD_UNMAP_LEN(tx_data_bd), DMA_TO_DEVICE);
256 if (--nbd)
257 bd_idx = TX_BD(NEXT_TX_IDX(bd_idx));
258 }
259
260
261 WARN_ON(!skb);
262 if (likely(skb)) {
263 (*pkts_compl)++;
264 (*bytes_compl) += skb->len;
265 dev_kfree_skb_any(skb);
266 }
267
268 tx_buf->first_bd = 0;
269 tx_buf->skb = NULL;
270
271 return new_cons;
272}
273
274int bnx2x_tx_int(struct bnx2x *bp, struct bnx2x_fp_txdata *txdata)
275{
276 struct netdev_queue *txq;
277 u16 hw_cons, sw_cons, bd_cons = txdata->tx_bd_cons;
278 unsigned int pkts_compl = 0, bytes_compl = 0;
279
280#ifdef BNX2X_STOP_ON_ERROR
281 if (unlikely(bp->panic))
282 return -1;
283#endif
284
285 txq = netdev_get_tx_queue(bp->dev, txdata->txq_index);
286 hw_cons = le16_to_cpu(*txdata->tx_cons_sb);
287 sw_cons = txdata->tx_pkt_cons;
288
289 while (sw_cons != hw_cons) {
290 u16 pkt_cons;
291
292 pkt_cons = TX_BD(sw_cons);
293
294 DP(NETIF_MSG_TX_DONE,
295 "queue[%d]: hw_cons %u sw_cons %u pkt_cons %u\n",
296 txdata->txq_index, hw_cons, sw_cons, pkt_cons);
297
298 bd_cons = bnx2x_free_tx_pkt(bp, txdata, pkt_cons,
299 &pkts_compl, &bytes_compl);
300
301 sw_cons++;
302 }
303
304 netdev_tx_completed_queue(txq, pkts_compl, bytes_compl);
305
306 txdata->tx_pkt_cons = sw_cons;
307 txdata->tx_bd_cons = bd_cons;
308
309
310
311
312
313
314
315
316
317
318 smp_mb();
319
320 if (unlikely(netif_tx_queue_stopped(txq))) {
321
322
323
324
325
326
327
328
329
330
331 __netif_tx_lock(txq, smp_processor_id());
332
333 if ((netif_tx_queue_stopped(txq)) &&
334 (bp->state == BNX2X_STATE_OPEN) &&
335 (bnx2x_tx_avail(bp, txdata) >= MAX_DESC_PER_TX_PKT))
336 netif_tx_wake_queue(txq);
337
338 __netif_tx_unlock(txq);
339 }
340 return 0;
341}
342
343static inline void bnx2x_update_last_max_sge(struct bnx2x_fastpath *fp,
344 u16 idx)
345{
346 u16 last_max = fp->last_max_sge;
347
348 if (SUB_S16(idx, last_max) > 0)
349 fp->last_max_sge = idx;
350}
351
352static inline void bnx2x_update_sge_prod(struct bnx2x_fastpath *fp,
353 u16 sge_len,
354 struct eth_end_agg_rx_cqe *cqe)
355{
356 struct bnx2x *bp = fp->bp;
357 u16 last_max, last_elem, first_elem;
358 u16 delta = 0;
359 u16 i;
360
361 if (!sge_len)
362 return;
363
364
365 for (i = 0; i < sge_len; i++)
366 BIT_VEC64_CLEAR_BIT(fp->sge_mask,
367 RX_SGE(le16_to_cpu(cqe->sgl_or_raw_data.sgl[i])));
368
369 DP(NETIF_MSG_RX_STATUS, "fp_cqe->sgl[%d] = %d\n",
370 sge_len - 1, le16_to_cpu(cqe->sgl_or_raw_data.sgl[sge_len - 1]));
371
372
373 prefetch((void *)(fp->sge_mask));
374 bnx2x_update_last_max_sge(fp,
375 le16_to_cpu(cqe->sgl_or_raw_data.sgl[sge_len - 1]));
376
377 last_max = RX_SGE(fp->last_max_sge);
378 last_elem = last_max >> BIT_VEC64_ELEM_SHIFT;
379 first_elem = RX_SGE(fp->rx_sge_prod) >> BIT_VEC64_ELEM_SHIFT;
380
381
382 if (last_elem + 1 != first_elem)
383 last_elem++;
384
385
386 for (i = first_elem; i != last_elem; i = NEXT_SGE_MASK_ELEM(i)) {
387 if (likely(fp->sge_mask[i]))
388 break;
389
390 fp->sge_mask[i] = BIT_VEC64_ELEM_ONE_MASK;
391 delta += BIT_VEC64_ELEM_SZ;
392 }
393
394 if (delta > 0) {
395 fp->rx_sge_prod += delta;
396
397 bnx2x_clear_sge_mask_next_elems(fp);
398 }
399
400 DP(NETIF_MSG_RX_STATUS,
401 "fp->last_max_sge = %d fp->rx_sge_prod = %d\n",
402 fp->last_max_sge, fp->rx_sge_prod);
403}
404
405
406
407
408static u32 bnx2x_get_rxhash(const struct bnx2x *bp,
409 const struct eth_fast_path_rx_cqe *cqe,
410 enum pkt_hash_types *rxhash_type)
411{
412
413 if ((bp->dev->features & NETIF_F_RXHASH) &&
414 (cqe->status_flags & ETH_FAST_PATH_RX_CQE_RSS_HASH_FLG)) {
415 enum eth_rss_hash_type htype;
416
417 htype = cqe->status_flags & ETH_FAST_PATH_RX_CQE_RSS_HASH_TYPE;
418 *rxhash_type = ((htype == TCP_IPV4_HASH_TYPE) ||
419 (htype == TCP_IPV6_HASH_TYPE)) ?
420 PKT_HASH_TYPE_L4 : PKT_HASH_TYPE_L3;
421
422 return le32_to_cpu(cqe->rss_hash_result);
423 }
424 *rxhash_type = PKT_HASH_TYPE_NONE;
425 return 0;
426}
427
428static void bnx2x_tpa_start(struct bnx2x_fastpath *fp, u16 queue,
429 u16 cons, u16 prod,
430 struct eth_fast_path_rx_cqe *cqe)
431{
432 struct bnx2x *bp = fp->bp;
433 struct sw_rx_bd *cons_rx_buf = &fp->rx_buf_ring[cons];
434 struct sw_rx_bd *prod_rx_buf = &fp->rx_buf_ring[prod];
435 struct eth_rx_bd *prod_bd = &fp->rx_desc_ring[prod];
436 dma_addr_t mapping;
437 struct bnx2x_agg_info *tpa_info = &fp->tpa_info[queue];
438 struct sw_rx_bd *first_buf = &tpa_info->first_buf;
439
440
441 if (tpa_info->tpa_state != BNX2X_TPA_STOP)
442 BNX2X_ERR("start of bin not in stop [%d]\n", queue);
443
444
445 mapping = dma_map_single(&bp->pdev->dev,
446 first_buf->data + NET_SKB_PAD,
447 fp->rx_buf_size, DMA_FROM_DEVICE);
448
449
450
451
452
453
454 if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) {
455
456 bnx2x_reuse_rx_data(fp, cons, prod);
457 tpa_info->tpa_state = BNX2X_TPA_ERROR;
458 return;
459 }
460
461
462 prod_rx_buf->data = first_buf->data;
463 dma_unmap_addr_set(prod_rx_buf, mapping, mapping);
464
465 prod_bd->addr_hi = cpu_to_le32(U64_HI(mapping));
466 prod_bd->addr_lo = cpu_to_le32(U64_LO(mapping));
467
468
469 *first_buf = *cons_rx_buf;
470
471
472 tpa_info->parsing_flags =
473 le16_to_cpu(cqe->pars_flags.flags);
474 tpa_info->vlan_tag = le16_to_cpu(cqe->vlan_tag);
475 tpa_info->tpa_state = BNX2X_TPA_START;
476 tpa_info->len_on_bd = le16_to_cpu(cqe->len_on_bd);
477 tpa_info->placement_offset = cqe->placement_offset;
478 tpa_info->rxhash = bnx2x_get_rxhash(bp, cqe, &tpa_info->rxhash_type);
479 if (fp->mode == TPA_MODE_GRO) {
480 u16 gro_size = le16_to_cpu(cqe->pkt_len_or_gro_seg_len);
481 tpa_info->full_page = SGE_PAGES / gro_size * gro_size;
482 tpa_info->gro_size = gro_size;
483 }
484
485#ifdef BNX2X_STOP_ON_ERROR
486 fp->tpa_queue_used |= (1 << queue);
487 DP(NETIF_MSG_RX_STATUS, "fp->tpa_queue_used = 0x%llx\n",
488 fp->tpa_queue_used);
489#endif
490}
491
492
493
494
495
496#define TPA_TSTAMP_OPT_LEN 12
497
498
499
500
501
502
503
504
505
506
507
508
509
510static void bnx2x_set_gro_params(struct sk_buff *skb, u16 parsing_flags,
511 u16 len_on_bd, unsigned int pkt_len,
512 u16 num_of_coalesced_segs)
513{
514
515
516
517 u16 hdrs_len = ETH_HLEN + sizeof(struct tcphdr);
518
519 if (GET_FLAG(parsing_flags, PARSING_FLAGS_OVER_ETHERNET_PROTOCOL) ==
520 PRS_FLAG_OVERETH_IPV6) {
521 hdrs_len += sizeof(struct ipv6hdr);
522 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV6;
523 } else {
524 hdrs_len += sizeof(struct iphdr);
525 skb_shinfo(skb)->gso_type = SKB_GSO_TCPV4;
526 }
527
528
529
530
531
532
533 if (parsing_flags & PARSING_FLAGS_TIME_STAMP_EXIST_FLAG)
534 hdrs_len += TPA_TSTAMP_OPT_LEN;
535
536 skb_shinfo(skb)->gso_size = len_on_bd - hdrs_len;
537
538
539
540
541 NAPI_GRO_CB(skb)->count = num_of_coalesced_segs;
542}
543
544static int bnx2x_alloc_rx_sge(struct bnx2x *bp, struct bnx2x_fastpath *fp,
545 u16 index, gfp_t gfp_mask)
546{
547 struct sw_rx_page *sw_buf = &fp->rx_page_ring[index];
548 struct eth_rx_sge *sge = &fp->rx_sge_ring[index];
549 struct bnx2x_alloc_pool *pool = &fp->page_pool;
550 dma_addr_t mapping;
551
552 if (!pool->page || (PAGE_SIZE - pool->offset) < SGE_PAGE_SIZE) {
553
554
555
556
557 if (pool->page)
558 put_page(pool->page);
559
560 pool->page = alloc_pages(gfp_mask, PAGES_PER_SGE_SHIFT);
561 if (unlikely(!pool->page))
562 return -ENOMEM;
563
564 pool->offset = 0;
565 }
566
567 mapping = dma_map_page(&bp->pdev->dev, pool->page,
568 pool->offset, SGE_PAGE_SIZE, DMA_FROM_DEVICE);
569 if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) {
570 BNX2X_ERR("Can't map sge\n");
571 return -ENOMEM;
572 }
573
574 get_page(pool->page);
575 sw_buf->page = pool->page;
576 sw_buf->offset = pool->offset;
577
578 dma_unmap_addr_set(sw_buf, mapping, mapping);
579
580 sge->addr_hi = cpu_to_le32(U64_HI(mapping));
581 sge->addr_lo = cpu_to_le32(U64_LO(mapping));
582
583 pool->offset += SGE_PAGE_SIZE;
584
585 return 0;
586}
587
588static int bnx2x_fill_frag_skb(struct bnx2x *bp, struct bnx2x_fastpath *fp,
589 struct bnx2x_agg_info *tpa_info,
590 u16 pages,
591 struct sk_buff *skb,
592 struct eth_end_agg_rx_cqe *cqe,
593 u16 cqe_idx)
594{
595 struct sw_rx_page *rx_pg, old_rx_pg;
596 u32 i, frag_len, frag_size;
597 int err, j, frag_id = 0;
598 u16 len_on_bd = tpa_info->len_on_bd;
599 u16 full_page = 0, gro_size = 0;
600
601 frag_size = le16_to_cpu(cqe->pkt_len) - len_on_bd;
602
603 if (fp->mode == TPA_MODE_GRO) {
604 gro_size = tpa_info->gro_size;
605 full_page = tpa_info->full_page;
606 }
607
608
609 if (frag_size)
610 bnx2x_set_gro_params(skb, tpa_info->parsing_flags, len_on_bd,
611 le16_to_cpu(cqe->pkt_len),
612 le16_to_cpu(cqe->num_of_coalesced_segs));
613
614#ifdef BNX2X_STOP_ON_ERROR
615 if (pages > min_t(u32, 8, MAX_SKB_FRAGS) * SGE_PAGES) {
616 BNX2X_ERR("SGL length is too long: %d. CQE index is %d\n",
617 pages, cqe_idx);
618 BNX2X_ERR("cqe->pkt_len = %d\n", cqe->pkt_len);
619 bnx2x_panic();
620 return -EINVAL;
621 }
622#endif
623
624
625 for (i = 0, j = 0; i < pages; i += PAGES_PER_SGE, j++) {
626 u16 sge_idx = RX_SGE(le16_to_cpu(cqe->sgl_or_raw_data.sgl[j]));
627
628
629
630 if (fp->mode == TPA_MODE_GRO)
631 frag_len = min_t(u32, frag_size, (u32)full_page);
632 else
633 frag_len = min_t(u32, frag_size, (u32)SGE_PAGES);
634
635 rx_pg = &fp->rx_page_ring[sge_idx];
636 old_rx_pg = *rx_pg;
637
638
639
640 err = bnx2x_alloc_rx_sge(bp, fp, sge_idx, GFP_ATOMIC);
641 if (unlikely(err)) {
642 bnx2x_fp_qstats(bp, fp)->rx_skb_alloc_failed++;
643 return err;
644 }
645
646 dma_unmap_page(&bp->pdev->dev,
647 dma_unmap_addr(&old_rx_pg, mapping),
648 SGE_PAGE_SIZE, DMA_FROM_DEVICE);
649
650 if (fp->mode == TPA_MODE_LRO)
651 skb_fill_page_desc(skb, j, old_rx_pg.page,
652 old_rx_pg.offset, frag_len);
653 else {
654 int rem;
655 int offset = 0;
656 for (rem = frag_len; rem > 0; rem -= gro_size) {
657 int len = rem > gro_size ? gro_size : rem;
658 skb_fill_page_desc(skb, frag_id++,
659 old_rx_pg.page,
660 old_rx_pg.offset + offset,
661 len);
662 if (offset)
663 get_page(old_rx_pg.page);
664 offset += len;
665 }
666 }
667
668 skb->data_len += frag_len;
669 skb->truesize += SGE_PAGES;
670 skb->len += frag_len;
671
672 frag_size -= frag_len;
673 }
674
675 return 0;
676}
677
678static void bnx2x_frag_free(const struct bnx2x_fastpath *fp, void *data)
679{
680 if (fp->rx_frag_size)
681 skb_free_frag(data);
682 else
683 kfree(data);
684}
685
686static void *bnx2x_frag_alloc(const struct bnx2x_fastpath *fp, gfp_t gfp_mask)
687{
688 if (fp->rx_frag_size) {
689
690 if (unlikely(gfpflags_allow_blocking(gfp_mask)))
691 return (void *)__get_free_page(gfp_mask);
692
693 return netdev_alloc_frag(fp->rx_frag_size);
694 }
695
696 return kmalloc(fp->rx_buf_size + NET_SKB_PAD, gfp_mask);
697}
698
699#ifdef CONFIG_INET
700static void bnx2x_gro_ip_csum(struct bnx2x *bp, struct sk_buff *skb)
701{
702 const struct iphdr *iph = ip_hdr(skb);
703 struct tcphdr *th;
704
705 skb_set_transport_header(skb, sizeof(struct iphdr));
706 th = tcp_hdr(skb);
707
708 th->check = ~tcp_v4_check(skb->len - skb_transport_offset(skb),
709 iph->saddr, iph->daddr, 0);
710}
711
712static void bnx2x_gro_ipv6_csum(struct bnx2x *bp, struct sk_buff *skb)
713{
714 struct ipv6hdr *iph = ipv6_hdr(skb);
715 struct tcphdr *th;
716
717 skb_set_transport_header(skb, sizeof(struct ipv6hdr));
718 th = tcp_hdr(skb);
719
720 th->check = ~tcp_v6_check(skb->len - skb_transport_offset(skb),
721 &iph->saddr, &iph->daddr, 0);
722}
723
724static void bnx2x_gro_csum(struct bnx2x *bp, struct sk_buff *skb,
725 void (*gro_func)(struct bnx2x*, struct sk_buff*))
726{
727 skb_set_network_header(skb, 0);
728 gro_func(bp, skb);
729 tcp_gro_complete(skb);
730}
731#endif
732
733static void bnx2x_gro_receive(struct bnx2x *bp, struct bnx2x_fastpath *fp,
734 struct sk_buff *skb)
735{
736#ifdef CONFIG_INET
737 if (skb_shinfo(skb)->gso_size) {
738 switch (be16_to_cpu(skb->protocol)) {
739 case ETH_P_IP:
740 bnx2x_gro_csum(bp, skb, bnx2x_gro_ip_csum);
741 break;
742 case ETH_P_IPV6:
743 bnx2x_gro_csum(bp, skb, bnx2x_gro_ipv6_csum);
744 break;
745 default:
746 WARN_ONCE(1, "Error: FW GRO supports only IPv4/IPv6, not 0x%04x\n",
747 be16_to_cpu(skb->protocol));
748 }
749 }
750#endif
751 skb_record_rx_queue(skb, fp->rx_queue);
752 napi_gro_receive(&fp->napi, skb);
753}
754
755static void bnx2x_tpa_stop(struct bnx2x *bp, struct bnx2x_fastpath *fp,
756 struct bnx2x_agg_info *tpa_info,
757 u16 pages,
758 struct eth_end_agg_rx_cqe *cqe,
759 u16 cqe_idx)
760{
761 struct sw_rx_bd *rx_buf = &tpa_info->first_buf;
762 u8 pad = tpa_info->placement_offset;
763 u16 len = tpa_info->len_on_bd;
764 struct sk_buff *skb = NULL;
765 u8 *new_data, *data = rx_buf->data;
766 u8 old_tpa_state = tpa_info->tpa_state;
767
768 tpa_info->tpa_state = BNX2X_TPA_STOP;
769
770
771
772
773 if (old_tpa_state == BNX2X_TPA_ERROR)
774 goto drop;
775
776
777 new_data = bnx2x_frag_alloc(fp, GFP_ATOMIC);
778
779
780
781 dma_unmap_single(&bp->pdev->dev, dma_unmap_addr(rx_buf, mapping),
782 fp->rx_buf_size, DMA_FROM_DEVICE);
783 if (likely(new_data))
784 skb = build_skb(data, fp->rx_frag_size);
785
786 if (likely(skb)) {
787#ifdef BNX2X_STOP_ON_ERROR
788 if (pad + len > fp->rx_buf_size) {
789 BNX2X_ERR("skb_put is about to fail... pad %d len %d rx_buf_size %d\n",
790 pad, len, fp->rx_buf_size);
791 bnx2x_panic();
792 return;
793 }
794#endif
795
796 skb_reserve(skb, pad + NET_SKB_PAD);
797 skb_put(skb, len);
798 skb_set_hash(skb, tpa_info->rxhash, tpa_info->rxhash_type);
799
800 skb->protocol = eth_type_trans(skb, bp->dev);
801 skb->ip_summed = CHECKSUM_UNNECESSARY;
802
803 if (!bnx2x_fill_frag_skb(bp, fp, tpa_info, pages,
804 skb, cqe, cqe_idx)) {
805 if (tpa_info->parsing_flags & PARSING_FLAGS_VLAN)
806 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q), tpa_info->vlan_tag);
807 bnx2x_gro_receive(bp, fp, skb);
808 } else {
809 DP(NETIF_MSG_RX_STATUS,
810 "Failed to allocate new pages - dropping packet!\n");
811 dev_kfree_skb_any(skb);
812 }
813
814
815 rx_buf->data = new_data;
816
817 return;
818 }
819 if (new_data)
820 bnx2x_frag_free(fp, new_data);
821drop:
822
823 DP(NETIF_MSG_RX_STATUS,
824 "Failed to allocate or map a new skb - dropping packet!\n");
825 bnx2x_fp_stats(bp, fp)->eth_q_stats.rx_skb_alloc_failed++;
826}
827
828static int bnx2x_alloc_rx_data(struct bnx2x *bp, struct bnx2x_fastpath *fp,
829 u16 index, gfp_t gfp_mask)
830{
831 u8 *data;
832 struct sw_rx_bd *rx_buf = &fp->rx_buf_ring[index];
833 struct eth_rx_bd *rx_bd = &fp->rx_desc_ring[index];
834 dma_addr_t mapping;
835
836 data = bnx2x_frag_alloc(fp, gfp_mask);
837 if (unlikely(data == NULL))
838 return -ENOMEM;
839
840 mapping = dma_map_single(&bp->pdev->dev, data + NET_SKB_PAD,
841 fp->rx_buf_size,
842 DMA_FROM_DEVICE);
843 if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) {
844 bnx2x_frag_free(fp, data);
845 BNX2X_ERR("Can't map rx data\n");
846 return -ENOMEM;
847 }
848
849 rx_buf->data = data;
850 dma_unmap_addr_set(rx_buf, mapping, mapping);
851
852 rx_bd->addr_hi = cpu_to_le32(U64_HI(mapping));
853 rx_bd->addr_lo = cpu_to_le32(U64_LO(mapping));
854
855 return 0;
856}
857
858static
859void bnx2x_csum_validate(struct sk_buff *skb, union eth_rx_cqe *cqe,
860 struct bnx2x_fastpath *fp,
861 struct bnx2x_eth_q_stats *qstats)
862{
863
864
865
866
867
868 if (cqe->fast_path_cqe.status_flags &
869 ETH_FAST_PATH_RX_CQE_L4_XSUM_NO_VALIDATION_FLG)
870 return;
871
872
873
874 if (cqe->fast_path_cqe.type_error_flags &
875 (ETH_FAST_PATH_RX_CQE_IP_BAD_XSUM_FLG |
876 ETH_FAST_PATH_RX_CQE_L4_BAD_XSUM_FLG))
877 qstats->hw_csum_err++;
878 else
879 skb->ip_summed = CHECKSUM_UNNECESSARY;
880}
881
882static int bnx2x_rx_int(struct bnx2x_fastpath *fp, int budget)
883{
884 struct bnx2x *bp = fp->bp;
885 u16 bd_cons, bd_prod, bd_prod_fw, comp_ring_cons;
886 u16 sw_comp_cons, sw_comp_prod;
887 int rx_pkt = 0;
888 union eth_rx_cqe *cqe;
889 struct eth_fast_path_rx_cqe *cqe_fp;
890
891#ifdef BNX2X_STOP_ON_ERROR
892 if (unlikely(bp->panic))
893 return 0;
894#endif
895 if (budget <= 0)
896 return rx_pkt;
897
898 bd_cons = fp->rx_bd_cons;
899 bd_prod = fp->rx_bd_prod;
900 bd_prod_fw = bd_prod;
901 sw_comp_cons = fp->rx_comp_cons;
902 sw_comp_prod = fp->rx_comp_prod;
903
904 comp_ring_cons = RCQ_BD(sw_comp_cons);
905 cqe = &fp->rx_comp_ring[comp_ring_cons];
906 cqe_fp = &cqe->fast_path_cqe;
907
908 DP(NETIF_MSG_RX_STATUS,
909 "queue[%d]: sw_comp_cons %u\n", fp->index, sw_comp_cons);
910
911 while (BNX2X_IS_CQE_COMPLETED(cqe_fp)) {
912 struct sw_rx_bd *rx_buf = NULL;
913 struct sk_buff *skb;
914 u8 cqe_fp_flags;
915 enum eth_rx_cqe_type cqe_fp_type;
916 u16 len, pad, queue;
917 u8 *data;
918 u32 rxhash;
919 enum pkt_hash_types rxhash_type;
920
921#ifdef BNX2X_STOP_ON_ERROR
922 if (unlikely(bp->panic))
923 return 0;
924#endif
925
926 bd_prod = RX_BD(bd_prod);
927 bd_cons = RX_BD(bd_cons);
928
929
930
931
932
933
934
935
936
937
938
939 rmb();
940
941 cqe_fp_flags = cqe_fp->type_error_flags;
942 cqe_fp_type = cqe_fp_flags & ETH_FAST_PATH_RX_CQE_TYPE;
943
944 DP(NETIF_MSG_RX_STATUS,
945 "CQE type %x err %x status %x queue %x vlan %x len %u\n",
946 CQE_TYPE(cqe_fp_flags),
947 cqe_fp_flags, cqe_fp->status_flags,
948 le32_to_cpu(cqe_fp->rss_hash_result),
949 le16_to_cpu(cqe_fp->vlan_tag),
950 le16_to_cpu(cqe_fp->pkt_len_or_gro_seg_len));
951
952
953 if (unlikely(CQE_TYPE_SLOW(cqe_fp_type))) {
954 bnx2x_sp_event(fp, cqe);
955 goto next_cqe;
956 }
957
958 rx_buf = &fp->rx_buf_ring[bd_cons];
959 data = rx_buf->data;
960
961 if (!CQE_TYPE_FAST(cqe_fp_type)) {
962 struct bnx2x_agg_info *tpa_info;
963 u16 frag_size, pages;
964#ifdef BNX2X_STOP_ON_ERROR
965
966 if (fp->mode == TPA_MODE_DISABLED &&
967 (CQE_TYPE_START(cqe_fp_type) ||
968 CQE_TYPE_STOP(cqe_fp_type)))
969 BNX2X_ERR("START/STOP packet while TPA disabled, type %x\n",
970 CQE_TYPE(cqe_fp_type));
971#endif
972
973 if (CQE_TYPE_START(cqe_fp_type)) {
974 u16 queue = cqe_fp->queue_index;
975 DP(NETIF_MSG_RX_STATUS,
976 "calling tpa_start on queue %d\n",
977 queue);
978
979 bnx2x_tpa_start(fp, queue,
980 bd_cons, bd_prod,
981 cqe_fp);
982
983 goto next_rx;
984 }
985 queue = cqe->end_agg_cqe.queue_index;
986 tpa_info = &fp->tpa_info[queue];
987 DP(NETIF_MSG_RX_STATUS,
988 "calling tpa_stop on queue %d\n",
989 queue);
990
991 frag_size = le16_to_cpu(cqe->end_agg_cqe.pkt_len) -
992 tpa_info->len_on_bd;
993
994 if (fp->mode == TPA_MODE_GRO)
995 pages = (frag_size + tpa_info->full_page - 1) /
996 tpa_info->full_page;
997 else
998 pages = SGE_PAGE_ALIGN(frag_size) >>
999 SGE_PAGE_SHIFT;
1000
1001 bnx2x_tpa_stop(bp, fp, tpa_info, pages,
1002 &cqe->end_agg_cqe, comp_ring_cons);
1003#ifdef BNX2X_STOP_ON_ERROR
1004 if (bp->panic)
1005 return 0;
1006#endif
1007
1008 bnx2x_update_sge_prod(fp, pages, &cqe->end_agg_cqe);
1009 goto next_cqe;
1010 }
1011
1012 len = le16_to_cpu(cqe_fp->pkt_len_or_gro_seg_len);
1013 pad = cqe_fp->placement_offset;
1014 dma_sync_single_for_cpu(&bp->pdev->dev,
1015 dma_unmap_addr(rx_buf, mapping),
1016 pad + RX_COPY_THRESH,
1017 DMA_FROM_DEVICE);
1018 pad += NET_SKB_PAD;
1019 prefetch(data + pad);
1020
1021 if (unlikely(cqe_fp_flags & ETH_RX_ERROR_FALGS)) {
1022 DP(NETIF_MSG_RX_ERR | NETIF_MSG_RX_STATUS,
1023 "ERROR flags %x rx packet %u\n",
1024 cqe_fp_flags, sw_comp_cons);
1025 bnx2x_fp_qstats(bp, fp)->rx_err_discard_pkt++;
1026 goto reuse_rx;
1027 }
1028
1029
1030
1031
1032 if ((bp->dev->mtu > ETH_MAX_PACKET_SIZE) &&
1033 (len <= RX_COPY_THRESH)) {
1034 skb = napi_alloc_skb(&fp->napi, len);
1035 if (skb == NULL) {
1036 DP(NETIF_MSG_RX_ERR | NETIF_MSG_RX_STATUS,
1037 "ERROR packet dropped because of alloc failure\n");
1038 bnx2x_fp_qstats(bp, fp)->rx_skb_alloc_failed++;
1039 goto reuse_rx;
1040 }
1041 memcpy(skb->data, data + pad, len);
1042 bnx2x_reuse_rx_data(fp, bd_cons, bd_prod);
1043 } else {
1044 if (likely(bnx2x_alloc_rx_data(bp, fp, bd_prod,
1045 GFP_ATOMIC) == 0)) {
1046 dma_unmap_single(&bp->pdev->dev,
1047 dma_unmap_addr(rx_buf, mapping),
1048 fp->rx_buf_size,
1049 DMA_FROM_DEVICE);
1050 skb = build_skb(data, fp->rx_frag_size);
1051 if (unlikely(!skb)) {
1052 bnx2x_frag_free(fp, data);
1053 bnx2x_fp_qstats(bp, fp)->
1054 rx_skb_alloc_failed++;
1055 goto next_rx;
1056 }
1057 skb_reserve(skb, pad);
1058 } else {
1059 DP(NETIF_MSG_RX_ERR | NETIF_MSG_RX_STATUS,
1060 "ERROR packet dropped because of alloc failure\n");
1061 bnx2x_fp_qstats(bp, fp)->rx_skb_alloc_failed++;
1062reuse_rx:
1063 bnx2x_reuse_rx_data(fp, bd_cons, bd_prod);
1064 goto next_rx;
1065 }
1066 }
1067
1068 skb_put(skb, len);
1069 skb->protocol = eth_type_trans(skb, bp->dev);
1070
1071
1072 rxhash = bnx2x_get_rxhash(bp, cqe_fp, &rxhash_type);
1073 skb_set_hash(skb, rxhash, rxhash_type);
1074
1075 skb_checksum_none_assert(skb);
1076
1077 if (bp->dev->features & NETIF_F_RXCSUM)
1078 bnx2x_csum_validate(skb, cqe, fp,
1079 bnx2x_fp_qstats(bp, fp));
1080
1081 skb_record_rx_queue(skb, fp->rx_queue);
1082
1083
1084 if (unlikely(cqe->fast_path_cqe.type_error_flags &
1085 (1 << ETH_FAST_PATH_RX_CQE_PTP_PKT_SHIFT)))
1086 bnx2x_set_rx_ts(bp, skb);
1087
1088 if (le16_to_cpu(cqe_fp->pars_flags.flags) &
1089 PARSING_FLAGS_VLAN)
1090 __vlan_hwaccel_put_tag(skb, htons(ETH_P_8021Q),
1091 le16_to_cpu(cqe_fp->vlan_tag));
1092
1093 napi_gro_receive(&fp->napi, skb);
1094next_rx:
1095 rx_buf->data = NULL;
1096
1097 bd_cons = NEXT_RX_IDX(bd_cons);
1098 bd_prod = NEXT_RX_IDX(bd_prod);
1099 bd_prod_fw = NEXT_RX_IDX(bd_prod_fw);
1100 rx_pkt++;
1101next_cqe:
1102 sw_comp_prod = NEXT_RCQ_IDX(sw_comp_prod);
1103 sw_comp_cons = NEXT_RCQ_IDX(sw_comp_cons);
1104
1105
1106 BNX2X_SEED_CQE(cqe_fp);
1107
1108 if (rx_pkt == budget)
1109 break;
1110
1111 comp_ring_cons = RCQ_BD(sw_comp_cons);
1112 cqe = &fp->rx_comp_ring[comp_ring_cons];
1113 cqe_fp = &cqe->fast_path_cqe;
1114 }
1115
1116 fp->rx_bd_cons = bd_cons;
1117 fp->rx_bd_prod = bd_prod_fw;
1118 fp->rx_comp_cons = sw_comp_cons;
1119 fp->rx_comp_prod = sw_comp_prod;
1120
1121
1122 bnx2x_update_rx_prod(bp, fp, bd_prod_fw, sw_comp_prod,
1123 fp->rx_sge_prod);
1124
1125 return rx_pkt;
1126}
1127
1128static irqreturn_t bnx2x_msix_fp_int(int irq, void *fp_cookie)
1129{
1130 struct bnx2x_fastpath *fp = fp_cookie;
1131 struct bnx2x *bp = fp->bp;
1132 u8 cos;
1133
1134 DP(NETIF_MSG_INTR,
1135 "got an MSI-X interrupt on IDX:SB [fp %d fw_sd %d igusb %d]\n",
1136 fp->index, fp->fw_sb_id, fp->igu_sb_id);
1137
1138 bnx2x_ack_sb(bp, fp->igu_sb_id, USTORM_ID, 0, IGU_INT_DISABLE, 0);
1139
1140#ifdef BNX2X_STOP_ON_ERROR
1141 if (unlikely(bp->panic))
1142 return IRQ_HANDLED;
1143#endif
1144
1145
1146 for_each_cos_in_tx_queue(fp, cos)
1147 prefetch(fp->txdata_ptr[cos]->tx_cons_sb);
1148
1149 prefetch(&fp->sb_running_index[SM_RX_ID]);
1150 napi_schedule_irqoff(&bnx2x_fp(bp, fp->index, napi));
1151
1152 return IRQ_HANDLED;
1153}
1154
1155
1156void bnx2x_acquire_phy_lock(struct bnx2x *bp)
1157{
1158 mutex_lock(&bp->port.phy_mutex);
1159
1160 bnx2x_acquire_hw_lock(bp, HW_LOCK_RESOURCE_MDIO);
1161}
1162
1163void bnx2x_release_phy_lock(struct bnx2x *bp)
1164{
1165 bnx2x_release_hw_lock(bp, HW_LOCK_RESOURCE_MDIO);
1166
1167 mutex_unlock(&bp->port.phy_mutex);
1168}
1169
1170
1171u16 bnx2x_get_mf_speed(struct bnx2x *bp)
1172{
1173 u16 line_speed = bp->link_vars.line_speed;
1174 if (IS_MF(bp)) {
1175 u16 maxCfg = bnx2x_extract_max_cfg(bp,
1176 bp->mf_config[BP_VN(bp)]);
1177
1178
1179
1180
1181 if (IS_MF_PERCENT_BW(bp))
1182 line_speed = (line_speed * maxCfg) / 100;
1183 else {
1184 u16 vn_max_rate = maxCfg * 100;
1185
1186 if (vn_max_rate < line_speed)
1187 line_speed = vn_max_rate;
1188 }
1189 }
1190
1191 return line_speed;
1192}
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202static void bnx2x_fill_report_data(struct bnx2x *bp,
1203 struct bnx2x_link_report_data *data)
1204{
1205 memset(data, 0, sizeof(*data));
1206
1207 if (IS_PF(bp)) {
1208
1209 data->line_speed = bnx2x_get_mf_speed(bp);
1210
1211
1212 if (!bp->link_vars.link_up || (bp->flags & MF_FUNC_DIS))
1213 __set_bit(BNX2X_LINK_REPORT_LINK_DOWN,
1214 &data->link_report_flags);
1215
1216 if (!BNX2X_NUM_ETH_QUEUES(bp))
1217 __set_bit(BNX2X_LINK_REPORT_LINK_DOWN,
1218 &data->link_report_flags);
1219
1220
1221 if (bp->link_vars.duplex == DUPLEX_FULL)
1222 __set_bit(BNX2X_LINK_REPORT_FD,
1223 &data->link_report_flags);
1224
1225
1226 if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_RX)
1227 __set_bit(BNX2X_LINK_REPORT_RX_FC_ON,
1228 &data->link_report_flags);
1229
1230
1231 if (bp->link_vars.flow_ctrl & BNX2X_FLOW_CTRL_TX)
1232 __set_bit(BNX2X_LINK_REPORT_TX_FC_ON,
1233 &data->link_report_flags);
1234 } else {
1235 *data = bp->vf_link_vars;
1236 }
1237}
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249void bnx2x_link_report(struct bnx2x *bp)
1250{
1251 bnx2x_acquire_phy_lock(bp);
1252 __bnx2x_link_report(bp);
1253 bnx2x_release_phy_lock(bp);
1254}
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264void __bnx2x_link_report(struct bnx2x *bp)
1265{
1266 struct bnx2x_link_report_data cur_data;
1267
1268
1269 if (IS_PF(bp) && !CHIP_IS_E1(bp))
1270 bnx2x_read_mf_cfg(bp);
1271
1272
1273 bnx2x_fill_report_data(bp, &cur_data);
1274
1275
1276 if (!memcmp(&cur_data, &bp->last_reported_link, sizeof(cur_data)) ||
1277 (test_bit(BNX2X_LINK_REPORT_LINK_DOWN,
1278 &bp->last_reported_link.link_report_flags) &&
1279 test_bit(BNX2X_LINK_REPORT_LINK_DOWN,
1280 &cur_data.link_report_flags)))
1281 return;
1282
1283 bp->link_cnt++;
1284
1285
1286
1287
1288 memcpy(&bp->last_reported_link, &cur_data, sizeof(cur_data));
1289
1290
1291 if (IS_PF(bp))
1292 bnx2x_iov_link_update(bp);
1293
1294 if (test_bit(BNX2X_LINK_REPORT_LINK_DOWN,
1295 &cur_data.link_report_flags)) {
1296 netif_carrier_off(bp->dev);
1297 netdev_err(bp->dev, "NIC Link is Down\n");
1298 return;
1299 } else {
1300 const char *duplex;
1301 const char *flow;
1302
1303 netif_carrier_on(bp->dev);
1304
1305 if (test_and_clear_bit(BNX2X_LINK_REPORT_FD,
1306 &cur_data.link_report_flags))
1307 duplex = "full";
1308 else
1309 duplex = "half";
1310
1311
1312
1313
1314
1315 if (cur_data.link_report_flags) {
1316 if (test_bit(BNX2X_LINK_REPORT_RX_FC_ON,
1317 &cur_data.link_report_flags)) {
1318 if (test_bit(BNX2X_LINK_REPORT_TX_FC_ON,
1319 &cur_data.link_report_flags))
1320 flow = "ON - receive & transmit";
1321 else
1322 flow = "ON - receive";
1323 } else {
1324 flow = "ON - transmit";
1325 }
1326 } else {
1327 flow = "none";
1328 }
1329 netdev_info(bp->dev, "NIC Link is Up, %d Mbps %s duplex, Flow control: %s\n",
1330 cur_data.line_speed, duplex, flow);
1331 }
1332}
1333
1334static void bnx2x_set_next_page_sgl(struct bnx2x_fastpath *fp)
1335{
1336 int i;
1337
1338 for (i = 1; i <= NUM_RX_SGE_PAGES; i++) {
1339 struct eth_rx_sge *sge;
1340
1341 sge = &fp->rx_sge_ring[RX_SGE_CNT * i - 2];
1342 sge->addr_hi =
1343 cpu_to_le32(U64_HI(fp->rx_sge_mapping +
1344 BCM_PAGE_SIZE*(i % NUM_RX_SGE_PAGES)));
1345
1346 sge->addr_lo =
1347 cpu_to_le32(U64_LO(fp->rx_sge_mapping +
1348 BCM_PAGE_SIZE*(i % NUM_RX_SGE_PAGES)));
1349 }
1350}
1351
1352static void bnx2x_free_tpa_pool(struct bnx2x *bp,
1353 struct bnx2x_fastpath *fp, int last)
1354{
1355 int i;
1356
1357 for (i = 0; i < last; i++) {
1358 struct bnx2x_agg_info *tpa_info = &fp->tpa_info[i];
1359 struct sw_rx_bd *first_buf = &tpa_info->first_buf;
1360 u8 *data = first_buf->data;
1361
1362 if (data == NULL) {
1363 DP(NETIF_MSG_IFDOWN, "tpa bin %d empty on free\n", i);
1364 continue;
1365 }
1366 if (tpa_info->tpa_state == BNX2X_TPA_START)
1367 dma_unmap_single(&bp->pdev->dev,
1368 dma_unmap_addr(first_buf, mapping),
1369 fp->rx_buf_size, DMA_FROM_DEVICE);
1370 bnx2x_frag_free(fp, data);
1371 first_buf->data = NULL;
1372 }
1373}
1374
1375void bnx2x_init_rx_rings_cnic(struct bnx2x *bp)
1376{
1377 int j;
1378
1379 for_each_rx_queue_cnic(bp, j) {
1380 struct bnx2x_fastpath *fp = &bp->fp[j];
1381
1382 fp->rx_bd_cons = 0;
1383
1384
1385
1386
1387
1388
1389 bnx2x_update_rx_prod(bp, fp, fp->rx_bd_prod, fp->rx_comp_prod,
1390 fp->rx_sge_prod);
1391 }
1392}
1393
1394void bnx2x_init_rx_rings(struct bnx2x *bp)
1395{
1396 int func = BP_FUNC(bp);
1397 u16 ring_prod;
1398 int i, j;
1399
1400
1401 for_each_eth_queue(bp, j) {
1402 struct bnx2x_fastpath *fp = &bp->fp[j];
1403
1404 DP(NETIF_MSG_IFUP,
1405 "mtu %d rx_buf_size %d\n", bp->dev->mtu, fp->rx_buf_size);
1406
1407 if (fp->mode != TPA_MODE_DISABLED) {
1408
1409 for (i = 0; i < MAX_AGG_QS(bp); i++) {
1410 struct bnx2x_agg_info *tpa_info =
1411 &fp->tpa_info[i];
1412 struct sw_rx_bd *first_buf =
1413 &tpa_info->first_buf;
1414
1415 first_buf->data =
1416 bnx2x_frag_alloc(fp, GFP_KERNEL);
1417 if (!first_buf->data) {
1418 BNX2X_ERR("Failed to allocate TPA skb pool for queue[%d] - disabling TPA on this queue!\n",
1419 j);
1420 bnx2x_free_tpa_pool(bp, fp, i);
1421 fp->mode = TPA_MODE_DISABLED;
1422 break;
1423 }
1424 dma_unmap_addr_set(first_buf, mapping, 0);
1425 tpa_info->tpa_state = BNX2X_TPA_STOP;
1426 }
1427
1428
1429 bnx2x_set_next_page_sgl(fp);
1430
1431
1432 bnx2x_init_sge_ring_bit_mask(fp);
1433
1434
1435 for (i = 0, ring_prod = 0;
1436 i < MAX_RX_SGE_CNT*NUM_RX_SGE_PAGES; i++) {
1437
1438 if (bnx2x_alloc_rx_sge(bp, fp, ring_prod,
1439 GFP_KERNEL) < 0) {
1440 BNX2X_ERR("was only able to allocate %d rx sges\n",
1441 i);
1442 BNX2X_ERR("disabling TPA for queue[%d]\n",
1443 j);
1444
1445 bnx2x_free_rx_sge_range(bp, fp,
1446 ring_prod);
1447 bnx2x_free_tpa_pool(bp, fp,
1448 MAX_AGG_QS(bp));
1449 fp->mode = TPA_MODE_DISABLED;
1450 ring_prod = 0;
1451 break;
1452 }
1453 ring_prod = NEXT_SGE_IDX(ring_prod);
1454 }
1455
1456 fp->rx_sge_prod = ring_prod;
1457 }
1458 }
1459
1460 for_each_eth_queue(bp, j) {
1461 struct bnx2x_fastpath *fp = &bp->fp[j];
1462
1463 fp->rx_bd_cons = 0;
1464
1465
1466
1467
1468
1469
1470 bnx2x_update_rx_prod(bp, fp, fp->rx_bd_prod, fp->rx_comp_prod,
1471 fp->rx_sge_prod);
1472
1473 if (j != 0)
1474 continue;
1475
1476 if (CHIP_IS_E1(bp)) {
1477 REG_WR(bp, BAR_USTRORM_INTMEM +
1478 USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(func),
1479 U64_LO(fp->rx_comp_mapping));
1480 REG_WR(bp, BAR_USTRORM_INTMEM +
1481 USTORM_MEM_WORKAROUND_ADDRESS_OFFSET(func) + 4,
1482 U64_HI(fp->rx_comp_mapping));
1483 }
1484 }
1485}
1486
1487static void bnx2x_free_tx_skbs_queue(struct bnx2x_fastpath *fp)
1488{
1489 u8 cos;
1490 struct bnx2x *bp = fp->bp;
1491
1492 for_each_cos_in_tx_queue(fp, cos) {
1493 struct bnx2x_fp_txdata *txdata = fp->txdata_ptr[cos];
1494 unsigned pkts_compl = 0, bytes_compl = 0;
1495
1496 u16 sw_prod = txdata->tx_pkt_prod;
1497 u16 sw_cons = txdata->tx_pkt_cons;
1498
1499 while (sw_cons != sw_prod) {
1500 bnx2x_free_tx_pkt(bp, txdata, TX_BD(sw_cons),
1501 &pkts_compl, &bytes_compl);
1502 sw_cons++;
1503 }
1504
1505 netdev_tx_reset_queue(
1506 netdev_get_tx_queue(bp->dev,
1507 txdata->txq_index));
1508 }
1509}
1510
1511static void bnx2x_free_tx_skbs_cnic(struct bnx2x *bp)
1512{
1513 int i;
1514
1515 for_each_tx_queue_cnic(bp, i) {
1516 bnx2x_free_tx_skbs_queue(&bp->fp[i]);
1517 }
1518}
1519
1520static void bnx2x_free_tx_skbs(struct bnx2x *bp)
1521{
1522 int i;
1523
1524 for_each_eth_queue(bp, i) {
1525 bnx2x_free_tx_skbs_queue(&bp->fp[i]);
1526 }
1527}
1528
1529static void bnx2x_free_rx_bds(struct bnx2x_fastpath *fp)
1530{
1531 struct bnx2x *bp = fp->bp;
1532 int i;
1533
1534
1535 if (fp->rx_buf_ring == NULL)
1536 return;
1537
1538 for (i = 0; i < NUM_RX_BD; i++) {
1539 struct sw_rx_bd *rx_buf = &fp->rx_buf_ring[i];
1540 u8 *data = rx_buf->data;
1541
1542 if (data == NULL)
1543 continue;
1544 dma_unmap_single(&bp->pdev->dev,
1545 dma_unmap_addr(rx_buf, mapping),
1546 fp->rx_buf_size, DMA_FROM_DEVICE);
1547
1548 rx_buf->data = NULL;
1549 bnx2x_frag_free(fp, data);
1550 }
1551}
1552
1553static void bnx2x_free_rx_skbs_cnic(struct bnx2x *bp)
1554{
1555 int j;
1556
1557 for_each_rx_queue_cnic(bp, j) {
1558 bnx2x_free_rx_bds(&bp->fp[j]);
1559 }
1560}
1561
1562static void bnx2x_free_rx_skbs(struct bnx2x *bp)
1563{
1564 int j;
1565
1566 for_each_eth_queue(bp, j) {
1567 struct bnx2x_fastpath *fp = &bp->fp[j];
1568
1569 bnx2x_free_rx_bds(fp);
1570
1571 if (fp->mode != TPA_MODE_DISABLED)
1572 bnx2x_free_tpa_pool(bp, fp, MAX_AGG_QS(bp));
1573 }
1574}
1575
1576static void bnx2x_free_skbs_cnic(struct bnx2x *bp)
1577{
1578 bnx2x_free_tx_skbs_cnic(bp);
1579 bnx2x_free_rx_skbs_cnic(bp);
1580}
1581
1582void bnx2x_free_skbs(struct bnx2x *bp)
1583{
1584 bnx2x_free_tx_skbs(bp);
1585 bnx2x_free_rx_skbs(bp);
1586}
1587
1588void bnx2x_update_max_mf_config(struct bnx2x *bp, u32 value)
1589{
1590
1591 u32 mf_cfg = bp->mf_config[BP_VN(bp)];
1592
1593 if (value != bnx2x_extract_max_cfg(bp, mf_cfg)) {
1594
1595 mf_cfg &= ~FUNC_MF_CFG_MAX_BW_MASK;
1596
1597
1598 mf_cfg |= (value << FUNC_MF_CFG_MAX_BW_SHIFT)
1599 & FUNC_MF_CFG_MAX_BW_MASK;
1600
1601 bnx2x_fw_command(bp, DRV_MSG_CODE_SET_MF_BW, mf_cfg);
1602 }
1603}
1604
1605
1606
1607
1608
1609
1610
1611static void bnx2x_free_msix_irqs(struct bnx2x *bp, int nvecs)
1612{
1613 int i, offset = 0;
1614
1615 if (nvecs == offset)
1616 return;
1617
1618
1619 if (IS_PF(bp)) {
1620 free_irq(bp->msix_table[offset].vector, bp->dev);
1621 DP(NETIF_MSG_IFDOWN, "released sp irq (%d)\n",
1622 bp->msix_table[offset].vector);
1623 offset++;
1624 }
1625
1626 if (CNIC_SUPPORT(bp)) {
1627 if (nvecs == offset)
1628 return;
1629 offset++;
1630 }
1631
1632 for_each_eth_queue(bp, i) {
1633 if (nvecs == offset)
1634 return;
1635 DP(NETIF_MSG_IFDOWN, "about to release fp #%d->%d irq\n",
1636 i, bp->msix_table[offset].vector);
1637
1638 free_irq(bp->msix_table[offset++].vector, &bp->fp[i]);
1639 }
1640}
1641
1642void bnx2x_free_irq(struct bnx2x *bp)
1643{
1644 if (bp->flags & USING_MSIX_FLAG &&
1645 !(bp->flags & USING_SINGLE_MSIX_FLAG)) {
1646 int nvecs = BNX2X_NUM_ETH_QUEUES(bp) + CNIC_SUPPORT(bp);
1647
1648
1649 if (IS_PF(bp))
1650 nvecs++;
1651
1652 bnx2x_free_msix_irqs(bp, nvecs);
1653 } else {
1654 free_irq(bp->dev->irq, bp->dev);
1655 }
1656}
1657
1658int bnx2x_enable_msix(struct bnx2x *bp)
1659{
1660 int msix_vec = 0, i, rc;
1661
1662
1663 if (IS_PF(bp)) {
1664 bp->msix_table[msix_vec].entry = msix_vec;
1665 BNX2X_DEV_INFO("msix_table[0].entry = %d (slowpath)\n",
1666 bp->msix_table[0].entry);
1667 msix_vec++;
1668 }
1669
1670
1671 if (CNIC_SUPPORT(bp)) {
1672 bp->msix_table[msix_vec].entry = msix_vec;
1673 BNX2X_DEV_INFO("msix_table[%d].entry = %d (CNIC)\n",
1674 msix_vec, bp->msix_table[msix_vec].entry);
1675 msix_vec++;
1676 }
1677
1678
1679 for_each_eth_queue(bp, i) {
1680 bp->msix_table[msix_vec].entry = msix_vec;
1681 BNX2X_DEV_INFO("msix_table[%d].entry = %d (fastpath #%u)\n",
1682 msix_vec, msix_vec, i);
1683 msix_vec++;
1684 }
1685
1686 DP(BNX2X_MSG_SP, "about to request enable msix with %d vectors\n",
1687 msix_vec);
1688
1689 rc = pci_enable_msix_range(bp->pdev, &bp->msix_table[0],
1690 BNX2X_MIN_MSIX_VEC_CNT(bp), msix_vec);
1691
1692
1693
1694
1695 if (rc == -ENOSPC) {
1696
1697 rc = pci_enable_msix_range(bp->pdev, &bp->msix_table[0], 1, 1);
1698 if (rc < 0) {
1699 BNX2X_DEV_INFO("Single MSI-X is not attainable rc %d\n",
1700 rc);
1701 goto no_msix;
1702 }
1703
1704 BNX2X_DEV_INFO("Using single MSI-X vector\n");
1705 bp->flags |= USING_SINGLE_MSIX_FLAG;
1706
1707 BNX2X_DEV_INFO("set number of queues to 1\n");
1708 bp->num_ethernet_queues = 1;
1709 bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues;
1710 } else if (rc < 0) {
1711 BNX2X_DEV_INFO("MSI-X is not attainable rc %d\n", rc);
1712 goto no_msix;
1713 } else if (rc < msix_vec) {
1714
1715 int diff = msix_vec - rc;
1716
1717 BNX2X_DEV_INFO("Trying to use less MSI-X vectors: %d\n", rc);
1718
1719
1720
1721
1722 bp->num_ethernet_queues -= diff;
1723 bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues;
1724
1725 BNX2X_DEV_INFO("New queue configuration set: %d\n",
1726 bp->num_queues);
1727 }
1728
1729 bp->flags |= USING_MSIX_FLAG;
1730
1731 return 0;
1732
1733no_msix:
1734
1735 if (rc == -ENOMEM)
1736 bp->flags |= DISABLE_MSI_FLAG;
1737
1738 return rc;
1739}
1740
1741static int bnx2x_req_msix_irqs(struct bnx2x *bp)
1742{
1743 int i, rc, offset = 0;
1744
1745
1746 if (IS_PF(bp)) {
1747 rc = request_irq(bp->msix_table[offset++].vector,
1748 bnx2x_msix_sp_int, 0,
1749 bp->dev->name, bp->dev);
1750 if (rc) {
1751 BNX2X_ERR("request sp irq failed\n");
1752 return -EBUSY;
1753 }
1754 }
1755
1756 if (CNIC_SUPPORT(bp))
1757 offset++;
1758
1759 for_each_eth_queue(bp, i) {
1760 struct bnx2x_fastpath *fp = &bp->fp[i];
1761 snprintf(fp->name, sizeof(fp->name), "%s-fp-%d",
1762 bp->dev->name, i);
1763
1764 rc = request_irq(bp->msix_table[offset].vector,
1765 bnx2x_msix_fp_int, 0, fp->name, fp);
1766 if (rc) {
1767 BNX2X_ERR("request fp #%d irq (%d) failed rc %d\n", i,
1768 bp->msix_table[offset].vector, rc);
1769 bnx2x_free_msix_irqs(bp, offset);
1770 return -EBUSY;
1771 }
1772
1773 offset++;
1774 }
1775
1776 i = BNX2X_NUM_ETH_QUEUES(bp);
1777 if (IS_PF(bp)) {
1778 offset = 1 + CNIC_SUPPORT(bp);
1779 netdev_info(bp->dev,
1780 "using MSI-X IRQs: sp %d fp[%d] %d ... fp[%d] %d\n",
1781 bp->msix_table[0].vector,
1782 0, bp->msix_table[offset].vector,
1783 i - 1, bp->msix_table[offset + i - 1].vector);
1784 } else {
1785 offset = CNIC_SUPPORT(bp);
1786 netdev_info(bp->dev,
1787 "using MSI-X IRQs: fp[%d] %d ... fp[%d] %d\n",
1788 0, bp->msix_table[offset].vector,
1789 i - 1, bp->msix_table[offset + i - 1].vector);
1790 }
1791 return 0;
1792}
1793
1794int bnx2x_enable_msi(struct bnx2x *bp)
1795{
1796 int rc;
1797
1798 rc = pci_enable_msi(bp->pdev);
1799 if (rc) {
1800 BNX2X_DEV_INFO("MSI is not attainable\n");
1801 return -1;
1802 }
1803 bp->flags |= USING_MSI_FLAG;
1804
1805 return 0;
1806}
1807
1808static int bnx2x_req_irq(struct bnx2x *bp)
1809{
1810 unsigned long flags;
1811 unsigned int irq;
1812
1813 if (bp->flags & (USING_MSI_FLAG | USING_MSIX_FLAG))
1814 flags = 0;
1815 else
1816 flags = IRQF_SHARED;
1817
1818 if (bp->flags & USING_MSIX_FLAG)
1819 irq = bp->msix_table[0].vector;
1820 else
1821 irq = bp->pdev->irq;
1822
1823 return request_irq(irq, bnx2x_interrupt, flags, bp->dev->name, bp->dev);
1824}
1825
1826static int bnx2x_setup_irqs(struct bnx2x *bp)
1827{
1828 int rc = 0;
1829 if (bp->flags & USING_MSIX_FLAG &&
1830 !(bp->flags & USING_SINGLE_MSIX_FLAG)) {
1831 rc = bnx2x_req_msix_irqs(bp);
1832 if (rc)
1833 return rc;
1834 } else {
1835 rc = bnx2x_req_irq(bp);
1836 if (rc) {
1837 BNX2X_ERR("IRQ request failed rc %d, aborting\n", rc);
1838 return rc;
1839 }
1840 if (bp->flags & USING_MSI_FLAG) {
1841 bp->dev->irq = bp->pdev->irq;
1842 netdev_info(bp->dev, "using MSI IRQ %d\n",
1843 bp->dev->irq);
1844 }
1845 if (bp->flags & USING_MSIX_FLAG) {
1846 bp->dev->irq = bp->msix_table[0].vector;
1847 netdev_info(bp->dev, "using MSIX IRQ %d\n",
1848 bp->dev->irq);
1849 }
1850 }
1851
1852 return 0;
1853}
1854
1855static void bnx2x_napi_enable_cnic(struct bnx2x *bp)
1856{
1857 int i;
1858
1859 for_each_rx_queue_cnic(bp, i) {
1860 napi_enable(&bnx2x_fp(bp, i, napi));
1861 }
1862}
1863
1864static void bnx2x_napi_enable(struct bnx2x *bp)
1865{
1866 int i;
1867
1868 for_each_eth_queue(bp, i) {
1869 napi_enable(&bnx2x_fp(bp, i, napi));
1870 }
1871}
1872
1873static void bnx2x_napi_disable_cnic(struct bnx2x *bp)
1874{
1875 int i;
1876
1877 for_each_rx_queue_cnic(bp, i) {
1878 napi_disable(&bnx2x_fp(bp, i, napi));
1879 }
1880}
1881
1882static void bnx2x_napi_disable(struct bnx2x *bp)
1883{
1884 int i;
1885
1886 for_each_eth_queue(bp, i) {
1887 napi_disable(&bnx2x_fp(bp, i, napi));
1888 }
1889}
1890
1891void bnx2x_netif_start(struct bnx2x *bp)
1892{
1893 if (netif_running(bp->dev)) {
1894 bnx2x_napi_enable(bp);
1895 if (CNIC_LOADED(bp))
1896 bnx2x_napi_enable_cnic(bp);
1897 bnx2x_int_enable(bp);
1898 if (bp->state == BNX2X_STATE_OPEN)
1899 netif_tx_wake_all_queues(bp->dev);
1900 }
1901}
1902
1903void bnx2x_netif_stop(struct bnx2x *bp, int disable_hw)
1904{
1905 bnx2x_int_disable_sync(bp, disable_hw);
1906 bnx2x_napi_disable(bp);
1907 if (CNIC_LOADED(bp))
1908 bnx2x_napi_disable_cnic(bp);
1909}
1910
1911u16 bnx2x_select_queue(struct net_device *dev, struct sk_buff *skb,
1912 void *accel_priv, select_queue_fallback_t fallback)
1913{
1914 struct bnx2x *bp = netdev_priv(dev);
1915
1916 if (CNIC_LOADED(bp) && !NO_FCOE(bp)) {
1917 struct ethhdr *hdr = (struct ethhdr *)skb->data;
1918 u16 ether_type = ntohs(hdr->h_proto);
1919
1920
1921 if (ether_type == ETH_P_8021Q) {
1922 struct vlan_ethhdr *vhdr =
1923 (struct vlan_ethhdr *)skb->data;
1924
1925 ether_type = ntohs(vhdr->h_vlan_encapsulated_proto);
1926 }
1927
1928
1929 if ((ether_type == ETH_P_FCOE) || (ether_type == ETH_P_FIP))
1930 return bnx2x_fcoe_tx(bp, txq_index);
1931 }
1932
1933
1934 return fallback(dev, skb) % BNX2X_NUM_ETH_QUEUES(bp);
1935}
1936
1937void bnx2x_set_num_queues(struct bnx2x *bp)
1938{
1939
1940 bp->num_ethernet_queues = bnx2x_calc_num_queues(bp);
1941
1942
1943 if (IS_MF_STORAGE_ONLY(bp))
1944 bp->num_ethernet_queues = 1;
1945
1946
1947 bp->num_cnic_queues = CNIC_SUPPORT(bp);
1948 bp->num_queues = bp->num_ethernet_queues + bp->num_cnic_queues;
1949
1950 BNX2X_DEV_INFO("set number of queues to %d\n", bp->num_queues);
1951}
1952
1953
1954
1955
1956
1957
1958
1959
1960
1961
1962
1963
1964
1965
1966
1967
1968
1969
1970
1971
1972
1973
1974
1975static int bnx2x_set_real_num_queues(struct bnx2x *bp, int include_cnic)
1976{
1977 int rc, tx, rx;
1978
1979 tx = BNX2X_NUM_ETH_QUEUES(bp) * bp->max_cos;
1980 rx = BNX2X_NUM_ETH_QUEUES(bp);
1981
1982
1983 if (include_cnic && !NO_FCOE(bp)) {
1984 rx++;
1985 tx++;
1986 }
1987
1988 rc = netif_set_real_num_tx_queues(bp->dev, tx);
1989 if (rc) {
1990 BNX2X_ERR("Failed to set real number of Tx queues: %d\n", rc);
1991 return rc;
1992 }
1993 rc = netif_set_real_num_rx_queues(bp->dev, rx);
1994 if (rc) {
1995 BNX2X_ERR("Failed to set real number of Rx queues: %d\n", rc);
1996 return rc;
1997 }
1998
1999 DP(NETIF_MSG_IFUP, "Setting real num queues to (tx, rx) (%d, %d)\n",
2000 tx, rx);
2001
2002 return rc;
2003}
2004
2005static void bnx2x_set_rx_buf_size(struct bnx2x *bp)
2006{
2007 int i;
2008
2009 for_each_queue(bp, i) {
2010 struct bnx2x_fastpath *fp = &bp->fp[i];
2011 u32 mtu;
2012
2013
2014 if (IS_FCOE_IDX(i))
2015
2016
2017
2018
2019
2020
2021 mtu = BNX2X_FCOE_MINI_JUMBO_MTU;
2022 else
2023 mtu = bp->dev->mtu;
2024 fp->rx_buf_size = BNX2X_FW_RX_ALIGN_START +
2025 IP_HEADER_ALIGNMENT_PADDING +
2026 ETH_OVREHEAD +
2027 mtu +
2028 BNX2X_FW_RX_ALIGN_END;
2029
2030 if (fp->rx_buf_size + NET_SKB_PAD <= PAGE_SIZE)
2031 fp->rx_frag_size = fp->rx_buf_size + NET_SKB_PAD;
2032 else
2033 fp->rx_frag_size = 0;
2034 }
2035}
2036
2037static int bnx2x_init_rss(struct bnx2x *bp)
2038{
2039 int i;
2040 u8 num_eth_queues = BNX2X_NUM_ETH_QUEUES(bp);
2041
2042
2043
2044
2045 for (i = 0; i < sizeof(bp->rss_conf_obj.ind_table); i++)
2046 bp->rss_conf_obj.ind_table[i] =
2047 bp->fp->cl_id +
2048 ethtool_rxfh_indir_default(i, num_eth_queues);
2049
2050
2051
2052
2053
2054
2055
2056
2057
2058 return bnx2x_config_rss_eth(bp, bp->port.pmf || !CHIP_IS_E1x(bp));
2059}
2060
2061int bnx2x_rss(struct bnx2x *bp, struct bnx2x_rss_config_obj *rss_obj,
2062 bool config_hash, bool enable)
2063{
2064 struct bnx2x_config_rss_params params = {NULL};
2065
2066
2067
2068
2069
2070
2071
2072
2073 params.rss_obj = rss_obj;
2074
2075 __set_bit(RAMROD_COMP_WAIT, ¶ms.ramrod_flags);
2076
2077 if (enable) {
2078 __set_bit(BNX2X_RSS_MODE_REGULAR, ¶ms.rss_flags);
2079
2080
2081 __set_bit(BNX2X_RSS_IPV4, ¶ms.rss_flags);
2082 __set_bit(BNX2X_RSS_IPV4_TCP, ¶ms.rss_flags);
2083 __set_bit(BNX2X_RSS_IPV6, ¶ms.rss_flags);
2084 __set_bit(BNX2X_RSS_IPV6_TCP, ¶ms.rss_flags);
2085 if (rss_obj->udp_rss_v4)
2086 __set_bit(BNX2X_RSS_IPV4_UDP, ¶ms.rss_flags);
2087 if (rss_obj->udp_rss_v6)
2088 __set_bit(BNX2X_RSS_IPV6_UDP, ¶ms.rss_flags);
2089
2090 if (!CHIP_IS_E1x(bp)) {
2091
2092 __set_bit(BNX2X_RSS_IPV4_VXLAN, ¶ms.rss_flags);
2093 __set_bit(BNX2X_RSS_IPV6_VXLAN, ¶ms.rss_flags);
2094
2095
2096 __set_bit(BNX2X_RSS_TUNN_INNER_HDRS, ¶ms.rss_flags);
2097 }
2098 } else {
2099 __set_bit(BNX2X_RSS_MODE_DISABLED, ¶ms.rss_flags);
2100 }
2101
2102
2103 params.rss_result_mask = MULTI_MASK;
2104
2105 memcpy(params.ind_table, rss_obj->ind_table, sizeof(params.ind_table));
2106
2107 if (config_hash) {
2108
2109 netdev_rss_key_fill(params.rss_key, T_ETH_RSS_KEY * 4);
2110 __set_bit(BNX2X_RSS_SET_SRCH, ¶ms.rss_flags);
2111 }
2112
2113 if (IS_PF(bp))
2114 return bnx2x_config_rss(bp, ¶ms);
2115 else
2116 return bnx2x_vfpf_config_rss(bp, ¶ms);
2117}
2118
2119static int bnx2x_init_hw(struct bnx2x *bp, u32 load_code)
2120{
2121 struct bnx2x_func_state_params func_params = {NULL};
2122
2123
2124 __set_bit(RAMROD_COMP_WAIT, &func_params.ramrod_flags);
2125
2126 func_params.f_obj = &bp->func_obj;
2127 func_params.cmd = BNX2X_F_CMD_HW_INIT;
2128
2129 func_params.params.hw_init.load_phase = load_code;
2130
2131 return bnx2x_func_state_change(bp, &func_params);
2132}
2133
2134
2135
2136
2137
2138void bnx2x_squeeze_objects(struct bnx2x *bp)
2139{
2140 int rc;
2141 unsigned long ramrod_flags = 0, vlan_mac_flags = 0;
2142 struct bnx2x_mcast_ramrod_params rparam = {NULL};
2143 struct bnx2x_vlan_mac_obj *mac_obj = &bp->sp_objs->mac_obj;
2144
2145
2146
2147
2148 __set_bit(RAMROD_COMP_WAIT, &ramrod_flags);
2149
2150 __set_bit(RAMROD_DRV_CLR_ONLY, &ramrod_flags);
2151
2152
2153 __set_bit(BNX2X_ETH_MAC, &vlan_mac_flags);
2154 rc = mac_obj->delete_all(bp, &bp->sp_objs->mac_obj, &vlan_mac_flags,
2155 &ramrod_flags);
2156 if (rc != 0)
2157 BNX2X_ERR("Failed to clean ETH MACs: %d\n", rc);
2158
2159
2160 vlan_mac_flags = 0;
2161 __set_bit(BNX2X_UC_LIST_MAC, &vlan_mac_flags);
2162 rc = mac_obj->delete_all(bp, mac_obj, &vlan_mac_flags,
2163 &ramrod_flags);
2164 if (rc != 0)
2165 BNX2X_ERR("Failed to clean UC list MACs: %d\n", rc);
2166
2167
2168 rparam.mcast_obj = &bp->mcast_obj;
2169 __set_bit(RAMROD_DRV_CLR_ONLY, &rparam.ramrod_flags);
2170
2171
2172
2173
2174
2175 netif_addr_lock_bh(bp->dev);
2176 rc = bnx2x_config_mcast(bp, &rparam, BNX2X_MCAST_CMD_DEL);
2177 if (rc < 0)
2178 BNX2X_ERR("Failed to add a new DEL command to a multi-cast object: %d\n",
2179 rc);
2180
2181
2182 rc = bnx2x_config_mcast(bp, &rparam, BNX2X_MCAST_CMD_CONT);
2183 while (rc != 0) {
2184 if (rc < 0) {
2185 BNX2X_ERR("Failed to clean multi-cast object: %d\n",
2186 rc);
2187 netif_addr_unlock_bh(bp->dev);
2188 return;
2189 }
2190
2191 rc = bnx2x_config_mcast(bp, &rparam, BNX2X_MCAST_CMD_CONT);
2192 }
2193 netif_addr_unlock_bh(bp->dev);
2194}
2195
2196#ifndef BNX2X_STOP_ON_ERROR
2197#define LOAD_ERROR_EXIT(bp, label) \
2198 do { \
2199 (bp)->state = BNX2X_STATE_ERROR; \
2200 goto label; \
2201 } while (0)
2202
2203#define LOAD_ERROR_EXIT_CNIC(bp, label) \
2204 do { \
2205 bp->cnic_loaded = false; \
2206 goto label; \
2207 } while (0)
2208#else
2209#define LOAD_ERROR_EXIT(bp, label) \
2210 do { \
2211 (bp)->state = BNX2X_STATE_ERROR; \
2212 (bp)->panic = 1; \
2213 return -EBUSY; \
2214 } while (0)
2215#define LOAD_ERROR_EXIT_CNIC(bp, label) \
2216 do { \
2217 bp->cnic_loaded = false; \
2218 (bp)->panic = 1; \
2219 return -EBUSY; \
2220 } while (0)
2221#endif
2222
2223static void bnx2x_free_fw_stats_mem(struct bnx2x *bp)
2224{
2225 BNX2X_PCI_FREE(bp->fw_stats, bp->fw_stats_mapping,
2226 bp->fw_stats_data_sz + bp->fw_stats_req_sz);
2227 return;
2228}
2229
2230static int bnx2x_alloc_fw_stats_mem(struct bnx2x *bp)
2231{
2232 int num_groups, vf_headroom = 0;
2233 int is_fcoe_stats = NO_FCOE(bp) ? 0 : 1;
2234
2235
2236 u8 num_queue_stats = BNX2X_NUM_ETH_QUEUES(bp) + is_fcoe_stats;
2237
2238
2239
2240
2241
2242
2243 bp->fw_stats_num = 2 + is_fcoe_stats + num_queue_stats;
2244
2245
2246
2247
2248
2249
2250 if (IS_SRIOV(bp))
2251 vf_headroom = bnx2x_vf_headroom(bp);
2252
2253
2254
2255
2256
2257
2258 num_groups =
2259 (((bp->fw_stats_num + vf_headroom) / STATS_QUERY_CMD_COUNT) +
2260 (((bp->fw_stats_num + vf_headroom) % STATS_QUERY_CMD_COUNT) ?
2261 1 : 0));
2262
2263 DP(BNX2X_MSG_SP, "stats fw_stats_num %d, vf headroom %d, num_groups %d\n",
2264 bp->fw_stats_num, vf_headroom, num_groups);
2265 bp->fw_stats_req_sz = sizeof(struct stats_query_header) +
2266 num_groups * sizeof(struct stats_query_cmd_group);
2267
2268
2269
2270
2271
2272
2273
2274
2275
2276 bp->fw_stats_data_sz = sizeof(struct per_port_stats) +
2277 sizeof(struct per_pf_stats) +
2278 sizeof(struct fcoe_statistics_params) +
2279 sizeof(struct per_queue_stats) * num_queue_stats +
2280 sizeof(struct stats_counter);
2281
2282 bp->fw_stats = BNX2X_PCI_ALLOC(&bp->fw_stats_mapping,
2283 bp->fw_stats_data_sz + bp->fw_stats_req_sz);
2284 if (!bp->fw_stats)
2285 goto alloc_mem_err;
2286
2287
2288 bp->fw_stats_req = (struct bnx2x_fw_stats_req *)bp->fw_stats;
2289 bp->fw_stats_req_mapping = bp->fw_stats_mapping;
2290 bp->fw_stats_data = (struct bnx2x_fw_stats_data *)
2291 ((u8 *)bp->fw_stats + bp->fw_stats_req_sz);
2292 bp->fw_stats_data_mapping = bp->fw_stats_mapping +
2293 bp->fw_stats_req_sz;
2294
2295 DP(BNX2X_MSG_SP, "statistics request base address set to %x %x\n",
2296 U64_HI(bp->fw_stats_req_mapping),
2297 U64_LO(bp->fw_stats_req_mapping));
2298 DP(BNX2X_MSG_SP, "statistics data base address set to %x %x\n",
2299 U64_HI(bp->fw_stats_data_mapping),
2300 U64_LO(bp->fw_stats_data_mapping));
2301 return 0;
2302
2303alloc_mem_err:
2304 bnx2x_free_fw_stats_mem(bp);
2305 BNX2X_ERR("Can't allocate FW stats memory\n");
2306 return -ENOMEM;
2307}
2308
2309
2310static int bnx2x_nic_load_request(struct bnx2x *bp, u32 *load_code)
2311{
2312 u32 param;
2313
2314
2315 bp->fw_seq =
2316 (SHMEM_RD(bp, func_mb[BP_FW_MB_IDX(bp)].drv_mb_header) &
2317 DRV_MSG_SEQ_NUMBER_MASK);
2318 BNX2X_DEV_INFO("fw_seq 0x%08x\n", bp->fw_seq);
2319
2320
2321 bp->fw_drv_pulse_wr_seq =
2322 (SHMEM_RD(bp, func_mb[BP_FW_MB_IDX(bp)].drv_pulse_mb) &
2323 DRV_PULSE_SEQ_MASK);
2324 BNX2X_DEV_INFO("drv_pulse 0x%x\n", bp->fw_drv_pulse_wr_seq);
2325
2326 param = DRV_MSG_CODE_LOAD_REQ_WITH_LFA;
2327
2328 if (IS_MF_SD(bp) && bnx2x_port_after_undi(bp))
2329 param |= DRV_MSG_CODE_LOAD_REQ_FORCE_LFA;
2330
2331
2332 (*load_code) = bnx2x_fw_command(bp, DRV_MSG_CODE_LOAD_REQ, param);
2333
2334
2335 if (!(*load_code)) {
2336 BNX2X_ERR("MCP response failure, aborting\n");
2337 return -EBUSY;
2338 }
2339
2340
2341
2342
2343 if ((*load_code) == FW_MSG_CODE_DRV_LOAD_REFUSED) {
2344 BNX2X_ERR("MCP refused load request, aborting\n");
2345 return -EBUSY;
2346 }
2347 return 0;
2348}
2349
2350
2351
2352
2353
2354int bnx2x_compare_fw_ver(struct bnx2x *bp, u32 load_code, bool print_err)
2355{
2356
2357 if (load_code != FW_MSG_CODE_DRV_LOAD_COMMON_CHIP &&
2358 load_code != FW_MSG_CODE_DRV_LOAD_COMMON) {
2359
2360 u32 my_fw = (BCM_5710_FW_MAJOR_VERSION) +
2361 (BCM_5710_FW_MINOR_VERSION << 8) +
2362 (BCM_5710_FW_REVISION_VERSION << 16) +
2363 (BCM_5710_FW_ENGINEERING_VERSION << 24);
2364
2365
2366 u32 loaded_fw = REG_RD(bp, XSEM_REG_PRAM);
2367
2368 DP(BNX2X_MSG_SP, "loaded fw %x, my fw %x\n",
2369 loaded_fw, my_fw);
2370
2371
2372 if (my_fw != loaded_fw) {
2373 if (print_err)
2374 BNX2X_ERR("bnx2x with FW %x was already loaded which mismatches my %x FW. Aborting\n",
2375 loaded_fw, my_fw);
2376 else
2377 BNX2X_DEV_INFO("bnx2x with FW %x was already loaded which mismatches my %x FW, possibly due to MF UNDI\n",
2378 loaded_fw, my_fw);
2379 return -EBUSY;
2380 }
2381 }
2382 return 0;
2383}
2384
2385
2386static int bnx2x_nic_load_no_mcp(struct bnx2x *bp, int port)
2387{
2388 int path = BP_PATH(bp);
2389
2390 DP(NETIF_MSG_IFUP, "NO MCP - load counts[%d] %d, %d, %d\n",
2391 path, bnx2x_load_count[path][0], bnx2x_load_count[path][1],
2392 bnx2x_load_count[path][2]);
2393 bnx2x_load_count[path][0]++;
2394 bnx2x_load_count[path][1 + port]++;
2395 DP(NETIF_MSG_IFUP, "NO MCP - new load counts[%d] %d, %d, %d\n",
2396 path, bnx2x_load_count[path][0], bnx2x_load_count[path][1],
2397 bnx2x_load_count[path][2]);
2398 if (bnx2x_load_count[path][0] == 1)
2399 return FW_MSG_CODE_DRV_LOAD_COMMON;
2400 else if (bnx2x_load_count[path][1 + port] == 1)
2401 return FW_MSG_CODE_DRV_LOAD_PORT;
2402 else
2403 return FW_MSG_CODE_DRV_LOAD_FUNCTION;
2404}
2405
2406
2407static void bnx2x_nic_load_pmf(struct bnx2x *bp, u32 load_code)
2408{
2409 if ((load_code == FW_MSG_CODE_DRV_LOAD_COMMON) ||
2410 (load_code == FW_MSG_CODE_DRV_LOAD_COMMON_CHIP) ||
2411 (load_code == FW_MSG_CODE_DRV_LOAD_PORT)) {
2412 bp->port.pmf = 1;
2413
2414
2415
2416
2417 smp_mb();
2418 } else {
2419 bp->port.pmf = 0;
2420 }
2421
2422 DP(NETIF_MSG_LINK, "pmf %d\n", bp->port.pmf);
2423}
2424
2425static void bnx2x_nic_load_afex_dcc(struct bnx2x *bp, int load_code)
2426{
2427 if (((load_code == FW_MSG_CODE_DRV_LOAD_COMMON) ||
2428 (load_code == FW_MSG_CODE_DRV_LOAD_COMMON_CHIP)) &&
2429 (bp->common.shmem2_base)) {
2430 if (SHMEM2_HAS(bp, dcc_support))
2431 SHMEM2_WR(bp, dcc_support,
2432 (SHMEM_DCC_SUPPORT_DISABLE_ENABLE_PF_TLV |
2433 SHMEM_DCC_SUPPORT_BANDWIDTH_ALLOCATION_TLV));
2434 if (SHMEM2_HAS(bp, afex_driver_support))
2435 SHMEM2_WR(bp, afex_driver_support,
2436 SHMEM_AFEX_SUPPORTED_VERSION_ONE);
2437 }
2438
2439
2440 bp->afex_def_vlan_tag = -1;
2441}
2442
2443
2444
2445
2446
2447
2448
2449
2450
2451
2452static void bnx2x_bz_fp(struct bnx2x *bp, int index)
2453{
2454 struct bnx2x_fastpath *fp = &bp->fp[index];
2455 int cos;
2456 struct napi_struct orig_napi = fp->napi;
2457 struct bnx2x_agg_info *orig_tpa_info = fp->tpa_info;
2458
2459
2460 if (fp->tpa_info)
2461 memset(fp->tpa_info, 0, ETH_MAX_AGGREGATION_QUEUES_E1H_E2 *
2462 sizeof(struct bnx2x_agg_info));
2463 memset(fp, 0, sizeof(*fp));
2464
2465
2466 fp->napi = orig_napi;
2467 fp->tpa_info = orig_tpa_info;
2468 fp->bp = bp;
2469 fp->index = index;
2470 if (IS_ETH_FP(fp))
2471 fp->max_cos = bp->max_cos;
2472 else
2473
2474 fp->max_cos = 1;
2475
2476
2477 if (IS_FCOE_FP(fp))
2478 fp->txdata_ptr[0] = &bp->bnx2x_txq[FCOE_TXQ_IDX(bp)];
2479 if (IS_ETH_FP(fp))
2480 for_each_cos_in_tx_queue(fp, cos)
2481 fp->txdata_ptr[cos] = &bp->bnx2x_txq[cos *
2482 BNX2X_NUM_ETH_QUEUES(bp) + index];
2483
2484
2485
2486
2487 if (bp->dev->features & NETIF_F_LRO)
2488 fp->mode = TPA_MODE_LRO;
2489 else if (bp->dev->features & NETIF_F_GRO &&
2490 bnx2x_mtu_allows_gro(bp->dev->mtu))
2491 fp->mode = TPA_MODE_GRO;
2492 else
2493 fp->mode = TPA_MODE_DISABLED;
2494
2495
2496
2497
2498 if (bp->disable_tpa || IS_FCOE_FP(fp))
2499 fp->mode = TPA_MODE_DISABLED;
2500}
2501
2502void bnx2x_set_os_driver_state(struct bnx2x *bp, u32 state)
2503{
2504 u32 cur;
2505
2506 if (!IS_MF_BD(bp) || !SHMEM2_HAS(bp, os_driver_state) || IS_VF(bp))
2507 return;
2508
2509 cur = SHMEM2_RD(bp, os_driver_state[BP_FW_MB_IDX(bp)]);
2510 DP(NETIF_MSG_IFUP, "Driver state %08x-->%08x\n",
2511 cur, state);
2512
2513 SHMEM2_WR(bp, os_driver_state[BP_FW_MB_IDX(bp)], state);
2514}
2515
2516int bnx2x_load_cnic(struct bnx2x *bp)
2517{
2518 int i, rc, port = BP_PORT(bp);
2519
2520 DP(NETIF_MSG_IFUP, "Starting CNIC-related load\n");
2521
2522 mutex_init(&bp->cnic_mutex);
2523
2524 if (IS_PF(bp)) {
2525 rc = bnx2x_alloc_mem_cnic(bp);
2526 if (rc) {
2527 BNX2X_ERR("Unable to allocate bp memory for cnic\n");
2528 LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic0);
2529 }
2530 }
2531
2532 rc = bnx2x_alloc_fp_mem_cnic(bp);
2533 if (rc) {
2534 BNX2X_ERR("Unable to allocate memory for cnic fps\n");
2535 LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic0);
2536 }
2537
2538
2539 rc = bnx2x_set_real_num_queues(bp, 1);
2540 if (rc) {
2541 BNX2X_ERR("Unable to set real_num_queues including cnic\n");
2542 LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic0);
2543 }
2544
2545
2546 bnx2x_add_all_napi_cnic(bp);
2547 DP(NETIF_MSG_IFUP, "cnic napi added\n");
2548 bnx2x_napi_enable_cnic(bp);
2549
2550 rc = bnx2x_init_hw_func_cnic(bp);
2551 if (rc)
2552 LOAD_ERROR_EXIT_CNIC(bp, load_error_cnic1);
2553
2554 bnx2x_nic_init_cnic(bp);
2555
2556 if (IS_PF(bp)) {
2557
2558 REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 1);
2559
2560
2561 for_each_cnic_queue(bp, i) {
2562 rc = bnx2x_setup_queue(bp, &bp->fp[i], 0);
2563 if (rc) {
2564 BNX2X_ERR("Queue setup failed\n");
2565 LOAD_ERROR_EXIT(bp, load_error_cnic2);
2566 }
2567 }
2568 }
2569
2570
2571 bnx2x_set_rx_mode_inner(bp);
2572
2573
2574 bnx2x_get_iscsi_info(bp);
2575 bnx2x_setup_cnic_irq_info(bp);
2576 bnx2x_setup_cnic_info(bp);
2577 bp->cnic_loaded = true;
2578 if (bp->state == BNX2X_STATE_OPEN)
2579 bnx2x_cnic_notify(bp, CNIC_CTL_START_CMD);
2580
2581 DP(NETIF_MSG_IFUP, "Ending successfully CNIC-related load\n");
2582
2583 return 0;
2584
2585#ifndef BNX2X_STOP_ON_ERROR
2586load_error_cnic2:
2587
2588 REG_WR(bp, TM_REG_EN_LINEAR0_TIMER + port*4, 0);
2589
2590load_error_cnic1:
2591 bnx2x_napi_disable_cnic(bp);
2592
2593 if (bnx2x_set_real_num_queues(bp, 0))
2594 BNX2X_ERR("Unable to set real_num_queues not including cnic\n");
2595load_error_cnic0:
2596 BNX2X_ERR("CNIC-related load failed\n");
2597 bnx2x_free_fp_mem_cnic(bp);
2598 bnx2x_free_mem_cnic(bp);
2599 return rc;
2600#endif
2601}
2602
2603
2604int bnx2x_nic_load(struct bnx2x *bp, int load_mode)
2605{
2606 int port = BP_PORT(bp);
2607 int i, rc = 0, load_code = 0;
2608
2609 DP(NETIF_MSG_IFUP, "Starting NIC load\n");
2610 DP(NETIF_MSG_IFUP,
2611 "CNIC is %s\n", CNIC_ENABLED(bp) ? "enabled" : "disabled");
2612
2613#ifdef BNX2X_STOP_ON_ERROR
2614 if (unlikely(bp->panic)) {
2615 BNX2X_ERR("Can't load NIC when there is panic\n");
2616 return -EPERM;
2617 }
2618#endif
2619
2620 bp->state = BNX2X_STATE_OPENING_WAIT4_LOAD;
2621
2622
2623 memset(&bp->last_reported_link, 0, sizeof(bp->last_reported_link));
2624 __set_bit(BNX2X_LINK_REPORT_LINK_DOWN,
2625 &bp->last_reported_link.link_report_flags);
2626
2627 if (IS_PF(bp))
2628
2629 bnx2x_ilt_set_info(bp);
2630
2631
2632
2633
2634
2635
2636 DP(NETIF_MSG_IFUP, "num queues: %d", bp->num_queues);
2637 for_each_queue(bp, i)
2638 bnx2x_bz_fp(bp, i);
2639 memset(bp->bnx2x_txq, 0, (BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS +
2640 bp->num_cnic_queues) *
2641 sizeof(struct bnx2x_fp_txdata));
2642
2643 bp->fcoe_init = false;
2644
2645
2646 bnx2x_set_rx_buf_size(bp);
2647
2648 if (IS_PF(bp)) {
2649 rc = bnx2x_alloc_mem(bp);
2650 if (rc) {
2651 BNX2X_ERR("Unable to allocate bp memory\n");
2652 return rc;
2653 }
2654 }
2655
2656
2657
2658
2659 rc = bnx2x_alloc_fp_mem(bp);
2660 if (rc) {
2661 BNX2X_ERR("Unable to allocate memory for fps\n");
2662 LOAD_ERROR_EXIT(bp, load_error0);
2663 }
2664
2665
2666 if (bnx2x_alloc_fw_stats_mem(bp))
2667 LOAD_ERROR_EXIT(bp, load_error0);
2668
2669
2670 if (IS_VF(bp)) {
2671 rc = bnx2x_vfpf_init(bp);
2672 if (rc)
2673 LOAD_ERROR_EXIT(bp, load_error0);
2674 }
2675
2676
2677
2678
2679
2680 rc = bnx2x_set_real_num_queues(bp, 0);
2681 if (rc) {
2682 BNX2X_ERR("Unable to set real_num_queues\n");
2683 LOAD_ERROR_EXIT(bp, load_error0);
2684 }
2685
2686
2687
2688
2689
2690 bnx2x_setup_tc(bp->dev, bp->max_cos);
2691
2692
2693 bnx2x_add_all_napi(bp);
2694 DP(NETIF_MSG_IFUP, "napi added\n");
2695 bnx2x_napi_enable(bp);
2696
2697 if (IS_PF(bp)) {
2698
2699 bnx2x_set_pf_load(bp);
2700
2701
2702 if (!BP_NOMCP(bp)) {
2703
2704 rc = bnx2x_nic_load_request(bp, &load_code);
2705 if (rc)
2706 LOAD_ERROR_EXIT(bp, load_error1);
2707
2708
2709 rc = bnx2x_compare_fw_ver(bp, load_code, true);
2710 if (rc) {
2711 bnx2x_fw_command(bp, DRV_MSG_CODE_LOAD_DONE, 0);
2712 LOAD_ERROR_EXIT(bp, load_error2);
2713 }
2714 } else {
2715 load_code = bnx2x_nic_load_no_mcp(bp, port);
2716 }
2717
2718
2719 bnx2x_nic_load_pmf(bp, load_code);
2720
2721
2722 bnx2x__init_func_obj(bp);
2723
2724
2725 rc = bnx2x_init_hw(bp, load_code);
2726 if (rc) {
2727 BNX2X_ERR("HW init failed, aborting\n");
2728 bnx2x_fw_command(bp, DRV_MSG_CODE_LOAD_DONE, 0);
2729 LOAD_ERROR_EXIT(bp, load_error2);
2730 }
2731 }
2732
2733 bnx2x_pre_irq_nic_init(bp);
2734
2735
2736 rc = bnx2x_setup_irqs(bp);
2737 if (rc) {
2738 BNX2X_ERR("setup irqs failed\n");
2739 if (IS_PF(bp))
2740 bnx2x_fw_command(bp, DRV_MSG_CODE_LOAD_DONE, 0);
2741 LOAD_ERROR_EXIT(bp, load_error2);
2742 }
2743
2744
2745 if (IS_PF(bp)) {
2746
2747 bnx2x_post_irq_nic_init(bp, load_code);
2748
2749 bnx2x_init_bp_objs(bp);
2750 bnx2x_iov_nic_init(bp);
2751
2752
2753 bp->afex_def_vlan_tag = -1;
2754 bnx2x_nic_load_afex_dcc(bp, load_code);
2755 bp->state = BNX2X_STATE_OPENING_WAIT4_PORT;
2756 rc = bnx2x_func_start(bp);
2757 if (rc) {
2758 BNX2X_ERR("Function start failed!\n");
2759 bnx2x_fw_command(bp, DRV_MSG_CODE_LOAD_DONE, 0);
2760
2761 LOAD_ERROR_EXIT(bp, load_error3);
2762 }
2763
2764
2765 if (!BP_NOMCP(bp)) {
2766 load_code = bnx2x_fw_command(bp,
2767 DRV_MSG_CODE_LOAD_DONE, 0);
2768 if (!load_code) {
2769 BNX2X_ERR("MCP response failure, aborting\n");
2770 rc = -EBUSY;
2771 LOAD_ERROR_EXIT(bp, load_error3);
2772 }
2773 }
2774
2775
2776 bnx2x_update_coalesce(bp);
2777 }
2778
2779
2780 rc = bnx2x_setup_leading(bp);
2781 if (rc) {
2782 BNX2X_ERR("Setup leading failed!\n");
2783 LOAD_ERROR_EXIT(bp, load_error3);
2784 }
2785
2786
2787 for_each_nondefault_eth_queue(bp, i) {
2788 if (IS_PF(bp))
2789 rc = bnx2x_setup_queue(bp, &bp->fp[i], false);
2790 else
2791 rc = bnx2x_vfpf_setup_q(bp, &bp->fp[i], false);
2792 if (rc) {
2793 BNX2X_ERR("Queue %d setup failed\n", i);
2794 LOAD_ERROR_EXIT(bp, load_error3);
2795 }
2796 }
2797
2798
2799 rc = bnx2x_init_rss(bp);
2800 if (rc) {
2801 BNX2X_ERR("PF RSS init failed\n");
2802 LOAD_ERROR_EXIT(bp, load_error3);
2803 }
2804
2805
2806 bp->state = BNX2X_STATE_OPEN;
2807
2808
2809 if (IS_PF(bp))
2810 rc = bnx2x_set_eth_mac(bp, true);
2811 else
2812 rc = bnx2x_vfpf_config_mac(bp, bp->dev->dev_addr, bp->fp->index,
2813 true);
2814 if (rc) {
2815 BNX2X_ERR("Setting Ethernet MAC failed\n");
2816 LOAD_ERROR_EXIT(bp, load_error3);
2817 }
2818
2819 if (IS_PF(bp) && bp->pending_max) {
2820 bnx2x_update_max_mf_config(bp, bp->pending_max);
2821 bp->pending_max = 0;
2822 }
2823
2824 if (bp->port.pmf) {
2825 rc = bnx2x_initial_phy_init(bp, load_mode);
2826 if (rc)
2827 LOAD_ERROR_EXIT(bp, load_error3);
2828 }
2829 bp->link_params.feature_config_flags &= ~FEATURE_CONFIG_BOOT_FROM_SAN;
2830
2831
2832
2833
2834 rc = bnx2x_vlan_reconfigure_vid(bp);
2835 if (rc)
2836 LOAD_ERROR_EXIT(bp, load_error3);
2837
2838
2839 bnx2x_set_rx_mode_inner(bp);
2840
2841 if (bp->flags & PTP_SUPPORTED) {
2842 bnx2x_init_ptp(bp);
2843 bnx2x_configure_ptp_filters(bp);
2844 }
2845
2846 switch (load_mode) {
2847 case LOAD_NORMAL:
2848
2849 netif_tx_wake_all_queues(bp->dev);
2850 break;
2851
2852 case LOAD_OPEN:
2853 netif_tx_start_all_queues(bp->dev);
2854 smp_mb__after_atomic();
2855 break;
2856
2857 case LOAD_DIAG:
2858 case LOAD_LOOPBACK_EXT:
2859 bp->state = BNX2X_STATE_DIAG;
2860 break;
2861
2862 default:
2863 break;
2864 }
2865
2866 if (bp->port.pmf)
2867 bnx2x_update_drv_flags(bp, 1 << DRV_FLAGS_PORT_MASK, 0);
2868 else
2869 bnx2x__link_status_update(bp);
2870
2871
2872 mod_timer(&bp->timer, jiffies + bp->current_interval);
2873
2874 if (CNIC_ENABLED(bp))
2875 bnx2x_load_cnic(bp);
2876
2877 if (IS_PF(bp))
2878 bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_GET_DRV_VERSION, 0);
2879
2880 if (IS_PF(bp) && SHMEM2_HAS(bp, drv_capabilities_flag)) {
2881
2882 u32 val;
2883 val = SHMEM2_RD(bp, drv_capabilities_flag[BP_FW_MB_IDX(bp)]);
2884 val &= ~DRV_FLAGS_MTU_MASK;
2885 val |= (bp->dev->mtu << DRV_FLAGS_MTU_SHIFT);
2886 SHMEM2_WR(bp, drv_capabilities_flag[BP_FW_MB_IDX(bp)],
2887 val | DRV_FLAGS_CAPABILITIES_LOADED_SUPPORTED |
2888 DRV_FLAGS_CAPABILITIES_LOADED_L2);
2889 }
2890
2891
2892 if (IS_PF(bp) && !bnx2x_wait_sp_comp(bp, ~0x0UL)) {
2893 BNX2X_ERR("Timeout waiting for SP elements to complete\n");
2894 bnx2x_nic_unload(bp, UNLOAD_CLOSE, false);
2895 return -EBUSY;
2896 }
2897
2898
2899 if (IS_PF(bp))
2900 bnx2x_update_mfw_dump(bp);
2901
2902
2903 if (bp->port.pmf && (bp->state != BNX2X_STATE_DIAG))
2904 bnx2x_dcbx_init(bp, false);
2905
2906 if (!IS_MF_SD_STORAGE_PERSONALITY_ONLY(bp))
2907 bnx2x_set_os_driver_state(bp, OS_DRIVER_STATE_ACTIVE);
2908
2909 DP(NETIF_MSG_IFUP, "Ending successfully NIC load\n");
2910
2911 return 0;
2912
2913#ifndef BNX2X_STOP_ON_ERROR
2914load_error3:
2915 if (IS_PF(bp)) {
2916 bnx2x_int_disable_sync(bp, 1);
2917
2918
2919 bnx2x_squeeze_objects(bp);
2920 }
2921
2922
2923 bnx2x_free_skbs(bp);
2924 for_each_rx_queue(bp, i)
2925 bnx2x_free_rx_sge_range(bp, bp->fp + i, NUM_RX_SGE);
2926
2927
2928 bnx2x_free_irq(bp);
2929load_error2:
2930 if (IS_PF(bp) && !BP_NOMCP(bp)) {
2931 bnx2x_fw_command(bp, DRV_MSG_CODE_UNLOAD_REQ_WOL_MCP, 0);
2932 bnx2x_fw_command(bp, DRV_MSG_CODE_UNLOAD_DONE, 0);
2933 }
2934
2935 bp->port.pmf = 0;
2936load_error1:
2937 bnx2x_napi_disable(bp);
2938 bnx2x_del_all_napi(bp);
2939
2940
2941 if (IS_PF(bp))
2942 bnx2x_clear_pf_load(bp);
2943load_error0:
2944 bnx2x_free_fw_stats_mem(bp);
2945 bnx2x_free_fp_mem(bp);
2946 bnx2x_free_mem(bp);
2947
2948 return rc;
2949#endif
2950}
2951
2952int bnx2x_drain_tx_queues(struct bnx2x *bp)
2953{
2954 u8 rc = 0, cos, i;
2955
2956
2957 for_each_tx_queue(bp, i) {
2958 struct bnx2x_fastpath *fp = &bp->fp[i];
2959
2960 for_each_cos_in_tx_queue(fp, cos)
2961 rc = bnx2x_clean_tx_queue(bp, fp->txdata_ptr[cos]);
2962 if (rc)
2963 return rc;
2964 }
2965 return 0;
2966}
2967
2968
2969int bnx2x_nic_unload(struct bnx2x *bp, int unload_mode, bool keep_link)
2970{
2971 int i;
2972 bool global = false;
2973
2974 DP(NETIF_MSG_IFUP, "Starting NIC unload\n");
2975
2976 if (!IS_MF_SD_STORAGE_PERSONALITY_ONLY(bp))
2977 bnx2x_set_os_driver_state(bp, OS_DRIVER_STATE_DISABLED);
2978
2979
2980 if (IS_PF(bp) && SHMEM2_HAS(bp, drv_capabilities_flag)) {
2981 u32 val;
2982 val = SHMEM2_RD(bp, drv_capabilities_flag[BP_FW_MB_IDX(bp)]);
2983 SHMEM2_WR(bp, drv_capabilities_flag[BP_FW_MB_IDX(bp)],
2984 val & ~DRV_FLAGS_CAPABILITIES_LOADED_L2);
2985 }
2986
2987 if (IS_PF(bp) && bp->recovery_state != BNX2X_RECOVERY_DONE &&
2988 (bp->state == BNX2X_STATE_CLOSED ||
2989 bp->state == BNX2X_STATE_ERROR)) {
2990
2991
2992
2993
2994
2995
2996
2997 bp->recovery_state = BNX2X_RECOVERY_DONE;
2998 bp->is_leader = 0;
2999 bnx2x_release_leader_lock(bp);
3000 smp_mb();
3001
3002 DP(NETIF_MSG_IFDOWN, "Releasing a leadership...\n");
3003 BNX2X_ERR("Can't unload in closed or error state\n");
3004 return -EINVAL;
3005 }
3006
3007
3008
3009
3010
3011
3012
3013 if (bp->state == BNX2X_STATE_CLOSED || bp->state == BNX2X_STATE_ERROR)
3014 return 0;
3015
3016
3017
3018
3019
3020 bp->state = BNX2X_STATE_CLOSING_WAIT4_HALT;
3021 smp_mb();
3022
3023
3024 bnx2x_iov_channel_down(bp);
3025
3026 if (CNIC_LOADED(bp))
3027 bnx2x_cnic_notify(bp, CNIC_CTL_STOP_CMD);
3028
3029
3030 bnx2x_tx_disable(bp);
3031 netdev_reset_tc(bp->dev);
3032
3033 bp->rx_mode = BNX2X_RX_MODE_NONE;
3034
3035 del_timer_sync(&bp->timer);
3036
3037 if (IS_PF(bp)) {
3038
3039 bp->fw_drv_pulse_wr_seq |= DRV_PULSE_ALWAYS_ALIVE;
3040 bnx2x_drv_pulse(bp);
3041 bnx2x_stats_handle(bp, STATS_EVENT_STOP);
3042 bnx2x_save_statistics(bp);
3043 }
3044
3045
3046
3047
3048
3049 if (unload_mode != UNLOAD_RECOVERY)
3050 bnx2x_drain_tx_queues(bp);
3051
3052
3053
3054
3055 if (IS_VF(bp))
3056 bnx2x_vfpf_close_vf(bp);
3057 else if (unload_mode != UNLOAD_RECOVERY)
3058
3059 bnx2x_chip_cleanup(bp, unload_mode, keep_link);
3060 else {
3061
3062 bnx2x_send_unload_req(bp, unload_mode);
3063
3064
3065
3066
3067
3068
3069
3070 if (!CHIP_IS_E1x(bp))
3071 bnx2x_pf_disable(bp);
3072
3073
3074 bnx2x_netif_stop(bp, 1);
3075
3076 bnx2x_del_all_napi(bp);
3077 if (CNIC_LOADED(bp))
3078 bnx2x_del_all_napi_cnic(bp);
3079
3080 bnx2x_free_irq(bp);
3081
3082
3083 bnx2x_send_unload_done(bp, false);
3084 }
3085
3086
3087
3088
3089
3090 if (IS_PF(bp))
3091 bnx2x_squeeze_objects(bp);
3092
3093
3094 bp->sp_state = 0;
3095
3096 bp->port.pmf = 0;
3097
3098
3099 bp->sp_rtnl_state = 0;
3100 smp_mb();
3101
3102
3103 bnx2x_free_skbs(bp);
3104 if (CNIC_LOADED(bp))
3105 bnx2x_free_skbs_cnic(bp);
3106 for_each_rx_queue(bp, i)
3107 bnx2x_free_rx_sge_range(bp, bp->fp + i, NUM_RX_SGE);
3108
3109 bnx2x_free_fp_mem(bp);
3110 if (CNIC_LOADED(bp))
3111 bnx2x_free_fp_mem_cnic(bp);
3112
3113 if (IS_PF(bp)) {
3114 if (CNIC_LOADED(bp))
3115 bnx2x_free_mem_cnic(bp);
3116 }
3117 bnx2x_free_mem(bp);
3118
3119 bp->state = BNX2X_STATE_CLOSED;
3120 bp->cnic_loaded = false;
3121
3122
3123 if (IS_PF(bp))
3124 bnx2x_update_mng_version(bp);
3125
3126
3127
3128
3129 if (IS_PF(bp) && bnx2x_chk_parity_attn(bp, &global, false)) {
3130 bnx2x_set_reset_in_progress(bp);
3131
3132
3133 if (global)
3134 bnx2x_set_reset_global(bp);
3135 }
3136
3137
3138
3139
3140 if (IS_PF(bp) &&
3141 !bnx2x_clear_pf_load(bp) &&
3142 bnx2x_reset_is_done(bp, BP_PATH(bp)))
3143 bnx2x_disable_close_the_gate(bp);
3144
3145 DP(NETIF_MSG_IFUP, "Ending NIC unload\n");
3146
3147 return 0;
3148}
3149
3150int bnx2x_set_power_state(struct bnx2x *bp, pci_power_t state)
3151{
3152 u16 pmcsr;
3153
3154
3155 if (!bp->pdev->pm_cap) {
3156 BNX2X_DEV_INFO("No power capability. Breaking.\n");
3157 return 0;
3158 }
3159
3160 pci_read_config_word(bp->pdev, bp->pdev->pm_cap + PCI_PM_CTRL, &pmcsr);
3161
3162 switch (state) {
3163 case PCI_D0:
3164 pci_write_config_word(bp->pdev, bp->pdev->pm_cap + PCI_PM_CTRL,
3165 ((pmcsr & ~PCI_PM_CTRL_STATE_MASK) |
3166 PCI_PM_CTRL_PME_STATUS));
3167
3168 if (pmcsr & PCI_PM_CTRL_STATE_MASK)
3169
3170 msleep(20);
3171 break;
3172
3173 case PCI_D3hot:
3174
3175
3176 if (atomic_read(&bp->pdev->enable_cnt) != 1)
3177 return 0;
3178
3179 if (CHIP_REV_IS_SLOW(bp))
3180 return 0;
3181
3182 pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
3183 pmcsr |= 3;
3184
3185 if (bp->wol)
3186 pmcsr |= PCI_PM_CTRL_PME_ENABLE;
3187
3188 pci_write_config_word(bp->pdev, bp->pdev->pm_cap + PCI_PM_CTRL,
3189 pmcsr);
3190
3191
3192
3193
3194 break;
3195
3196 default:
3197 dev_err(&bp->pdev->dev, "Can't support state = %d\n", state);
3198 return -EINVAL;
3199 }
3200 return 0;
3201}
3202
3203
3204
3205
3206static int bnx2x_poll(struct napi_struct *napi, int budget)
3207{
3208 struct bnx2x_fastpath *fp = container_of(napi, struct bnx2x_fastpath,
3209 napi);
3210 struct bnx2x *bp = fp->bp;
3211 int rx_work_done;
3212 u8 cos;
3213
3214#ifdef BNX2X_STOP_ON_ERROR
3215 if (unlikely(bp->panic)) {
3216 napi_complete(napi);
3217 return 0;
3218 }
3219#endif
3220 for_each_cos_in_tx_queue(fp, cos)
3221 if (bnx2x_tx_queue_has_work(fp->txdata_ptr[cos]))
3222 bnx2x_tx_int(bp, fp->txdata_ptr[cos]);
3223
3224 rx_work_done = (bnx2x_has_rx_work(fp)) ? bnx2x_rx_int(fp, budget) : 0;
3225
3226 if (rx_work_done < budget) {
3227
3228
3229
3230
3231 if (IS_FCOE_FP(fp)) {
3232 napi_complete(napi);
3233 } else {
3234 bnx2x_update_fpsb_idx(fp);
3235
3236
3237
3238
3239
3240
3241
3242
3243
3244
3245
3246
3247
3248 rmb();
3249
3250 if (!(bnx2x_has_rx_work(fp) || bnx2x_has_tx_work(fp))) {
3251 napi_complete(napi);
3252
3253 DP(NETIF_MSG_RX_STATUS,
3254 "Update index to %d\n", fp->fp_hc_idx);
3255 bnx2x_ack_sb(bp, fp->igu_sb_id, USTORM_ID,
3256 le16_to_cpu(fp->fp_hc_idx),
3257 IGU_INT_ENABLE, 1);
3258 } else {
3259 rx_work_done = budget;
3260 }
3261 }
3262 }
3263
3264 return rx_work_done;
3265}
3266
3267
3268
3269
3270
3271static u16 bnx2x_tx_split(struct bnx2x *bp,
3272 struct bnx2x_fp_txdata *txdata,
3273 struct sw_tx_bd *tx_buf,
3274 struct eth_tx_start_bd **tx_bd, u16 hlen,
3275 u16 bd_prod)
3276{
3277 struct eth_tx_start_bd *h_tx_bd = *tx_bd;
3278 struct eth_tx_bd *d_tx_bd;
3279 dma_addr_t mapping;
3280 int old_len = le16_to_cpu(h_tx_bd->nbytes);
3281
3282
3283 h_tx_bd->nbytes = cpu_to_le16(hlen);
3284
3285 DP(NETIF_MSG_TX_QUEUED, "TSO split header size is %d (%x:%x)\n",
3286 h_tx_bd->nbytes, h_tx_bd->addr_hi, h_tx_bd->addr_lo);
3287
3288
3289
3290 bd_prod = TX_BD(NEXT_TX_IDX(bd_prod));
3291 d_tx_bd = &txdata->tx_desc_ring[bd_prod].reg_bd;
3292
3293 mapping = HILO_U64(le32_to_cpu(h_tx_bd->addr_hi),
3294 le32_to_cpu(h_tx_bd->addr_lo)) + hlen;
3295
3296 d_tx_bd->addr_hi = cpu_to_le32(U64_HI(mapping));
3297 d_tx_bd->addr_lo = cpu_to_le32(U64_LO(mapping));
3298 d_tx_bd->nbytes = cpu_to_le16(old_len - hlen);
3299
3300
3301 tx_buf->flags |= BNX2X_TSO_SPLIT_BD;
3302
3303 DP(NETIF_MSG_TX_QUEUED,
3304 "TSO split data size is %d (%x:%x)\n",
3305 d_tx_bd->nbytes, d_tx_bd->addr_hi, d_tx_bd->addr_lo);
3306
3307
3308 *tx_bd = (struct eth_tx_start_bd *)d_tx_bd;
3309
3310 return bd_prod;
3311}
3312
3313#define bswab32(b32) ((__force __le32) swab32((__force __u32) (b32)))
3314#define bswab16(b16) ((__force __le16) swab16((__force __u16) (b16)))
3315static __le16 bnx2x_csum_fix(unsigned char *t_header, u16 csum, s8 fix)
3316{
3317 __sum16 tsum = (__force __sum16) csum;
3318
3319 if (fix > 0)
3320 tsum = ~csum_fold(csum_sub((__force __wsum) csum,
3321 csum_partial(t_header - fix, fix, 0)));
3322
3323 else if (fix < 0)
3324 tsum = ~csum_fold(csum_add((__force __wsum) csum,
3325 csum_partial(t_header, -fix, 0)));
3326
3327 return bswab16(tsum);
3328}
3329
3330static u32 bnx2x_xmit_type(struct bnx2x *bp, struct sk_buff *skb)
3331{
3332 u32 rc;
3333 __u8 prot = 0;
3334 __be16 protocol;
3335
3336 if (skb->ip_summed != CHECKSUM_PARTIAL)
3337 return XMIT_PLAIN;
3338
3339 protocol = vlan_get_protocol(skb);
3340 if (protocol == htons(ETH_P_IPV6)) {
3341 rc = XMIT_CSUM_V6;
3342 prot = ipv6_hdr(skb)->nexthdr;
3343 } else {
3344 rc = XMIT_CSUM_V4;
3345 prot = ip_hdr(skb)->protocol;
3346 }
3347
3348 if (!CHIP_IS_E1x(bp) && skb->encapsulation) {
3349 if (inner_ip_hdr(skb)->version == 6) {
3350 rc |= XMIT_CSUM_ENC_V6;
3351 if (inner_ipv6_hdr(skb)->nexthdr == IPPROTO_TCP)
3352 rc |= XMIT_CSUM_TCP;
3353 } else {
3354 rc |= XMIT_CSUM_ENC_V4;
3355 if (inner_ip_hdr(skb)->protocol == IPPROTO_TCP)
3356 rc |= XMIT_CSUM_TCP;
3357 }
3358 }
3359 if (prot == IPPROTO_TCP)
3360 rc |= XMIT_CSUM_TCP;
3361
3362 if (skb_is_gso(skb)) {
3363 if (skb_is_gso_v6(skb)) {
3364 rc |= (XMIT_GSO_V6 | XMIT_CSUM_TCP);
3365 if (rc & XMIT_CSUM_ENC)
3366 rc |= XMIT_GSO_ENC_V6;
3367 } else {
3368 rc |= (XMIT_GSO_V4 | XMIT_CSUM_TCP);
3369 if (rc & XMIT_CSUM_ENC)
3370 rc |= XMIT_GSO_ENC_V4;
3371 }
3372 }
3373
3374 return rc;
3375}
3376
3377
3378#define BNX2X_NUM_VXLAN_TSO_WIN_SUB_BDS 4
3379
3380
3381#define BNX2X_NUM_TSO_WIN_SUB_BDS 3
3382
3383#if (MAX_SKB_FRAGS >= MAX_FETCH_BD - BDS_PER_TX_PKT)
3384
3385
3386
3387static int bnx2x_pkt_req_lin(struct bnx2x *bp, struct sk_buff *skb,
3388 u32 xmit_type)
3389{
3390 int first_bd_sz = 0, num_tso_win_sub = BNX2X_NUM_TSO_WIN_SUB_BDS;
3391 int to_copy = 0, hlen = 0;
3392
3393 if (xmit_type & XMIT_GSO_ENC)
3394 num_tso_win_sub = BNX2X_NUM_VXLAN_TSO_WIN_SUB_BDS;
3395
3396 if (skb_shinfo(skb)->nr_frags >= (MAX_FETCH_BD - num_tso_win_sub)) {
3397 if (xmit_type & XMIT_GSO) {
3398 unsigned short lso_mss = skb_shinfo(skb)->gso_size;
3399 int wnd_size = MAX_FETCH_BD - num_tso_win_sub;
3400
3401 int num_wnds = skb_shinfo(skb)->nr_frags - wnd_size;
3402 int wnd_idx = 0;
3403 int frag_idx = 0;
3404 u32 wnd_sum = 0;
3405
3406
3407 if (xmit_type & XMIT_GSO_ENC)
3408 hlen = (int)(skb_inner_transport_header(skb) -
3409 skb->data) +
3410 inner_tcp_hdrlen(skb);
3411 else
3412 hlen = (int)(skb_transport_header(skb) -
3413 skb->data) + tcp_hdrlen(skb);
3414
3415
3416 first_bd_sz = skb_headlen(skb) - hlen;
3417
3418 wnd_sum = first_bd_sz;
3419
3420
3421 for (frag_idx = 0; frag_idx < wnd_size - 1; frag_idx++)
3422 wnd_sum +=
3423 skb_frag_size(&skb_shinfo(skb)->frags[frag_idx]);
3424
3425
3426 if (first_bd_sz > 0) {
3427 if (unlikely(wnd_sum < lso_mss)) {
3428 to_copy = 1;
3429 goto exit_lbl;
3430 }
3431
3432 wnd_sum -= first_bd_sz;
3433 }
3434
3435
3436
3437 for (wnd_idx = 0; wnd_idx <= num_wnds; wnd_idx++) {
3438 wnd_sum +=
3439 skb_frag_size(&skb_shinfo(skb)->frags[wnd_idx + wnd_size - 1]);
3440
3441 if (unlikely(wnd_sum < lso_mss)) {
3442 to_copy = 1;
3443 break;
3444 }
3445 wnd_sum -=
3446 skb_frag_size(&skb_shinfo(skb)->frags[wnd_idx]);
3447 }
3448 } else {
3449
3450
3451 to_copy = 1;
3452 }
3453 }
3454
3455exit_lbl:
3456 if (unlikely(to_copy))
3457 DP(NETIF_MSG_TX_QUEUED,
3458 "Linearization IS REQUIRED for %s packet. num_frags %d hlen %d first_bd_sz %d\n",
3459 (xmit_type & XMIT_GSO) ? "LSO" : "non-LSO",
3460 skb_shinfo(skb)->nr_frags, hlen, first_bd_sz);
3461
3462 return to_copy;
3463}
3464#endif
3465
3466
3467
3468
3469
3470
3471
3472
3473static void bnx2x_set_pbd_gso(struct sk_buff *skb,
3474 struct eth_tx_parse_bd_e1x *pbd,
3475 u32 xmit_type)
3476{
3477 pbd->lso_mss = cpu_to_le16(skb_shinfo(skb)->gso_size);
3478 pbd->tcp_send_seq = bswab32(tcp_hdr(skb)->seq);
3479 pbd->tcp_flags = pbd_tcp_flags(tcp_hdr(skb));
3480
3481 if (xmit_type & XMIT_GSO_V4) {
3482 pbd->ip_id = bswab16(ip_hdr(skb)->id);
3483 pbd->tcp_pseudo_csum =
3484 bswab16(~csum_tcpudp_magic(ip_hdr(skb)->saddr,
3485 ip_hdr(skb)->daddr,
3486 0, IPPROTO_TCP, 0));
3487 } else {
3488 pbd->tcp_pseudo_csum =
3489 bswab16(~csum_ipv6_magic(&ipv6_hdr(skb)->saddr,
3490 &ipv6_hdr(skb)->daddr,
3491 0, IPPROTO_TCP, 0));
3492 }
3493
3494 pbd->global_data |=
3495 cpu_to_le16(ETH_TX_PARSE_BD_E1X_PSEUDO_CS_WITHOUT_LEN);
3496}
3497
3498
3499
3500
3501
3502
3503
3504
3505
3506
3507
3508static u8 bnx2x_set_pbd_csum_enc(struct bnx2x *bp, struct sk_buff *skb,
3509 u32 *parsing_data, u32 xmit_type)
3510{
3511 *parsing_data |=
3512 ((((u8 *)skb_inner_transport_header(skb) - skb->data) >> 1) <<
3513 ETH_TX_PARSE_BD_E2_L4_HDR_START_OFFSET_W_SHIFT) &
3514 ETH_TX_PARSE_BD_E2_L4_HDR_START_OFFSET_W;
3515
3516 if (xmit_type & XMIT_CSUM_TCP) {
3517 *parsing_data |= ((inner_tcp_hdrlen(skb) / 4) <<
3518 ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) &
3519 ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW;
3520
3521 return skb_inner_transport_header(skb) +
3522 inner_tcp_hdrlen(skb) - skb->data;
3523 }
3524
3525
3526
3527
3528 return skb_inner_transport_header(skb) +
3529 sizeof(struct udphdr) - skb->data;
3530}
3531
3532
3533
3534
3535
3536
3537
3538
3539
3540
3541
3542static u8 bnx2x_set_pbd_csum_e2(struct bnx2x *bp, struct sk_buff *skb,
3543 u32 *parsing_data, u32 xmit_type)
3544{
3545 *parsing_data |=
3546 ((((u8 *)skb_transport_header(skb) - skb->data) >> 1) <<
3547 ETH_TX_PARSE_BD_E2_L4_HDR_START_OFFSET_W_SHIFT) &
3548 ETH_TX_PARSE_BD_E2_L4_HDR_START_OFFSET_W;
3549
3550 if (xmit_type & XMIT_CSUM_TCP) {
3551 *parsing_data |= ((tcp_hdrlen(skb) / 4) <<
3552 ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW_SHIFT) &
3553 ETH_TX_PARSE_BD_E2_TCP_HDR_LENGTH_DW;
3554
3555 return skb_transport_header(skb) + tcp_hdrlen(skb) - skb->data;
3556 }
3557
3558
3559
3560 return skb_transport_header(skb) + sizeof(struct udphdr) - skb->data;
3561}
3562
3563
3564static void bnx2x_set_sbd_csum(struct bnx2x *bp, struct sk_buff *skb,
3565 struct eth_tx_start_bd *tx_start_bd,
3566 u32 xmit_type)
3567{
3568 tx_start_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_L4_CSUM;
3569
3570 if (xmit_type & (XMIT_CSUM_ENC_V6 | XMIT_CSUM_V6))
3571 tx_start_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_IPV6;
3572
3573 if (!(xmit_type & XMIT_CSUM_TCP))
3574 tx_start_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_IS_UDP;
3575}
3576
3577
3578
3579
3580
3581
3582
3583
3584
3585static u8 bnx2x_set_pbd_csum(struct bnx2x *bp, struct sk_buff *skb,
3586 struct eth_tx_parse_bd_e1x *pbd,
3587 u32 xmit_type)
3588{
3589 u8 hlen = (skb_network_header(skb) - skb->data) >> 1;
3590
3591
3592 pbd->global_data =
3593 cpu_to_le16(hlen |
3594 ((skb->protocol == cpu_to_be16(ETH_P_8021Q)) <<
3595 ETH_TX_PARSE_BD_E1X_LLC_SNAP_EN_SHIFT));
3596
3597 pbd->ip_hlen_w = (skb_transport_header(skb) -
3598 skb_network_header(skb)) >> 1;
3599
3600 hlen += pbd->ip_hlen_w;
3601
3602
3603 if (xmit_type & XMIT_CSUM_TCP)
3604 hlen += tcp_hdrlen(skb) / 2;
3605 else
3606 hlen += sizeof(struct udphdr) / 2;
3607
3608 pbd->total_hlen_w = cpu_to_le16(hlen);
3609 hlen = hlen*2;
3610
3611 if (xmit_type & XMIT_CSUM_TCP) {
3612 pbd->tcp_pseudo_csum = bswab16(tcp_hdr(skb)->check);
3613
3614 } else {
3615 s8 fix = SKB_CS_OFF(skb);
3616
3617 DP(NETIF_MSG_TX_QUEUED,
3618 "hlen %d fix %d csum before fix %x\n",
3619 le16_to_cpu(pbd->total_hlen_w), fix, SKB_CS(skb));
3620
3621
3622 pbd->tcp_pseudo_csum =
3623 bnx2x_csum_fix(skb_transport_header(skb),
3624 SKB_CS(skb), fix);
3625
3626 DP(NETIF_MSG_TX_QUEUED, "csum after fix %x\n",
3627 pbd->tcp_pseudo_csum);
3628 }
3629
3630 return hlen;
3631}
3632
3633static void bnx2x_update_pbds_gso_enc(struct sk_buff *skb,
3634 struct eth_tx_parse_bd_e2 *pbd_e2,
3635 struct eth_tx_parse_2nd_bd *pbd2,
3636 u16 *global_data,
3637 u32 xmit_type)
3638{
3639 u16 hlen_w = 0;
3640 u8 outerip_off, outerip_len = 0;
3641
3642
3643 hlen_w = (skb_inner_transport_header(skb) -
3644 skb_network_header(skb)) >> 1;
3645
3646
3647 hlen_w += inner_tcp_hdrlen(skb) >> 1;
3648
3649 pbd2->fw_ip_hdr_to_payload_w = hlen_w;
3650
3651
3652 if (xmit_type & XMIT_CSUM_V4) {
3653 struct iphdr *iph = ip_hdr(skb);
3654 u32 csum = (__force u32)(~iph->check) -
3655 (__force u32)iph->tot_len -
3656 (__force u32)iph->frag_off;
3657
3658 outerip_len = iph->ihl << 1;
3659
3660 pbd2->fw_ip_csum_wo_len_flags_frag =
3661 bswab16(csum_fold((__force __wsum)csum));
3662 } else {
3663 pbd2->fw_ip_hdr_to_payload_w =
3664 hlen_w - ((sizeof(struct ipv6hdr)) >> 1);
3665 pbd_e2->data.tunnel_data.flags |=
3666 ETH_TUNNEL_DATA_IPV6_OUTER;
3667 }
3668
3669 pbd2->tcp_send_seq = bswab32(inner_tcp_hdr(skb)->seq);
3670
3671 pbd2->tcp_flags = pbd_tcp_flags(inner_tcp_hdr(skb));
3672
3673
3674 if (xmit_type & XMIT_CSUM_ENC_V4) {
3675 pbd2->hw_ip_id = bswab16(inner_ip_hdr(skb)->id);
3676
3677 pbd_e2->data.tunnel_data.pseudo_csum =
3678 bswab16(~csum_tcpudp_magic(
3679 inner_ip_hdr(skb)->saddr,
3680 inner_ip_hdr(skb)->daddr,
3681 0, IPPROTO_TCP, 0));
3682 } else {
3683 pbd_e2->data.tunnel_data.pseudo_csum =
3684 bswab16(~csum_ipv6_magic(
3685 &inner_ipv6_hdr(skb)->saddr,
3686 &inner_ipv6_hdr(skb)->daddr,
3687 0, IPPROTO_TCP, 0));
3688 }
3689
3690 outerip_off = (skb_network_header(skb) - skb->data) >> 1;
3691
3692 *global_data |=
3693 outerip_off |
3694 (outerip_len <<
3695 ETH_TX_PARSE_2ND_BD_IP_HDR_LEN_OUTER_W_SHIFT) |
3696 ((skb->protocol == cpu_to_be16(ETH_P_8021Q)) <<
3697 ETH_TX_PARSE_2ND_BD_LLC_SNAP_EN_SHIFT);
3698
3699 if (ip_hdr(skb)->protocol == IPPROTO_UDP) {
3700 SET_FLAG(*global_data, ETH_TX_PARSE_2ND_BD_TUNNEL_UDP_EXIST, 1);
3701 pbd2->tunnel_udp_hdr_start_w = skb_transport_offset(skb) >> 1;
3702 }
3703}
3704
3705static inline void bnx2x_set_ipv6_ext_e2(struct sk_buff *skb, u32 *parsing_data,
3706 u32 xmit_type)
3707{
3708 struct ipv6hdr *ipv6;
3709
3710 if (!(xmit_type & (XMIT_GSO_ENC_V6 | XMIT_GSO_V6)))
3711 return;
3712
3713 if (xmit_type & XMIT_GSO_ENC_V6)
3714 ipv6 = inner_ipv6_hdr(skb);
3715 else
3716 ipv6 = ipv6_hdr(skb);
3717
3718 if (ipv6->nexthdr == NEXTHDR_IPV6)
3719 *parsing_data |= ETH_TX_PARSE_BD_E2_IPV6_WITH_EXT_HDR;
3720}
3721
3722
3723
3724
3725
3726netdev_tx_t bnx2x_start_xmit(struct sk_buff *skb, struct net_device *dev)
3727{
3728 struct bnx2x *bp = netdev_priv(dev);
3729
3730 struct netdev_queue *txq;
3731 struct bnx2x_fp_txdata *txdata;
3732 struct sw_tx_bd *tx_buf;
3733 struct eth_tx_start_bd *tx_start_bd, *first_bd;
3734 struct eth_tx_bd *tx_data_bd, *total_pkt_bd = NULL;
3735 struct eth_tx_parse_bd_e1x *pbd_e1x = NULL;
3736 struct eth_tx_parse_bd_e2 *pbd_e2 = NULL;
3737 struct eth_tx_parse_2nd_bd *pbd2 = NULL;
3738 u32 pbd_e2_parsing_data = 0;
3739 u16 pkt_prod, bd_prod;
3740 int nbd, txq_index;
3741 dma_addr_t mapping;
3742 u32 xmit_type = bnx2x_xmit_type(bp, skb);
3743 int i;
3744 u8 hlen = 0;
3745 __le16 pkt_size = 0;
3746 struct ethhdr *eth;
3747 u8 mac_type = UNICAST_ADDRESS;
3748
3749#ifdef BNX2X_STOP_ON_ERROR
3750 if (unlikely(bp->panic))
3751 return NETDEV_TX_BUSY;
3752#endif
3753
3754 txq_index = skb_get_queue_mapping(skb);
3755 txq = netdev_get_tx_queue(dev, txq_index);
3756
3757 BUG_ON(txq_index >= MAX_ETH_TXQ_IDX(bp) + (CNIC_LOADED(bp) ? 1 : 0));
3758
3759 txdata = &bp->bnx2x_txq[txq_index];
3760
3761
3762
3763
3764
3765
3766
3767
3768
3769
3770 if (unlikely(bnx2x_tx_avail(bp, txdata) <
3771 skb_shinfo(skb)->nr_frags +
3772 BDS_PER_TX_PKT +
3773 NEXT_CNT_PER_TX_PKT(MAX_BDS_PER_TX_PKT))) {
3774
3775 if (txdata->tx_ring_size == 0) {
3776 struct bnx2x_eth_q_stats *q_stats =
3777 bnx2x_fp_qstats(bp, txdata->parent_fp);
3778 q_stats->driver_filtered_tx_pkt++;
3779 dev_kfree_skb(skb);
3780 return NETDEV_TX_OK;
3781 }
3782 bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++;
3783 netif_tx_stop_queue(txq);
3784 BNX2X_ERR("BUG! Tx ring full when queue awake!\n");
3785
3786 return NETDEV_TX_BUSY;
3787 }
3788
3789 DP(NETIF_MSG_TX_QUEUED,
3790 "queue[%d]: SKB: summed %x protocol %x protocol(%x,%x) gso type %x xmit_type %x len %d\n",
3791 txq_index, skb->ip_summed, skb->protocol, ipv6_hdr(skb)->nexthdr,
3792 ip_hdr(skb)->protocol, skb_shinfo(skb)->gso_type, xmit_type,
3793 skb->len);
3794
3795 eth = (struct ethhdr *)skb->data;
3796
3797
3798 if (unlikely(is_multicast_ether_addr(eth->h_dest))) {
3799 if (is_broadcast_ether_addr(eth->h_dest))
3800 mac_type = BROADCAST_ADDRESS;
3801 else
3802 mac_type = MULTICAST_ADDRESS;
3803 }
3804
3805#if (MAX_SKB_FRAGS >= MAX_FETCH_BD - BDS_PER_TX_PKT)
3806
3807
3808
3809 if (bnx2x_pkt_req_lin(bp, skb, xmit_type)) {
3810
3811 bp->lin_cnt++;
3812 if (skb_linearize(skb) != 0) {
3813 DP(NETIF_MSG_TX_QUEUED,
3814 "SKB linearization failed - silently dropping this SKB\n");
3815 dev_kfree_skb_any(skb);
3816 return NETDEV_TX_OK;
3817 }
3818 }
3819#endif
3820
3821 mapping = dma_map_single(&bp->pdev->dev, skb->data,
3822 skb_headlen(skb), DMA_TO_DEVICE);
3823 if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) {
3824 DP(NETIF_MSG_TX_QUEUED,
3825 "SKB mapping failed - silently dropping this SKB\n");
3826 dev_kfree_skb_any(skb);
3827 return NETDEV_TX_OK;
3828 }
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3840
3841 pkt_prod = txdata->tx_pkt_prod;
3842 bd_prod = TX_BD(txdata->tx_bd_prod);
3843
3844
3845
3846
3847
3848 tx_buf = &txdata->tx_buf_ring[TX_BD(pkt_prod)];
3849 tx_start_bd = &txdata->tx_desc_ring[bd_prod].start_bd;
3850 first_bd = tx_start_bd;
3851
3852 tx_start_bd->bd_flags.as_bitfield = ETH_TX_BD_FLAGS_START_BD;
3853
3854 if (unlikely(skb_shinfo(skb)->tx_flags & SKBTX_HW_TSTAMP)) {
3855 if (!(bp->flags & TX_TIMESTAMPING_EN)) {
3856 BNX2X_ERR("Tx timestamping was not enabled, this packet will not be timestamped\n");
3857 } else if (bp->ptp_tx_skb) {
3858 BNX2X_ERR("The device supports only a single outstanding packet to timestamp, this packet will not be timestamped\n");
3859 } else {
3860 skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
3861
3862 bp->ptp_tx_skb = skb_get(skb);
3863 bp->ptp_tx_start = jiffies;
3864 schedule_work(&bp->ptp_task);
3865 }
3866 }
3867
3868
3869 tx_start_bd->general_data = 1 << ETH_TX_START_BD_HDR_NBDS_SHIFT;
3870
3871
3872 tx_buf->first_bd = txdata->tx_bd_prod;
3873 tx_buf->skb = skb;
3874 tx_buf->flags = 0;
3875
3876 DP(NETIF_MSG_TX_QUEUED,
3877 "sending pkt %u @%p next_idx %u bd %u @%p\n",
3878 pkt_prod, tx_buf, txdata->tx_pkt_prod, bd_prod, tx_start_bd);
3879
3880 if (skb_vlan_tag_present(skb)) {
3881 tx_start_bd->vlan_or_ethertype =
3882 cpu_to_le16(skb_vlan_tag_get(skb));
3883 tx_start_bd->bd_flags.as_bitfield |=
3884 (X_ETH_OUTBAND_VLAN << ETH_TX_BD_FLAGS_VLAN_MODE_SHIFT);
3885 } else {
3886
3887
3888
3889#ifndef BNX2X_STOP_ON_ERROR
3890 if (IS_VF(bp))
3891#endif
3892 tx_start_bd->vlan_or_ethertype =
3893 cpu_to_le16(ntohs(eth->h_proto));
3894#ifndef BNX2X_STOP_ON_ERROR
3895 else
3896
3897 tx_start_bd->vlan_or_ethertype = cpu_to_le16(pkt_prod);
3898#endif
3899 }
3900
3901 nbd = 2;
3902
3903
3904 bd_prod = TX_BD(NEXT_TX_IDX(bd_prod));
3905
3906 if (xmit_type & XMIT_CSUM)
3907 bnx2x_set_sbd_csum(bp, skb, tx_start_bd, xmit_type);
3908
3909 if (!CHIP_IS_E1x(bp)) {
3910 pbd_e2 = &txdata->tx_desc_ring[bd_prod].parse_bd_e2;
3911 memset(pbd_e2, 0, sizeof(struct eth_tx_parse_bd_e2));
3912
3913 if (xmit_type & XMIT_CSUM_ENC) {
3914 u16 global_data = 0;
3915
3916
3917 hlen = bnx2x_set_pbd_csum_enc(bp, skb,
3918 &pbd_e2_parsing_data,
3919 xmit_type);
3920
3921
3922 bd_prod = TX_BD(NEXT_TX_IDX(bd_prod));
3923
3924 pbd2 = &txdata->tx_desc_ring[bd_prod].parse_2nd_bd;
3925
3926 memset(pbd2, 0, sizeof(*pbd2));
3927
3928 pbd_e2->data.tunnel_data.ip_hdr_start_inner_w =
3929 (skb_inner_network_header(skb) -
3930 skb->data) >> 1;
3931
3932 if (xmit_type & XMIT_GSO_ENC)
3933 bnx2x_update_pbds_gso_enc(skb, pbd_e2, pbd2,
3934 &global_data,
3935 xmit_type);
3936
3937 pbd2->global_data = cpu_to_le16(global_data);
3938
3939
3940 SET_FLAG(tx_start_bd->general_data,
3941 ETH_TX_START_BD_PARSE_NBDS, 1);
3942
3943 SET_FLAG(tx_start_bd->general_data,
3944 ETH_TX_START_BD_TUNNEL_EXIST, 1);
3945
3946 tx_buf->flags |= BNX2X_HAS_SECOND_PBD;
3947
3948 nbd++;
3949 } else if (xmit_type & XMIT_CSUM) {
3950
3951 hlen = bnx2x_set_pbd_csum_e2(bp, skb,
3952 &pbd_e2_parsing_data,
3953 xmit_type);
3954 }
3955
3956 bnx2x_set_ipv6_ext_e2(skb, &pbd_e2_parsing_data, xmit_type);
3957
3958
3959
3960 if (IS_VF(bp)) {
3961
3962 bnx2x_set_fw_mac_addr(&pbd_e2->data.mac_addr.src_hi,
3963 &pbd_e2->data.mac_addr.src_mid,
3964 &pbd_e2->data.mac_addr.src_lo,
3965 eth->h_source);
3966
3967 bnx2x_set_fw_mac_addr(&pbd_e2->data.mac_addr.dst_hi,
3968 &pbd_e2->data.mac_addr.dst_mid,
3969 &pbd_e2->data.mac_addr.dst_lo,
3970 eth->h_dest);
3971 } else {
3972 if (bp->flags & TX_SWITCHING)
3973 bnx2x_set_fw_mac_addr(
3974 &pbd_e2->data.mac_addr.dst_hi,
3975 &pbd_e2->data.mac_addr.dst_mid,
3976 &pbd_e2->data.mac_addr.dst_lo,
3977 eth->h_dest);
3978#ifdef BNX2X_STOP_ON_ERROR
3979
3980
3981
3982 bnx2x_set_fw_mac_addr(&pbd_e2->data.mac_addr.src_hi,
3983 &pbd_e2->data.mac_addr.src_mid,
3984 &pbd_e2->data.mac_addr.src_lo,
3985 eth->h_source);
3986#endif
3987 }
3988
3989 SET_FLAG(pbd_e2_parsing_data,
3990 ETH_TX_PARSE_BD_E2_ETH_ADDR_TYPE, mac_type);
3991 } else {
3992 u16 global_data = 0;
3993 pbd_e1x = &txdata->tx_desc_ring[bd_prod].parse_bd_e1x;
3994 memset(pbd_e1x, 0, sizeof(struct eth_tx_parse_bd_e1x));
3995
3996 if (xmit_type & XMIT_CSUM)
3997 hlen = bnx2x_set_pbd_csum(bp, skb, pbd_e1x, xmit_type);
3998
3999 SET_FLAG(global_data,
4000 ETH_TX_PARSE_BD_E1X_ETH_ADDR_TYPE, mac_type);
4001 pbd_e1x->global_data |= cpu_to_le16(global_data);
4002 }
4003
4004
4005 tx_start_bd->addr_hi = cpu_to_le32(U64_HI(mapping));
4006 tx_start_bd->addr_lo = cpu_to_le32(U64_LO(mapping));
4007 tx_start_bd->nbytes = cpu_to_le16(skb_headlen(skb));
4008 pkt_size = tx_start_bd->nbytes;
4009
4010 DP(NETIF_MSG_TX_QUEUED,
4011 "first bd @%p addr (%x:%x) nbytes %d flags %x vlan %x\n",
4012 tx_start_bd, tx_start_bd->addr_hi, tx_start_bd->addr_lo,
4013 le16_to_cpu(tx_start_bd->nbytes),
4014 tx_start_bd->bd_flags.as_bitfield,
4015 le16_to_cpu(tx_start_bd->vlan_or_ethertype));
4016
4017 if (xmit_type & XMIT_GSO) {
4018
4019 DP(NETIF_MSG_TX_QUEUED,
4020 "TSO packet len %d hlen %d total len %d tso size %d\n",
4021 skb->len, hlen, skb_headlen(skb),
4022 skb_shinfo(skb)->gso_size);
4023
4024 tx_start_bd->bd_flags.as_bitfield |= ETH_TX_BD_FLAGS_SW_LSO;
4025
4026 if (unlikely(skb_headlen(skb) > hlen)) {
4027 nbd++;
4028 bd_prod = bnx2x_tx_split(bp, txdata, tx_buf,
4029 &tx_start_bd, hlen,
4030 bd_prod);
4031 }
4032 if (!CHIP_IS_E1x(bp))
4033 pbd_e2_parsing_data |=
4034 (skb_shinfo(skb)->gso_size <<
4035 ETH_TX_PARSE_BD_E2_LSO_MSS_SHIFT) &
4036 ETH_TX_PARSE_BD_E2_LSO_MSS;
4037 else
4038 bnx2x_set_pbd_gso(skb, pbd_e1x, xmit_type);
4039 }
4040
4041
4042
4043
4044 if (pbd_e2_parsing_data)
4045 pbd_e2->parsing_data = cpu_to_le32(pbd_e2_parsing_data);
4046
4047 tx_data_bd = (struct eth_tx_bd *)tx_start_bd;
4048
4049
4050 for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
4051 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
4052
4053 mapping = skb_frag_dma_map(&bp->pdev->dev, frag, 0,
4054 skb_frag_size(frag), DMA_TO_DEVICE);
4055 if (unlikely(dma_mapping_error(&bp->pdev->dev, mapping))) {
4056 unsigned int pkts_compl = 0, bytes_compl = 0;
4057
4058 DP(NETIF_MSG_TX_QUEUED,
4059 "Unable to map page - dropping packet...\n");
4060
4061
4062
4063
4064
4065
4066 first_bd->nbd = cpu_to_le16(nbd);
4067 bnx2x_free_tx_pkt(bp, txdata,
4068 TX_BD(txdata->tx_pkt_prod),
4069 &pkts_compl, &bytes_compl);
4070 return NETDEV_TX_OK;
4071 }
4072
4073 bd_prod = TX_BD(NEXT_TX_IDX(bd_prod));
4074 tx_data_bd = &txdata->tx_desc_ring[bd_prod].reg_bd;
4075 if (total_pkt_bd == NULL)
4076 total_pkt_bd = &txdata->tx_desc_ring[bd_prod].reg_bd;
4077
4078 tx_data_bd->addr_hi = cpu_to_le32(U64_HI(mapping));
4079 tx_data_bd->addr_lo = cpu_to_le32(U64_LO(mapping));
4080 tx_data_bd->nbytes = cpu_to_le16(skb_frag_size(frag));
4081 le16_add_cpu(&pkt_size, skb_frag_size(frag));
4082 nbd++;
4083
4084 DP(NETIF_MSG_TX_QUEUED,
4085 "frag %d bd @%p addr (%x:%x) nbytes %d\n",
4086 i, tx_data_bd, tx_data_bd->addr_hi, tx_data_bd->addr_lo,
4087 le16_to_cpu(tx_data_bd->nbytes));
4088 }
4089
4090 DP(NETIF_MSG_TX_QUEUED, "last bd @%p\n", tx_data_bd);
4091
4092
4093 first_bd->nbd = cpu_to_le16(nbd);
4094
4095 bd_prod = TX_BD(NEXT_TX_IDX(bd_prod));
4096
4097
4098
4099
4100 if (TX_BD_POFF(bd_prod) < nbd)
4101 nbd++;
4102
4103
4104
4105
4106
4107
4108
4109
4110 if (total_pkt_bd != NULL)
4111 total_pkt_bd->total_pkt_bytes = pkt_size;
4112
4113 if (pbd_e1x)
4114 DP(NETIF_MSG_TX_QUEUED,
4115 "PBD (E1X) @%p ip_data %x ip_hlen %u ip_id %u lso_mss %u tcp_flags %x xsum %x seq %u hlen %u\n",
4116 pbd_e1x, pbd_e1x->global_data, pbd_e1x->ip_hlen_w,
4117 pbd_e1x->ip_id, pbd_e1x->lso_mss, pbd_e1x->tcp_flags,
4118 pbd_e1x->tcp_pseudo_csum, pbd_e1x->tcp_send_seq,
4119 le16_to_cpu(pbd_e1x->total_hlen_w));
4120 if (pbd_e2)
4121 DP(NETIF_MSG_TX_QUEUED,
4122 "PBD (E2) @%p dst %x %x %x src %x %x %x parsing_data %x\n",
4123 pbd_e2,
4124 pbd_e2->data.mac_addr.dst_hi,
4125 pbd_e2->data.mac_addr.dst_mid,
4126 pbd_e2->data.mac_addr.dst_lo,
4127 pbd_e2->data.mac_addr.src_hi,
4128 pbd_e2->data.mac_addr.src_mid,
4129 pbd_e2->data.mac_addr.src_lo,
4130 pbd_e2->parsing_data);
4131 DP(NETIF_MSG_TX_QUEUED, "doorbell: nbd %d bd %u\n", nbd, bd_prod);
4132
4133 netdev_tx_sent_queue(txq, skb->len);
4134
4135 skb_tx_timestamp(skb);
4136
4137 txdata->tx_pkt_prod++;
4138
4139
4140
4141
4142
4143
4144
4145 wmb();
4146
4147 txdata->tx_db.data.prod += nbd;
4148 barrier();
4149
4150 DOORBELL(bp, txdata->cid, txdata->tx_db.raw);
4151
4152 mmiowb();
4153
4154 txdata->tx_bd_prod += nbd;
4155
4156 if (unlikely(bnx2x_tx_avail(bp, txdata) < MAX_DESC_PER_TX_PKT)) {
4157 netif_tx_stop_queue(txq);
4158
4159
4160
4161
4162 smp_mb();
4163
4164 bnx2x_fp_qstats(bp, txdata->parent_fp)->driver_xoff++;
4165 if (bnx2x_tx_avail(bp, txdata) >= MAX_DESC_PER_TX_PKT)
4166 netif_tx_wake_queue(txq);
4167 }
4168 txdata->tx_pkt++;
4169
4170 return NETDEV_TX_OK;
4171}
4172
4173void bnx2x_get_c2s_mapping(struct bnx2x *bp, u8 *c2s_map, u8 *c2s_default)
4174{
4175 int mfw_vn = BP_FW_MB_IDX(bp);
4176 u32 tmp;
4177
4178
4179 if (!IS_MF_BD(bp)) {
4180 int i;
4181
4182 for (i = 0; i < BNX2X_MAX_PRIORITY; i++)
4183 c2s_map[i] = i;
4184 *c2s_default = 0;
4185
4186 return;
4187 }
4188
4189 tmp = SHMEM2_RD(bp, c2s_pcp_map_lower[mfw_vn]);
4190 tmp = (__force u32)be32_to_cpu((__force __be32)tmp);
4191 c2s_map[0] = tmp & 0xff;
4192 c2s_map[1] = (tmp >> 8) & 0xff;
4193 c2s_map[2] = (tmp >> 16) & 0xff;
4194 c2s_map[3] = (tmp >> 24) & 0xff;
4195
4196 tmp = SHMEM2_RD(bp, c2s_pcp_map_upper[mfw_vn]);
4197 tmp = (__force u32)be32_to_cpu((__force __be32)tmp);
4198 c2s_map[4] = tmp & 0xff;
4199 c2s_map[5] = (tmp >> 8) & 0xff;
4200 c2s_map[6] = (tmp >> 16) & 0xff;
4201 c2s_map[7] = (tmp >> 24) & 0xff;
4202
4203 tmp = SHMEM2_RD(bp, c2s_pcp_map_default[mfw_vn]);
4204 tmp = (__force u32)be32_to_cpu((__force __be32)tmp);
4205 *c2s_default = (tmp >> (8 * mfw_vn)) & 0xff;
4206}
4207
4208
4209
4210
4211
4212
4213
4214
4215
4216int bnx2x_setup_tc(struct net_device *dev, u8 num_tc)
4217{
4218 struct bnx2x *bp = netdev_priv(dev);
4219 u8 c2s_map[BNX2X_MAX_PRIORITY], c2s_def;
4220 int cos, prio, count, offset;
4221
4222
4223 ASSERT_RTNL();
4224
4225
4226 if (!num_tc) {
4227 netdev_reset_tc(dev);
4228 return 0;
4229 }
4230
4231
4232 if (num_tc > bp->max_cos) {
4233 BNX2X_ERR("support for too many traffic classes requested: %d. Max supported is %d\n",
4234 num_tc, bp->max_cos);
4235 return -EINVAL;
4236 }
4237
4238
4239 if (netdev_set_num_tc(dev, num_tc)) {
4240 BNX2X_ERR("failed to declare %d traffic classes\n", num_tc);
4241 return -EINVAL;
4242 }
4243
4244 bnx2x_get_c2s_mapping(bp, c2s_map, &c2s_def);
4245
4246
4247 for (prio = 0; prio < BNX2X_MAX_PRIORITY; prio++) {
4248 int outer_prio = c2s_map[prio];
4249
4250 netdev_set_prio_tc_map(dev, prio, bp->prio_to_cos[outer_prio]);
4251 DP(BNX2X_MSG_SP | NETIF_MSG_IFUP,
4252 "mapping priority %d to tc %d\n",
4253 outer_prio, bp->prio_to_cos[outer_prio]);
4254 }
4255
4256
4257
4258
4259
4260
4261
4262
4263
4264
4265
4266
4267 for (cos = 0; cos < bp->max_cos; cos++) {
4268 count = BNX2X_NUM_ETH_QUEUES(bp);
4269 offset = cos * BNX2X_NUM_NON_CNIC_QUEUES(bp);
4270 netdev_set_tc_queue(dev, cos, count, offset);
4271 DP(BNX2X_MSG_SP | NETIF_MSG_IFUP,
4272 "mapping tc %d to offset %d count %d\n",
4273 cos, offset, count);
4274 }
4275
4276 return 0;
4277}
4278
4279int __bnx2x_setup_tc(struct net_device *dev, u32 handle, __be16 proto,
4280 struct tc_to_netdev *tc)
4281{
4282 if (tc->type != TC_SETUP_MQPRIO)
4283 return -EINVAL;
4284 return bnx2x_setup_tc(dev, tc->tc);
4285}
4286
4287
4288int bnx2x_change_mac_addr(struct net_device *dev, void *p)
4289{
4290 struct sockaddr *addr = p;
4291 struct bnx2x *bp = netdev_priv(dev);
4292 int rc = 0;
4293
4294 if (!is_valid_ether_addr(addr->sa_data)) {
4295 BNX2X_ERR("Requested MAC address is not valid\n");
4296 return -EINVAL;
4297 }
4298
4299 if (IS_MF_STORAGE_ONLY(bp)) {
4300 BNX2X_ERR("Can't change address on STORAGE ONLY function\n");
4301 return -EINVAL;
4302 }
4303
4304 if (netif_running(dev)) {
4305 rc = bnx2x_set_eth_mac(bp, false);
4306 if (rc)
4307 return rc;
4308 }
4309
4310 memcpy(dev->dev_addr, addr->sa_data, dev->addr_len);
4311
4312 if (netif_running(dev))
4313 rc = bnx2x_set_eth_mac(bp, true);
4314
4315 if (IS_PF(bp) && SHMEM2_HAS(bp, curr_cfg))
4316 SHMEM2_WR(bp, curr_cfg, CURR_CFG_MET_OS);
4317
4318 return rc;
4319}
4320
4321static void bnx2x_free_fp_mem_at(struct bnx2x *bp, int fp_index)
4322{
4323 union host_hc_status_block *sb = &bnx2x_fp(bp, fp_index, status_blk);
4324 struct bnx2x_fastpath *fp = &bp->fp[fp_index];
4325 u8 cos;
4326
4327
4328
4329 if (IS_FCOE_IDX(fp_index)) {
4330 memset(sb, 0, sizeof(union host_hc_status_block));
4331 fp->status_blk_mapping = 0;
4332 } else {
4333
4334 if (!CHIP_IS_E1x(bp))
4335 BNX2X_PCI_FREE(sb->e2_sb,
4336 bnx2x_fp(bp, fp_index,
4337 status_blk_mapping),
4338 sizeof(struct host_hc_status_block_e2));
4339 else
4340 BNX2X_PCI_FREE(sb->e1x_sb,
4341 bnx2x_fp(bp, fp_index,
4342 status_blk_mapping),
4343 sizeof(struct host_hc_status_block_e1x));
4344 }
4345
4346
4347 if (!skip_rx_queue(bp, fp_index)) {
4348 bnx2x_free_rx_bds(fp);
4349
4350
4351 BNX2X_FREE(bnx2x_fp(bp, fp_index, rx_buf_ring));
4352 BNX2X_PCI_FREE(bnx2x_fp(bp, fp_index, rx_desc_ring),
4353 bnx2x_fp(bp, fp_index, rx_desc_mapping),
4354 sizeof(struct eth_rx_bd) * NUM_RX_BD);
4355
4356 BNX2X_PCI_FREE(bnx2x_fp(bp, fp_index, rx_comp_ring),
4357 bnx2x_fp(bp, fp_index, rx_comp_mapping),
4358 sizeof(struct eth_fast_path_rx_cqe) *
4359 NUM_RCQ_BD);
4360
4361
4362 BNX2X_FREE(bnx2x_fp(bp, fp_index, rx_page_ring));
4363 BNX2X_PCI_FREE(bnx2x_fp(bp, fp_index, rx_sge_ring),
4364 bnx2x_fp(bp, fp_index, rx_sge_mapping),
4365 BCM_PAGE_SIZE * NUM_RX_SGE_PAGES);
4366 }
4367
4368
4369 if (!skip_tx_queue(bp, fp_index)) {
4370
4371 for_each_cos_in_tx_queue(fp, cos) {
4372 struct bnx2x_fp_txdata *txdata = fp->txdata_ptr[cos];
4373
4374 DP(NETIF_MSG_IFDOWN,
4375 "freeing tx memory of fp %d cos %d cid %d\n",
4376 fp_index, cos, txdata->cid);
4377
4378 BNX2X_FREE(txdata->tx_buf_ring);
4379 BNX2X_PCI_FREE(txdata->tx_desc_ring,
4380 txdata->tx_desc_mapping,
4381 sizeof(union eth_tx_bd_types) * NUM_TX_BD);
4382 }
4383 }
4384
4385}
4386
4387static void bnx2x_free_fp_mem_cnic(struct bnx2x *bp)
4388{
4389 int i;
4390 for_each_cnic_queue(bp, i)
4391 bnx2x_free_fp_mem_at(bp, i);
4392}
4393
4394void bnx2x_free_fp_mem(struct bnx2x *bp)
4395{
4396 int i;
4397 for_each_eth_queue(bp, i)
4398 bnx2x_free_fp_mem_at(bp, i);
4399}
4400
4401static void set_sb_shortcuts(struct bnx2x *bp, int index)
4402{
4403 union host_hc_status_block status_blk = bnx2x_fp(bp, index, status_blk);
4404 if (!CHIP_IS_E1x(bp)) {
4405 bnx2x_fp(bp, index, sb_index_values) =
4406 (__le16 *)status_blk.e2_sb->sb.index_values;
4407 bnx2x_fp(bp, index, sb_running_index) =
4408 (__le16 *)status_blk.e2_sb->sb.running_index;
4409 } else {
4410 bnx2x_fp(bp, index, sb_index_values) =
4411 (__le16 *)status_blk.e1x_sb->sb.index_values;
4412 bnx2x_fp(bp, index, sb_running_index) =
4413 (__le16 *)status_blk.e1x_sb->sb.running_index;
4414 }
4415}
4416
4417
4418static int bnx2x_alloc_rx_bds(struct bnx2x_fastpath *fp,
4419 int rx_ring_size)
4420{
4421 struct bnx2x *bp = fp->bp;
4422 u16 ring_prod, cqe_ring_prod;
4423 int i, failure_cnt = 0;
4424
4425 fp->rx_comp_cons = 0;
4426 cqe_ring_prod = ring_prod = 0;
4427
4428
4429
4430
4431 for (i = 0; i < rx_ring_size; i++) {
4432 if (bnx2x_alloc_rx_data(bp, fp, ring_prod, GFP_KERNEL) < 0) {
4433 failure_cnt++;
4434 continue;
4435 }
4436 ring_prod = NEXT_RX_IDX(ring_prod);
4437 cqe_ring_prod = NEXT_RCQ_IDX(cqe_ring_prod);
4438 WARN_ON(ring_prod <= (i - failure_cnt));
4439 }
4440
4441 if (failure_cnt)
4442 BNX2X_ERR("was only able to allocate %d rx skbs on queue[%d]\n",
4443 i - failure_cnt, fp->index);
4444
4445 fp->rx_bd_prod = ring_prod;
4446
4447 fp->rx_comp_prod = min_t(u16, NUM_RCQ_RINGS*RCQ_DESC_CNT,
4448 cqe_ring_prod);
4449
4450 bnx2x_fp_stats(bp, fp)->eth_q_stats.rx_skb_alloc_failed += failure_cnt;
4451
4452 return i - failure_cnt;
4453}
4454
4455static void bnx2x_set_next_page_rx_cq(struct bnx2x_fastpath *fp)
4456{
4457 int i;
4458
4459 for (i = 1; i <= NUM_RCQ_RINGS; i++) {
4460 struct eth_rx_cqe_next_page *nextpg;
4461
4462 nextpg = (struct eth_rx_cqe_next_page *)
4463 &fp->rx_comp_ring[RCQ_DESC_CNT * i - 1];
4464 nextpg->addr_hi =
4465 cpu_to_le32(U64_HI(fp->rx_comp_mapping +
4466 BCM_PAGE_SIZE*(i % NUM_RCQ_RINGS)));
4467 nextpg->addr_lo =
4468 cpu_to_le32(U64_LO(fp->rx_comp_mapping +
4469 BCM_PAGE_SIZE*(i % NUM_RCQ_RINGS)));
4470 }
4471}
4472
4473static int bnx2x_alloc_fp_mem_at(struct bnx2x *bp, int index)
4474{
4475 union host_hc_status_block *sb;
4476 struct bnx2x_fastpath *fp = &bp->fp[index];
4477 int ring_size = 0;
4478 u8 cos;
4479 int rx_ring_size = 0;
4480
4481 if (!bp->rx_ring_size && IS_MF_STORAGE_ONLY(bp)) {
4482 rx_ring_size = MIN_RX_SIZE_NONTPA;
4483 bp->rx_ring_size = rx_ring_size;
4484 } else if (!bp->rx_ring_size) {
4485 rx_ring_size = MAX_RX_AVAIL/BNX2X_NUM_RX_QUEUES(bp);
4486
4487 if (CHIP_IS_E3(bp)) {
4488 u32 cfg = SHMEM_RD(bp,
4489 dev_info.port_hw_config[BP_PORT(bp)].
4490 default_cfg);
4491
4492
4493 if ((cfg & PORT_HW_CFG_NET_SERDES_IF_MASK) ==
4494 PORT_HW_CFG_NET_SERDES_IF_SGMII)
4495 rx_ring_size /= 10;
4496 }
4497
4498
4499 rx_ring_size = max_t(int, bp->disable_tpa ? MIN_RX_SIZE_NONTPA :
4500 MIN_RX_SIZE_TPA, rx_ring_size);
4501
4502 bp->rx_ring_size = rx_ring_size;
4503 } else
4504 rx_ring_size = bp->rx_ring_size;
4505
4506 DP(BNX2X_MSG_SP, "calculated rx_ring_size %d\n", rx_ring_size);
4507
4508
4509 sb = &bnx2x_fp(bp, index, status_blk);
4510
4511 if (!IS_FCOE_IDX(index)) {
4512
4513 if (!CHIP_IS_E1x(bp)) {
4514 sb->e2_sb = BNX2X_PCI_ALLOC(&bnx2x_fp(bp, index, status_blk_mapping),
4515 sizeof(struct host_hc_status_block_e2));
4516 if (!sb->e2_sb)
4517 goto alloc_mem_err;
4518 } else {
4519 sb->e1x_sb = BNX2X_PCI_ALLOC(&bnx2x_fp(bp, index, status_blk_mapping),
4520 sizeof(struct host_hc_status_block_e1x));
4521 if (!sb->e1x_sb)
4522 goto alloc_mem_err;
4523 }
4524 }
4525
4526
4527
4528
4529 if (!IS_FCOE_IDX(index))
4530 set_sb_shortcuts(bp, index);
4531
4532
4533 if (!skip_tx_queue(bp, index)) {
4534
4535 for_each_cos_in_tx_queue(fp, cos) {
4536 struct bnx2x_fp_txdata *txdata = fp->txdata_ptr[cos];
4537
4538 DP(NETIF_MSG_IFUP,
4539 "allocating tx memory of fp %d cos %d\n",
4540 index, cos);
4541
4542 txdata->tx_buf_ring = kcalloc(NUM_TX_BD,
4543 sizeof(struct sw_tx_bd),
4544 GFP_KERNEL);
4545 if (!txdata->tx_buf_ring)
4546 goto alloc_mem_err;
4547 txdata->tx_desc_ring = BNX2X_PCI_ALLOC(&txdata->tx_desc_mapping,
4548 sizeof(union eth_tx_bd_types) * NUM_TX_BD);
4549 if (!txdata->tx_desc_ring)
4550 goto alloc_mem_err;
4551 }
4552 }
4553
4554
4555 if (!skip_rx_queue(bp, index)) {
4556
4557 bnx2x_fp(bp, index, rx_buf_ring) =
4558 kcalloc(NUM_RX_BD, sizeof(struct sw_rx_bd), GFP_KERNEL);
4559 if (!bnx2x_fp(bp, index, rx_buf_ring))
4560 goto alloc_mem_err;
4561 bnx2x_fp(bp, index, rx_desc_ring) =
4562 BNX2X_PCI_ALLOC(&bnx2x_fp(bp, index, rx_desc_mapping),
4563 sizeof(struct eth_rx_bd) * NUM_RX_BD);
4564 if (!bnx2x_fp(bp, index, rx_desc_ring))
4565 goto alloc_mem_err;
4566
4567
4568 bnx2x_fp(bp, index, rx_comp_ring) =
4569 BNX2X_PCI_FALLOC(&bnx2x_fp(bp, index, rx_comp_mapping),
4570 sizeof(struct eth_fast_path_rx_cqe) * NUM_RCQ_BD);
4571 if (!bnx2x_fp(bp, index, rx_comp_ring))
4572 goto alloc_mem_err;
4573
4574
4575 bnx2x_fp(bp, index, rx_page_ring) =
4576 kcalloc(NUM_RX_SGE, sizeof(struct sw_rx_page),
4577 GFP_KERNEL);
4578 if (!bnx2x_fp(bp, index, rx_page_ring))
4579 goto alloc_mem_err;
4580 bnx2x_fp(bp, index, rx_sge_ring) =
4581 BNX2X_PCI_ALLOC(&bnx2x_fp(bp, index, rx_sge_mapping),
4582 BCM_PAGE_SIZE * NUM_RX_SGE_PAGES);
4583 if (!bnx2x_fp(bp, index, rx_sge_ring))
4584 goto alloc_mem_err;
4585
4586 bnx2x_set_next_page_rx_bd(fp);
4587
4588
4589 bnx2x_set_next_page_rx_cq(fp);
4590
4591
4592 ring_size = bnx2x_alloc_rx_bds(fp, rx_ring_size);
4593 if (ring_size < rx_ring_size)
4594 goto alloc_mem_err;
4595 }
4596
4597 return 0;
4598
4599
4600alloc_mem_err:
4601 BNX2X_ERR("Unable to allocate full memory for queue %d (size %d)\n",
4602 index, ring_size);
4603
4604
4605
4606
4607 if (ring_size < (fp->mode == TPA_MODE_DISABLED ?
4608 MIN_RX_SIZE_NONTPA : MIN_RX_SIZE_TPA)) {
4609
4610 bnx2x_free_fp_mem_at(bp, index);
4611 return -ENOMEM;
4612 }
4613 return 0;
4614}
4615
4616static int bnx2x_alloc_fp_mem_cnic(struct bnx2x *bp)
4617{
4618 if (!NO_FCOE(bp))
4619
4620 if (bnx2x_alloc_fp_mem_at(bp, FCOE_IDX(bp)))
4621
4622
4623
4624 return -ENOMEM;
4625
4626 return 0;
4627}
4628
4629static int bnx2x_alloc_fp_mem(struct bnx2x *bp)
4630{
4631 int i;
4632
4633
4634
4635
4636
4637
4638 if (bnx2x_alloc_fp_mem_at(bp, 0))
4639 return -ENOMEM;
4640
4641
4642 for_each_nondefault_eth_queue(bp, i)
4643 if (bnx2x_alloc_fp_mem_at(bp, i))
4644 break;
4645
4646
4647 if (i != BNX2X_NUM_ETH_QUEUES(bp)) {
4648 int delta = BNX2X_NUM_ETH_QUEUES(bp) - i;
4649
4650 WARN_ON(delta < 0);
4651 bnx2x_shrink_eth_fp(bp, delta);
4652 if (CNIC_SUPPORT(bp))
4653
4654
4655
4656
4657
4658
4659 bnx2x_move_fp(bp, FCOE_IDX(bp), FCOE_IDX(bp) - delta);
4660 bp->num_ethernet_queues -= delta;
4661 bp->num_queues = bp->num_ethernet_queues +
4662 bp->num_cnic_queues;
4663 BNX2X_ERR("Adjusted num of queues from %d to %d\n",
4664 bp->num_queues + delta, bp->num_queues);
4665 }
4666
4667 return 0;
4668}
4669
4670void bnx2x_free_mem_bp(struct bnx2x *bp)
4671{
4672 int i;
4673
4674 for (i = 0; i < bp->fp_array_size; i++)
4675 kfree(bp->fp[i].tpa_info);
4676 kfree(bp->fp);
4677 kfree(bp->sp_objs);
4678 kfree(bp->fp_stats);
4679 kfree(bp->bnx2x_txq);
4680 kfree(bp->msix_table);
4681 kfree(bp->ilt);
4682}
4683
4684int bnx2x_alloc_mem_bp(struct bnx2x *bp)
4685{
4686 struct bnx2x_fastpath *fp;
4687 struct msix_entry *tbl;
4688 struct bnx2x_ilt *ilt;
4689 int msix_table_size = 0;
4690 int fp_array_size, txq_array_size;
4691 int i;
4692
4693
4694
4695
4696
4697 msix_table_size = bp->igu_sb_cnt;
4698 if (IS_PF(bp))
4699 msix_table_size++;
4700 BNX2X_DEV_INFO("msix_table_size %d\n", msix_table_size);
4701
4702
4703 fp_array_size = BNX2X_MAX_RSS_COUNT(bp) + CNIC_SUPPORT(bp);
4704 bp->fp_array_size = fp_array_size;
4705 BNX2X_DEV_INFO("fp_array_size %d\n", bp->fp_array_size);
4706
4707 fp = kcalloc(bp->fp_array_size, sizeof(*fp), GFP_KERNEL);
4708 if (!fp)
4709 goto alloc_err;
4710 for (i = 0; i < bp->fp_array_size; i++) {
4711 fp[i].tpa_info =
4712 kcalloc(ETH_MAX_AGGREGATION_QUEUES_E1H_E2,
4713 sizeof(struct bnx2x_agg_info), GFP_KERNEL);
4714 if (!(fp[i].tpa_info))
4715 goto alloc_err;
4716 }
4717
4718 bp->fp = fp;
4719
4720
4721 bp->sp_objs = kcalloc(bp->fp_array_size, sizeof(struct bnx2x_sp_objs),
4722 GFP_KERNEL);
4723 if (!bp->sp_objs)
4724 goto alloc_err;
4725
4726
4727 bp->fp_stats = kcalloc(bp->fp_array_size, sizeof(struct bnx2x_fp_stats),
4728 GFP_KERNEL);
4729 if (!bp->fp_stats)
4730 goto alloc_err;
4731
4732
4733 txq_array_size =
4734 BNX2X_MAX_RSS_COUNT(bp) * BNX2X_MULTI_TX_COS + CNIC_SUPPORT(bp);
4735 BNX2X_DEV_INFO("txq_array_size %d", txq_array_size);
4736
4737 bp->bnx2x_txq = kcalloc(txq_array_size, sizeof(struct bnx2x_fp_txdata),
4738 GFP_KERNEL);
4739 if (!bp->bnx2x_txq)
4740 goto alloc_err;
4741
4742
4743 tbl = kcalloc(msix_table_size, sizeof(*tbl), GFP_KERNEL);
4744 if (!tbl)
4745 goto alloc_err;
4746 bp->msix_table = tbl;
4747
4748
4749 ilt = kzalloc(sizeof(*ilt), GFP_KERNEL);
4750 if (!ilt)
4751 goto alloc_err;
4752 bp->ilt = ilt;
4753
4754 return 0;
4755alloc_err:
4756 bnx2x_free_mem_bp(bp);
4757 return -ENOMEM;
4758}
4759
4760int bnx2x_reload_if_running(struct net_device *dev)
4761{
4762 struct bnx2x *bp = netdev_priv(dev);
4763
4764 if (unlikely(!netif_running(dev)))
4765 return 0;
4766
4767 bnx2x_nic_unload(bp, UNLOAD_NORMAL, true);
4768 return bnx2x_nic_load(bp, LOAD_NORMAL);
4769}
4770
4771int bnx2x_get_cur_phy_idx(struct bnx2x *bp)
4772{
4773 u32 sel_phy_idx = 0;
4774 if (bp->link_params.num_phys <= 1)
4775 return INT_PHY;
4776
4777 if (bp->link_vars.link_up) {
4778 sel_phy_idx = EXT_PHY1;
4779
4780 if ((bp->link_vars.link_status & LINK_STATUS_SERDES_LINK) &&
4781 (bp->link_params.phy[EXT_PHY2].supported & SUPPORTED_FIBRE))
4782 sel_phy_idx = EXT_PHY2;
4783 } else {
4784
4785 switch (bnx2x_phy_selection(&bp->link_params)) {
4786 case PORT_HW_CFG_PHY_SELECTION_HARDWARE_DEFAULT:
4787 case PORT_HW_CFG_PHY_SELECTION_FIRST_PHY:
4788 case PORT_HW_CFG_PHY_SELECTION_FIRST_PHY_PRIORITY:
4789 sel_phy_idx = EXT_PHY1;
4790 break;
4791 case PORT_HW_CFG_PHY_SELECTION_SECOND_PHY:
4792 case PORT_HW_CFG_PHY_SELECTION_SECOND_PHY_PRIORITY:
4793 sel_phy_idx = EXT_PHY2;
4794 break;
4795 }
4796 }
4797
4798 return sel_phy_idx;
4799}
4800int bnx2x_get_link_cfg_idx(struct bnx2x *bp)
4801{
4802 u32 sel_phy_idx = bnx2x_get_cur_phy_idx(bp);
4803
4804
4805
4806
4807
4808
4809 if (bp->link_params.multi_phy_config &
4810 PORT_HW_CFG_PHY_SWAPPED_ENABLED) {
4811 if (sel_phy_idx == EXT_PHY1)
4812 sel_phy_idx = EXT_PHY2;
4813 else if (sel_phy_idx == EXT_PHY2)
4814 sel_phy_idx = EXT_PHY1;
4815 }
4816 return LINK_CONFIG_IDX(sel_phy_idx);
4817}
4818
4819#ifdef NETDEV_FCOE_WWNN
4820int bnx2x_fcoe_get_wwn(struct net_device *dev, u64 *wwn, int type)
4821{
4822 struct bnx2x *bp = netdev_priv(dev);
4823 struct cnic_eth_dev *cp = &bp->cnic_eth_dev;
4824
4825 switch (type) {
4826 case NETDEV_FCOE_WWNN:
4827 *wwn = HILO_U64(cp->fcoe_wwn_node_name_hi,
4828 cp->fcoe_wwn_node_name_lo);
4829 break;
4830 case NETDEV_FCOE_WWPN:
4831 *wwn = HILO_U64(cp->fcoe_wwn_port_name_hi,
4832 cp->fcoe_wwn_port_name_lo);
4833 break;
4834 default:
4835 BNX2X_ERR("Wrong WWN type requested - %d\n", type);
4836 return -EINVAL;
4837 }
4838
4839 return 0;
4840}
4841#endif
4842
4843
4844int bnx2x_change_mtu(struct net_device *dev, int new_mtu)
4845{
4846 struct bnx2x *bp = netdev_priv(dev);
4847
4848 if (pci_num_vf(bp->pdev)) {
4849 DP(BNX2X_MSG_IOV, "VFs are enabled, can not change MTU\n");
4850 return -EPERM;
4851 }
4852
4853 if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
4854 BNX2X_ERR("Can't perform change MTU during parity recovery\n");
4855 return -EAGAIN;
4856 }
4857
4858 if ((new_mtu > ETH_MAX_JUMBO_PACKET_SIZE) ||
4859 ((new_mtu + ETH_HLEN) < ETH_MIN_PACKET_SIZE)) {
4860 BNX2X_ERR("Can't support requested MTU size\n");
4861 return -EINVAL;
4862 }
4863
4864
4865
4866
4867
4868 dev->mtu = new_mtu;
4869
4870 if (IS_PF(bp) && SHMEM2_HAS(bp, curr_cfg))
4871 SHMEM2_WR(bp, curr_cfg, CURR_CFG_MET_OS);
4872
4873 return bnx2x_reload_if_running(dev);
4874}
4875
4876netdev_features_t bnx2x_fix_features(struct net_device *dev,
4877 netdev_features_t features)
4878{
4879 struct bnx2x *bp = netdev_priv(dev);
4880
4881 if (pci_num_vf(bp->pdev)) {
4882 netdev_features_t changed = dev->features ^ features;
4883
4884
4885
4886
4887 if (!(features & NETIF_F_RXCSUM) && !bp->disable_tpa) {
4888 features &= ~NETIF_F_RXCSUM;
4889 features |= dev->features & NETIF_F_RXCSUM;
4890 }
4891
4892 if (changed & NETIF_F_LOOPBACK) {
4893 features &= ~NETIF_F_LOOPBACK;
4894 features |= dev->features & NETIF_F_LOOPBACK;
4895 }
4896 }
4897
4898
4899 if (!(features & NETIF_F_RXCSUM)) {
4900 features &= ~NETIF_F_LRO;
4901 features &= ~NETIF_F_GRO;
4902 }
4903
4904 return features;
4905}
4906
4907int bnx2x_set_features(struct net_device *dev, netdev_features_t features)
4908{
4909 struct bnx2x *bp = netdev_priv(dev);
4910 netdev_features_t changes = features ^ dev->features;
4911 bool bnx2x_reload = false;
4912 int rc;
4913
4914
4915 if (!pci_num_vf(bp->pdev)) {
4916 if (features & NETIF_F_LOOPBACK) {
4917 if (bp->link_params.loopback_mode != LOOPBACK_BMAC) {
4918 bp->link_params.loopback_mode = LOOPBACK_BMAC;
4919 bnx2x_reload = true;
4920 }
4921 } else {
4922 if (bp->link_params.loopback_mode != LOOPBACK_NONE) {
4923 bp->link_params.loopback_mode = LOOPBACK_NONE;
4924 bnx2x_reload = true;
4925 }
4926 }
4927 }
4928
4929
4930 if ((changes & NETIF_F_GRO) && (features & NETIF_F_LRO))
4931 changes &= ~NETIF_F_GRO;
4932
4933
4934 if ((changes & NETIF_F_GRO) && bp->disable_tpa)
4935 changes &= ~NETIF_F_GRO;
4936
4937 if (changes)
4938 bnx2x_reload = true;
4939
4940 if (bnx2x_reload) {
4941 if (bp->recovery_state == BNX2X_RECOVERY_DONE) {
4942 dev->features = features;
4943 rc = bnx2x_reload_if_running(dev);
4944 return rc ? rc : 1;
4945 }
4946
4947 }
4948
4949 return 0;
4950}
4951
4952void bnx2x_tx_timeout(struct net_device *dev)
4953{
4954 struct bnx2x *bp = netdev_priv(dev);
4955
4956#ifdef BNX2X_STOP_ON_ERROR
4957 if (!bp->panic)
4958 bnx2x_panic();
4959#endif
4960
4961
4962 bnx2x_schedule_sp_rtnl(bp, BNX2X_SP_RTNL_TX_TIMEOUT, 0);
4963}
4964
4965int bnx2x_suspend(struct pci_dev *pdev, pm_message_t state)
4966{
4967 struct net_device *dev = pci_get_drvdata(pdev);
4968 struct bnx2x *bp;
4969
4970 if (!dev) {
4971 dev_err(&pdev->dev, "BAD net device from bnx2x_init_one\n");
4972 return -ENODEV;
4973 }
4974 bp = netdev_priv(dev);
4975
4976 rtnl_lock();
4977
4978 pci_save_state(pdev);
4979
4980 if (!netif_running(dev)) {
4981 rtnl_unlock();
4982 return 0;
4983 }
4984
4985 netif_device_detach(dev);
4986
4987 bnx2x_nic_unload(bp, UNLOAD_CLOSE, false);
4988
4989 bnx2x_set_power_state(bp, pci_choose_state(pdev, state));
4990
4991 rtnl_unlock();
4992
4993 return 0;
4994}
4995
4996int bnx2x_resume(struct pci_dev *pdev)
4997{
4998 struct net_device *dev = pci_get_drvdata(pdev);
4999 struct bnx2x *bp;
5000 int rc;
5001
5002 if (!dev) {
5003 dev_err(&pdev->dev, "BAD net device from bnx2x_init_one\n");
5004 return -ENODEV;
5005 }
5006 bp = netdev_priv(dev);
5007
5008 if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
5009 BNX2X_ERR("Handling parity error recovery. Try again later\n");
5010 return -EAGAIN;
5011 }
5012
5013 rtnl_lock();
5014
5015 pci_restore_state(pdev);
5016
5017 if (!netif_running(dev)) {
5018 rtnl_unlock();
5019 return 0;
5020 }
5021
5022 bnx2x_set_power_state(bp, PCI_D0);
5023 netif_device_attach(dev);
5024
5025 rc = bnx2x_nic_load(bp, LOAD_OPEN);
5026
5027 rtnl_unlock();
5028
5029 return rc;
5030}
5031
5032void bnx2x_set_ctx_validation(struct bnx2x *bp, struct eth_context *cxt,
5033 u32 cid)
5034{
5035 if (!cxt) {
5036 BNX2X_ERR("bad context pointer %p\n", cxt);
5037 return;
5038 }
5039
5040
5041 cxt->ustorm_ag_context.cdu_usage =
5042 CDU_RSRVD_VALUE_TYPE_A(HW_CID(bp, cid),
5043 CDU_REGION_NUMBER_UCM_AG, ETH_CONNECTION_TYPE);
5044
5045 cxt->xstorm_ag_context.cdu_reserved =
5046 CDU_RSRVD_VALUE_TYPE_A(HW_CID(bp, cid),
5047 CDU_REGION_NUMBER_XCM_AG, ETH_CONNECTION_TYPE);
5048}
5049
5050static void storm_memset_hc_timeout(struct bnx2x *bp, u8 port,
5051 u8 fw_sb_id, u8 sb_index,
5052 u8 ticks)
5053{
5054 u32 addr = BAR_CSTRORM_INTMEM +
5055 CSTORM_STATUS_BLOCK_DATA_TIMEOUT_OFFSET(fw_sb_id, sb_index);
5056 REG_WR8(bp, addr, ticks);
5057 DP(NETIF_MSG_IFUP,
5058 "port %x fw_sb_id %d sb_index %d ticks %d\n",
5059 port, fw_sb_id, sb_index, ticks);
5060}
5061
5062static void storm_memset_hc_disable(struct bnx2x *bp, u8 port,
5063 u16 fw_sb_id, u8 sb_index,
5064 u8 disable)
5065{
5066 u32 enable_flag = disable ? 0 : (1 << HC_INDEX_DATA_HC_ENABLED_SHIFT);
5067 u32 addr = BAR_CSTRORM_INTMEM +
5068 CSTORM_STATUS_BLOCK_DATA_FLAGS_OFFSET(fw_sb_id, sb_index);
5069 u8 flags = REG_RD8(bp, addr);
5070
5071 flags &= ~HC_INDEX_DATA_HC_ENABLED;
5072 flags |= enable_flag;
5073 REG_WR8(bp, addr, flags);
5074 DP(NETIF_MSG_IFUP,
5075 "port %x fw_sb_id %d sb_index %d disable %d\n",
5076 port, fw_sb_id, sb_index, disable);
5077}
5078
5079void bnx2x_update_coalesce_sb_index(struct bnx2x *bp, u8 fw_sb_id,
5080 u8 sb_index, u8 disable, u16 usec)
5081{
5082 int port = BP_PORT(bp);
5083 u8 ticks = usec / BNX2X_BTR;
5084
5085 storm_memset_hc_timeout(bp, port, fw_sb_id, sb_index, ticks);
5086
5087 disable = disable ? 1 : (usec ? 0 : 1);
5088 storm_memset_hc_disable(bp, port, fw_sb_id, sb_index, disable);
5089}
5090
5091void bnx2x_schedule_sp_rtnl(struct bnx2x *bp, enum sp_rtnl_flag flag,
5092 u32 verbose)
5093{
5094 smp_mb__before_atomic();
5095 set_bit(flag, &bp->sp_rtnl_state);
5096 smp_mb__after_atomic();
5097 DP((BNX2X_MSG_SP | verbose), "Scheduling sp_rtnl task [Flag: %d]\n",
5098 flag);
5099 schedule_delayed_work(&bp->sp_rtnl_task, 0);
5100}
5101