blob: 882beafeb74c88b0f1536b73051ab543c9e32b16 [file] [log] [blame]
Divy Le Ray4d22de32007-01-18 22:04:14 -05001/*
Divy Le Raya02d44a2008-10-13 18:47:30 -07002 * Copyright (c) 2005-2008 Chelsio, Inc. All rights reserved.
Divy Le Ray4d22de32007-01-18 22:04:14 -05003 *
Divy Le Ray1d68e932007-01-30 19:44:35 -08004 * This software is available to you under a choice of one of two
5 * licenses. You may choose to be licensed under the terms of the GNU
6 * General Public License (GPL) Version 2, available from the file
7 * COPYING in the main directory of this source tree, or the
8 * OpenIB.org BSD license below:
Divy Le Ray4d22de32007-01-18 22:04:14 -05009 *
Divy Le Ray1d68e932007-01-30 19:44:35 -080010 * Redistribution and use in source and binary forms, with or
11 * without modification, are permitted provided that the following
12 * conditions are met:
13 *
14 * - Redistributions of source code must retain the above
15 * copyright notice, this list of conditions and the following
16 * disclaimer.
17 *
18 * - Redistributions in binary form must reproduce the above
19 * copyright notice, this list of conditions and the following
20 * disclaimer in the documentation and/or other materials
21 * provided with the distribution.
22 *
23 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
24 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
26 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
27 * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28 * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
30 * SOFTWARE.
Divy Le Ray4d22de32007-01-18 22:04:14 -050031 */
Divy Le Ray4d22de32007-01-18 22:04:14 -050032#include <linux/skbuff.h>
33#include <linux/netdevice.h>
34#include <linux/etherdevice.h>
35#include <linux/if_vlan.h>
36#include <linux/ip.h>
37#include <linux/tcp.h>
38#include <linux/dma-mapping.h>
Karen Xiea109a5b2008-12-18 22:56:20 -080039#include <net/arp.h>
Divy Le Ray4d22de32007-01-18 22:04:14 -050040#include "common.h"
41#include "regs.h"
42#include "sge_defs.h"
43#include "t3_cpl.h"
44#include "firmware_exports.h"
45
46#define USE_GTS 0
47
48#define SGE_RX_SM_BUF_SIZE 1536
Divy Le Raye0994eb2007-02-24 16:44:17 -080049
Divy Le Ray4d22de32007-01-18 22:04:14 -050050#define SGE_RX_COPY_THRES 256
Divy Le Raycf992af2007-05-30 21:10:47 -070051#define SGE_RX_PULL_LEN 128
Divy Le Ray4d22de32007-01-18 22:04:14 -050052
Divy Le Raye0994eb2007-02-24 16:44:17 -080053/*
Divy Le Raycf992af2007-05-30 21:10:47 -070054 * Page chunk size for FL0 buffers if FL0 is to be populated with page chunks.
55 * It must be a divisor of PAGE_SIZE. If set to 0 FL0 will use sk_buffs
56 * directly.
Divy Le Raye0994eb2007-02-24 16:44:17 -080057 */
Divy Le Raycf992af2007-05-30 21:10:47 -070058#define FL0_PG_CHUNK_SIZE 2048
Divy Le Ray7385ecf2008-05-21 18:56:21 -070059#define FL0_PG_ORDER 0
60#define FL1_PG_CHUNK_SIZE (PAGE_SIZE > 8192 ? 16384 : 8192)
61#define FL1_PG_ORDER (PAGE_SIZE > 8192 ? 0 : 1)
Divy Le Raycf992af2007-05-30 21:10:47 -070062
Divy Le Raye0994eb2007-02-24 16:44:17 -080063#define SGE_RX_DROP_THRES 16
Divy Le Ray4d22de32007-01-18 22:04:14 -050064
65/*
Divy Le Ray26b38712009-03-12 21:13:43 +000066 * Max number of Rx buffers we replenish at a time.
67 */
68#define MAX_RX_REFILL 16U
69/*
Divy Le Ray4d22de32007-01-18 22:04:14 -050070 * Period of the Tx buffer reclaim timer. This timer does not need to run
71 * frequently as Tx buffers are usually reclaimed by new Tx packets.
72 */
73#define TX_RECLAIM_PERIOD (HZ / 4)
74
75/* WR size in bytes */
76#define WR_LEN (WR_FLITS * 8)
77
78/*
79 * Types of Tx queues in each queue set. Order here matters, do not change.
80 */
81enum { TXQ_ETH, TXQ_OFLD, TXQ_CTRL };
82
83/* Values for sge_txq.flags */
84enum {
85 TXQ_RUNNING = 1 << 0, /* fetch engine is running */
86 TXQ_LAST_PKT_DB = 1 << 1, /* last packet rang the doorbell */
87};
88
89struct tx_desc {
Al Virofb8e4442007-08-23 03:04:12 -040090 __be64 flit[TX_DESC_FLITS];
Divy Le Ray4d22de32007-01-18 22:04:14 -050091};
92
93struct rx_desc {
94 __be32 addr_lo;
95 __be32 len_gen;
96 __be32 gen2;
97 __be32 addr_hi;
98};
99
100struct tx_sw_desc { /* SW state per Tx descriptor */
101 struct sk_buff *skb;
Divy Le Ray23561c92007-11-16 11:22:05 -0800102 u8 eop; /* set if last descriptor for packet */
103 u8 addr_idx; /* buffer index of first SGL entry in descriptor */
104 u8 fragidx; /* first page fragment associated with descriptor */
105 s8 sflit; /* start flit of first SGL entry in descriptor */
Divy Le Ray4d22de32007-01-18 22:04:14 -0500106};
107
Divy Le Raycf992af2007-05-30 21:10:47 -0700108struct rx_sw_desc { /* SW state per Rx descriptor */
Divy Le Raye0994eb2007-02-24 16:44:17 -0800109 union {
110 struct sk_buff *skb;
Divy Le Raycf992af2007-05-30 21:10:47 -0700111 struct fl_pg_chunk pg_chunk;
112 };
113 DECLARE_PCI_UNMAP_ADDR(dma_addr);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500114};
115
116struct rsp_desc { /* response queue descriptor */
117 struct rss_header rss_hdr;
118 __be32 flags;
119 __be32 len_cq;
120 u8 imm_data[47];
121 u8 intr_gen;
122};
123
Divy Le Ray4d22de32007-01-18 22:04:14 -0500124/*
Divy Le Ray99d7cf32007-02-24 16:44:06 -0800125 * Holds unmapping information for Tx packets that need deferred unmapping.
126 * This structure lives at skb->head and must be allocated by callers.
127 */
128struct deferred_unmap_info {
129 struct pci_dev *pdev;
130 dma_addr_t addr[MAX_SKB_FRAGS + 1];
131};
132
133/*
Divy Le Ray4d22de32007-01-18 22:04:14 -0500134 * Maps a number of flits to the number of Tx descriptors that can hold them.
135 * The formula is
136 *
137 * desc = 1 + (flits - 2) / (WR_FLITS - 1).
138 *
139 * HW allows up to 4 descriptors to be combined into a WR.
140 */
141static u8 flit_desc_map[] = {
142 0,
143#if SGE_NUM_GENBITS == 1
144 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
145 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
146 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
147 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4
148#elif SGE_NUM_GENBITS == 2
149 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
150 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
151 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
152 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
153#else
154# error "SGE_NUM_GENBITS must be 1 or 2"
155#endif
156};
157
158static inline struct sge_qset *fl_to_qset(const struct sge_fl *q, int qidx)
159{
160 return container_of(q, struct sge_qset, fl[qidx]);
161}
162
163static inline struct sge_qset *rspq_to_qset(const struct sge_rspq *q)
164{
165 return container_of(q, struct sge_qset, rspq);
166}
167
168static inline struct sge_qset *txq_to_qset(const struct sge_txq *q, int qidx)
169{
170 return container_of(q, struct sge_qset, txq[qidx]);
171}
172
173/**
174 * refill_rspq - replenish an SGE response queue
175 * @adapter: the adapter
176 * @q: the response queue to replenish
177 * @credits: how many new responses to make available
178 *
179 * Replenishes a response queue by making the supplied number of responses
180 * available to HW.
181 */
182static inline void refill_rspq(struct adapter *adapter,
183 const struct sge_rspq *q, unsigned int credits)
184{
Divy Le Rayafefce62007-11-16 11:22:21 -0800185 rmb();
Divy Le Ray4d22de32007-01-18 22:04:14 -0500186 t3_write_reg(adapter, A_SG_RSPQ_CREDIT_RETURN,
187 V_RSPQ(q->cntxt_id) | V_CREDITS(credits));
188}
189
190/**
191 * need_skb_unmap - does the platform need unmapping of sk_buffs?
192 *
193 * Returns true if the platfrom needs sk_buff unmapping. The compiler
194 * optimizes away unecessary code if this returns true.
195 */
196static inline int need_skb_unmap(void)
197{
198 /*
199 * This structure is used to tell if the platfrom needs buffer
200 * unmapping by checking if DECLARE_PCI_UNMAP_ADDR defines anything.
201 */
202 struct dummy {
203 DECLARE_PCI_UNMAP_ADDR(addr);
204 };
205
206 return sizeof(struct dummy) != 0;
207}
208
209/**
210 * unmap_skb - unmap a packet main body and its page fragments
211 * @skb: the packet
212 * @q: the Tx queue containing Tx descriptors for the packet
213 * @cidx: index of Tx descriptor
214 * @pdev: the PCI device
215 *
216 * Unmap the main body of an sk_buff and its page fragments, if any.
217 * Because of the fairly complicated structure of our SGLs and the desire
Divy Le Ray23561c92007-11-16 11:22:05 -0800218 * to conserve space for metadata, the information necessary to unmap an
219 * sk_buff is spread across the sk_buff itself (buffer lengths), the HW Tx
220 * descriptors (the physical addresses of the various data buffers), and
221 * the SW descriptor state (assorted indices). The send functions
222 * initialize the indices for the first packet descriptor so we can unmap
223 * the buffers held in the first Tx descriptor here, and we have enough
224 * information at this point to set the state for the next Tx descriptor.
225 *
226 * Note that it is possible to clean up the first descriptor of a packet
227 * before the send routines have written the next descriptors, but this
228 * race does not cause any problem. We just end up writing the unmapping
229 * info for the descriptor first.
Divy Le Ray4d22de32007-01-18 22:04:14 -0500230 */
231static inline void unmap_skb(struct sk_buff *skb, struct sge_txq *q,
232 unsigned int cidx, struct pci_dev *pdev)
233{
234 const struct sg_ent *sgp;
Divy Le Ray23561c92007-11-16 11:22:05 -0800235 struct tx_sw_desc *d = &q->sdesc[cidx];
236 int nfrags, frag_idx, curflit, j = d->addr_idx;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500237
Divy Le Ray23561c92007-11-16 11:22:05 -0800238 sgp = (struct sg_ent *)&q->desc[cidx].flit[d->sflit];
239 frag_idx = d->fragidx;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500240
Divy Le Ray23561c92007-11-16 11:22:05 -0800241 if (frag_idx == 0 && skb_headlen(skb)) {
242 pci_unmap_single(pdev, be64_to_cpu(sgp->addr[0]),
243 skb_headlen(skb), PCI_DMA_TODEVICE);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500244 j = 1;
245 }
246
Divy Le Ray23561c92007-11-16 11:22:05 -0800247 curflit = d->sflit + 1 + j;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500248 nfrags = skb_shinfo(skb)->nr_frags;
249
250 while (frag_idx < nfrags && curflit < WR_FLITS) {
251 pci_unmap_page(pdev, be64_to_cpu(sgp->addr[j]),
252 skb_shinfo(skb)->frags[frag_idx].size,
253 PCI_DMA_TODEVICE);
254 j ^= 1;
255 if (j == 0) {
256 sgp++;
257 curflit++;
258 }
259 curflit++;
260 frag_idx++;
261 }
262
Divy Le Ray23561c92007-11-16 11:22:05 -0800263 if (frag_idx < nfrags) { /* SGL continues into next Tx descriptor */
264 d = cidx + 1 == q->size ? q->sdesc : d + 1;
265 d->fragidx = frag_idx;
266 d->addr_idx = j;
267 d->sflit = curflit - WR_FLITS - j; /* sflit can be -1 */
Divy Le Ray4d22de32007-01-18 22:04:14 -0500268 }
269}
270
271/**
272 * free_tx_desc - reclaims Tx descriptors and their buffers
273 * @adapter: the adapter
274 * @q: the Tx queue to reclaim descriptors from
275 * @n: the number of descriptors to reclaim
276 *
277 * Reclaims Tx descriptors from an SGE Tx queue and frees the associated
278 * Tx buffers. Called with the Tx queue lock held.
279 */
280static void free_tx_desc(struct adapter *adapter, struct sge_txq *q,
281 unsigned int n)
282{
283 struct tx_sw_desc *d;
284 struct pci_dev *pdev = adapter->pdev;
285 unsigned int cidx = q->cidx;
286
Divy Le Ray99d7cf32007-02-24 16:44:06 -0800287 const int need_unmap = need_skb_unmap() &&
288 q->cntxt_id >= FW_TUNNEL_SGEEC_START;
289
Divy Le Ray4d22de32007-01-18 22:04:14 -0500290 d = &q->sdesc[cidx];
291 while (n--) {
292 if (d->skb) { /* an SGL is present */
Divy Le Ray99d7cf32007-02-24 16:44:06 -0800293 if (need_unmap)
Divy Le Ray4d22de32007-01-18 22:04:14 -0500294 unmap_skb(d->skb, q, cidx, pdev);
Divy Le Ray23561c92007-11-16 11:22:05 -0800295 if (d->eop)
Divy Le Ray4d22de32007-01-18 22:04:14 -0500296 kfree_skb(d->skb);
297 }
298 ++d;
299 if (++cidx == q->size) {
300 cidx = 0;
301 d = q->sdesc;
302 }
303 }
304 q->cidx = cidx;
305}
306
307/**
308 * reclaim_completed_tx - reclaims completed Tx descriptors
309 * @adapter: the adapter
310 * @q: the Tx queue to reclaim completed descriptors from
311 *
312 * Reclaims Tx descriptors that the SGE has indicated it has processed,
313 * and frees the associated buffers if possible. Called with the Tx
314 * queue's lock held.
315 */
316static inline void reclaim_completed_tx(struct adapter *adapter,
317 struct sge_txq *q)
318{
319 unsigned int reclaim = q->processed - q->cleaned;
320
321 if (reclaim) {
322 free_tx_desc(adapter, q, reclaim);
323 q->cleaned += reclaim;
324 q->in_use -= reclaim;
325 }
326}
327
328/**
329 * should_restart_tx - are there enough resources to restart a Tx queue?
330 * @q: the Tx queue
331 *
332 * Checks if there are enough descriptors to restart a suspended Tx queue.
333 */
334static inline int should_restart_tx(const struct sge_txq *q)
335{
336 unsigned int r = q->processed - q->cleaned;
337
338 return q->in_use - r < (q->size >> 1);
339}
340
341/**
342 * free_rx_bufs - free the Rx buffers on an SGE free list
343 * @pdev: the PCI device associated with the adapter
344 * @rxq: the SGE free list to clean up
345 *
346 * Release the buffers on an SGE free-buffer Rx queue. HW fetching from
347 * this queue should be stopped before calling this function.
348 */
349static void free_rx_bufs(struct pci_dev *pdev, struct sge_fl *q)
350{
351 unsigned int cidx = q->cidx;
352
353 while (q->credits--) {
354 struct rx_sw_desc *d = &q->sdesc[cidx];
355
356 pci_unmap_single(pdev, pci_unmap_addr(d, dma_addr),
357 q->buf_size, PCI_DMA_FROMDEVICE);
Divy Le Raycf992af2007-05-30 21:10:47 -0700358 if (q->use_pages) {
Divy Le Ray20d3fc12008-10-08 17:36:03 -0700359 if (d->pg_chunk.page)
360 put_page(d->pg_chunk.page);
Divy Le Raycf992af2007-05-30 21:10:47 -0700361 d->pg_chunk.page = NULL;
Divy Le Raye0994eb2007-02-24 16:44:17 -0800362 } else {
Divy Le Raycf992af2007-05-30 21:10:47 -0700363 kfree_skb(d->skb);
364 d->skb = NULL;
Divy Le Raye0994eb2007-02-24 16:44:17 -0800365 }
Divy Le Ray4d22de32007-01-18 22:04:14 -0500366 if (++cidx == q->size)
367 cidx = 0;
368 }
Divy Le Raye0994eb2007-02-24 16:44:17 -0800369
Divy Le Raycf992af2007-05-30 21:10:47 -0700370 if (q->pg_chunk.page) {
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700371 __free_pages(q->pg_chunk.page, q->order);
Divy Le Raycf992af2007-05-30 21:10:47 -0700372 q->pg_chunk.page = NULL;
373 }
Divy Le Ray4d22de32007-01-18 22:04:14 -0500374}
375
376/**
377 * add_one_rx_buf - add a packet buffer to a free-buffer list
Divy Le Raycf992af2007-05-30 21:10:47 -0700378 * @va: buffer start VA
Divy Le Ray4d22de32007-01-18 22:04:14 -0500379 * @len: the buffer length
380 * @d: the HW Rx descriptor to write
381 * @sd: the SW Rx descriptor to write
382 * @gen: the generation bit value
383 * @pdev: the PCI device associated with the adapter
384 *
385 * Add a buffer of the given length to the supplied HW and SW Rx
386 * descriptors.
387 */
Divy Le Rayb1fb1f22008-05-21 18:56:16 -0700388static inline int add_one_rx_buf(void *va, unsigned int len,
389 struct rx_desc *d, struct rx_sw_desc *sd,
390 unsigned int gen, struct pci_dev *pdev)
Divy Le Ray4d22de32007-01-18 22:04:14 -0500391{
392 dma_addr_t mapping;
393
Divy Le Raye0994eb2007-02-24 16:44:17 -0800394 mapping = pci_map_single(pdev, va, len, PCI_DMA_FROMDEVICE);
FUJITA Tomonori8d8bb392008-07-25 19:44:49 -0700395 if (unlikely(pci_dma_mapping_error(pdev, mapping)))
Divy Le Rayb1fb1f22008-05-21 18:56:16 -0700396 return -ENOMEM;
397
Divy Le Ray4d22de32007-01-18 22:04:14 -0500398 pci_unmap_addr_set(sd, dma_addr, mapping);
399
400 d->addr_lo = cpu_to_be32(mapping);
401 d->addr_hi = cpu_to_be32((u64) mapping >> 32);
402 wmb();
403 d->len_gen = cpu_to_be32(V_FLD_GEN1(gen));
404 d->gen2 = cpu_to_be32(V_FLD_GEN2(gen));
Divy Le Rayb1fb1f22008-05-21 18:56:16 -0700405 return 0;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500406}
407
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700408static int alloc_pg_chunk(struct sge_fl *q, struct rx_sw_desc *sd, gfp_t gfp,
409 unsigned int order)
Divy Le Raycf992af2007-05-30 21:10:47 -0700410{
411 if (!q->pg_chunk.page) {
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700412 q->pg_chunk.page = alloc_pages(gfp, order);
Divy Le Raycf992af2007-05-30 21:10:47 -0700413 if (unlikely(!q->pg_chunk.page))
414 return -ENOMEM;
415 q->pg_chunk.va = page_address(q->pg_chunk.page);
416 q->pg_chunk.offset = 0;
417 }
418 sd->pg_chunk = q->pg_chunk;
419
420 q->pg_chunk.offset += q->buf_size;
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700421 if (q->pg_chunk.offset == (PAGE_SIZE << order))
Divy Le Raycf992af2007-05-30 21:10:47 -0700422 q->pg_chunk.page = NULL;
423 else {
424 q->pg_chunk.va += q->buf_size;
425 get_page(q->pg_chunk.page);
426 }
427 return 0;
428}
429
Divy Le Ray26b38712009-03-12 21:13:43 +0000430static inline void ring_fl_db(struct adapter *adap, struct sge_fl *q)
431{
432 if (q->pend_cred >= q->credits / 4) {
433 q->pend_cred = 0;
434 t3_write_reg(adap, A_SG_KDOORBELL, V_EGRCNTX(q->cntxt_id));
435 }
436}
437
Divy Le Ray4d22de32007-01-18 22:04:14 -0500438/**
439 * refill_fl - refill an SGE free-buffer list
440 * @adapter: the adapter
441 * @q: the free-list to refill
442 * @n: the number of new buffers to allocate
443 * @gfp: the gfp flags for allocating new buffers
444 *
445 * (Re)populate an SGE free-buffer list with up to @n new packet buffers,
446 * allocated with the supplied gfp flags. The caller must assure that
447 * @n does not exceed the queue's capacity.
448 */
Divy Le Rayb1fb1f22008-05-21 18:56:16 -0700449static int refill_fl(struct adapter *adap, struct sge_fl *q, int n, gfp_t gfp)
Divy Le Ray4d22de32007-01-18 22:04:14 -0500450{
Divy Le Raycf992af2007-05-30 21:10:47 -0700451 void *buf_start;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500452 struct rx_sw_desc *sd = &q->sdesc[q->pidx];
453 struct rx_desc *d = &q->desc[q->pidx];
Divy Le Rayb1fb1f22008-05-21 18:56:16 -0700454 unsigned int count = 0;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500455
456 while (n--) {
Divy Le Rayb1fb1f22008-05-21 18:56:16 -0700457 int err;
458
Divy Le Raycf992af2007-05-30 21:10:47 -0700459 if (q->use_pages) {
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700460 if (unlikely(alloc_pg_chunk(q, sd, gfp, q->order))) {
Divy Le Raycf992af2007-05-30 21:10:47 -0700461nomem: q->alloc_failed++;
Divy Le Raye0994eb2007-02-24 16:44:17 -0800462 break;
463 }
Divy Le Raycf992af2007-05-30 21:10:47 -0700464 buf_start = sd->pg_chunk.va;
Divy Le Raye0994eb2007-02-24 16:44:17 -0800465 } else {
Divy Le Raycf992af2007-05-30 21:10:47 -0700466 struct sk_buff *skb = alloc_skb(q->buf_size, gfp);
Divy Le Raye0994eb2007-02-24 16:44:17 -0800467
Divy Le Raycf992af2007-05-30 21:10:47 -0700468 if (!skb)
469 goto nomem;
Divy Le Raye0994eb2007-02-24 16:44:17 -0800470
Divy Le Raycf992af2007-05-30 21:10:47 -0700471 sd->skb = skb;
472 buf_start = skb->data;
Divy Le Raye0994eb2007-02-24 16:44:17 -0800473 }
474
Divy Le Rayb1fb1f22008-05-21 18:56:16 -0700475 err = add_one_rx_buf(buf_start, q->buf_size, d, sd, q->gen,
476 adap->pdev);
477 if (unlikely(err)) {
478 if (!q->use_pages) {
479 kfree_skb(sd->skb);
480 sd->skb = NULL;
481 }
482 break;
483 }
484
Divy Le Ray4d22de32007-01-18 22:04:14 -0500485 d++;
486 sd++;
487 if (++q->pidx == q->size) {
488 q->pidx = 0;
489 q->gen ^= 1;
490 sd = q->sdesc;
491 d = q->desc;
492 }
Divy Le Rayb1fb1f22008-05-21 18:56:16 -0700493 count++;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500494 }
Divy Le Ray26b38712009-03-12 21:13:43 +0000495
496 q->credits += count;
497 q->pend_cred += count;
498 ring_fl_db(adap, q);
Divy Le Rayb1fb1f22008-05-21 18:56:16 -0700499
500 return count;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500501}
502
503static inline void __refill_fl(struct adapter *adap, struct sge_fl *fl)
504{
Divy Le Ray26b38712009-03-12 21:13:43 +0000505 refill_fl(adap, fl, min(MAX_RX_REFILL, fl->size - fl->credits),
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700506 GFP_ATOMIC | __GFP_COMP);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500507}
508
509/**
510 * recycle_rx_buf - recycle a receive buffer
511 * @adapter: the adapter
512 * @q: the SGE free list
513 * @idx: index of buffer to recycle
514 *
515 * Recycles the specified buffer on the given free list by adding it at
516 * the next available slot on the list.
517 */
518static void recycle_rx_buf(struct adapter *adap, struct sge_fl *q,
519 unsigned int idx)
520{
521 struct rx_desc *from = &q->desc[idx];
522 struct rx_desc *to = &q->desc[q->pidx];
523
Divy Le Raycf992af2007-05-30 21:10:47 -0700524 q->sdesc[q->pidx] = q->sdesc[idx];
Divy Le Ray4d22de32007-01-18 22:04:14 -0500525 to->addr_lo = from->addr_lo; /* already big endian */
526 to->addr_hi = from->addr_hi; /* likewise */
527 wmb();
528 to->len_gen = cpu_to_be32(V_FLD_GEN1(q->gen));
529 to->gen2 = cpu_to_be32(V_FLD_GEN2(q->gen));
Divy Le Ray4d22de32007-01-18 22:04:14 -0500530
531 if (++q->pidx == q->size) {
532 q->pidx = 0;
533 q->gen ^= 1;
534 }
Divy Le Ray26b38712009-03-12 21:13:43 +0000535
536 q->credits++;
537 q->pend_cred++;
538 ring_fl_db(adap, q);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500539}
540
541/**
542 * alloc_ring - allocate resources for an SGE descriptor ring
543 * @pdev: the PCI device
544 * @nelem: the number of descriptors
545 * @elem_size: the size of each descriptor
546 * @sw_size: the size of the SW state associated with each ring element
547 * @phys: the physical address of the allocated ring
548 * @metadata: address of the array holding the SW state for the ring
549 *
550 * Allocates resources for an SGE descriptor ring, such as Tx queues,
551 * free buffer lists, or response queues. Each SGE ring requires
552 * space for its HW descriptors plus, optionally, space for the SW state
553 * associated with each HW entry (the metadata). The function returns
554 * three values: the virtual address for the HW ring (the return value
555 * of the function), the physical address of the HW ring, and the address
556 * of the SW ring.
557 */
558static void *alloc_ring(struct pci_dev *pdev, size_t nelem, size_t elem_size,
Divy Le Raye0994eb2007-02-24 16:44:17 -0800559 size_t sw_size, dma_addr_t * phys, void *metadata)
Divy Le Ray4d22de32007-01-18 22:04:14 -0500560{
561 size_t len = nelem * elem_size;
562 void *s = NULL;
563 void *p = dma_alloc_coherent(&pdev->dev, len, phys, GFP_KERNEL);
564
565 if (!p)
566 return NULL;
Divy Le Ray52565542008-11-26 15:35:59 -0800567 if (sw_size && metadata) {
Divy Le Ray4d22de32007-01-18 22:04:14 -0500568 s = kcalloc(nelem, sw_size, GFP_KERNEL);
569
570 if (!s) {
571 dma_free_coherent(&pdev->dev, len, p, *phys);
572 return NULL;
573 }
Divy Le Ray4d22de32007-01-18 22:04:14 -0500574 *(void **)metadata = s;
Divy Le Ray52565542008-11-26 15:35:59 -0800575 }
Divy Le Ray4d22de32007-01-18 22:04:14 -0500576 memset(p, 0, len);
577 return p;
578}
579
580/**
Divy Le Ray204e2f92008-05-06 19:26:01 -0700581 * t3_reset_qset - reset a sge qset
582 * @q: the queue set
583 *
584 * Reset the qset structure.
585 * the NAPI structure is preserved in the event of
586 * the qset's reincarnation, for example during EEH recovery.
587 */
588static void t3_reset_qset(struct sge_qset *q)
589{
590 if (q->adap &&
591 !(q->adap->flags & NAPI_INIT)) {
592 memset(q, 0, sizeof(*q));
593 return;
594 }
595
596 q->adap = NULL;
597 memset(&q->rspq, 0, sizeof(q->rspq));
598 memset(q->fl, 0, sizeof(struct sge_fl) * SGE_RXQ_PER_SET);
599 memset(q->txq, 0, sizeof(struct sge_txq) * SGE_TXQ_PER_SET);
600 q->txq_stopped = 0;
Divy Le Ray20d3fc12008-10-08 17:36:03 -0700601 q->tx_reclaim_timer.function = NULL; /* for t3_stop_sge_timers() */
Herbert Xu7be2df42009-01-21 14:39:13 -0800602 q->lro_frag_tbl.nr_frags = q->lro_frag_tbl.len = 0;
Divy Le Ray204e2f92008-05-06 19:26:01 -0700603}
604
605
606/**
Divy Le Ray4d22de32007-01-18 22:04:14 -0500607 * free_qset - free the resources of an SGE queue set
608 * @adapter: the adapter owning the queue set
609 * @q: the queue set
610 *
611 * Release the HW and SW resources associated with an SGE queue set, such
612 * as HW contexts, packet buffers, and descriptor rings. Traffic to the
613 * queue set must be quiesced prior to calling this.
614 */
Stephen Hemminger9265fab2007-10-08 16:22:29 -0700615static void t3_free_qset(struct adapter *adapter, struct sge_qset *q)
Divy Le Ray4d22de32007-01-18 22:04:14 -0500616{
617 int i;
618 struct pci_dev *pdev = adapter->pdev;
619
Divy Le Ray4d22de32007-01-18 22:04:14 -0500620 for (i = 0; i < SGE_RXQ_PER_SET; ++i)
621 if (q->fl[i].desc) {
Roland Dreierb1186de2008-03-20 13:30:48 -0700622 spin_lock_irq(&adapter->sge.reg_lock);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500623 t3_sge_disable_fl(adapter, q->fl[i].cntxt_id);
Roland Dreierb1186de2008-03-20 13:30:48 -0700624 spin_unlock_irq(&adapter->sge.reg_lock);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500625 free_rx_bufs(pdev, &q->fl[i]);
626 kfree(q->fl[i].sdesc);
627 dma_free_coherent(&pdev->dev,
628 q->fl[i].size *
629 sizeof(struct rx_desc), q->fl[i].desc,
630 q->fl[i].phys_addr);
631 }
632
633 for (i = 0; i < SGE_TXQ_PER_SET; ++i)
634 if (q->txq[i].desc) {
Roland Dreierb1186de2008-03-20 13:30:48 -0700635 spin_lock_irq(&adapter->sge.reg_lock);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500636 t3_sge_enable_ecntxt(adapter, q->txq[i].cntxt_id, 0);
Roland Dreierb1186de2008-03-20 13:30:48 -0700637 spin_unlock_irq(&adapter->sge.reg_lock);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500638 if (q->txq[i].sdesc) {
639 free_tx_desc(adapter, &q->txq[i],
640 q->txq[i].in_use);
641 kfree(q->txq[i].sdesc);
642 }
643 dma_free_coherent(&pdev->dev,
644 q->txq[i].size *
645 sizeof(struct tx_desc),
646 q->txq[i].desc, q->txq[i].phys_addr);
647 __skb_queue_purge(&q->txq[i].sendq);
648 }
649
650 if (q->rspq.desc) {
Roland Dreierb1186de2008-03-20 13:30:48 -0700651 spin_lock_irq(&adapter->sge.reg_lock);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500652 t3_sge_disable_rspcntxt(adapter, q->rspq.cntxt_id);
Roland Dreierb1186de2008-03-20 13:30:48 -0700653 spin_unlock_irq(&adapter->sge.reg_lock);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500654 dma_free_coherent(&pdev->dev,
655 q->rspq.size * sizeof(struct rsp_desc),
656 q->rspq.desc, q->rspq.phys_addr);
657 }
658
Divy Le Ray204e2f92008-05-06 19:26:01 -0700659 t3_reset_qset(q);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500660}
661
662/**
663 * init_qset_cntxt - initialize an SGE queue set context info
664 * @qs: the queue set
665 * @id: the queue set id
666 *
667 * Initializes the TIDs and context ids for the queues of a queue set.
668 */
669static void init_qset_cntxt(struct sge_qset *qs, unsigned int id)
670{
671 qs->rspq.cntxt_id = id;
672 qs->fl[0].cntxt_id = 2 * id;
673 qs->fl[1].cntxt_id = 2 * id + 1;
674 qs->txq[TXQ_ETH].cntxt_id = FW_TUNNEL_SGEEC_START + id;
675 qs->txq[TXQ_ETH].token = FW_TUNNEL_TID_START + id;
676 qs->txq[TXQ_OFLD].cntxt_id = FW_OFLD_SGEEC_START + id;
677 qs->txq[TXQ_CTRL].cntxt_id = FW_CTRL_SGEEC_START + id;
678 qs->txq[TXQ_CTRL].token = FW_CTRL_TID_START + id;
679}
680
681/**
682 * sgl_len - calculates the size of an SGL of the given capacity
683 * @n: the number of SGL entries
684 *
685 * Calculates the number of flits needed for a scatter/gather list that
686 * can hold the given number of entries.
687 */
688static inline unsigned int sgl_len(unsigned int n)
689{
690 /* alternatively: 3 * (n / 2) + 2 * (n & 1) */
691 return (3 * n) / 2 + (n & 1);
692}
693
694/**
695 * flits_to_desc - returns the num of Tx descriptors for the given flits
696 * @n: the number of flits
697 *
698 * Calculates the number of Tx descriptors needed for the supplied number
699 * of flits.
700 */
701static inline unsigned int flits_to_desc(unsigned int n)
702{
703 BUG_ON(n >= ARRAY_SIZE(flit_desc_map));
704 return flit_desc_map[n];
705}
706
707/**
Divy Le Raycf992af2007-05-30 21:10:47 -0700708 * get_packet - return the next ingress packet buffer from a free list
709 * @adap: the adapter that received the packet
710 * @fl: the SGE free list holding the packet
711 * @len: the packet length including any SGE padding
712 * @drop_thres: # of remaining buffers before we start dropping packets
713 *
714 * Get the next packet from a free list and complete setup of the
715 * sk_buff. If the packet is small we make a copy and recycle the
716 * original buffer, otherwise we use the original buffer itself. If a
717 * positive drop threshold is supplied packets are dropped and their
718 * buffers recycled if (a) the number of remaining buffers is under the
719 * threshold and the packet is too big to copy, or (b) the packet should
720 * be copied but there is no memory for the copy.
721 */
722static struct sk_buff *get_packet(struct adapter *adap, struct sge_fl *fl,
723 unsigned int len, unsigned int drop_thres)
724{
725 struct sk_buff *skb = NULL;
726 struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
727
728 prefetch(sd->skb->data);
729 fl->credits--;
730
731 if (len <= SGE_RX_COPY_THRES) {
732 skb = alloc_skb(len, GFP_ATOMIC);
733 if (likely(skb != NULL)) {
734 __skb_put(skb, len);
735 pci_dma_sync_single_for_cpu(adap->pdev,
736 pci_unmap_addr(sd, dma_addr), len,
737 PCI_DMA_FROMDEVICE);
738 memcpy(skb->data, sd->skb->data, len);
739 pci_dma_sync_single_for_device(adap->pdev,
740 pci_unmap_addr(sd, dma_addr), len,
741 PCI_DMA_FROMDEVICE);
742 } else if (!drop_thres)
743 goto use_orig_buf;
744recycle:
745 recycle_rx_buf(adap, fl, fl->cidx);
746 return skb;
747 }
748
Divy Le Ray26b38712009-03-12 21:13:43 +0000749 if (unlikely(fl->credits < drop_thres) &&
750 refill_fl(adap, fl, min(MAX_RX_REFILL, fl->size - fl->credits - 1),
751 GFP_ATOMIC | __GFP_COMP) == 0)
Divy Le Raycf992af2007-05-30 21:10:47 -0700752 goto recycle;
753
754use_orig_buf:
755 pci_unmap_single(adap->pdev, pci_unmap_addr(sd, dma_addr),
756 fl->buf_size, PCI_DMA_FROMDEVICE);
757 skb = sd->skb;
758 skb_put(skb, len);
759 __refill_fl(adap, fl);
760 return skb;
761}
762
763/**
764 * get_packet_pg - return the next ingress packet buffer from a free list
765 * @adap: the adapter that received the packet
766 * @fl: the SGE free list holding the packet
767 * @len: the packet length including any SGE padding
768 * @drop_thres: # of remaining buffers before we start dropping packets
769 *
770 * Get the next packet from a free list populated with page chunks.
771 * If the packet is small we make a copy and recycle the original buffer,
772 * otherwise we attach the original buffer as a page fragment to a fresh
773 * sk_buff. If a positive drop threshold is supplied packets are dropped
774 * and their buffers recycled if (a) the number of remaining buffers is
775 * under the threshold and the packet is too big to copy, or (b) there's
776 * no system memory.
777 *
778 * Note: this function is similar to @get_packet but deals with Rx buffers
779 * that are page chunks rather than sk_buffs.
780 */
781static struct sk_buff *get_packet_pg(struct adapter *adap, struct sge_fl *fl,
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700782 struct sge_rspq *q, unsigned int len,
783 unsigned int drop_thres)
Divy Le Raycf992af2007-05-30 21:10:47 -0700784{
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700785 struct sk_buff *newskb, *skb;
Divy Le Raycf992af2007-05-30 21:10:47 -0700786 struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
787
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700788 newskb = skb = q->pg_skb;
789
790 if (!skb && (len <= SGE_RX_COPY_THRES)) {
791 newskb = alloc_skb(len, GFP_ATOMIC);
792 if (likely(newskb != NULL)) {
793 __skb_put(newskb, len);
Divy Le Raycf992af2007-05-30 21:10:47 -0700794 pci_dma_sync_single_for_cpu(adap->pdev,
795 pci_unmap_addr(sd, dma_addr), len,
796 PCI_DMA_FROMDEVICE);
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700797 memcpy(newskb->data, sd->pg_chunk.va, len);
Divy Le Raycf992af2007-05-30 21:10:47 -0700798 pci_dma_sync_single_for_device(adap->pdev,
799 pci_unmap_addr(sd, dma_addr), len,
800 PCI_DMA_FROMDEVICE);
801 } else if (!drop_thres)
802 return NULL;
803recycle:
804 fl->credits--;
805 recycle_rx_buf(adap, fl, fl->cidx);
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700806 q->rx_recycle_buf++;
807 return newskb;
Divy Le Raycf992af2007-05-30 21:10:47 -0700808 }
809
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700810 if (unlikely(q->rx_recycle_buf || (!skb && fl->credits <= drop_thres)))
Divy Le Raycf992af2007-05-30 21:10:47 -0700811 goto recycle;
812
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700813 if (!skb)
Divy Le Rayb47385b2008-05-21 18:56:26 -0700814 newskb = alloc_skb(SGE_RX_PULL_LEN, GFP_ATOMIC);
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700815 if (unlikely(!newskb)) {
Divy Le Raycf992af2007-05-30 21:10:47 -0700816 if (!drop_thres)
817 return NULL;
818 goto recycle;
819 }
820
821 pci_unmap_single(adap->pdev, pci_unmap_addr(sd, dma_addr),
822 fl->buf_size, PCI_DMA_FROMDEVICE);
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700823 if (!skb) {
824 __skb_put(newskb, SGE_RX_PULL_LEN);
825 memcpy(newskb->data, sd->pg_chunk.va, SGE_RX_PULL_LEN);
826 skb_fill_page_desc(newskb, 0, sd->pg_chunk.page,
827 sd->pg_chunk.offset + SGE_RX_PULL_LEN,
828 len - SGE_RX_PULL_LEN);
829 newskb->len = len;
830 newskb->data_len = len - SGE_RX_PULL_LEN;
831 } else {
832 skb_fill_page_desc(newskb, skb_shinfo(newskb)->nr_frags,
833 sd->pg_chunk.page,
834 sd->pg_chunk.offset, len);
835 newskb->len += len;
836 newskb->data_len += len;
837 }
838 newskb->truesize += newskb->data_len;
Divy Le Raycf992af2007-05-30 21:10:47 -0700839
840 fl->credits--;
841 /*
842 * We do not refill FLs here, we let the caller do it to overlap a
843 * prefetch.
844 */
Divy Le Ray7385ecf2008-05-21 18:56:21 -0700845 return newskb;
Divy Le Raycf992af2007-05-30 21:10:47 -0700846}
847
848/**
Divy Le Ray4d22de32007-01-18 22:04:14 -0500849 * get_imm_packet - return the next ingress packet buffer from a response
850 * @resp: the response descriptor containing the packet data
851 *
852 * Return a packet containing the immediate data of the given response.
853 */
854static inline struct sk_buff *get_imm_packet(const struct rsp_desc *resp)
855{
856 struct sk_buff *skb = alloc_skb(IMMED_PKT_SIZE, GFP_ATOMIC);
857
858 if (skb) {
859 __skb_put(skb, IMMED_PKT_SIZE);
Arnaldo Carvalho de Melo27d7ff42007-03-31 11:55:19 -0300860 skb_copy_to_linear_data(skb, resp->imm_data, IMMED_PKT_SIZE);
Divy Le Ray4d22de32007-01-18 22:04:14 -0500861 }
862 return skb;
863}
864
865/**
866 * calc_tx_descs - calculate the number of Tx descriptors for a packet
867 * @skb: the packet
868 *
869 * Returns the number of Tx descriptors needed for the given Ethernet
870 * packet. Ethernet packets require addition of WR and CPL headers.
871 */
872static inline unsigned int calc_tx_descs(const struct sk_buff *skb)
873{
874 unsigned int flits;
875
876 if (skb->len <= WR_LEN - sizeof(struct cpl_tx_pkt))
877 return 1;
878
879 flits = sgl_len(skb_shinfo(skb)->nr_frags + 1) + 2;
880 if (skb_shinfo(skb)->gso_size)
881 flits++;
882 return flits_to_desc(flits);
883}
884
885/**
886 * make_sgl - populate a scatter/gather list for a packet
887 * @skb: the packet
888 * @sgp: the SGL to populate
889 * @start: start address of skb main body data to include in the SGL
890 * @len: length of skb main body data to include in the SGL
891 * @pdev: the PCI device
892 *
893 * Generates a scatter/gather list for the buffers that make up a packet
894 * and returns the SGL size in 8-byte words. The caller must size the SGL
895 * appropriately.
896 */
897static inline unsigned int make_sgl(const struct sk_buff *skb,
898 struct sg_ent *sgp, unsigned char *start,
899 unsigned int len, struct pci_dev *pdev)
900{
901 dma_addr_t mapping;
902 unsigned int i, j = 0, nfrags;
903
904 if (len) {
905 mapping = pci_map_single(pdev, start, len, PCI_DMA_TODEVICE);
906 sgp->len[0] = cpu_to_be32(len);
907 sgp->addr[0] = cpu_to_be64(mapping);
908 j = 1;
909 }
910
911 nfrags = skb_shinfo(skb)->nr_frags;
912 for (i = 0; i < nfrags; i++) {
913 skb_frag_t *frag = &skb_shinfo(skb)->frags[i];
914
915 mapping = pci_map_page(pdev, frag->page, frag->page_offset,
916 frag->size, PCI_DMA_TODEVICE);
917 sgp->len[j] = cpu_to_be32(frag->size);
918 sgp->addr[j] = cpu_to_be64(mapping);
919 j ^= 1;
920 if (j == 0)
921 ++sgp;
922 }
923 if (j)
924 sgp->len[j] = 0;
925 return ((nfrags + (len != 0)) * 3) / 2 + j;
926}
927
928/**
929 * check_ring_tx_db - check and potentially ring a Tx queue's doorbell
930 * @adap: the adapter
931 * @q: the Tx queue
932 *
933 * Ring the doorbel if a Tx queue is asleep. There is a natural race,
934 * where the HW is going to sleep just after we checked, however,
935 * then the interrupt handler will detect the outstanding TX packet
936 * and ring the doorbell for us.
937 *
938 * When GTS is disabled we unconditionally ring the doorbell.
939 */
940static inline void check_ring_tx_db(struct adapter *adap, struct sge_txq *q)
941{
942#if USE_GTS
943 clear_bit(TXQ_LAST_PKT_DB, &q->flags);
944 if (test_and_set_bit(TXQ_RUNNING, &q->flags) == 0) {
945 set_bit(TXQ_LAST_PKT_DB, &q->flags);
946 t3_write_reg(adap, A_SG_KDOORBELL,
947 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
948 }
949#else
950 wmb(); /* write descriptors before telling HW */
951 t3_write_reg(adap, A_SG_KDOORBELL,
952 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
953#endif
954}
955
956static inline void wr_gen2(struct tx_desc *d, unsigned int gen)
957{
958#if SGE_NUM_GENBITS == 2
959 d->flit[TX_DESC_FLITS - 1] = cpu_to_be64(gen);
960#endif
961}
962
963/**
964 * write_wr_hdr_sgl - write a WR header and, optionally, SGL
965 * @ndesc: number of Tx descriptors spanned by the SGL
966 * @skb: the packet corresponding to the WR
967 * @d: first Tx descriptor to be written
968 * @pidx: index of above descriptors
969 * @q: the SGE Tx queue
970 * @sgl: the SGL
971 * @flits: number of flits to the start of the SGL in the first descriptor
972 * @sgl_flits: the SGL size in flits
973 * @gen: the Tx descriptor generation
974 * @wr_hi: top 32 bits of WR header based on WR type (big endian)
975 * @wr_lo: low 32 bits of WR header based on WR type (big endian)
976 *
977 * Write a work request header and an associated SGL. If the SGL is
978 * small enough to fit into one Tx descriptor it has already been written
979 * and we just need to write the WR header. Otherwise we distribute the
980 * SGL across the number of descriptors it spans.
981 */
982static void write_wr_hdr_sgl(unsigned int ndesc, struct sk_buff *skb,
983 struct tx_desc *d, unsigned int pidx,
984 const struct sge_txq *q,
985 const struct sg_ent *sgl,
986 unsigned int flits, unsigned int sgl_flits,
Al Virofb8e4442007-08-23 03:04:12 -0400987 unsigned int gen, __be32 wr_hi,
988 __be32 wr_lo)
Divy Le Ray4d22de32007-01-18 22:04:14 -0500989{
990 struct work_request_hdr *wrp = (struct work_request_hdr *)d;
991 struct tx_sw_desc *sd = &q->sdesc[pidx];
992
993 sd->skb = skb;
994 if (need_skb_unmap()) {
Divy Le Ray23561c92007-11-16 11:22:05 -0800995 sd->fragidx = 0;
996 sd->addr_idx = 0;
997 sd->sflit = flits;
Divy Le Ray4d22de32007-01-18 22:04:14 -0500998 }
999
1000 if (likely(ndesc == 1)) {
Divy Le Ray23561c92007-11-16 11:22:05 -08001001 sd->eop = 1;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001002 wrp->wr_hi = htonl(F_WR_SOP | F_WR_EOP | V_WR_DATATYPE(1) |
1003 V_WR_SGLSFLT(flits)) | wr_hi;
1004 wmb();
1005 wrp->wr_lo = htonl(V_WR_LEN(flits + sgl_flits) |
1006 V_WR_GEN(gen)) | wr_lo;
1007 wr_gen2(d, gen);
1008 } else {
1009 unsigned int ogen = gen;
1010 const u64 *fp = (const u64 *)sgl;
1011 struct work_request_hdr *wp = wrp;
1012
1013 wrp->wr_hi = htonl(F_WR_SOP | V_WR_DATATYPE(1) |
1014 V_WR_SGLSFLT(flits)) | wr_hi;
1015
1016 while (sgl_flits) {
1017 unsigned int avail = WR_FLITS - flits;
1018
1019 if (avail > sgl_flits)
1020 avail = sgl_flits;
1021 memcpy(&d->flit[flits], fp, avail * sizeof(*fp));
1022 sgl_flits -= avail;
1023 ndesc--;
1024 if (!sgl_flits)
1025 break;
1026
1027 fp += avail;
1028 d++;
Divy Le Ray23561c92007-11-16 11:22:05 -08001029 sd->eop = 0;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001030 sd++;
1031 if (++pidx == q->size) {
1032 pidx = 0;
1033 gen ^= 1;
1034 d = q->desc;
1035 sd = q->sdesc;
1036 }
1037
1038 sd->skb = skb;
1039 wrp = (struct work_request_hdr *)d;
1040 wrp->wr_hi = htonl(V_WR_DATATYPE(1) |
1041 V_WR_SGLSFLT(1)) | wr_hi;
1042 wrp->wr_lo = htonl(V_WR_LEN(min(WR_FLITS,
1043 sgl_flits + 1)) |
1044 V_WR_GEN(gen)) | wr_lo;
1045 wr_gen2(d, gen);
1046 flits = 1;
1047 }
Divy Le Ray23561c92007-11-16 11:22:05 -08001048 sd->eop = 1;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001049 wrp->wr_hi |= htonl(F_WR_EOP);
1050 wmb();
1051 wp->wr_lo = htonl(V_WR_LEN(WR_FLITS) | V_WR_GEN(ogen)) | wr_lo;
1052 wr_gen2((struct tx_desc *)wp, ogen);
1053 WARN_ON(ndesc != 0);
1054 }
1055}
1056
1057/**
1058 * write_tx_pkt_wr - write a TX_PKT work request
1059 * @adap: the adapter
1060 * @skb: the packet to send
1061 * @pi: the egress interface
1062 * @pidx: index of the first Tx descriptor to write
1063 * @gen: the generation value to use
1064 * @q: the Tx queue
1065 * @ndesc: number of descriptors the packet will occupy
1066 * @compl: the value of the COMPL bit to use
1067 *
1068 * Generate a TX_PKT work request to send the supplied packet.
1069 */
1070static void write_tx_pkt_wr(struct adapter *adap, struct sk_buff *skb,
1071 const struct port_info *pi,
1072 unsigned int pidx, unsigned int gen,
1073 struct sge_txq *q, unsigned int ndesc,
1074 unsigned int compl)
1075{
1076 unsigned int flits, sgl_flits, cntrl, tso_info;
1077 struct sg_ent *sgp, sgl[MAX_SKB_FRAGS / 2 + 1];
1078 struct tx_desc *d = &q->desc[pidx];
1079 struct cpl_tx_pkt *cpl = (struct cpl_tx_pkt *)d;
1080
1081 cpl->len = htonl(skb->len | 0x80000000);
1082 cntrl = V_TXPKT_INTF(pi->port_id);
1083
1084 if (vlan_tx_tag_present(skb) && pi->vlan_grp)
1085 cntrl |= F_TXPKT_VLAN_VLD | V_TXPKT_VLAN(vlan_tx_tag_get(skb));
1086
1087 tso_info = V_LSO_MSS(skb_shinfo(skb)->gso_size);
1088 if (tso_info) {
1089 int eth_type;
1090 struct cpl_tx_pkt_lso *hdr = (struct cpl_tx_pkt_lso *)cpl;
1091
1092 d->flit[2] = 0;
1093 cntrl |= V_TXPKT_OPCODE(CPL_TX_PKT_LSO);
1094 hdr->cntrl = htonl(cntrl);
Arnaldo Carvalho de Melobbe735e2007-03-10 22:16:10 -03001095 eth_type = skb_network_offset(skb) == ETH_HLEN ?
Divy Le Ray4d22de32007-01-18 22:04:14 -05001096 CPL_ETH_II : CPL_ETH_II_VLAN;
1097 tso_info |= V_LSO_ETH_TYPE(eth_type) |
Arnaldo Carvalho de Meloeddc9ec2007-04-20 22:47:35 -07001098 V_LSO_IPHDR_WORDS(ip_hdr(skb)->ihl) |
Arnaldo Carvalho de Meloaa8223c2007-04-10 21:04:22 -07001099 V_LSO_TCPHDR_WORDS(tcp_hdr(skb)->doff);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001100 hdr->lso_info = htonl(tso_info);
1101 flits = 3;
1102 } else {
1103 cntrl |= V_TXPKT_OPCODE(CPL_TX_PKT);
1104 cntrl |= F_TXPKT_IPCSUM_DIS; /* SW calculates IP csum */
1105 cntrl |= V_TXPKT_L4CSUM_DIS(skb->ip_summed != CHECKSUM_PARTIAL);
1106 cpl->cntrl = htonl(cntrl);
1107
1108 if (skb->len <= WR_LEN - sizeof(*cpl)) {
1109 q->sdesc[pidx].skb = NULL;
1110 if (!skb->data_len)
Arnaldo Carvalho de Melod626f622007-03-27 18:55:52 -03001111 skb_copy_from_linear_data(skb, &d->flit[2],
1112 skb->len);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001113 else
1114 skb_copy_bits(skb, 0, &d->flit[2], skb->len);
1115
1116 flits = (skb->len + 7) / 8 + 2;
1117 cpl->wr.wr_hi = htonl(V_WR_BCNTLFLT(skb->len & 7) |
1118 V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT)
1119 | F_WR_SOP | F_WR_EOP | compl);
1120 wmb();
1121 cpl->wr.wr_lo = htonl(V_WR_LEN(flits) | V_WR_GEN(gen) |
1122 V_WR_TID(q->token));
1123 wr_gen2(d, gen);
1124 kfree_skb(skb);
1125 return;
1126 }
1127
1128 flits = 2;
1129 }
1130
1131 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl;
1132 sgl_flits = make_sgl(skb, sgp, skb->data, skb_headlen(skb), adap->pdev);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001133
1134 write_wr_hdr_sgl(ndesc, skb, d, pidx, q, sgl, flits, sgl_flits, gen,
1135 htonl(V_WR_OP(FW_WROPCODE_TUNNEL_TX_PKT) | compl),
1136 htonl(V_WR_TID(q->token)));
1137}
1138
Divy Le Ray82ad3322008-12-16 01:09:39 -08001139static inline void t3_stop_tx_queue(struct netdev_queue *txq,
1140 struct sge_qset *qs, struct sge_txq *q)
Krishna Kumara8cc21f2008-01-30 12:30:16 +05301141{
Divy Le Ray82ad3322008-12-16 01:09:39 -08001142 netif_tx_stop_queue(txq);
Krishna Kumara8cc21f2008-01-30 12:30:16 +05301143 set_bit(TXQ_ETH, &qs->txq_stopped);
1144 q->stops++;
1145}
1146
Divy Le Ray4d22de32007-01-18 22:04:14 -05001147/**
1148 * eth_xmit - add a packet to the Ethernet Tx queue
1149 * @skb: the packet
1150 * @dev: the egress net device
1151 *
1152 * Add a packet to an SGE Tx queue. Runs with softirqs disabled.
1153 */
1154int t3_eth_xmit(struct sk_buff *skb, struct net_device *dev)
1155{
Divy Le Ray82ad3322008-12-16 01:09:39 -08001156 int qidx;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001157 unsigned int ndesc, pidx, credits, gen, compl;
1158 const struct port_info *pi = netdev_priv(dev);
Divy Le Ray5fbf8162007-08-29 19:15:47 -07001159 struct adapter *adap = pi->adapter;
Divy Le Ray82ad3322008-12-16 01:09:39 -08001160 struct netdev_queue *txq;
1161 struct sge_qset *qs;
1162 struct sge_txq *q;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001163
1164 /*
1165 * The chip min packet length is 9 octets but play safe and reject
1166 * anything shorter than an Ethernet header.
1167 */
1168 if (unlikely(skb->len < ETH_HLEN)) {
1169 dev_kfree_skb(skb);
1170 return NETDEV_TX_OK;
1171 }
1172
Divy Le Ray82ad3322008-12-16 01:09:39 -08001173 qidx = skb_get_queue_mapping(skb);
1174 qs = &pi->qs[qidx];
1175 q = &qs->txq[TXQ_ETH];
1176 txq = netdev_get_tx_queue(dev, qidx);
1177
Divy Le Ray4d22de32007-01-18 22:04:14 -05001178 spin_lock(&q->lock);
1179 reclaim_completed_tx(adap, q);
1180
1181 credits = q->size - q->in_use;
1182 ndesc = calc_tx_descs(skb);
1183
1184 if (unlikely(credits < ndesc)) {
Divy Le Ray82ad3322008-12-16 01:09:39 -08001185 t3_stop_tx_queue(txq, qs, q);
Krishna Kumara8cc21f2008-01-30 12:30:16 +05301186 dev_err(&adap->pdev->dev,
1187 "%s: Tx ring %u full while queue awake!\n",
1188 dev->name, q->cntxt_id & 7);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001189 spin_unlock(&q->lock);
1190 return NETDEV_TX_BUSY;
1191 }
1192
1193 q->in_use += ndesc;
Divy Le Raycd7e9032008-03-13 00:13:30 -07001194 if (unlikely(credits - ndesc < q->stop_thres)) {
Divy Le Ray82ad3322008-12-16 01:09:39 -08001195 t3_stop_tx_queue(txq, qs, q);
Divy Le Raycd7e9032008-03-13 00:13:30 -07001196
1197 if (should_restart_tx(q) &&
1198 test_and_clear_bit(TXQ_ETH, &qs->txq_stopped)) {
1199 q->restarts++;
Divy Le Ray82ad3322008-12-16 01:09:39 -08001200 netif_tx_wake_queue(txq);
Divy Le Raycd7e9032008-03-13 00:13:30 -07001201 }
1202 }
Divy Le Ray4d22de32007-01-18 22:04:14 -05001203
1204 gen = q->gen;
1205 q->unacked += ndesc;
1206 compl = (q->unacked & 8) << (S_WR_COMPL - 3);
1207 q->unacked &= 7;
1208 pidx = q->pidx;
1209 q->pidx += ndesc;
1210 if (q->pidx >= q->size) {
1211 q->pidx -= q->size;
1212 q->gen ^= 1;
1213 }
1214
1215 /* update port statistics */
1216 if (skb->ip_summed == CHECKSUM_COMPLETE)
1217 qs->port_stats[SGE_PSTAT_TX_CSUM]++;
1218 if (skb_shinfo(skb)->gso_size)
1219 qs->port_stats[SGE_PSTAT_TSO]++;
1220 if (vlan_tx_tag_present(skb) && pi->vlan_grp)
1221 qs->port_stats[SGE_PSTAT_VLANINS]++;
1222
1223 dev->trans_start = jiffies;
1224 spin_unlock(&q->lock);
1225
1226 /*
1227 * We do not use Tx completion interrupts to free DMAd Tx packets.
1228 * This is good for performamce but means that we rely on new Tx
1229 * packets arriving to run the destructors of completed packets,
1230 * which open up space in their sockets' send queues. Sometimes
1231 * we do not get such new packets causing Tx to stall. A single
1232 * UDP transmitter is a good example of this situation. We have
1233 * a clean up timer that periodically reclaims completed packets
1234 * but it doesn't run often enough (nor do we want it to) to prevent
1235 * lengthy stalls. A solution to this problem is to run the
1236 * destructor early, after the packet is queued but before it's DMAd.
1237 * A cons is that we lie to socket memory accounting, but the amount
1238 * of extra memory is reasonable (limited by the number of Tx
1239 * descriptors), the packets do actually get freed quickly by new
1240 * packets almost always, and for protocols like TCP that wait for
1241 * acks to really free up the data the extra memory is even less.
1242 * On the positive side we run the destructors on the sending CPU
1243 * rather than on a potentially different completing CPU, usually a
1244 * good thing. We also run them without holding our Tx queue lock,
1245 * unlike what reclaim_completed_tx() would otherwise do.
1246 *
1247 * Run the destructor before telling the DMA engine about the packet
1248 * to make sure it doesn't complete and get freed prematurely.
1249 */
1250 if (likely(!skb_shared(skb)))
1251 skb_orphan(skb);
1252
1253 write_tx_pkt_wr(adap, skb, pi, pidx, gen, q, ndesc, compl);
1254 check_ring_tx_db(adap, q);
1255 return NETDEV_TX_OK;
1256}
1257
1258/**
1259 * write_imm - write a packet into a Tx descriptor as immediate data
1260 * @d: the Tx descriptor to write
1261 * @skb: the packet
1262 * @len: the length of packet data to write as immediate data
1263 * @gen: the generation bit value to write
1264 *
1265 * Writes a packet as immediate data into a Tx descriptor. The packet
1266 * contains a work request at its beginning. We must write the packet
Divy Le Ray27186dc2007-08-21 20:49:15 -07001267 * carefully so the SGE doesn't read it accidentally before it's written
1268 * in its entirety.
Divy Le Ray4d22de32007-01-18 22:04:14 -05001269 */
1270static inline void write_imm(struct tx_desc *d, struct sk_buff *skb,
1271 unsigned int len, unsigned int gen)
1272{
1273 struct work_request_hdr *from = (struct work_request_hdr *)skb->data;
1274 struct work_request_hdr *to = (struct work_request_hdr *)d;
1275
Divy Le Ray27186dc2007-08-21 20:49:15 -07001276 if (likely(!skb->data_len))
1277 memcpy(&to[1], &from[1], len - sizeof(*from));
1278 else
1279 skb_copy_bits(skb, sizeof(*from), &to[1], len - sizeof(*from));
1280
Divy Le Ray4d22de32007-01-18 22:04:14 -05001281 to->wr_hi = from->wr_hi | htonl(F_WR_SOP | F_WR_EOP |
1282 V_WR_BCNTLFLT(len & 7));
1283 wmb();
1284 to->wr_lo = from->wr_lo | htonl(V_WR_GEN(gen) |
1285 V_WR_LEN((len + 7) / 8));
1286 wr_gen2(d, gen);
1287 kfree_skb(skb);
1288}
1289
1290/**
1291 * check_desc_avail - check descriptor availability on a send queue
1292 * @adap: the adapter
1293 * @q: the send queue
1294 * @skb: the packet needing the descriptors
1295 * @ndesc: the number of Tx descriptors needed
1296 * @qid: the Tx queue number in its queue set (TXQ_OFLD or TXQ_CTRL)
1297 *
1298 * Checks if the requested number of Tx descriptors is available on an
1299 * SGE send queue. If the queue is already suspended or not enough
1300 * descriptors are available the packet is queued for later transmission.
1301 * Must be called with the Tx queue locked.
1302 *
1303 * Returns 0 if enough descriptors are available, 1 if there aren't
1304 * enough descriptors and the packet has been queued, and 2 if the caller
1305 * needs to retry because there weren't enough descriptors at the
1306 * beginning of the call but some freed up in the mean time.
1307 */
1308static inline int check_desc_avail(struct adapter *adap, struct sge_txq *q,
1309 struct sk_buff *skb, unsigned int ndesc,
1310 unsigned int qid)
1311{
1312 if (unlikely(!skb_queue_empty(&q->sendq))) {
1313 addq_exit:__skb_queue_tail(&q->sendq, skb);
1314 return 1;
1315 }
1316 if (unlikely(q->size - q->in_use < ndesc)) {
1317 struct sge_qset *qs = txq_to_qset(q, qid);
1318
1319 set_bit(qid, &qs->txq_stopped);
1320 smp_mb__after_clear_bit();
1321
1322 if (should_restart_tx(q) &&
1323 test_and_clear_bit(qid, &qs->txq_stopped))
1324 return 2;
1325
1326 q->stops++;
1327 goto addq_exit;
1328 }
1329 return 0;
1330}
1331
1332/**
1333 * reclaim_completed_tx_imm - reclaim completed control-queue Tx descs
1334 * @q: the SGE control Tx queue
1335 *
1336 * This is a variant of reclaim_completed_tx() that is used for Tx queues
1337 * that send only immediate data (presently just the control queues) and
1338 * thus do not have any sk_buffs to release.
1339 */
1340static inline void reclaim_completed_tx_imm(struct sge_txq *q)
1341{
1342 unsigned int reclaim = q->processed - q->cleaned;
1343
1344 q->in_use -= reclaim;
1345 q->cleaned += reclaim;
1346}
1347
1348static inline int immediate(const struct sk_buff *skb)
1349{
Divy Le Ray27186dc2007-08-21 20:49:15 -07001350 return skb->len <= WR_LEN;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001351}
1352
1353/**
1354 * ctrl_xmit - send a packet through an SGE control Tx queue
1355 * @adap: the adapter
1356 * @q: the control queue
1357 * @skb: the packet
1358 *
1359 * Send a packet through an SGE control Tx queue. Packets sent through
1360 * a control queue must fit entirely as immediate data in a single Tx
1361 * descriptor and have no page fragments.
1362 */
1363static int ctrl_xmit(struct adapter *adap, struct sge_txq *q,
1364 struct sk_buff *skb)
1365{
1366 int ret;
1367 struct work_request_hdr *wrp = (struct work_request_hdr *)skb->data;
1368
1369 if (unlikely(!immediate(skb))) {
1370 WARN_ON(1);
1371 dev_kfree_skb(skb);
1372 return NET_XMIT_SUCCESS;
1373 }
1374
1375 wrp->wr_hi |= htonl(F_WR_SOP | F_WR_EOP);
1376 wrp->wr_lo = htonl(V_WR_TID(q->token));
1377
1378 spin_lock(&q->lock);
1379 again:reclaim_completed_tx_imm(q);
1380
1381 ret = check_desc_avail(adap, q, skb, 1, TXQ_CTRL);
1382 if (unlikely(ret)) {
1383 if (ret == 1) {
1384 spin_unlock(&q->lock);
1385 return NET_XMIT_CN;
1386 }
1387 goto again;
1388 }
1389
1390 write_imm(&q->desc[q->pidx], skb, skb->len, q->gen);
1391
1392 q->in_use++;
1393 if (++q->pidx >= q->size) {
1394 q->pidx = 0;
1395 q->gen ^= 1;
1396 }
1397 spin_unlock(&q->lock);
1398 wmb();
1399 t3_write_reg(adap, A_SG_KDOORBELL,
1400 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1401 return NET_XMIT_SUCCESS;
1402}
1403
1404/**
1405 * restart_ctrlq - restart a suspended control queue
1406 * @qs: the queue set cotaining the control queue
1407 *
1408 * Resumes transmission on a suspended Tx control queue.
1409 */
1410static void restart_ctrlq(unsigned long data)
1411{
1412 struct sk_buff *skb;
1413 struct sge_qset *qs = (struct sge_qset *)data;
1414 struct sge_txq *q = &qs->txq[TXQ_CTRL];
Divy Le Ray4d22de32007-01-18 22:04:14 -05001415
1416 spin_lock(&q->lock);
1417 again:reclaim_completed_tx_imm(q);
1418
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001419 while (q->in_use < q->size &&
1420 (skb = __skb_dequeue(&q->sendq)) != NULL) {
Divy Le Ray4d22de32007-01-18 22:04:14 -05001421
1422 write_imm(&q->desc[q->pidx], skb, skb->len, q->gen);
1423
1424 if (++q->pidx >= q->size) {
1425 q->pidx = 0;
1426 q->gen ^= 1;
1427 }
1428 q->in_use++;
1429 }
1430
1431 if (!skb_queue_empty(&q->sendq)) {
1432 set_bit(TXQ_CTRL, &qs->txq_stopped);
1433 smp_mb__after_clear_bit();
1434
1435 if (should_restart_tx(q) &&
1436 test_and_clear_bit(TXQ_CTRL, &qs->txq_stopped))
1437 goto again;
1438 q->stops++;
1439 }
1440
1441 spin_unlock(&q->lock);
Divy Le Rayafefce62007-11-16 11:22:21 -08001442 wmb();
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001443 t3_write_reg(qs->adap, A_SG_KDOORBELL,
Divy Le Ray4d22de32007-01-18 22:04:14 -05001444 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1445}
1446
Divy Le Ray14ab9892007-01-30 19:43:50 -08001447/*
1448 * Send a management message through control queue 0
1449 */
1450int t3_mgmt_tx(struct adapter *adap, struct sk_buff *skb)
1451{
Divy Le Ray204e2f92008-05-06 19:26:01 -07001452 int ret;
Divy Le Raybc4b6b522007-12-17 18:47:41 -08001453 local_bh_disable();
1454 ret = ctrl_xmit(adap, &adap->sge.qs[0].txq[TXQ_CTRL], skb);
1455 local_bh_enable();
1456
1457 return ret;
Divy Le Ray14ab9892007-01-30 19:43:50 -08001458}
1459
Divy Le Ray4d22de32007-01-18 22:04:14 -05001460/**
Divy Le Ray99d7cf32007-02-24 16:44:06 -08001461 * deferred_unmap_destructor - unmap a packet when it is freed
1462 * @skb: the packet
1463 *
1464 * This is the packet destructor used for Tx packets that need to remain
1465 * mapped until they are freed rather than until their Tx descriptors are
1466 * freed.
1467 */
1468static void deferred_unmap_destructor(struct sk_buff *skb)
1469{
1470 int i;
1471 const dma_addr_t *p;
1472 const struct skb_shared_info *si;
1473 const struct deferred_unmap_info *dui;
Divy Le Ray99d7cf32007-02-24 16:44:06 -08001474
1475 dui = (struct deferred_unmap_info *)skb->head;
1476 p = dui->addr;
1477
Divy Le Ray23561c92007-11-16 11:22:05 -08001478 if (skb->tail - skb->transport_header)
1479 pci_unmap_single(dui->pdev, *p++,
1480 skb->tail - skb->transport_header,
1481 PCI_DMA_TODEVICE);
Divy Le Ray99d7cf32007-02-24 16:44:06 -08001482
1483 si = skb_shinfo(skb);
1484 for (i = 0; i < si->nr_frags; i++)
1485 pci_unmap_page(dui->pdev, *p++, si->frags[i].size,
1486 PCI_DMA_TODEVICE);
1487}
1488
1489static void setup_deferred_unmapping(struct sk_buff *skb, struct pci_dev *pdev,
1490 const struct sg_ent *sgl, int sgl_flits)
1491{
1492 dma_addr_t *p;
1493 struct deferred_unmap_info *dui;
1494
1495 dui = (struct deferred_unmap_info *)skb->head;
1496 dui->pdev = pdev;
1497 for (p = dui->addr; sgl_flits >= 3; sgl++, sgl_flits -= 3) {
1498 *p++ = be64_to_cpu(sgl->addr[0]);
1499 *p++ = be64_to_cpu(sgl->addr[1]);
1500 }
1501 if (sgl_flits)
1502 *p = be64_to_cpu(sgl->addr[0]);
1503}
1504
1505/**
Divy Le Ray4d22de32007-01-18 22:04:14 -05001506 * write_ofld_wr - write an offload work request
1507 * @adap: the adapter
1508 * @skb: the packet to send
1509 * @q: the Tx queue
1510 * @pidx: index of the first Tx descriptor to write
1511 * @gen: the generation value to use
1512 * @ndesc: number of descriptors the packet will occupy
1513 *
1514 * Write an offload work request to send the supplied packet. The packet
1515 * data already carry the work request with most fields populated.
1516 */
1517static void write_ofld_wr(struct adapter *adap, struct sk_buff *skb,
1518 struct sge_txq *q, unsigned int pidx,
1519 unsigned int gen, unsigned int ndesc)
1520{
1521 unsigned int sgl_flits, flits;
1522 struct work_request_hdr *from;
1523 struct sg_ent *sgp, sgl[MAX_SKB_FRAGS / 2 + 1];
1524 struct tx_desc *d = &q->desc[pidx];
1525
1526 if (immediate(skb)) {
1527 q->sdesc[pidx].skb = NULL;
1528 write_imm(d, skb, skb->len, gen);
1529 return;
1530 }
1531
1532 /* Only TX_DATA builds SGLs */
1533
1534 from = (struct work_request_hdr *)skb->data;
Arnaldo Carvalho de Meloea2ae172007-04-25 17:55:53 -07001535 memcpy(&d->flit[1], &from[1],
1536 skb_transport_offset(skb) - sizeof(*from));
Divy Le Ray4d22de32007-01-18 22:04:14 -05001537
Arnaldo Carvalho de Meloea2ae172007-04-25 17:55:53 -07001538 flits = skb_transport_offset(skb) / 8;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001539 sgp = ndesc == 1 ? (struct sg_ent *)&d->flit[flits] : sgl;
Arnaldo Carvalho de Melo9c702202007-04-25 18:04:18 -07001540 sgl_flits = make_sgl(skb, sgp, skb_transport_header(skb),
Arnaldo Carvalho de Melo27a884d2007-04-19 20:29:13 -07001541 skb->tail - skb->transport_header,
Divy Le Ray4d22de32007-01-18 22:04:14 -05001542 adap->pdev);
Divy Le Ray99d7cf32007-02-24 16:44:06 -08001543 if (need_skb_unmap()) {
1544 setup_deferred_unmapping(skb, adap->pdev, sgp, sgl_flits);
1545 skb->destructor = deferred_unmap_destructor;
Divy Le Ray99d7cf32007-02-24 16:44:06 -08001546 }
Divy Le Ray4d22de32007-01-18 22:04:14 -05001547
1548 write_wr_hdr_sgl(ndesc, skb, d, pidx, q, sgl, flits, sgl_flits,
1549 gen, from->wr_hi, from->wr_lo);
1550}
1551
1552/**
1553 * calc_tx_descs_ofld - calculate # of Tx descriptors for an offload packet
1554 * @skb: the packet
1555 *
1556 * Returns the number of Tx descriptors needed for the given offload
1557 * packet. These packets are already fully constructed.
1558 */
1559static inline unsigned int calc_tx_descs_ofld(const struct sk_buff *skb)
1560{
Divy Le Ray27186dc2007-08-21 20:49:15 -07001561 unsigned int flits, cnt;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001562
Divy Le Ray27186dc2007-08-21 20:49:15 -07001563 if (skb->len <= WR_LEN)
Divy Le Ray4d22de32007-01-18 22:04:14 -05001564 return 1; /* packet fits as immediate data */
1565
Arnaldo Carvalho de Meloea2ae172007-04-25 17:55:53 -07001566 flits = skb_transport_offset(skb) / 8; /* headers */
Divy Le Ray27186dc2007-08-21 20:49:15 -07001567 cnt = skb_shinfo(skb)->nr_frags;
Arnaldo Carvalho de Melo27a884d2007-04-19 20:29:13 -07001568 if (skb->tail != skb->transport_header)
Divy Le Ray4d22de32007-01-18 22:04:14 -05001569 cnt++;
1570 return flits_to_desc(flits + sgl_len(cnt));
1571}
1572
1573/**
1574 * ofld_xmit - send a packet through an offload queue
1575 * @adap: the adapter
1576 * @q: the Tx offload queue
1577 * @skb: the packet
1578 *
1579 * Send an offload packet through an SGE offload queue.
1580 */
1581static int ofld_xmit(struct adapter *adap, struct sge_txq *q,
1582 struct sk_buff *skb)
1583{
1584 int ret;
1585 unsigned int ndesc = calc_tx_descs_ofld(skb), pidx, gen;
1586
1587 spin_lock(&q->lock);
1588 again:reclaim_completed_tx(adap, q);
1589
1590 ret = check_desc_avail(adap, q, skb, ndesc, TXQ_OFLD);
1591 if (unlikely(ret)) {
1592 if (ret == 1) {
1593 skb->priority = ndesc; /* save for restart */
1594 spin_unlock(&q->lock);
1595 return NET_XMIT_CN;
1596 }
1597 goto again;
1598 }
1599
1600 gen = q->gen;
1601 q->in_use += ndesc;
1602 pidx = q->pidx;
1603 q->pidx += ndesc;
1604 if (q->pidx >= q->size) {
1605 q->pidx -= q->size;
1606 q->gen ^= 1;
1607 }
1608 spin_unlock(&q->lock);
1609
1610 write_ofld_wr(adap, skb, q, pidx, gen, ndesc);
1611 check_ring_tx_db(adap, q);
1612 return NET_XMIT_SUCCESS;
1613}
1614
1615/**
1616 * restart_offloadq - restart a suspended offload queue
1617 * @qs: the queue set cotaining the offload queue
1618 *
1619 * Resumes transmission on a suspended Tx offload queue.
1620 */
1621static void restart_offloadq(unsigned long data)
1622{
1623 struct sk_buff *skb;
1624 struct sge_qset *qs = (struct sge_qset *)data;
1625 struct sge_txq *q = &qs->txq[TXQ_OFLD];
Divy Le Ray5fbf8162007-08-29 19:15:47 -07001626 const struct port_info *pi = netdev_priv(qs->netdev);
1627 struct adapter *adap = pi->adapter;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001628
1629 spin_lock(&q->lock);
1630 again:reclaim_completed_tx(adap, q);
1631
1632 while ((skb = skb_peek(&q->sendq)) != NULL) {
1633 unsigned int gen, pidx;
1634 unsigned int ndesc = skb->priority;
1635
1636 if (unlikely(q->size - q->in_use < ndesc)) {
1637 set_bit(TXQ_OFLD, &qs->txq_stopped);
1638 smp_mb__after_clear_bit();
1639
1640 if (should_restart_tx(q) &&
1641 test_and_clear_bit(TXQ_OFLD, &qs->txq_stopped))
1642 goto again;
1643 q->stops++;
1644 break;
1645 }
1646
1647 gen = q->gen;
1648 q->in_use += ndesc;
1649 pidx = q->pidx;
1650 q->pidx += ndesc;
1651 if (q->pidx >= q->size) {
1652 q->pidx -= q->size;
1653 q->gen ^= 1;
1654 }
1655 __skb_unlink(skb, &q->sendq);
1656 spin_unlock(&q->lock);
1657
1658 write_ofld_wr(adap, skb, q, pidx, gen, ndesc);
1659 spin_lock(&q->lock);
1660 }
1661 spin_unlock(&q->lock);
1662
1663#if USE_GTS
1664 set_bit(TXQ_RUNNING, &q->flags);
1665 set_bit(TXQ_LAST_PKT_DB, &q->flags);
1666#endif
Divy Le Rayafefce62007-11-16 11:22:21 -08001667 wmb();
Divy Le Ray4d22de32007-01-18 22:04:14 -05001668 t3_write_reg(adap, A_SG_KDOORBELL,
1669 F_SELEGRCNTX | V_EGRCNTX(q->cntxt_id));
1670}
1671
1672/**
1673 * queue_set - return the queue set a packet should use
1674 * @skb: the packet
1675 *
1676 * Maps a packet to the SGE queue set it should use. The desired queue
1677 * set is carried in bits 1-3 in the packet's priority.
1678 */
1679static inline int queue_set(const struct sk_buff *skb)
1680{
1681 return skb->priority >> 1;
1682}
1683
1684/**
1685 * is_ctrl_pkt - return whether an offload packet is a control packet
1686 * @skb: the packet
1687 *
1688 * Determines whether an offload packet should use an OFLD or a CTRL
1689 * Tx queue. This is indicated by bit 0 in the packet's priority.
1690 */
1691static inline int is_ctrl_pkt(const struct sk_buff *skb)
1692{
1693 return skb->priority & 1;
1694}
1695
1696/**
1697 * t3_offload_tx - send an offload packet
1698 * @tdev: the offload device to send to
1699 * @skb: the packet
1700 *
1701 * Sends an offload packet. We use the packet priority to select the
1702 * appropriate Tx queue as follows: bit 0 indicates whether the packet
1703 * should be sent as regular or control, bits 1-3 select the queue set.
1704 */
1705int t3_offload_tx(struct t3cdev *tdev, struct sk_buff *skb)
1706{
1707 struct adapter *adap = tdev2adap(tdev);
1708 struct sge_qset *qs = &adap->sge.qs[queue_set(skb)];
1709
1710 if (unlikely(is_ctrl_pkt(skb)))
1711 return ctrl_xmit(adap, &qs->txq[TXQ_CTRL], skb);
1712
1713 return ofld_xmit(adap, &qs->txq[TXQ_OFLD], skb);
1714}
1715
1716/**
1717 * offload_enqueue - add an offload packet to an SGE offload receive queue
1718 * @q: the SGE response queue
1719 * @skb: the packet
1720 *
1721 * Add a new offload packet to an SGE response queue's offload packet
1722 * queue. If the packet is the first on the queue it schedules the RX
1723 * softirq to process the queue.
1724 */
1725static inline void offload_enqueue(struct sge_rspq *q, struct sk_buff *skb)
1726{
David S. Miller147e70e2008-09-22 01:29:52 -07001727 int was_empty = skb_queue_empty(&q->rx_queue);
1728
1729 __skb_queue_tail(&q->rx_queue, skb);
1730
1731 if (was_empty) {
Divy Le Ray4d22de32007-01-18 22:04:14 -05001732 struct sge_qset *qs = rspq_to_qset(q);
1733
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001734 napi_schedule(&qs->napi);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001735 }
Divy Le Ray4d22de32007-01-18 22:04:14 -05001736}
1737
1738/**
1739 * deliver_partial_bundle - deliver a (partial) bundle of Rx offload pkts
1740 * @tdev: the offload device that will be receiving the packets
1741 * @q: the SGE response queue that assembled the bundle
1742 * @skbs: the partial bundle
1743 * @n: the number of packets in the bundle
1744 *
1745 * Delivers a (partial) bundle of Rx offload packets to an offload device.
1746 */
1747static inline void deliver_partial_bundle(struct t3cdev *tdev,
1748 struct sge_rspq *q,
1749 struct sk_buff *skbs[], int n)
1750{
1751 if (n) {
1752 q->offload_bundles++;
1753 tdev->recv(tdev, skbs, n);
1754 }
1755}
1756
1757/**
1758 * ofld_poll - NAPI handler for offload packets in interrupt mode
1759 * @dev: the network device doing the polling
1760 * @budget: polling budget
1761 *
1762 * The NAPI handler for offload packets when a response queue is serviced
1763 * by the hard interrupt handler, i.e., when it's operating in non-polling
1764 * mode. Creates small packet batches and sends them through the offload
1765 * receive handler. Batches need to be of modest size as we do prefetches
1766 * on the packets in each.
1767 */
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001768static int ofld_poll(struct napi_struct *napi, int budget)
Divy Le Ray4d22de32007-01-18 22:04:14 -05001769{
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001770 struct sge_qset *qs = container_of(napi, struct sge_qset, napi);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001771 struct sge_rspq *q = &qs->rspq;
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001772 struct adapter *adapter = qs->adap;
1773 int work_done = 0;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001774
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001775 while (work_done < budget) {
David S. Miller147e70e2008-09-22 01:29:52 -07001776 struct sk_buff *skb, *tmp, *skbs[RX_BUNDLE_SIZE];
1777 struct sk_buff_head queue;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001778 int ngathered;
1779
1780 spin_lock_irq(&q->lock);
David S. Miller147e70e2008-09-22 01:29:52 -07001781 __skb_queue_head_init(&queue);
1782 skb_queue_splice_init(&q->rx_queue, &queue);
1783 if (skb_queue_empty(&queue)) {
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001784 napi_complete(napi);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001785 spin_unlock_irq(&q->lock);
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001786 return work_done;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001787 }
Divy Le Ray4d22de32007-01-18 22:04:14 -05001788 spin_unlock_irq(&q->lock);
1789
David S. Miller147e70e2008-09-22 01:29:52 -07001790 ngathered = 0;
1791 skb_queue_walk_safe(&queue, skb, tmp) {
1792 if (work_done >= budget)
1793 break;
1794 work_done++;
1795
1796 __skb_unlink(skb, &queue);
1797 prefetch(skb->data);
1798 skbs[ngathered] = skb;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001799 if (++ngathered == RX_BUNDLE_SIZE) {
1800 q->offload_bundles++;
1801 adapter->tdev.recv(&adapter->tdev, skbs,
1802 ngathered);
1803 ngathered = 0;
1804 }
1805 }
David S. Miller147e70e2008-09-22 01:29:52 -07001806 if (!skb_queue_empty(&queue)) {
1807 /* splice remaining packets back onto Rx queue */
Divy Le Ray4d22de32007-01-18 22:04:14 -05001808 spin_lock_irq(&q->lock);
David S. Miller147e70e2008-09-22 01:29:52 -07001809 skb_queue_splice(&queue, &q->rx_queue);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001810 spin_unlock_irq(&q->lock);
1811 }
1812 deliver_partial_bundle(&adapter->tdev, q, skbs, ngathered);
1813 }
Stephen Hemmingerbea33482007-10-03 16:41:36 -07001814
1815 return work_done;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001816}
1817
1818/**
1819 * rx_offload - process a received offload packet
1820 * @tdev: the offload device receiving the packet
1821 * @rq: the response queue that received the packet
1822 * @skb: the packet
1823 * @rx_gather: a gather list of packets if we are building a bundle
1824 * @gather_idx: index of the next available slot in the bundle
1825 *
1826 * Process an ingress offload pakcet and add it to the offload ingress
1827 * queue. Returns the index of the next available slot in the bundle.
1828 */
1829static inline int rx_offload(struct t3cdev *tdev, struct sge_rspq *rq,
1830 struct sk_buff *skb, struct sk_buff *rx_gather[],
1831 unsigned int gather_idx)
1832{
Arnaldo Carvalho de Melo459a98e2007-03-19 15:30:44 -07001833 skb_reset_mac_header(skb);
Arnaldo Carvalho de Meloc1d2bbe2007-04-10 20:45:18 -07001834 skb_reset_network_header(skb);
Arnaldo Carvalho de Melobadff6d2007-03-13 13:06:52 -03001835 skb_reset_transport_header(skb);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001836
1837 if (rq->polling) {
1838 rx_gather[gather_idx++] = skb;
1839 if (gather_idx == RX_BUNDLE_SIZE) {
1840 tdev->recv(tdev, rx_gather, RX_BUNDLE_SIZE);
1841 gather_idx = 0;
1842 rq->offload_bundles++;
1843 }
1844 } else
1845 offload_enqueue(rq, skb);
1846
1847 return gather_idx;
1848}
1849
1850/**
Divy Le Ray4d22de32007-01-18 22:04:14 -05001851 * restart_tx - check whether to restart suspended Tx queues
1852 * @qs: the queue set to resume
1853 *
1854 * Restarts suspended Tx queues of an SGE queue set if they have enough
1855 * free resources to resume operation.
1856 */
1857static void restart_tx(struct sge_qset *qs)
1858{
1859 if (test_bit(TXQ_ETH, &qs->txq_stopped) &&
1860 should_restart_tx(&qs->txq[TXQ_ETH]) &&
1861 test_and_clear_bit(TXQ_ETH, &qs->txq_stopped)) {
1862 qs->txq[TXQ_ETH].restarts++;
1863 if (netif_running(qs->netdev))
Divy Le Ray82ad3322008-12-16 01:09:39 -08001864 netif_tx_wake_queue(qs->tx_q);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001865 }
1866
1867 if (test_bit(TXQ_OFLD, &qs->txq_stopped) &&
1868 should_restart_tx(&qs->txq[TXQ_OFLD]) &&
1869 test_and_clear_bit(TXQ_OFLD, &qs->txq_stopped)) {
1870 qs->txq[TXQ_OFLD].restarts++;
1871 tasklet_schedule(&qs->txq[TXQ_OFLD].qresume_tsk);
1872 }
1873 if (test_bit(TXQ_CTRL, &qs->txq_stopped) &&
1874 should_restart_tx(&qs->txq[TXQ_CTRL]) &&
1875 test_and_clear_bit(TXQ_CTRL, &qs->txq_stopped)) {
1876 qs->txq[TXQ_CTRL].restarts++;
1877 tasklet_schedule(&qs->txq[TXQ_CTRL].qresume_tsk);
1878 }
1879}
1880
1881/**
Karen Xiea109a5b2008-12-18 22:56:20 -08001882 * cxgb3_arp_process - process an ARP request probing a private IP address
1883 * @adapter: the adapter
1884 * @skb: the skbuff containing the ARP request
1885 *
1886 * Check if the ARP request is probing the private IP address
1887 * dedicated to iSCSI, generate an ARP reply if so.
1888 */
1889static void cxgb3_arp_process(struct adapter *adapter, struct sk_buff *skb)
1890{
1891 struct net_device *dev = skb->dev;
1892 struct port_info *pi;
1893 struct arphdr *arp;
1894 unsigned char *arp_ptr;
1895 unsigned char *sha;
1896 __be32 sip, tip;
1897
1898 if (!dev)
1899 return;
1900
1901 skb_reset_network_header(skb);
1902 arp = arp_hdr(skb);
1903
1904 if (arp->ar_op != htons(ARPOP_REQUEST))
1905 return;
1906
1907 arp_ptr = (unsigned char *)(arp + 1);
1908 sha = arp_ptr;
1909 arp_ptr += dev->addr_len;
1910 memcpy(&sip, arp_ptr, sizeof(sip));
1911 arp_ptr += sizeof(sip);
1912 arp_ptr += dev->addr_len;
1913 memcpy(&tip, arp_ptr, sizeof(tip));
1914
1915 pi = netdev_priv(dev);
1916 if (tip != pi->iscsi_ipv4addr)
1917 return;
1918
1919 arp_send(ARPOP_REPLY, ETH_P_ARP, sip, dev, tip, sha,
1920 dev->dev_addr, sha);
1921
1922}
1923
1924static inline int is_arp(struct sk_buff *skb)
1925{
1926 return skb->protocol == htons(ETH_P_ARP);
1927}
1928
1929/**
Divy Le Ray4d22de32007-01-18 22:04:14 -05001930 * rx_eth - process an ingress ethernet packet
1931 * @adap: the adapter
1932 * @rq: the response queue that received the packet
1933 * @skb: the packet
1934 * @pad: amount of padding at the start of the buffer
1935 *
1936 * Process an ingress ethernet pakcet and deliver it to the stack.
1937 * The padding is 2 if the packet was delivered in an Rx buffer and 0
1938 * if it was immediate data in a response.
1939 */
1940static void rx_eth(struct adapter *adap, struct sge_rspq *rq,
Divy Le Rayb47385b2008-05-21 18:56:26 -07001941 struct sk_buff *skb, int pad, int lro)
Divy Le Ray4d22de32007-01-18 22:04:14 -05001942{
1943 struct cpl_rx_pkt *p = (struct cpl_rx_pkt *)(skb->data + pad);
Divy Le Rayb47385b2008-05-21 18:56:26 -07001944 struct sge_qset *qs = rspq_to_qset(rq);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001945 struct port_info *pi;
1946
Divy Le Ray4d22de32007-01-18 22:04:14 -05001947 skb_pull(skb, sizeof(*p) + pad);
Arnaldo Carvalho de Melo4c13eb62007-04-25 17:40:23 -07001948 skb->protocol = eth_type_trans(skb, adap->port[p->iff]);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001949 pi = netdev_priv(skb->dev);
Roland Dreier47fd23f2009-01-11 00:19:36 -08001950 if ((pi->rx_offload & T3_RX_CSUM) && p->csum_valid && p->csum == htons(0xffff) &&
Divy Le Ray4d22de32007-01-18 22:04:14 -05001951 !p->fragment) {
Karen Xiea109a5b2008-12-18 22:56:20 -08001952 qs->port_stats[SGE_PSTAT_RX_CSUM_GOOD]++;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001953 skb->ip_summed = CHECKSUM_UNNECESSARY;
1954 } else
1955 skb->ip_summed = CHECKSUM_NONE;
David S. Miller0c8dfc82009-01-27 16:22:32 -08001956 skb_record_rx_queue(skb, qs - &adap->sge.qs[0]);
Divy Le Ray4d22de32007-01-18 22:04:14 -05001957
1958 if (unlikely(p->vlan_valid)) {
1959 struct vlan_group *grp = pi->vlan_grp;
1960
Divy Le Rayb47385b2008-05-21 18:56:26 -07001961 qs->port_stats[SGE_PSTAT_VLANEX]++;
Divy Le Ray4d22de32007-01-18 22:04:14 -05001962 if (likely(grp))
Divy Le Rayb47385b2008-05-21 18:56:26 -07001963 if (lro)
Herbert Xu7be2df42009-01-21 14:39:13 -08001964 vlan_gro_receive(&qs->napi, grp,
1965 ntohs(p->vlan), skb);
Karen Xiea109a5b2008-12-18 22:56:20 -08001966 else {
1967 if (unlikely(pi->iscsi_ipv4addr &&
1968 is_arp(skb))) {
1969 unsigned short vtag = ntohs(p->vlan) &
1970 VLAN_VID_MASK;
1971 skb->dev = vlan_group_get_device(grp,
1972 vtag);
1973 cxgb3_arp_process(adap, skb);
1974 }
Divy Le Rayb47385b2008-05-21 18:56:26 -07001975 __vlan_hwaccel_rx(skb, grp, ntohs(p->vlan),
1976 rq->polling);
Karen Xiea109a5b2008-12-18 22:56:20 -08001977 }
Divy Le Ray4d22de32007-01-18 22:04:14 -05001978 else
1979 dev_kfree_skb_any(skb);
Divy Le Rayb47385b2008-05-21 18:56:26 -07001980 } else if (rq->polling) {
1981 if (lro)
Herbert Xu7be2df42009-01-21 14:39:13 -08001982 napi_gro_receive(&qs->napi, skb);
Karen Xiea109a5b2008-12-18 22:56:20 -08001983 else {
1984 if (unlikely(pi->iscsi_ipv4addr && is_arp(skb)))
1985 cxgb3_arp_process(adap, skb);
Divy Le Rayb47385b2008-05-21 18:56:26 -07001986 netif_receive_skb(skb);
Karen Xiea109a5b2008-12-18 22:56:20 -08001987 }
Divy Le Rayb47385b2008-05-21 18:56:26 -07001988 } else
Divy Le Ray4d22de32007-01-18 22:04:14 -05001989 netif_rx(skb);
1990}
1991
Divy Le Rayb47385b2008-05-21 18:56:26 -07001992static inline int is_eth_tcp(u32 rss)
1993{
1994 return G_HASHTYPE(ntohl(rss)) == RSS_HASH_4_TUPLE;
1995}
1996
1997/**
Divy Le Rayb47385b2008-05-21 18:56:26 -07001998 * lro_add_page - add a page chunk to an LRO session
1999 * @adap: the adapter
2000 * @qs: the associated queue set
2001 * @fl: the free list containing the page chunk to add
2002 * @len: packet length
2003 * @complete: Indicates the last fragment of a frame
2004 *
2005 * Add a received packet contained in a page chunk to an existing LRO
2006 * session.
2007 */
2008static void lro_add_page(struct adapter *adap, struct sge_qset *qs,
2009 struct sge_fl *fl, int len, int complete)
2010{
2011 struct rx_sw_desc *sd = &fl->sdesc[fl->cidx];
2012 struct cpl_rx_pkt *cpl;
Herbert Xu7be2df42009-01-21 14:39:13 -08002013 struct skb_frag_struct *rx_frag = qs->lro_frag_tbl.frags;
2014 int nr_frags = qs->lro_frag_tbl.nr_frags;
2015 int frag_len = qs->lro_frag_tbl.len;
Divy Le Rayb47385b2008-05-21 18:56:26 -07002016 int offset = 0;
2017
2018 if (!nr_frags) {
2019 offset = 2 + sizeof(struct cpl_rx_pkt);
2020 qs->lro_va = cpl = sd->pg_chunk.va + 2;
2021 }
2022
2023 fl->credits--;
2024
2025 len -= offset;
2026 pci_unmap_single(adap->pdev, pci_unmap_addr(sd, dma_addr),
2027 fl->buf_size, PCI_DMA_FROMDEVICE);
2028
2029 rx_frag += nr_frags;
2030 rx_frag->page = sd->pg_chunk.page;
2031 rx_frag->page_offset = sd->pg_chunk.offset + offset;
2032 rx_frag->size = len;
2033 frag_len += len;
Herbert Xu7be2df42009-01-21 14:39:13 -08002034 qs->lro_frag_tbl.nr_frags++;
2035 qs->lro_frag_tbl.len = frag_len;
Divy Le Rayb47385b2008-05-21 18:56:26 -07002036
2037 if (!complete)
2038 return;
2039
Herbert Xu7be2df42009-01-21 14:39:13 -08002040 qs->lro_frag_tbl.ip_summed = CHECKSUM_UNNECESSARY;
Divy Le Rayb47385b2008-05-21 18:56:26 -07002041 cpl = qs->lro_va;
2042
2043 if (unlikely(cpl->vlan_valid)) {
2044 struct net_device *dev = qs->netdev;
2045 struct port_info *pi = netdev_priv(dev);
2046 struct vlan_group *grp = pi->vlan_grp;
2047
2048 if (likely(grp != NULL)) {
Herbert Xu7be2df42009-01-21 14:39:13 -08002049 vlan_gro_frags(&qs->napi, grp, ntohs(cpl->vlan),
2050 &qs->lro_frag_tbl);
2051 goto out;
Divy Le Rayb47385b2008-05-21 18:56:26 -07002052 }
2053 }
Herbert Xu7be2df42009-01-21 14:39:13 -08002054 napi_gro_frags(&qs->napi, &qs->lro_frag_tbl);
Divy Le Rayb47385b2008-05-21 18:56:26 -07002055
Herbert Xu7be2df42009-01-21 14:39:13 -08002056out:
2057 qs->lro_frag_tbl.nr_frags = qs->lro_frag_tbl.len = 0;
Divy Le Rayb47385b2008-05-21 18:56:26 -07002058}
2059
Divy Le Ray4d22de32007-01-18 22:04:14 -05002060/**
2061 * handle_rsp_cntrl_info - handles control information in a response
2062 * @qs: the queue set corresponding to the response
2063 * @flags: the response control flags
Divy Le Ray4d22de32007-01-18 22:04:14 -05002064 *
2065 * Handles the control information of an SGE response, such as GTS
2066 * indications and completion credits for the queue set's Tx queues.
Divy Le Ray6195c712007-01-30 19:43:56 -08002067 * HW coalesces credits, we don't do any extra SW coalescing.
Divy Le Ray4d22de32007-01-18 22:04:14 -05002068 */
Divy Le Ray6195c712007-01-30 19:43:56 -08002069static inline void handle_rsp_cntrl_info(struct sge_qset *qs, u32 flags)
Divy Le Ray4d22de32007-01-18 22:04:14 -05002070{
2071 unsigned int credits;
2072
2073#if USE_GTS
2074 if (flags & F_RSPD_TXQ0_GTS)
2075 clear_bit(TXQ_RUNNING, &qs->txq[TXQ_ETH].flags);
2076#endif
2077
Divy Le Ray4d22de32007-01-18 22:04:14 -05002078 credits = G_RSPD_TXQ0_CR(flags);
2079 if (credits)
2080 qs->txq[TXQ_ETH].processed += credits;
2081
Divy Le Ray6195c712007-01-30 19:43:56 -08002082 credits = G_RSPD_TXQ2_CR(flags);
2083 if (credits)
2084 qs->txq[TXQ_CTRL].processed += credits;
2085
Divy Le Ray4d22de32007-01-18 22:04:14 -05002086# if USE_GTS
2087 if (flags & F_RSPD_TXQ1_GTS)
2088 clear_bit(TXQ_RUNNING, &qs->txq[TXQ_OFLD].flags);
2089# endif
Divy Le Ray6195c712007-01-30 19:43:56 -08002090 credits = G_RSPD_TXQ1_CR(flags);
2091 if (credits)
2092 qs->txq[TXQ_OFLD].processed += credits;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002093}
2094
2095/**
2096 * check_ring_db - check if we need to ring any doorbells
2097 * @adapter: the adapter
2098 * @qs: the queue set whose Tx queues are to be examined
2099 * @sleeping: indicates which Tx queue sent GTS
2100 *
2101 * Checks if some of a queue set's Tx queues need to ring their doorbells
2102 * to resume transmission after idling while they still have unprocessed
2103 * descriptors.
2104 */
2105static void check_ring_db(struct adapter *adap, struct sge_qset *qs,
2106 unsigned int sleeping)
2107{
2108 if (sleeping & F_RSPD_TXQ0_GTS) {
2109 struct sge_txq *txq = &qs->txq[TXQ_ETH];
2110
2111 if (txq->cleaned + txq->in_use != txq->processed &&
2112 !test_and_set_bit(TXQ_LAST_PKT_DB, &txq->flags)) {
2113 set_bit(TXQ_RUNNING, &txq->flags);
2114 t3_write_reg(adap, A_SG_KDOORBELL, F_SELEGRCNTX |
2115 V_EGRCNTX(txq->cntxt_id));
2116 }
2117 }
2118
2119 if (sleeping & F_RSPD_TXQ1_GTS) {
2120 struct sge_txq *txq = &qs->txq[TXQ_OFLD];
2121
2122 if (txq->cleaned + txq->in_use != txq->processed &&
2123 !test_and_set_bit(TXQ_LAST_PKT_DB, &txq->flags)) {
2124 set_bit(TXQ_RUNNING, &txq->flags);
2125 t3_write_reg(adap, A_SG_KDOORBELL, F_SELEGRCNTX |
2126 V_EGRCNTX(txq->cntxt_id));
2127 }
2128 }
2129}
2130
2131/**
2132 * is_new_response - check if a response is newly written
2133 * @r: the response descriptor
2134 * @q: the response queue
2135 *
2136 * Returns true if a response descriptor contains a yet unprocessed
2137 * response.
2138 */
2139static inline int is_new_response(const struct rsp_desc *r,
2140 const struct sge_rspq *q)
2141{
2142 return (r->intr_gen & F_RSPD_GEN2) == q->gen;
2143}
2144
Divy Le Ray7385ecf2008-05-21 18:56:21 -07002145static inline void clear_rspq_bufstate(struct sge_rspq * const q)
2146{
2147 q->pg_skb = NULL;
2148 q->rx_recycle_buf = 0;
2149}
2150
Divy Le Ray4d22de32007-01-18 22:04:14 -05002151#define RSPD_GTS_MASK (F_RSPD_TXQ0_GTS | F_RSPD_TXQ1_GTS)
2152#define RSPD_CTRL_MASK (RSPD_GTS_MASK | \
2153 V_RSPD_TXQ0_CR(M_RSPD_TXQ0_CR) | \
2154 V_RSPD_TXQ1_CR(M_RSPD_TXQ1_CR) | \
2155 V_RSPD_TXQ2_CR(M_RSPD_TXQ2_CR))
2156
2157/* How long to delay the next interrupt in case of memory shortage, in 0.1us. */
2158#define NOMEM_INTR_DELAY 2500
2159
2160/**
2161 * process_responses - process responses from an SGE response queue
2162 * @adap: the adapter
2163 * @qs: the queue set to which the response queue belongs
2164 * @budget: how many responses can be processed in this round
2165 *
2166 * Process responses from an SGE response queue up to the supplied budget.
2167 * Responses include received packets as well as credits and other events
2168 * for the queues that belong to the response queue's queue set.
2169 * A negative budget is effectively unlimited.
2170 *
2171 * Additionally choose the interrupt holdoff time for the next interrupt
2172 * on this queue. If the system is under memory shortage use a fairly
2173 * long delay to help recovery.
2174 */
2175static int process_responses(struct adapter *adap, struct sge_qset *qs,
2176 int budget)
2177{
2178 struct sge_rspq *q = &qs->rspq;
2179 struct rsp_desc *r = &q->desc[q->cidx];
2180 int budget_left = budget;
Divy Le Ray6195c712007-01-30 19:43:56 -08002181 unsigned int sleeping = 0;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002182 struct sk_buff *offload_skbs[RX_BUNDLE_SIZE];
2183 int ngathered = 0;
2184
2185 q->next_holdoff = q->holdoff_tmr;
2186
2187 while (likely(budget_left && is_new_response(r, q))) {
Divy Le Rayb47385b2008-05-21 18:56:26 -07002188 int packet_complete, eth, ethpad = 2, lro = qs->lro_enabled;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002189 struct sk_buff *skb = NULL;
2190 u32 len, flags = ntohl(r->flags);
Divy Le Ray7385ecf2008-05-21 18:56:21 -07002191 __be32 rss_hi = *(const __be32 *)r,
2192 rss_lo = r->rss_hdr.rss_hash_val;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002193
2194 eth = r->rss_hdr.opcode == CPL_RX_PKT;
2195
2196 if (unlikely(flags & F_RSPD_ASYNC_NOTIF)) {
2197 skb = alloc_skb(AN_PKT_SIZE, GFP_ATOMIC);
2198 if (!skb)
2199 goto no_mem;
2200
2201 memcpy(__skb_put(skb, AN_PKT_SIZE), r, AN_PKT_SIZE);
2202 skb->data[0] = CPL_ASYNC_NOTIF;
2203 rss_hi = htonl(CPL_ASYNC_NOTIF << 24);
2204 q->async_notif++;
2205 } else if (flags & F_RSPD_IMM_DATA_VALID) {
2206 skb = get_imm_packet(r);
2207 if (unlikely(!skb)) {
Divy Le Raycf992af2007-05-30 21:10:47 -07002208no_mem:
Divy Le Ray4d22de32007-01-18 22:04:14 -05002209 q->next_holdoff = NOMEM_INTR_DELAY;
2210 q->nomem++;
2211 /* consume one credit since we tried */
2212 budget_left--;
2213 break;
2214 }
2215 q->imm_data++;
Divy Le Raye0994eb2007-02-24 16:44:17 -08002216 ethpad = 0;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002217 } else if ((len = ntohl(r->len_cq)) != 0) {
Divy Le Raycf992af2007-05-30 21:10:47 -07002218 struct sge_fl *fl;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002219
Divy Le Ray65ab8382009-02-04 16:31:39 -08002220 lro &= eth && is_eth_tcp(rss_hi);
Divy Le Rayb47385b2008-05-21 18:56:26 -07002221
Divy Le Raycf992af2007-05-30 21:10:47 -07002222 fl = (len & F_RSPD_FLQ) ? &qs->fl[1] : &qs->fl[0];
2223 if (fl->use_pages) {
2224 void *addr = fl->sdesc[fl->cidx].pg_chunk.va;
Divy Le Raye0994eb2007-02-24 16:44:17 -08002225
Divy Le Raycf992af2007-05-30 21:10:47 -07002226 prefetch(addr);
2227#if L1_CACHE_BYTES < 128
2228 prefetch(addr + L1_CACHE_BYTES);
2229#endif
Divy Le Raye0994eb2007-02-24 16:44:17 -08002230 __refill_fl(adap, fl);
Divy Le Rayb47385b2008-05-21 18:56:26 -07002231 if (lro > 0) {
2232 lro_add_page(adap, qs, fl,
2233 G_RSPD_LEN(len),
2234 flags & F_RSPD_EOP);
2235 goto next_fl;
2236 }
Divy Le Raye0994eb2007-02-24 16:44:17 -08002237
Divy Le Ray7385ecf2008-05-21 18:56:21 -07002238 skb = get_packet_pg(adap, fl, q,
2239 G_RSPD_LEN(len),
2240 eth ?
2241 SGE_RX_DROP_THRES : 0);
2242 q->pg_skb = skb;
Divy Le Raycf992af2007-05-30 21:10:47 -07002243 } else
Divy Le Raye0994eb2007-02-24 16:44:17 -08002244 skb = get_packet(adap, fl, G_RSPD_LEN(len),
2245 eth ? SGE_RX_DROP_THRES : 0);
Divy Le Raycf992af2007-05-30 21:10:47 -07002246 if (unlikely(!skb)) {
2247 if (!eth)
2248 goto no_mem;
2249 q->rx_drops++;
2250 } else if (unlikely(r->rss_hdr.opcode == CPL_TRACE_PKT))
2251 __skb_pull(skb, 2);
Divy Le Rayb47385b2008-05-21 18:56:26 -07002252next_fl:
Divy Le Ray4d22de32007-01-18 22:04:14 -05002253 if (++fl->cidx == fl->size)
2254 fl->cidx = 0;
2255 } else
2256 q->pure_rsps++;
2257
2258 if (flags & RSPD_CTRL_MASK) {
2259 sleeping |= flags & RSPD_GTS_MASK;
Divy Le Ray6195c712007-01-30 19:43:56 -08002260 handle_rsp_cntrl_info(qs, flags);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002261 }
2262
2263 r++;
2264 if (unlikely(++q->cidx == q->size)) {
2265 q->cidx = 0;
2266 q->gen ^= 1;
2267 r = q->desc;
2268 }
2269 prefetch(r);
2270
2271 if (++q->credits >= (q->size / 4)) {
2272 refill_rspq(adap, q, q->credits);
2273 q->credits = 0;
2274 }
2275
Divy Le Ray7385ecf2008-05-21 18:56:21 -07002276 packet_complete = flags &
2277 (F_RSPD_EOP | F_RSPD_IMM_DATA_VALID |
2278 F_RSPD_ASYNC_NOTIF);
2279
2280 if (skb != NULL && packet_complete) {
Divy Le Ray4d22de32007-01-18 22:04:14 -05002281 if (eth)
Divy Le Rayb47385b2008-05-21 18:56:26 -07002282 rx_eth(adap, q, skb, ethpad, lro);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002283 else {
Divy Le Rayafefce62007-11-16 11:22:21 -08002284 q->offload_pkts++;
Divy Le Raycf992af2007-05-30 21:10:47 -07002285 /* Preserve the RSS info in csum & priority */
2286 skb->csum = rss_hi;
2287 skb->priority = rss_lo;
2288 ngathered = rx_offload(&adap->tdev, q, skb,
2289 offload_skbs,
Divy Le Raye0994eb2007-02-24 16:44:17 -08002290 ngathered);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002291 }
Divy Le Ray7385ecf2008-05-21 18:56:21 -07002292
2293 if (flags & F_RSPD_EOP)
Divy Le Rayb47385b2008-05-21 18:56:26 -07002294 clear_rspq_bufstate(q);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002295 }
Divy Le Ray4d22de32007-01-18 22:04:14 -05002296 --budget_left;
2297 }
2298
Divy Le Ray4d22de32007-01-18 22:04:14 -05002299 deliver_partial_bundle(&adap->tdev, q, offload_skbs, ngathered);
Divy Le Rayb47385b2008-05-21 18:56:26 -07002300
Divy Le Ray4d22de32007-01-18 22:04:14 -05002301 if (sleeping)
2302 check_ring_db(adap, qs, sleeping);
2303
2304 smp_mb(); /* commit Tx queue .processed updates */
2305 if (unlikely(qs->txq_stopped != 0))
2306 restart_tx(qs);
2307
2308 budget -= budget_left;
2309 return budget;
2310}
2311
2312static inline int is_pure_response(const struct rsp_desc *r)
2313{
Roland Dreierc5419e62008-11-28 21:55:42 -08002314 __be32 n = r->flags & htonl(F_RSPD_ASYNC_NOTIF | F_RSPD_IMM_DATA_VALID);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002315
2316 return (n | r->len_cq) == 0;
2317}
2318
2319/**
2320 * napi_rx_handler - the NAPI handler for Rx processing
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002321 * @napi: the napi instance
Divy Le Ray4d22de32007-01-18 22:04:14 -05002322 * @budget: how many packets we can process in this round
2323 *
2324 * Handler for new data events when using NAPI.
2325 */
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002326static int napi_rx_handler(struct napi_struct *napi, int budget)
Divy Le Ray4d22de32007-01-18 22:04:14 -05002327{
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002328 struct sge_qset *qs = container_of(napi, struct sge_qset, napi);
2329 struct adapter *adap = qs->adap;
2330 int work_done = process_responses(adap, qs, budget);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002331
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002332 if (likely(work_done < budget)) {
2333 napi_complete(napi);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002334
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002335 /*
2336 * Because we don't atomically flush the following
2337 * write it is possible that in very rare cases it can
2338 * reach the device in a way that races with a new
2339 * response being written plus an error interrupt
2340 * causing the NAPI interrupt handler below to return
2341 * unhandled status to the OS. To protect against
2342 * this would require flushing the write and doing
2343 * both the write and the flush with interrupts off.
2344 * Way too expensive and unjustifiable given the
2345 * rarity of the race.
2346 *
2347 * The race cannot happen at all with MSI-X.
2348 */
2349 t3_write_reg(adap, A_SG_GTS, V_RSPQ(qs->rspq.cntxt_id) |
2350 V_NEWTIMER(qs->rspq.next_holdoff) |
2351 V_NEWINDEX(qs->rspq.cidx));
2352 }
2353 return work_done;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002354}
2355
2356/*
2357 * Returns true if the device is already scheduled for polling.
2358 */
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002359static inline int napi_is_scheduled(struct napi_struct *napi)
Divy Le Ray4d22de32007-01-18 22:04:14 -05002360{
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002361 return test_bit(NAPI_STATE_SCHED, &napi->state);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002362}
2363
2364/**
2365 * process_pure_responses - process pure responses from a response queue
2366 * @adap: the adapter
2367 * @qs: the queue set owning the response queue
2368 * @r: the first pure response to process
2369 *
2370 * A simpler version of process_responses() that handles only pure (i.e.,
2371 * non data-carrying) responses. Such respones are too light-weight to
2372 * justify calling a softirq under NAPI, so we handle them specially in
2373 * the interrupt handler. The function is called with a pointer to a
2374 * response, which the caller must ensure is a valid pure response.
2375 *
2376 * Returns 1 if it encounters a valid data-carrying response, 0 otherwise.
2377 */
2378static int process_pure_responses(struct adapter *adap, struct sge_qset *qs,
2379 struct rsp_desc *r)
2380{
2381 struct sge_rspq *q = &qs->rspq;
Divy Le Ray6195c712007-01-30 19:43:56 -08002382 unsigned int sleeping = 0;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002383
2384 do {
2385 u32 flags = ntohl(r->flags);
2386
2387 r++;
2388 if (unlikely(++q->cidx == q->size)) {
2389 q->cidx = 0;
2390 q->gen ^= 1;
2391 r = q->desc;
2392 }
2393 prefetch(r);
2394
2395 if (flags & RSPD_CTRL_MASK) {
2396 sleeping |= flags & RSPD_GTS_MASK;
Divy Le Ray6195c712007-01-30 19:43:56 -08002397 handle_rsp_cntrl_info(qs, flags);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002398 }
2399
2400 q->pure_rsps++;
2401 if (++q->credits >= (q->size / 4)) {
2402 refill_rspq(adap, q, q->credits);
2403 q->credits = 0;
2404 }
2405 } while (is_new_response(r, q) && is_pure_response(r));
2406
Divy Le Ray4d22de32007-01-18 22:04:14 -05002407 if (sleeping)
2408 check_ring_db(adap, qs, sleeping);
2409
2410 smp_mb(); /* commit Tx queue .processed updates */
2411 if (unlikely(qs->txq_stopped != 0))
2412 restart_tx(qs);
2413
2414 return is_new_response(r, q);
2415}
2416
2417/**
2418 * handle_responses - decide what to do with new responses in NAPI mode
2419 * @adap: the adapter
2420 * @q: the response queue
2421 *
2422 * This is used by the NAPI interrupt handlers to decide what to do with
2423 * new SGE responses. If there are no new responses it returns -1. If
2424 * there are new responses and they are pure (i.e., non-data carrying)
2425 * it handles them straight in hard interrupt context as they are very
2426 * cheap and don't deliver any packets. Finally, if there are any data
2427 * signaling responses it schedules the NAPI handler. Returns 1 if it
2428 * schedules NAPI, 0 if all new responses were pure.
2429 *
2430 * The caller must ascertain NAPI is not already running.
2431 */
2432static inline int handle_responses(struct adapter *adap, struct sge_rspq *q)
2433{
2434 struct sge_qset *qs = rspq_to_qset(q);
2435 struct rsp_desc *r = &q->desc[q->cidx];
2436
2437 if (!is_new_response(r, q))
2438 return -1;
2439 if (is_pure_response(r) && process_pure_responses(adap, qs, r) == 0) {
2440 t3_write_reg(adap, A_SG_GTS, V_RSPQ(q->cntxt_id) |
2441 V_NEWTIMER(q->holdoff_tmr) | V_NEWINDEX(q->cidx));
2442 return 0;
2443 }
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002444 napi_schedule(&qs->napi);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002445 return 1;
2446}
2447
2448/*
2449 * The MSI-X interrupt handler for an SGE response queue for the non-NAPI case
2450 * (i.e., response queue serviced in hard interrupt).
2451 */
2452irqreturn_t t3_sge_intr_msix(int irq, void *cookie)
2453{
2454 struct sge_qset *qs = cookie;
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002455 struct adapter *adap = qs->adap;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002456 struct sge_rspq *q = &qs->rspq;
2457
2458 spin_lock(&q->lock);
2459 if (process_responses(adap, qs, -1) == 0)
2460 q->unhandled_irqs++;
2461 t3_write_reg(adap, A_SG_GTS, V_RSPQ(q->cntxt_id) |
2462 V_NEWTIMER(q->next_holdoff) | V_NEWINDEX(q->cidx));
2463 spin_unlock(&q->lock);
2464 return IRQ_HANDLED;
2465}
2466
2467/*
2468 * The MSI-X interrupt handler for an SGE response queue for the NAPI case
2469 * (i.e., response queue serviced by NAPI polling).
2470 */
Stephen Hemminger9265fab2007-10-08 16:22:29 -07002471static irqreturn_t t3_sge_intr_msix_napi(int irq, void *cookie)
Divy Le Ray4d22de32007-01-18 22:04:14 -05002472{
2473 struct sge_qset *qs = cookie;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002474 struct sge_rspq *q = &qs->rspq;
2475
2476 spin_lock(&q->lock);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002477
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002478 if (handle_responses(qs->adap, q) < 0)
Divy Le Ray4d22de32007-01-18 22:04:14 -05002479 q->unhandled_irqs++;
2480 spin_unlock(&q->lock);
2481 return IRQ_HANDLED;
2482}
2483
2484/*
2485 * The non-NAPI MSI interrupt handler. This needs to handle data events from
2486 * SGE response queues as well as error and other async events as they all use
2487 * the same MSI vector. We use one SGE response queue per port in this mode
2488 * and protect all response queues with queue 0's lock.
2489 */
2490static irqreturn_t t3_intr_msi(int irq, void *cookie)
2491{
2492 int new_packets = 0;
2493 struct adapter *adap = cookie;
2494 struct sge_rspq *q = &adap->sge.qs[0].rspq;
2495
2496 spin_lock(&q->lock);
2497
2498 if (process_responses(adap, &adap->sge.qs[0], -1)) {
2499 t3_write_reg(adap, A_SG_GTS, V_RSPQ(q->cntxt_id) |
2500 V_NEWTIMER(q->next_holdoff) | V_NEWINDEX(q->cidx));
2501 new_packets = 1;
2502 }
2503
2504 if (adap->params.nports == 2 &&
2505 process_responses(adap, &adap->sge.qs[1], -1)) {
2506 struct sge_rspq *q1 = &adap->sge.qs[1].rspq;
2507
2508 t3_write_reg(adap, A_SG_GTS, V_RSPQ(q1->cntxt_id) |
2509 V_NEWTIMER(q1->next_holdoff) |
2510 V_NEWINDEX(q1->cidx));
2511 new_packets = 1;
2512 }
2513
2514 if (!new_packets && t3_slow_intr_handler(adap) == 0)
2515 q->unhandled_irqs++;
2516
2517 spin_unlock(&q->lock);
2518 return IRQ_HANDLED;
2519}
2520
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002521static int rspq_check_napi(struct sge_qset *qs)
Divy Le Ray4d22de32007-01-18 22:04:14 -05002522{
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002523 struct sge_rspq *q = &qs->rspq;
2524
2525 if (!napi_is_scheduled(&qs->napi) &&
2526 is_new_response(&q->desc[q->cidx], q)) {
2527 napi_schedule(&qs->napi);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002528 return 1;
2529 }
2530 return 0;
2531}
2532
2533/*
2534 * The MSI interrupt handler for the NAPI case (i.e., response queues serviced
2535 * by NAPI polling). Handles data events from SGE response queues as well as
2536 * error and other async events as they all use the same MSI vector. We use
2537 * one SGE response queue per port in this mode and protect all response
2538 * queues with queue 0's lock.
2539 */
Stephen Hemminger9265fab2007-10-08 16:22:29 -07002540static irqreturn_t t3_intr_msi_napi(int irq, void *cookie)
Divy Le Ray4d22de32007-01-18 22:04:14 -05002541{
2542 int new_packets;
2543 struct adapter *adap = cookie;
2544 struct sge_rspq *q = &adap->sge.qs[0].rspq;
2545
2546 spin_lock(&q->lock);
2547
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002548 new_packets = rspq_check_napi(&adap->sge.qs[0]);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002549 if (adap->params.nports == 2)
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002550 new_packets += rspq_check_napi(&adap->sge.qs[1]);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002551 if (!new_packets && t3_slow_intr_handler(adap) == 0)
2552 q->unhandled_irqs++;
2553
2554 spin_unlock(&q->lock);
2555 return IRQ_HANDLED;
2556}
2557
2558/*
2559 * A helper function that processes responses and issues GTS.
2560 */
2561static inline int process_responses_gts(struct adapter *adap,
2562 struct sge_rspq *rq)
2563{
2564 int work;
2565
2566 work = process_responses(adap, rspq_to_qset(rq), -1);
2567 t3_write_reg(adap, A_SG_GTS, V_RSPQ(rq->cntxt_id) |
2568 V_NEWTIMER(rq->next_holdoff) | V_NEWINDEX(rq->cidx));
2569 return work;
2570}
2571
2572/*
2573 * The legacy INTx interrupt handler. This needs to handle data events from
2574 * SGE response queues as well as error and other async events as they all use
2575 * the same interrupt pin. We use one SGE response queue per port in this mode
2576 * and protect all response queues with queue 0's lock.
2577 */
2578static irqreturn_t t3_intr(int irq, void *cookie)
2579{
2580 int work_done, w0, w1;
2581 struct adapter *adap = cookie;
2582 struct sge_rspq *q0 = &adap->sge.qs[0].rspq;
2583 struct sge_rspq *q1 = &adap->sge.qs[1].rspq;
2584
2585 spin_lock(&q0->lock);
2586
2587 w0 = is_new_response(&q0->desc[q0->cidx], q0);
2588 w1 = adap->params.nports == 2 &&
2589 is_new_response(&q1->desc[q1->cidx], q1);
2590
2591 if (likely(w0 | w1)) {
2592 t3_write_reg(adap, A_PL_CLI, 0);
2593 t3_read_reg(adap, A_PL_CLI); /* flush */
2594
2595 if (likely(w0))
2596 process_responses_gts(adap, q0);
2597
2598 if (w1)
2599 process_responses_gts(adap, q1);
2600
2601 work_done = w0 | w1;
2602 } else
2603 work_done = t3_slow_intr_handler(adap);
2604
2605 spin_unlock(&q0->lock);
2606 return IRQ_RETVAL(work_done != 0);
2607}
2608
2609/*
2610 * Interrupt handler for legacy INTx interrupts for T3B-based cards.
2611 * Handles data events from SGE response queues as well as error and other
2612 * async events as they all use the same interrupt pin. We use one SGE
2613 * response queue per port in this mode and protect all response queues with
2614 * queue 0's lock.
2615 */
2616static irqreturn_t t3b_intr(int irq, void *cookie)
2617{
2618 u32 map;
2619 struct adapter *adap = cookie;
2620 struct sge_rspq *q0 = &adap->sge.qs[0].rspq;
2621
2622 t3_write_reg(adap, A_PL_CLI, 0);
2623 map = t3_read_reg(adap, A_SG_DATA_INTR);
2624
2625 if (unlikely(!map)) /* shared interrupt, most likely */
2626 return IRQ_NONE;
2627
2628 spin_lock(&q0->lock);
2629
2630 if (unlikely(map & F_ERRINTR))
2631 t3_slow_intr_handler(adap);
2632
2633 if (likely(map & 1))
2634 process_responses_gts(adap, q0);
2635
2636 if (map & 2)
2637 process_responses_gts(adap, &adap->sge.qs[1].rspq);
2638
2639 spin_unlock(&q0->lock);
2640 return IRQ_HANDLED;
2641}
2642
2643/*
2644 * NAPI interrupt handler for legacy INTx interrupts for T3B-based cards.
2645 * Handles data events from SGE response queues as well as error and other
2646 * async events as they all use the same interrupt pin. We use one SGE
2647 * response queue per port in this mode and protect all response queues with
2648 * queue 0's lock.
2649 */
2650static irqreturn_t t3b_intr_napi(int irq, void *cookie)
2651{
2652 u32 map;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002653 struct adapter *adap = cookie;
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002654 struct sge_qset *qs0 = &adap->sge.qs[0];
2655 struct sge_rspq *q0 = &qs0->rspq;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002656
2657 t3_write_reg(adap, A_PL_CLI, 0);
2658 map = t3_read_reg(adap, A_SG_DATA_INTR);
2659
2660 if (unlikely(!map)) /* shared interrupt, most likely */
2661 return IRQ_NONE;
2662
2663 spin_lock(&q0->lock);
2664
2665 if (unlikely(map & F_ERRINTR))
2666 t3_slow_intr_handler(adap);
2667
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002668 if (likely(map & 1))
2669 napi_schedule(&qs0->napi);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002670
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002671 if (map & 2)
2672 napi_schedule(&adap->sge.qs[1].napi);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002673
2674 spin_unlock(&q0->lock);
2675 return IRQ_HANDLED;
2676}
2677
2678/**
2679 * t3_intr_handler - select the top-level interrupt handler
2680 * @adap: the adapter
2681 * @polling: whether using NAPI to service response queues
2682 *
2683 * Selects the top-level interrupt handler based on the type of interrupts
2684 * (MSI-X, MSI, or legacy) and whether NAPI will be used to service the
2685 * response queues.
2686 */
Jeff Garzik7c239972007-10-19 03:12:20 -04002687irq_handler_t t3_intr_handler(struct adapter *adap, int polling)
Divy Le Ray4d22de32007-01-18 22:04:14 -05002688{
2689 if (adap->flags & USING_MSIX)
2690 return polling ? t3_sge_intr_msix_napi : t3_sge_intr_msix;
2691 if (adap->flags & USING_MSI)
2692 return polling ? t3_intr_msi_napi : t3_intr_msi;
2693 if (adap->params.rev > 0)
2694 return polling ? t3b_intr_napi : t3b_intr;
2695 return t3_intr;
2696}
2697
Divy Le Rayb8819552007-12-17 18:47:31 -08002698#define SGE_PARERR (F_CPPARITYERROR | F_OCPARITYERROR | F_RCPARITYERROR | \
2699 F_IRPARITYERROR | V_ITPARITYERROR(M_ITPARITYERROR) | \
2700 V_FLPARITYERROR(M_FLPARITYERROR) | F_LODRBPARITYERROR | \
2701 F_HIDRBPARITYERROR | F_LORCQPARITYERROR | \
2702 F_HIRCQPARITYERROR)
2703#define SGE_FRAMINGERR (F_UC_REQ_FRAMINGERROR | F_R_REQ_FRAMINGERROR)
2704#define SGE_FATALERR (SGE_PARERR | SGE_FRAMINGERR | F_RSPQCREDITOVERFOW | \
2705 F_RSPQDISABLED)
2706
Divy Le Ray4d22de32007-01-18 22:04:14 -05002707/**
2708 * t3_sge_err_intr_handler - SGE async event interrupt handler
2709 * @adapter: the adapter
2710 *
2711 * Interrupt handler for SGE asynchronous (non-data) events.
2712 */
2713void t3_sge_err_intr_handler(struct adapter *adapter)
2714{
2715 unsigned int v, status = t3_read_reg(adapter, A_SG_INT_CAUSE);
2716
Divy Le Rayb8819552007-12-17 18:47:31 -08002717 if (status & SGE_PARERR)
2718 CH_ALERT(adapter, "SGE parity error (0x%x)\n",
2719 status & SGE_PARERR);
2720 if (status & SGE_FRAMINGERR)
2721 CH_ALERT(adapter, "SGE framing error (0x%x)\n",
2722 status & SGE_FRAMINGERR);
2723
Divy Le Ray4d22de32007-01-18 22:04:14 -05002724 if (status & F_RSPQCREDITOVERFOW)
2725 CH_ALERT(adapter, "SGE response queue credit overflow\n");
2726
2727 if (status & F_RSPQDISABLED) {
2728 v = t3_read_reg(adapter, A_SG_RSPQ_FL_STATUS);
2729
2730 CH_ALERT(adapter,
2731 "packet delivered to disabled response queue "
2732 "(0x%x)\n", (v >> S_RSPQ0DISABLED) & 0xff);
2733 }
2734
Divy Le Ray6e3f03b2007-08-21 20:49:10 -07002735 if (status & (F_HIPIODRBDROPERR | F_LOPIODRBDROPERR))
2736 CH_ALERT(adapter, "SGE dropped %s priority doorbell\n",
2737 status & F_HIPIODRBDROPERR ? "high" : "lo");
2738
Divy Le Ray4d22de32007-01-18 22:04:14 -05002739 t3_write_reg(adapter, A_SG_INT_CAUSE, status);
Divy Le Rayb8819552007-12-17 18:47:31 -08002740 if (status & SGE_FATALERR)
Divy Le Ray4d22de32007-01-18 22:04:14 -05002741 t3_fatal_err(adapter);
2742}
2743
2744/**
2745 * sge_timer_cb - perform periodic maintenance of an SGE qset
2746 * @data: the SGE queue set to maintain
2747 *
2748 * Runs periodically from a timer to perform maintenance of an SGE queue
2749 * set. It performs two tasks:
2750 *
2751 * a) Cleans up any completed Tx descriptors that may still be pending.
2752 * Normal descriptor cleanup happens when new packets are added to a Tx
2753 * queue so this timer is relatively infrequent and does any cleanup only
2754 * if the Tx queue has not seen any new packets in a while. We make a
2755 * best effort attempt to reclaim descriptors, in that we don't wait
2756 * around if we cannot get a queue's lock (which most likely is because
2757 * someone else is queueing new packets and so will also handle the clean
2758 * up). Since control queues use immediate data exclusively we don't
2759 * bother cleaning them up here.
2760 *
2761 * b) Replenishes Rx queues that have run out due to memory shortage.
2762 * Normally new Rx buffers are added when existing ones are consumed but
2763 * when out of memory a queue can become empty. We try to add only a few
2764 * buffers here, the queue will be replenished fully as these new buffers
2765 * are used up if memory shortage has subsided.
2766 */
2767static void sge_timer_cb(unsigned long data)
2768{
2769 spinlock_t *lock;
2770 struct sge_qset *qs = (struct sge_qset *)data;
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002771 struct adapter *adap = qs->adap;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002772
2773 if (spin_trylock(&qs->txq[TXQ_ETH].lock)) {
2774 reclaim_completed_tx(adap, &qs->txq[TXQ_ETH]);
2775 spin_unlock(&qs->txq[TXQ_ETH].lock);
2776 }
2777 if (spin_trylock(&qs->txq[TXQ_OFLD].lock)) {
2778 reclaim_completed_tx(adap, &qs->txq[TXQ_OFLD]);
2779 spin_unlock(&qs->txq[TXQ_OFLD].lock);
2780 }
2781 lock = (adap->flags & USING_MSIX) ? &qs->rspq.lock :
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002782 &adap->sge.qs[0].rspq.lock;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002783 if (spin_trylock_irq(lock)) {
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002784 if (!napi_is_scheduled(&qs->napi)) {
Divy Le Raybae73f42007-02-24 16:44:12 -08002785 u32 status = t3_read_reg(adap, A_SG_RSPQ_FL_STATUS);
2786
Divy Le Ray4d22de32007-01-18 22:04:14 -05002787 if (qs->fl[0].credits < qs->fl[0].size)
2788 __refill_fl(adap, &qs->fl[0]);
2789 if (qs->fl[1].credits < qs->fl[1].size)
2790 __refill_fl(adap, &qs->fl[1]);
Divy Le Raybae73f42007-02-24 16:44:12 -08002791
2792 if (status & (1 << qs->rspq.cntxt_id)) {
2793 qs->rspq.starved++;
2794 if (qs->rspq.credits) {
2795 refill_rspq(adap, &qs->rspq, 1);
2796 qs->rspq.credits--;
2797 qs->rspq.restarted++;
Divy Le Raye0994eb2007-02-24 16:44:17 -08002798 t3_write_reg(adap, A_SG_RSPQ_FL_STATUS,
Divy Le Raybae73f42007-02-24 16:44:12 -08002799 1 << qs->rspq.cntxt_id);
2800 }
2801 }
Divy Le Ray4d22de32007-01-18 22:04:14 -05002802 }
2803 spin_unlock_irq(lock);
2804 }
2805 mod_timer(&qs->tx_reclaim_timer, jiffies + TX_RECLAIM_PERIOD);
2806}
2807
2808/**
2809 * t3_update_qset_coalesce - update coalescing settings for a queue set
2810 * @qs: the SGE queue set
2811 * @p: new queue set parameters
2812 *
2813 * Update the coalescing settings for an SGE queue set. Nothing is done
2814 * if the queue set is not initialized yet.
2815 */
2816void t3_update_qset_coalesce(struct sge_qset *qs, const struct qset_params *p)
2817{
Divy Le Ray4d22de32007-01-18 22:04:14 -05002818 qs->rspq.holdoff_tmr = max(p->coalesce_usecs * 10, 1U);/* can't be 0 */
2819 qs->rspq.polling = p->polling;
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002820 qs->napi.poll = p->polling ? napi_rx_handler : ofld_poll;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002821}
2822
2823/**
2824 * t3_sge_alloc_qset - initialize an SGE queue set
2825 * @adapter: the adapter
2826 * @id: the queue set id
2827 * @nports: how many Ethernet ports will be using this queue set
2828 * @irq_vec_idx: the IRQ vector index for response queue interrupts
2829 * @p: configuration parameters for this queue set
2830 * @ntxq: number of Tx queues for the queue set
2831 * @netdev: net device associated with this queue set
Divy Le Ray82ad3322008-12-16 01:09:39 -08002832 * @netdevq: net device TX queue associated with this queue set
Divy Le Ray4d22de32007-01-18 22:04:14 -05002833 *
2834 * Allocate resources and initialize an SGE queue set. A queue set
2835 * comprises a response queue, two Rx free-buffer queues, and up to 3
2836 * Tx queues. The Tx queues are assigned roles in the order Ethernet
2837 * queue, offload queue, and control queue.
2838 */
2839int t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports,
2840 int irq_vec_idx, const struct qset_params *p,
Divy Le Ray82ad3322008-12-16 01:09:39 -08002841 int ntxq, struct net_device *dev,
2842 struct netdev_queue *netdevq)
Divy Le Ray4d22de32007-01-18 22:04:14 -05002843{
Divy Le Rayb1fb1f22008-05-21 18:56:16 -07002844 int i, avail, ret = -ENOMEM;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002845 struct sge_qset *q = &adapter->sge.qs[id];
2846
2847 init_qset_cntxt(q, id);
Divy Le Ray20d3fc12008-10-08 17:36:03 -07002848 setup_timer(&q->tx_reclaim_timer, sge_timer_cb, (unsigned long)q);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002849
2850 q->fl[0].desc = alloc_ring(adapter->pdev, p->fl_size,
2851 sizeof(struct rx_desc),
2852 sizeof(struct rx_sw_desc),
2853 &q->fl[0].phys_addr, &q->fl[0].sdesc);
2854 if (!q->fl[0].desc)
2855 goto err;
2856
2857 q->fl[1].desc = alloc_ring(adapter->pdev, p->jumbo_size,
2858 sizeof(struct rx_desc),
2859 sizeof(struct rx_sw_desc),
2860 &q->fl[1].phys_addr, &q->fl[1].sdesc);
2861 if (!q->fl[1].desc)
2862 goto err;
2863
2864 q->rspq.desc = alloc_ring(adapter->pdev, p->rspq_size,
2865 sizeof(struct rsp_desc), 0,
2866 &q->rspq.phys_addr, NULL);
2867 if (!q->rspq.desc)
2868 goto err;
2869
2870 for (i = 0; i < ntxq; ++i) {
2871 /*
2872 * The control queue always uses immediate data so does not
2873 * need to keep track of any sk_buffs.
2874 */
2875 size_t sz = i == TXQ_CTRL ? 0 : sizeof(struct tx_sw_desc);
2876
2877 q->txq[i].desc = alloc_ring(adapter->pdev, p->txq_size[i],
2878 sizeof(struct tx_desc), sz,
2879 &q->txq[i].phys_addr,
2880 &q->txq[i].sdesc);
2881 if (!q->txq[i].desc)
2882 goto err;
2883
2884 q->txq[i].gen = 1;
2885 q->txq[i].size = p->txq_size[i];
2886 spin_lock_init(&q->txq[i].lock);
2887 skb_queue_head_init(&q->txq[i].sendq);
2888 }
2889
2890 tasklet_init(&q->txq[TXQ_OFLD].qresume_tsk, restart_offloadq,
2891 (unsigned long)q);
2892 tasklet_init(&q->txq[TXQ_CTRL].qresume_tsk, restart_ctrlq,
2893 (unsigned long)q);
2894
2895 q->fl[0].gen = q->fl[1].gen = 1;
2896 q->fl[0].size = p->fl_size;
2897 q->fl[1].size = p->jumbo_size;
2898
2899 q->rspq.gen = 1;
2900 q->rspq.size = p->rspq_size;
2901 spin_lock_init(&q->rspq.lock);
David S. Miller147e70e2008-09-22 01:29:52 -07002902 skb_queue_head_init(&q->rspq.rx_queue);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002903
2904 q->txq[TXQ_ETH].stop_thres = nports *
2905 flits_to_desc(sgl_len(MAX_SKB_FRAGS + 1) + 3);
2906
Divy Le Raycf992af2007-05-30 21:10:47 -07002907#if FL0_PG_CHUNK_SIZE > 0
2908 q->fl[0].buf_size = FL0_PG_CHUNK_SIZE;
Divy Le Raye0994eb2007-02-24 16:44:17 -08002909#else
Divy Le Raycf992af2007-05-30 21:10:47 -07002910 q->fl[0].buf_size = SGE_RX_SM_BUF_SIZE + sizeof(struct cpl_rx_data);
Divy Le Raye0994eb2007-02-24 16:44:17 -08002911#endif
Divy Le Ray7385ecf2008-05-21 18:56:21 -07002912#if FL1_PG_CHUNK_SIZE > 0
2913 q->fl[1].buf_size = FL1_PG_CHUNK_SIZE;
2914#else
Divy Le Raycf992af2007-05-30 21:10:47 -07002915 q->fl[1].buf_size = is_offload(adapter) ?
2916 (16 * 1024) - SKB_DATA_ALIGN(sizeof(struct skb_shared_info)) :
2917 MAX_FRAME_SIZE + 2 + sizeof(struct cpl_rx_pkt);
Divy Le Ray7385ecf2008-05-21 18:56:21 -07002918#endif
2919
2920 q->fl[0].use_pages = FL0_PG_CHUNK_SIZE > 0;
2921 q->fl[1].use_pages = FL1_PG_CHUNK_SIZE > 0;
2922 q->fl[0].order = FL0_PG_ORDER;
2923 q->fl[1].order = FL1_PG_ORDER;
Divy Le Ray4d22de32007-01-18 22:04:14 -05002924
Roland Dreierb1186de2008-03-20 13:30:48 -07002925 spin_lock_irq(&adapter->sge.reg_lock);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002926
2927 /* FL threshold comparison uses < */
2928 ret = t3_sge_init_rspcntxt(adapter, q->rspq.cntxt_id, irq_vec_idx,
2929 q->rspq.phys_addr, q->rspq.size,
2930 q->fl[0].buf_size, 1, 0);
2931 if (ret)
2932 goto err_unlock;
2933
2934 for (i = 0; i < SGE_RXQ_PER_SET; ++i) {
2935 ret = t3_sge_init_flcntxt(adapter, q->fl[i].cntxt_id, 0,
2936 q->fl[i].phys_addr, q->fl[i].size,
2937 q->fl[i].buf_size, p->cong_thres, 1,
2938 0);
2939 if (ret)
2940 goto err_unlock;
2941 }
2942
2943 ret = t3_sge_init_ecntxt(adapter, q->txq[TXQ_ETH].cntxt_id, USE_GTS,
2944 SGE_CNTXT_ETH, id, q->txq[TXQ_ETH].phys_addr,
2945 q->txq[TXQ_ETH].size, q->txq[TXQ_ETH].token,
2946 1, 0);
2947 if (ret)
2948 goto err_unlock;
2949
2950 if (ntxq > 1) {
2951 ret = t3_sge_init_ecntxt(adapter, q->txq[TXQ_OFLD].cntxt_id,
2952 USE_GTS, SGE_CNTXT_OFLD, id,
2953 q->txq[TXQ_OFLD].phys_addr,
2954 q->txq[TXQ_OFLD].size, 0, 1, 0);
2955 if (ret)
2956 goto err_unlock;
2957 }
2958
2959 if (ntxq > 2) {
2960 ret = t3_sge_init_ecntxt(adapter, q->txq[TXQ_CTRL].cntxt_id, 0,
2961 SGE_CNTXT_CTRL, id,
2962 q->txq[TXQ_CTRL].phys_addr,
2963 q->txq[TXQ_CTRL].size,
2964 q->txq[TXQ_CTRL].token, 1, 0);
2965 if (ret)
2966 goto err_unlock;
2967 }
2968
Roland Dreierb1186de2008-03-20 13:30:48 -07002969 spin_unlock_irq(&adapter->sge.reg_lock);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002970
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002971 q->adap = adapter;
2972 q->netdev = dev;
Divy Le Ray82ad3322008-12-16 01:09:39 -08002973 q->tx_q = netdevq;
Stephen Hemmingerbea33482007-10-03 16:41:36 -07002974 t3_update_qset_coalesce(q, p);
Divy Le Rayb47385b2008-05-21 18:56:26 -07002975
Divy Le Ray7385ecf2008-05-21 18:56:21 -07002976 avail = refill_fl(adapter, &q->fl[0], q->fl[0].size,
2977 GFP_KERNEL | __GFP_COMP);
Divy Le Rayb1fb1f22008-05-21 18:56:16 -07002978 if (!avail) {
2979 CH_ALERT(adapter, "free list queue 0 initialization failed\n");
2980 goto err;
2981 }
2982 if (avail < q->fl[0].size)
2983 CH_WARN(adapter, "free list queue 0 enabled with %d credits\n",
2984 avail);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002985
Divy Le Ray7385ecf2008-05-21 18:56:21 -07002986 avail = refill_fl(adapter, &q->fl[1], q->fl[1].size,
2987 GFP_KERNEL | __GFP_COMP);
Divy Le Rayb1fb1f22008-05-21 18:56:16 -07002988 if (avail < q->fl[1].size)
2989 CH_WARN(adapter, "free list queue 1 enabled with %d credits\n",
2990 avail);
Divy Le Ray4d22de32007-01-18 22:04:14 -05002991 refill_rspq(adapter, &q->rspq, q->rspq.size - 1);
2992
2993 t3_write_reg(adapter, A_SG_GTS, V_RSPQ(q->rspq.cntxt_id) |
2994 V_NEWTIMER(q->rspq.holdoff_tmr));
2995
2996 mod_timer(&q->tx_reclaim_timer, jiffies + TX_RECLAIM_PERIOD);
2997 return 0;
2998
Divy Le Rayb1fb1f22008-05-21 18:56:16 -07002999err_unlock:
Roland Dreierb1186de2008-03-20 13:30:48 -07003000 spin_unlock_irq(&adapter->sge.reg_lock);
Divy Le Rayb1fb1f22008-05-21 18:56:16 -07003001err:
Divy Le Ray4d22de32007-01-18 22:04:14 -05003002 t3_free_qset(adapter, q);
3003 return ret;
3004}
3005
3006/**
Divy Le Ray0ca41c02008-09-25 14:05:28 +00003007 * t3_stop_sge_timers - stop SGE timer call backs
3008 * @adap: the adapter
3009 *
3010 * Stops each SGE queue set's timer call back
3011 */
3012void t3_stop_sge_timers(struct adapter *adap)
3013{
3014 int i;
3015
3016 for (i = 0; i < SGE_QSETS; ++i) {
3017 struct sge_qset *q = &adap->sge.qs[i];
3018
3019 if (q->tx_reclaim_timer.function)
3020 del_timer_sync(&q->tx_reclaim_timer);
3021 }
3022}
3023
3024/**
Divy Le Ray4d22de32007-01-18 22:04:14 -05003025 * t3_free_sge_resources - free SGE resources
3026 * @adap: the adapter
3027 *
3028 * Frees resources used by the SGE queue sets.
3029 */
3030void t3_free_sge_resources(struct adapter *adap)
3031{
3032 int i;
3033
3034 for (i = 0; i < SGE_QSETS; ++i)
3035 t3_free_qset(adap, &adap->sge.qs[i]);
3036}
3037
3038/**
3039 * t3_sge_start - enable SGE
3040 * @adap: the adapter
3041 *
3042 * Enables the SGE for DMAs. This is the last step in starting packet
3043 * transfers.
3044 */
3045void t3_sge_start(struct adapter *adap)
3046{
3047 t3_set_reg_field(adap, A_SG_CONTROL, F_GLOBALENABLE, F_GLOBALENABLE);
3048}
3049
3050/**
3051 * t3_sge_stop - disable SGE operation
3052 * @adap: the adapter
3053 *
3054 * Disables the DMA engine. This can be called in emeregencies (e.g.,
3055 * from error interrupts) or from normal process context. In the latter
3056 * case it also disables any pending queue restart tasklets. Note that
3057 * if it is called in interrupt context it cannot disable the restart
3058 * tasklets as it cannot wait, however the tasklets will have no effect
3059 * since the doorbells are disabled and the driver will call this again
3060 * later from process context, at which time the tasklets will be stopped
3061 * if they are still running.
3062 */
3063void t3_sge_stop(struct adapter *adap)
3064{
3065 t3_set_reg_field(adap, A_SG_CONTROL, F_GLOBALENABLE, 0);
3066 if (!in_interrupt()) {
3067 int i;
3068
3069 for (i = 0; i < SGE_QSETS; ++i) {
3070 struct sge_qset *qs = &adap->sge.qs[i];
3071
3072 tasklet_kill(&qs->txq[TXQ_OFLD].qresume_tsk);
3073 tasklet_kill(&qs->txq[TXQ_CTRL].qresume_tsk);
3074 }
3075 }
3076}
3077
3078/**
3079 * t3_sge_init - initialize SGE
3080 * @adap: the adapter
3081 * @p: the SGE parameters
3082 *
3083 * Performs SGE initialization needed every time after a chip reset.
3084 * We do not initialize any of the queue sets here, instead the driver
3085 * top-level must request those individually. We also do not enable DMA
3086 * here, that should be done after the queues have been set up.
3087 */
3088void t3_sge_init(struct adapter *adap, struct sge_params *p)
3089{
3090 unsigned int ctrl, ups = ffs(pci_resource_len(adap->pdev, 2) >> 12);
3091
3092 ctrl = F_DROPPKT | V_PKTSHIFT(2) | F_FLMODE | F_AVOIDCQOVFL |
Divy Le Rayb8819552007-12-17 18:47:31 -08003093 F_CQCRDTCTRL | F_CONGMODE | F_TNLFLMODE | F_FATLPERREN |
Divy Le Ray4d22de32007-01-18 22:04:14 -05003094 V_HOSTPAGESIZE(PAGE_SHIFT - 11) | F_BIGENDIANINGRESS |
3095 V_USERSPACESIZE(ups ? ups - 1 : 0) | F_ISCSICOALESCING;
3096#if SGE_NUM_GENBITS == 1
3097 ctrl |= F_EGRGENCTRL;
3098#endif
3099 if (adap->params.rev > 0) {
3100 if (!(adap->flags & (USING_MSIX | USING_MSI)))
3101 ctrl |= F_ONEINTMULTQ | F_OPTONEINTMULTQ;
Divy Le Ray4d22de32007-01-18 22:04:14 -05003102 }
3103 t3_write_reg(adap, A_SG_CONTROL, ctrl);
3104 t3_write_reg(adap, A_SG_EGR_RCQ_DRB_THRSH, V_HIRCQDRBTHRSH(512) |
3105 V_LORCQDRBTHRSH(512));
3106 t3_write_reg(adap, A_SG_TIMER_TICK, core_ticks_per_usec(adap) / 10);
3107 t3_write_reg(adap, A_SG_CMDQ_CREDIT_TH, V_THRESHOLD(32) |
Divy Le Ray6195c712007-01-30 19:43:56 -08003108 V_TIMEOUT(200 * core_ticks_per_usec(adap)));
Divy Le Rayb8819552007-12-17 18:47:31 -08003109 t3_write_reg(adap, A_SG_HI_DRB_HI_THRSH,
3110 adap->params.rev < T3_REV_C ? 1000 : 500);
Divy Le Ray4d22de32007-01-18 22:04:14 -05003111 t3_write_reg(adap, A_SG_HI_DRB_LO_THRSH, 256);
3112 t3_write_reg(adap, A_SG_LO_DRB_HI_THRSH, 1000);
3113 t3_write_reg(adap, A_SG_LO_DRB_LO_THRSH, 256);
3114 t3_write_reg(adap, A_SG_OCO_BASE, V_BASE1(0xfff));
3115 t3_write_reg(adap, A_SG_DRB_PRI_THRESH, 63 * 1024);
3116}
3117
3118/**
3119 * t3_sge_prep - one-time SGE initialization
3120 * @adap: the associated adapter
3121 * @p: SGE parameters
3122 *
3123 * Performs one-time initialization of SGE SW state. Includes determining
3124 * defaults for the assorted SGE parameters, which admins can change until
3125 * they are used to initialize the SGE.
3126 */
Roland Dreier7b9b0942008-01-29 14:45:11 -08003127void t3_sge_prep(struct adapter *adap, struct sge_params *p)
Divy Le Ray4d22de32007-01-18 22:04:14 -05003128{
3129 int i;
3130
3131 p->max_pkt_size = (16 * 1024) - sizeof(struct cpl_rx_data) -
3132 SKB_DATA_ALIGN(sizeof(struct skb_shared_info));
3133
3134 for (i = 0; i < SGE_QSETS; ++i) {
3135 struct qset_params *q = p->qset + i;
3136
3137 q->polling = adap->params.rev > 0;
3138 q->coalesce_usecs = 5;
3139 q->rspq_size = 1024;
Divy Le Raye0994eb2007-02-24 16:44:17 -08003140 q->fl_size = 1024;
Divy Le Ray7385ecf2008-05-21 18:56:21 -07003141 q->jumbo_size = 512;
Divy Le Ray4d22de32007-01-18 22:04:14 -05003142 q->txq_size[TXQ_ETH] = 1024;
3143 q->txq_size[TXQ_OFLD] = 1024;
3144 q->txq_size[TXQ_CTRL] = 256;
3145 q->cong_thres = 0;
3146 }
3147
3148 spin_lock_init(&adap->sge.reg_lock);
3149}
3150
3151/**
3152 * t3_get_desc - dump an SGE descriptor for debugging purposes
3153 * @qs: the queue set
3154 * @qnum: identifies the specific queue (0..2: Tx, 3:response, 4..5: Rx)
3155 * @idx: the descriptor index in the queue
3156 * @data: where to dump the descriptor contents
3157 *
3158 * Dumps the contents of a HW descriptor of an SGE queue. Returns the
3159 * size of the descriptor.
3160 */
3161int t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx,
3162 unsigned char *data)
3163{
3164 if (qnum >= 6)
3165 return -EINVAL;
3166
3167 if (qnum < 3) {
3168 if (!qs->txq[qnum].desc || idx >= qs->txq[qnum].size)
3169 return -EINVAL;
3170 memcpy(data, &qs->txq[qnum].desc[idx], sizeof(struct tx_desc));
3171 return sizeof(struct tx_desc);
3172 }
3173
3174 if (qnum == 3) {
3175 if (!qs->rspq.desc || idx >= qs->rspq.size)
3176 return -EINVAL;
3177 memcpy(data, &qs->rspq.desc[idx], sizeof(struct rsp_desc));
3178 return sizeof(struct rsp_desc);
3179 }
3180
3181 qnum -= 4;
3182 if (!qs->fl[qnum].desc || idx >= qs->fl[qnum].size)
3183 return -EINVAL;
3184 memcpy(data, &qs->fl[qnum].desc[idx], sizeof(struct rx_desc));
3185 return sizeof(struct rx_desc);
3186}