]> bbs.cooldavid.org Git - net-next-2.6.git/blob - drivers/net/qlcnic/qlcnic_init.c
90766757c3148792db61c317be7f2b75f461d363
[net-next-2.6.git] / drivers / net / qlcnic / qlcnic_init.c
1 /*
2  * Copyright (C) 2009 - QLogic Corporation.
3  * All rights reserved.
4  *
5  * This program is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU General Public License
7  * as published by the Free Software Foundation; either version 2
8  * of the License, or (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful, but
11  * WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
18  * MA  02111-1307, USA.
19  *
20  * The full GNU General Public License is included in this distribution
21  * in the file called "COPYING".
22  *
23  */
24
25 #include <linux/netdevice.h>
26 #include <linux/delay.h>
27 #include <linux/slab.h>
28 #include "qlcnic.h"
29
30 struct crb_addr_pair {
31         u32 addr;
32         u32 data;
33 };
34
35 #define QLCNIC_MAX_CRB_XFORM 60
36 static unsigned int crb_addr_xform[QLCNIC_MAX_CRB_XFORM];
37
38 #define crb_addr_transform(name) \
39         (crb_addr_xform[QLCNIC_HW_PX_MAP_CRB_##name] = \
40         QLCNIC_HW_CRB_HUB_AGT_ADR_##name << 20)
41
42 #define QLCNIC_ADDR_ERROR (0xffffffff)
43
44 static void
45 qlcnic_post_rx_buffers_nodb(struct qlcnic_adapter *adapter,
46                 struct qlcnic_host_rds_ring *rds_ring);
47
48 static void crb_addr_transform_setup(void)
49 {
50         crb_addr_transform(XDMA);
51         crb_addr_transform(TIMR);
52         crb_addr_transform(SRE);
53         crb_addr_transform(SQN3);
54         crb_addr_transform(SQN2);
55         crb_addr_transform(SQN1);
56         crb_addr_transform(SQN0);
57         crb_addr_transform(SQS3);
58         crb_addr_transform(SQS2);
59         crb_addr_transform(SQS1);
60         crb_addr_transform(SQS0);
61         crb_addr_transform(RPMX7);
62         crb_addr_transform(RPMX6);
63         crb_addr_transform(RPMX5);
64         crb_addr_transform(RPMX4);
65         crb_addr_transform(RPMX3);
66         crb_addr_transform(RPMX2);
67         crb_addr_transform(RPMX1);
68         crb_addr_transform(RPMX0);
69         crb_addr_transform(ROMUSB);
70         crb_addr_transform(SN);
71         crb_addr_transform(QMN);
72         crb_addr_transform(QMS);
73         crb_addr_transform(PGNI);
74         crb_addr_transform(PGND);
75         crb_addr_transform(PGN3);
76         crb_addr_transform(PGN2);
77         crb_addr_transform(PGN1);
78         crb_addr_transform(PGN0);
79         crb_addr_transform(PGSI);
80         crb_addr_transform(PGSD);
81         crb_addr_transform(PGS3);
82         crb_addr_transform(PGS2);
83         crb_addr_transform(PGS1);
84         crb_addr_transform(PGS0);
85         crb_addr_transform(PS);
86         crb_addr_transform(PH);
87         crb_addr_transform(NIU);
88         crb_addr_transform(I2Q);
89         crb_addr_transform(EG);
90         crb_addr_transform(MN);
91         crb_addr_transform(MS);
92         crb_addr_transform(CAS2);
93         crb_addr_transform(CAS1);
94         crb_addr_transform(CAS0);
95         crb_addr_transform(CAM);
96         crb_addr_transform(C2C1);
97         crb_addr_transform(C2C0);
98         crb_addr_transform(SMB);
99         crb_addr_transform(OCM0);
100         crb_addr_transform(I2C0);
101 }
102
103 void qlcnic_release_rx_buffers(struct qlcnic_adapter *adapter)
104 {
105         struct qlcnic_recv_context *recv_ctx;
106         struct qlcnic_host_rds_ring *rds_ring;
107         struct qlcnic_rx_buffer *rx_buf;
108         int i, ring;
109
110         recv_ctx = &adapter->recv_ctx;
111         for (ring = 0; ring < adapter->max_rds_rings; ring++) {
112                 rds_ring = &recv_ctx->rds_rings[ring];
113                 for (i = 0; i < rds_ring->num_desc; ++i) {
114                         rx_buf = &(rds_ring->rx_buf_arr[i]);
115                         if (rx_buf->skb == NULL)
116                                 continue;
117
118                         pci_unmap_single(adapter->pdev,
119                                         rx_buf->dma,
120                                         rds_ring->dma_size,
121                                         PCI_DMA_FROMDEVICE);
122
123                         dev_kfree_skb_any(rx_buf->skb);
124                 }
125         }
126 }
127
128 void qlcnic_reset_rx_buffers_list(struct qlcnic_adapter *adapter)
129 {
130         struct qlcnic_recv_context *recv_ctx;
131         struct qlcnic_host_rds_ring *rds_ring;
132         struct qlcnic_rx_buffer *rx_buf;
133         int i, ring;
134
135         recv_ctx = &adapter->recv_ctx;
136         for (ring = 0; ring < adapter->max_rds_rings; ring++) {
137                 rds_ring = &recv_ctx->rds_rings[ring];
138
139                 INIT_LIST_HEAD(&rds_ring->free_list);
140
141                 rx_buf = rds_ring->rx_buf_arr;
142                 for (i = 0; i < rds_ring->num_desc; i++) {
143                         list_add_tail(&rx_buf->list,
144                                         &rds_ring->free_list);
145                         rx_buf++;
146                 }
147         }
148 }
149
150 void qlcnic_release_tx_buffers(struct qlcnic_adapter *adapter)
151 {
152         struct qlcnic_cmd_buffer *cmd_buf;
153         struct qlcnic_skb_frag *buffrag;
154         int i, j;
155         struct qlcnic_host_tx_ring *tx_ring = adapter->tx_ring;
156
157         cmd_buf = tx_ring->cmd_buf_arr;
158         for (i = 0; i < tx_ring->num_desc; i++) {
159                 buffrag = cmd_buf->frag_array;
160                 if (buffrag->dma) {
161                         pci_unmap_single(adapter->pdev, buffrag->dma,
162                                          buffrag->length, PCI_DMA_TODEVICE);
163                         buffrag->dma = 0ULL;
164                 }
165                 for (j = 0; j < cmd_buf->frag_count; j++) {
166                         buffrag++;
167                         if (buffrag->dma) {
168                                 pci_unmap_page(adapter->pdev, buffrag->dma,
169                                                buffrag->length,
170                                                PCI_DMA_TODEVICE);
171                                 buffrag->dma = 0ULL;
172                         }
173                 }
174                 if (cmd_buf->skb) {
175                         dev_kfree_skb_any(cmd_buf->skb);
176                         cmd_buf->skb = NULL;
177                 }
178                 cmd_buf++;
179         }
180 }
181
182 void qlcnic_free_sw_resources(struct qlcnic_adapter *adapter)
183 {
184         struct qlcnic_recv_context *recv_ctx;
185         struct qlcnic_host_rds_ring *rds_ring;
186         struct qlcnic_host_tx_ring *tx_ring;
187         int ring;
188
189         recv_ctx = &adapter->recv_ctx;
190
191         if (recv_ctx->rds_rings == NULL)
192                 goto skip_rds;
193
194         for (ring = 0; ring < adapter->max_rds_rings; ring++) {
195                 rds_ring = &recv_ctx->rds_rings[ring];
196                 vfree(rds_ring->rx_buf_arr);
197                 rds_ring->rx_buf_arr = NULL;
198         }
199         kfree(recv_ctx->rds_rings);
200
201 skip_rds:
202         if (adapter->tx_ring == NULL)
203                 return;
204
205         tx_ring = adapter->tx_ring;
206         vfree(tx_ring->cmd_buf_arr);
207         tx_ring->cmd_buf_arr = NULL;
208         kfree(adapter->tx_ring);
209         adapter->tx_ring = NULL;
210 }
211
212 int qlcnic_alloc_sw_resources(struct qlcnic_adapter *adapter)
213 {
214         struct qlcnic_recv_context *recv_ctx;
215         struct qlcnic_host_rds_ring *rds_ring;
216         struct qlcnic_host_sds_ring *sds_ring;
217         struct qlcnic_host_tx_ring *tx_ring;
218         struct qlcnic_rx_buffer *rx_buf;
219         int ring, i, size;
220
221         struct qlcnic_cmd_buffer *cmd_buf_arr;
222         struct net_device *netdev = adapter->netdev;
223
224         size = sizeof(struct qlcnic_host_tx_ring);
225         tx_ring = kzalloc(size, GFP_KERNEL);
226         if (tx_ring == NULL) {
227                 dev_err(&netdev->dev, "failed to allocate tx ring struct\n");
228                 return -ENOMEM;
229         }
230         adapter->tx_ring = tx_ring;
231
232         tx_ring->num_desc = adapter->num_txd;
233         tx_ring->txq = netdev_get_tx_queue(netdev, 0);
234
235         cmd_buf_arr = vmalloc(TX_BUFF_RINGSIZE(tx_ring));
236         if (cmd_buf_arr == NULL) {
237                 dev_err(&netdev->dev, "failed to allocate cmd buffer ring\n");
238                 goto err_out;
239         }
240         memset(cmd_buf_arr, 0, TX_BUFF_RINGSIZE(tx_ring));
241         tx_ring->cmd_buf_arr = cmd_buf_arr;
242
243         recv_ctx = &adapter->recv_ctx;
244
245         size = adapter->max_rds_rings * sizeof(struct qlcnic_host_rds_ring);
246         rds_ring = kzalloc(size, GFP_KERNEL);
247         if (rds_ring == NULL) {
248                 dev_err(&netdev->dev, "failed to allocate rds ring struct\n");
249                 goto err_out;
250         }
251         recv_ctx->rds_rings = rds_ring;
252
253         for (ring = 0; ring < adapter->max_rds_rings; ring++) {
254                 rds_ring = &recv_ctx->rds_rings[ring];
255                 switch (ring) {
256                 case RCV_RING_NORMAL:
257                         rds_ring->num_desc = adapter->num_rxd;
258                         rds_ring->dma_size = QLCNIC_P3_RX_BUF_MAX_LEN;
259                         rds_ring->skb_size = rds_ring->dma_size + NET_IP_ALIGN;
260                         break;
261
262                 case RCV_RING_JUMBO:
263                         rds_ring->num_desc = adapter->num_jumbo_rxd;
264                         rds_ring->dma_size =
265                                 QLCNIC_P3_RX_JUMBO_BUF_MAX_LEN;
266
267                         if (adapter->capabilities & QLCNIC_FW_CAPABILITY_HW_LRO)
268                                 rds_ring->dma_size += QLCNIC_LRO_BUFFER_EXTRA;
269
270                         rds_ring->skb_size =
271                                 rds_ring->dma_size + NET_IP_ALIGN;
272                         break;
273                 }
274                 rds_ring->rx_buf_arr = (struct qlcnic_rx_buffer *)
275                         vmalloc(RCV_BUFF_RINGSIZE(rds_ring));
276                 if (rds_ring->rx_buf_arr == NULL) {
277                         dev_err(&netdev->dev, "Failed to allocate "
278                                 "rx buffer ring %d\n", ring);
279                         goto err_out;
280                 }
281                 memset(rds_ring->rx_buf_arr, 0, RCV_BUFF_RINGSIZE(rds_ring));
282                 INIT_LIST_HEAD(&rds_ring->free_list);
283                 /*
284                  * Now go through all of them, set reference handles
285                  * and put them in the queues.
286                  */
287                 rx_buf = rds_ring->rx_buf_arr;
288                 for (i = 0; i < rds_ring->num_desc; i++) {
289                         list_add_tail(&rx_buf->list,
290                                         &rds_ring->free_list);
291                         rx_buf->ref_handle = i;
292                         rx_buf++;
293                 }
294                 spin_lock_init(&rds_ring->lock);
295         }
296
297         for (ring = 0; ring < adapter->max_sds_rings; ring++) {
298                 sds_ring = &recv_ctx->sds_rings[ring];
299                 sds_ring->irq = adapter->msix_entries[ring].vector;
300                 sds_ring->adapter = adapter;
301                 sds_ring->num_desc = adapter->num_rxd;
302
303                 for (i = 0; i < NUM_RCV_DESC_RINGS; i++)
304                         INIT_LIST_HEAD(&sds_ring->free_list[i]);
305         }
306
307         return 0;
308
309 err_out:
310         qlcnic_free_sw_resources(adapter);
311         return -ENOMEM;
312 }
313
314 /*
315  * Utility to translate from internal Phantom CRB address
316  * to external PCI CRB address.
317  */
318 static u32 qlcnic_decode_crb_addr(u32 addr)
319 {
320         int i;
321         u32 base_addr, offset, pci_base;
322
323         crb_addr_transform_setup();
324
325         pci_base = QLCNIC_ADDR_ERROR;
326         base_addr = addr & 0xfff00000;
327         offset = addr & 0x000fffff;
328
329         for (i = 0; i < QLCNIC_MAX_CRB_XFORM; i++) {
330                 if (crb_addr_xform[i] == base_addr) {
331                         pci_base = i << 20;
332                         break;
333                 }
334         }
335         if (pci_base == QLCNIC_ADDR_ERROR)
336                 return pci_base;
337         else
338                 return pci_base + offset;
339 }
340
341 #define QLCNIC_MAX_ROM_WAIT_USEC        100
342
343 static int qlcnic_wait_rom_done(struct qlcnic_adapter *adapter)
344 {
345         long timeout = 0;
346         long done = 0;
347
348         cond_resched();
349
350         while (done == 0) {
351                 done = QLCRD32(adapter, QLCNIC_ROMUSB_GLB_STATUS);
352                 done &= 2;
353                 if (++timeout >= QLCNIC_MAX_ROM_WAIT_USEC) {
354                         dev_err(&adapter->pdev->dev,
355                                 "Timeout reached  waiting for rom done");
356                         return -EIO;
357                 }
358                 udelay(1);
359         }
360         return 0;
361 }
362
363 static int do_rom_fast_read(struct qlcnic_adapter *adapter,
364                             int addr, int *valp)
365 {
366         QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ADDRESS, addr);
367         QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
368         QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 3);
369         QLCWR32(adapter, QLCNIC_ROMUSB_ROM_INSTR_OPCODE, 0xb);
370         if (qlcnic_wait_rom_done(adapter)) {
371                 dev_err(&adapter->pdev->dev, "Error waiting for rom done\n");
372                 return -EIO;
373         }
374         /* reset abyte_cnt and dummy_byte_cnt */
375         QLCWR32(adapter, QLCNIC_ROMUSB_ROM_ABYTE_CNT, 0);
376         udelay(10);
377         QLCWR32(adapter, QLCNIC_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
378
379         *valp = QLCRD32(adapter, QLCNIC_ROMUSB_ROM_RDATA);
380         return 0;
381 }
382
383 static int do_rom_fast_read_words(struct qlcnic_adapter *adapter, int addr,
384                                   u8 *bytes, size_t size)
385 {
386         int addridx;
387         int ret = 0;
388
389         for (addridx = addr; addridx < (addr + size); addridx += 4) {
390                 int v;
391                 ret = do_rom_fast_read(adapter, addridx, &v);
392                 if (ret != 0)
393                         break;
394                 *(__le32 *)bytes = cpu_to_le32(v);
395                 bytes += 4;
396         }
397
398         return ret;
399 }
400
401 int
402 qlcnic_rom_fast_read_words(struct qlcnic_adapter *adapter, int addr,
403                                 u8 *bytes, size_t size)
404 {
405         int ret;
406
407         ret = qlcnic_rom_lock(adapter);
408         if (ret < 0)
409                 return ret;
410
411         ret = do_rom_fast_read_words(adapter, addr, bytes, size);
412
413         qlcnic_rom_unlock(adapter);
414         return ret;
415 }
416
417 int qlcnic_rom_fast_read(struct qlcnic_adapter *adapter, int addr, int *valp)
418 {
419         int ret;
420
421         if (qlcnic_rom_lock(adapter) != 0)
422                 return -EIO;
423
424         ret = do_rom_fast_read(adapter, addr, valp);
425         qlcnic_rom_unlock(adapter);
426         return ret;
427 }
428
429 int qlcnic_pinit_from_rom(struct qlcnic_adapter *adapter)
430 {
431         int addr, val;
432         int i, n, init_delay;
433         struct crb_addr_pair *buf;
434         unsigned offset;
435         u32 off;
436         struct pci_dev *pdev = adapter->pdev;
437
438         /* resetall */
439         qlcnic_rom_lock(adapter);
440         QLCWR32(adapter, QLCNIC_ROMUSB_GLB_SW_RESET, 0xfeffffff);
441         qlcnic_rom_unlock(adapter);
442
443         if (qlcnic_rom_fast_read(adapter, 0, &n) != 0 || (n != 0xcafecafe) ||
444                         qlcnic_rom_fast_read(adapter, 4, &n) != 0) {
445                 dev_err(&pdev->dev, "ERROR Reading crb_init area: val:%x\n", n);
446                 return -EIO;
447         }
448         offset = n & 0xffffU;
449         n = (n >> 16) & 0xffffU;
450
451         if (n >= 1024) {
452                 dev_err(&pdev->dev, "QLOGIC card flash not initialized.\n");
453                 return -EIO;
454         }
455
456         buf = kcalloc(n, sizeof(struct crb_addr_pair), GFP_KERNEL);
457         if (buf == NULL) {
458                 dev_err(&pdev->dev, "Unable to calloc memory for rom read.\n");
459                 return -ENOMEM;
460         }
461
462         for (i = 0; i < n; i++) {
463                 if (qlcnic_rom_fast_read(adapter, 8*i + 4*offset, &val) != 0 ||
464                 qlcnic_rom_fast_read(adapter, 8*i + 4*offset + 4, &addr) != 0) {
465                         kfree(buf);
466                         return -EIO;
467                 }
468
469                 buf[i].addr = addr;
470                 buf[i].data = val;
471         }
472
473         for (i = 0; i < n; i++) {
474
475                 off = qlcnic_decode_crb_addr(buf[i].addr);
476                 if (off == QLCNIC_ADDR_ERROR) {
477                         dev_err(&pdev->dev, "CRB init value out of range %x\n",
478                                         buf[i].addr);
479                         continue;
480                 }
481                 off += QLCNIC_PCI_CRBSPACE;
482
483                 if (off & 1)
484                         continue;
485
486                 /* skipping cold reboot MAGIC */
487                 if (off == QLCNIC_CAM_RAM(0x1fc))
488                         continue;
489                 if (off == (QLCNIC_CRB_I2C0 + 0x1c))
490                         continue;
491                 if (off == (ROMUSB_GLB + 0xbc)) /* do not reset PCI */
492                         continue;
493                 if (off == (ROMUSB_GLB + 0xa8))
494                         continue;
495                 if (off == (ROMUSB_GLB + 0xc8)) /* core clock */
496                         continue;
497                 if (off == (ROMUSB_GLB + 0x24)) /* MN clock */
498                         continue;
499                 if (off == (ROMUSB_GLB + 0x1c)) /* MS clock */
500                         continue;
501                 if ((off & 0x0ff00000) == QLCNIC_CRB_DDR_NET)
502                         continue;
503                 /* skip the function enable register */
504                 if (off == QLCNIC_PCIE_REG(PCIE_SETUP_FUNCTION))
505                         continue;
506                 if (off == QLCNIC_PCIE_REG(PCIE_SETUP_FUNCTION2))
507                         continue;
508                 if ((off & 0x0ff00000) == QLCNIC_CRB_SMB)
509                         continue;
510
511                 init_delay = 1;
512                 /* After writing this register, HW needs time for CRB */
513                 /* to quiet down (else crb_window returns 0xffffffff) */
514                 if (off == QLCNIC_ROMUSB_GLB_SW_RESET)
515                         init_delay = 1000;
516
517                 QLCWR32(adapter, off, buf[i].data);
518
519                 msleep(init_delay);
520         }
521         kfree(buf);
522
523         /* p2dn replyCount */
524         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_D + 0xec, 0x1e);
525         /* disable_peg_cache 0 & 1*/
526         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_D + 0x4c, 8);
527         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_I + 0x4c, 8);
528
529         /* peg_clr_all */
530         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x8, 0);
531         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_0 + 0xc, 0);
532         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_1 + 0x8, 0);
533         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_1 + 0xc, 0);
534         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_2 + 0x8, 0);
535         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_2 + 0xc, 0);
536         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_3 + 0x8, 0);
537         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_3 + 0xc, 0);
538         return 0;
539 }
540
541 int
542 qlcnic_setup_idc_param(struct qlcnic_adapter *adapter) {
543
544         int timeo;
545         u32 val;
546
547         val = QLCRD32(adapter, QLCNIC_CRB_DEV_PARTITION_INFO);
548         val = QLC_DEV_GET_DRV(val, adapter->portnum);
549         if ((val & 0x3) != QLCNIC_TYPE_NIC) {
550                 dev_err(&adapter->pdev->dev,
551                         "Not an Ethernet NIC func=%u\n", val);
552                 return -EIO;
553         }
554         adapter->physical_port = (val >> 2);
555         if (qlcnic_rom_fast_read(adapter, QLCNIC_ROM_DEV_INIT_TIMEOUT, &timeo))
556                 timeo = QLCNIC_INIT_TIMEOUT_SECS;
557
558         adapter->dev_init_timeo = timeo;
559
560         if (qlcnic_rom_fast_read(adapter, QLCNIC_ROM_DRV_RESET_TIMEOUT, &timeo))
561                 timeo = QLCNIC_RESET_TIMEOUT_SECS;
562
563         adapter->reset_ack_timeo = timeo;
564
565         return 0;
566 }
567
568 int
569 qlcnic_check_flash_fw_ver(struct qlcnic_adapter *adapter)
570 {
571         u32 ver = -1, min_ver;
572
573         qlcnic_rom_fast_read(adapter, QLCNIC_FW_VERSION_OFFSET, (int *)&ver);
574
575         ver = QLCNIC_DECODE_VERSION(ver);
576         min_ver = QLCNIC_MIN_FW_VERSION;
577
578         if (ver < min_ver) {
579                 dev_err(&adapter->pdev->dev,
580                         "firmware version %d.%d.%d unsupported."
581                         "Min supported version %d.%d.%d\n",
582                         _major(ver), _minor(ver), _build(ver),
583                         _major(min_ver), _minor(min_ver), _build(min_ver));
584                 return -EINVAL;
585         }
586
587         return 0;
588 }
589
590 static int
591 qlcnic_has_mn(struct qlcnic_adapter *adapter)
592 {
593         u32 capability;
594         capability = 0;
595
596         capability = QLCRD32(adapter, QLCNIC_PEG_TUNE_CAPABILITY);
597         if (capability & QLCNIC_PEG_TUNE_MN_PRESENT)
598                 return 1;
599
600         return 0;
601 }
602
603 static
604 struct uni_table_desc *qlcnic_get_table_desc(const u8 *unirom, int section)
605 {
606         u32 i;
607         struct uni_table_desc *directory = (struct uni_table_desc *) &unirom[0];
608         __le32 entries = cpu_to_le32(directory->num_entries);
609
610         for (i = 0; i < entries; i++) {
611
612                 __le32 offs = cpu_to_le32(directory->findex) +
613                                 (i * cpu_to_le32(directory->entry_size));
614                 __le32 tab_type = cpu_to_le32(*((u32 *)&unirom[offs] + 8));
615
616                 if (tab_type == section)
617                         return (struct uni_table_desc *) &unirom[offs];
618         }
619
620         return NULL;
621 }
622
623 #define FILEHEADER_SIZE (14 * 4)
624
625 static int
626 qlcnic_validate_header(struct qlcnic_adapter *adapter)
627 {
628         const u8 *unirom = adapter->fw->data;
629         struct uni_table_desc *directory = (struct uni_table_desc *) &unirom[0];
630         __le32 fw_file_size = adapter->fw->size;
631         __le32 entries;
632         __le32 entry_size;
633         __le32 tab_size;
634
635         if (fw_file_size < FILEHEADER_SIZE)
636                 return -EINVAL;
637
638         entries = cpu_to_le32(directory->num_entries);
639         entry_size = cpu_to_le32(directory->entry_size);
640         tab_size = cpu_to_le32(directory->findex) + (entries * entry_size);
641
642         if (fw_file_size < tab_size)
643                 return -EINVAL;
644
645         return 0;
646 }
647
648 static int
649 qlcnic_validate_bootld(struct qlcnic_adapter *adapter)
650 {
651         struct uni_table_desc *tab_desc;
652         struct uni_data_desc *descr;
653         const u8 *unirom = adapter->fw->data;
654         int idx = cpu_to_le32(*((int *)&unirom[adapter->file_prd_off] +
655                                 QLCNIC_UNI_BOOTLD_IDX_OFF));
656         __le32 offs;
657         __le32 tab_size;
658         __le32 data_size;
659
660         tab_desc = qlcnic_get_table_desc(unirom, QLCNIC_UNI_DIR_SECT_BOOTLD);
661
662         if (!tab_desc)
663                 return -EINVAL;
664
665         tab_size = cpu_to_le32(tab_desc->findex) +
666                         (cpu_to_le32(tab_desc->entry_size) * (idx + 1));
667
668         if (adapter->fw->size < tab_size)
669                 return -EINVAL;
670
671         offs = cpu_to_le32(tab_desc->findex) +
672                 (cpu_to_le32(tab_desc->entry_size) * (idx));
673         descr = (struct uni_data_desc *)&unirom[offs];
674
675         data_size = cpu_to_le32(descr->findex) + cpu_to_le32(descr->size);
676
677         if (adapter->fw->size < data_size)
678                 return -EINVAL;
679
680         return 0;
681 }
682
683 static int
684 qlcnic_validate_fw(struct qlcnic_adapter *adapter)
685 {
686         struct uni_table_desc *tab_desc;
687         struct uni_data_desc *descr;
688         const u8 *unirom = adapter->fw->data;
689         int idx = cpu_to_le32(*((int *)&unirom[adapter->file_prd_off] +
690                                 QLCNIC_UNI_FIRMWARE_IDX_OFF));
691         __le32 offs;
692         __le32 tab_size;
693         __le32 data_size;
694
695         tab_desc = qlcnic_get_table_desc(unirom, QLCNIC_UNI_DIR_SECT_FW);
696
697         if (!tab_desc)
698                 return -EINVAL;
699
700         tab_size = cpu_to_le32(tab_desc->findex) +
701                         (cpu_to_le32(tab_desc->entry_size) * (idx + 1));
702
703         if (adapter->fw->size < tab_size)
704                 return -EINVAL;
705
706         offs = cpu_to_le32(tab_desc->findex) +
707                 (cpu_to_le32(tab_desc->entry_size) * (idx));
708         descr = (struct uni_data_desc *)&unirom[offs];
709         data_size = cpu_to_le32(descr->findex) + cpu_to_le32(descr->size);
710
711         if (adapter->fw->size < data_size)
712                 return -EINVAL;
713
714         return 0;
715 }
716
717 static int
718 qlcnic_validate_product_offs(struct qlcnic_adapter *adapter)
719 {
720         struct uni_table_desc *ptab_descr;
721         const u8 *unirom = adapter->fw->data;
722         int mn_present = qlcnic_has_mn(adapter);
723         __le32 entries;
724         __le32 entry_size;
725         __le32 tab_size;
726         u32 i;
727
728         ptab_descr = qlcnic_get_table_desc(unirom,
729                                 QLCNIC_UNI_DIR_SECT_PRODUCT_TBL);
730         if (!ptab_descr)
731                 return -EINVAL;
732
733         entries = cpu_to_le32(ptab_descr->num_entries);
734         entry_size = cpu_to_le32(ptab_descr->entry_size);
735         tab_size = cpu_to_le32(ptab_descr->findex) + (entries * entry_size);
736
737         if (adapter->fw->size < tab_size)
738                 return -EINVAL;
739
740 nomn:
741         for (i = 0; i < entries; i++) {
742
743                 __le32 flags, file_chiprev, offs;
744                 u8 chiprev = adapter->ahw.revision_id;
745                 u32 flagbit;
746
747                 offs = cpu_to_le32(ptab_descr->findex) +
748                                 (i * cpu_to_le32(ptab_descr->entry_size));
749                 flags = cpu_to_le32(*((int *)&unirom[offs] +
750                                                 QLCNIC_UNI_FLAGS_OFF));
751                 file_chiprev = cpu_to_le32(*((int *)&unirom[offs] +
752                                                 QLCNIC_UNI_CHIP_REV_OFF));
753
754                 flagbit = mn_present ? 1 : 2;
755
756                 if ((chiprev == file_chiprev) &&
757                                         ((1ULL << flagbit) & flags)) {
758                         adapter->file_prd_off = offs;
759                         return 0;
760                 }
761         }
762         if (mn_present) {
763                 mn_present = 0;
764                 goto nomn;
765         }
766         return -EINVAL;
767 }
768
769 static int
770 qlcnic_validate_unified_romimage(struct qlcnic_adapter *adapter)
771 {
772         if (qlcnic_validate_header(adapter)) {
773                 dev_err(&adapter->pdev->dev,
774                                 "unified image: header validation failed\n");
775                 return -EINVAL;
776         }
777
778         if (qlcnic_validate_product_offs(adapter)) {
779                 dev_err(&adapter->pdev->dev,
780                                 "unified image: product validation failed\n");
781                 return -EINVAL;
782         }
783
784         if (qlcnic_validate_bootld(adapter)) {
785                 dev_err(&adapter->pdev->dev,
786                                 "unified image: bootld validation failed\n");
787                 return -EINVAL;
788         }
789
790         if (qlcnic_validate_fw(adapter)) {
791                 dev_err(&adapter->pdev->dev,
792                                 "unified image: firmware validation failed\n");
793                 return -EINVAL;
794         }
795
796         return 0;
797 }
798
799 static
800 struct uni_data_desc *qlcnic_get_data_desc(struct qlcnic_adapter *adapter,
801                         u32 section, u32 idx_offset)
802 {
803         const u8 *unirom = adapter->fw->data;
804         int idx = cpu_to_le32(*((int *)&unirom[adapter->file_prd_off] +
805                                                                 idx_offset));
806         struct uni_table_desc *tab_desc;
807         __le32 offs;
808
809         tab_desc = qlcnic_get_table_desc(unirom, section);
810
811         if (tab_desc == NULL)
812                 return NULL;
813
814         offs = cpu_to_le32(tab_desc->findex) +
815                         (cpu_to_le32(tab_desc->entry_size) * idx);
816
817         return (struct uni_data_desc *)&unirom[offs];
818 }
819
820 static u8 *
821 qlcnic_get_bootld_offs(struct qlcnic_adapter *adapter)
822 {
823         u32 offs = QLCNIC_BOOTLD_START;
824
825         if (adapter->fw_type == QLCNIC_UNIFIED_ROMIMAGE)
826                 offs = cpu_to_le32((qlcnic_get_data_desc(adapter,
827                                         QLCNIC_UNI_DIR_SECT_BOOTLD,
828                                         QLCNIC_UNI_BOOTLD_IDX_OFF))->findex);
829
830         return (u8 *)&adapter->fw->data[offs];
831 }
832
833 static u8 *
834 qlcnic_get_fw_offs(struct qlcnic_adapter *adapter)
835 {
836         u32 offs = QLCNIC_IMAGE_START;
837
838         if (adapter->fw_type == QLCNIC_UNIFIED_ROMIMAGE)
839                 offs = cpu_to_le32((qlcnic_get_data_desc(adapter,
840                                         QLCNIC_UNI_DIR_SECT_FW,
841                                         QLCNIC_UNI_FIRMWARE_IDX_OFF))->findex);
842
843         return (u8 *)&adapter->fw->data[offs];
844 }
845
846 static __le32
847 qlcnic_get_fw_size(struct qlcnic_adapter *adapter)
848 {
849         if (adapter->fw_type == QLCNIC_UNIFIED_ROMIMAGE)
850                 return cpu_to_le32((qlcnic_get_data_desc(adapter,
851                                         QLCNIC_UNI_DIR_SECT_FW,
852                                         QLCNIC_UNI_FIRMWARE_IDX_OFF))->size);
853         else
854                 return cpu_to_le32(
855                         *(u32 *)&adapter->fw->data[QLCNIC_FW_SIZE_OFFSET]);
856 }
857
858 static __le32
859 qlcnic_get_fw_version(struct qlcnic_adapter *adapter)
860 {
861         struct uni_data_desc *fw_data_desc;
862         const struct firmware *fw = adapter->fw;
863         __le32 major, minor, sub;
864         const u8 *ver_str;
865         int i, ret;
866
867         if (adapter->fw_type != QLCNIC_UNIFIED_ROMIMAGE)
868                 return cpu_to_le32(*(u32 *)&fw->data[QLCNIC_FW_VERSION_OFFSET]);
869
870         fw_data_desc = qlcnic_get_data_desc(adapter, QLCNIC_UNI_DIR_SECT_FW,
871                         QLCNIC_UNI_FIRMWARE_IDX_OFF);
872         ver_str = fw->data + cpu_to_le32(fw_data_desc->findex) +
873                 cpu_to_le32(fw_data_desc->size) - 17;
874
875         for (i = 0; i < 12; i++) {
876                 if (!strncmp(&ver_str[i], "REV=", 4)) {
877                         ret = sscanf(&ver_str[i+4], "%u.%u.%u ",
878                                         &major, &minor, &sub);
879                         if (ret != 3)
880                                 return 0;
881                         else
882                                 return major + (minor << 8) + (sub << 16);
883                 }
884         }
885
886         return 0;
887 }
888
889 static __le32
890 qlcnic_get_bios_version(struct qlcnic_adapter *adapter)
891 {
892         const struct firmware *fw = adapter->fw;
893         __le32 bios_ver, prd_off = adapter->file_prd_off;
894
895         if (adapter->fw_type != QLCNIC_UNIFIED_ROMIMAGE)
896                 return cpu_to_le32(
897                         *(u32 *)&fw->data[QLCNIC_BIOS_VERSION_OFFSET]);
898
899         bios_ver = cpu_to_le32(*((u32 *) (&fw->data[prd_off])
900                                 + QLCNIC_UNI_BIOS_VERSION_OFF));
901
902         return (bios_ver << 16) + ((bios_ver >> 8) & 0xff00) + (bios_ver >> 24);
903 }
904
905 int
906 qlcnic_need_fw_reset(struct qlcnic_adapter *adapter)
907 {
908         u32 count, old_count;
909         u32 val, version, major, minor, build;
910         int i, timeout;
911
912         if (adapter->need_fw_reset)
913                 return 1;
914
915         /* last attempt had failed */
916         if (QLCRD32(adapter, CRB_CMDPEG_STATE) == PHAN_INITIALIZE_FAILED)
917                 return 1;
918
919         old_count = QLCRD32(adapter, QLCNIC_PEG_ALIVE_COUNTER);
920
921         for (i = 0; i < 10; i++) {
922
923                 timeout = msleep_interruptible(200);
924                 if (timeout) {
925                         QLCWR32(adapter, CRB_CMDPEG_STATE,
926                                         PHAN_INITIALIZE_FAILED);
927                         return -EINTR;
928                 }
929
930                 count = QLCRD32(adapter, QLCNIC_PEG_ALIVE_COUNTER);
931                 if (count != old_count)
932                         break;
933         }
934
935         /* firmware is dead */
936         if (count == old_count)
937                 return 1;
938
939         /* check if we have got newer or different file firmware */
940         if (adapter->fw) {
941
942                 val = qlcnic_get_fw_version(adapter);
943
944                 version = QLCNIC_DECODE_VERSION(val);
945
946                 major = QLCRD32(adapter, QLCNIC_FW_VERSION_MAJOR);
947                 minor = QLCRD32(adapter, QLCNIC_FW_VERSION_MINOR);
948                 build = QLCRD32(adapter, QLCNIC_FW_VERSION_SUB);
949
950                 if (version > QLCNIC_VERSION_CODE(major, minor, build))
951                         return 1;
952         }
953
954         return 0;
955 }
956
957 static const char *fw_name[] = {
958         QLCNIC_UNIFIED_ROMIMAGE_NAME,
959         QLCNIC_FLASH_ROMIMAGE_NAME,
960 };
961
962 int
963 qlcnic_load_firmware(struct qlcnic_adapter *adapter)
964 {
965         u64 *ptr64;
966         u32 i, flashaddr, size;
967         const struct firmware *fw = adapter->fw;
968         struct pci_dev *pdev = adapter->pdev;
969
970         dev_info(&pdev->dev, "loading firmware from %s\n",
971                         fw_name[adapter->fw_type]);
972
973         if (fw) {
974                 __le64 data;
975
976                 size = (QLCNIC_IMAGE_START - QLCNIC_BOOTLD_START) / 8;
977
978                 ptr64 = (u64 *)qlcnic_get_bootld_offs(adapter);
979                 flashaddr = QLCNIC_BOOTLD_START;
980
981                 for (i = 0; i < size; i++) {
982                         data = cpu_to_le64(ptr64[i]);
983
984                         if (qlcnic_pci_mem_write_2M(adapter, flashaddr, data))
985                                 return -EIO;
986
987                         flashaddr += 8;
988                 }
989
990                 size = (__force u32)qlcnic_get_fw_size(adapter) / 8;
991
992                 ptr64 = (u64 *)qlcnic_get_fw_offs(adapter);
993                 flashaddr = QLCNIC_IMAGE_START;
994
995                 for (i = 0; i < size; i++) {
996                         data = cpu_to_le64(ptr64[i]);
997
998                         if (qlcnic_pci_mem_write_2M(adapter,
999                                                 flashaddr, data))
1000                                 return -EIO;
1001
1002                         flashaddr += 8;
1003                 }
1004
1005                 size = (__force u32)qlcnic_get_fw_size(adapter) % 8;
1006                 if (size) {
1007                         data = cpu_to_le64(ptr64[i]);
1008
1009                         if (qlcnic_pci_mem_write_2M(adapter,
1010                                                 flashaddr, data))
1011                                 return -EIO;
1012                 }
1013
1014         } else {
1015                 u64 data;
1016                 u32 hi, lo;
1017
1018                 size = (QLCNIC_IMAGE_START - QLCNIC_BOOTLD_START) / 8;
1019                 flashaddr = QLCNIC_BOOTLD_START;
1020
1021                 for (i = 0; i < size; i++) {
1022                         if (qlcnic_rom_fast_read(adapter,
1023                                         flashaddr, (int *)&lo) != 0)
1024                                 return -EIO;
1025                         if (qlcnic_rom_fast_read(adapter,
1026                                         flashaddr + 4, (int *)&hi) != 0)
1027                                 return -EIO;
1028
1029                         data = (((u64)hi << 32) | lo);
1030
1031                         if (qlcnic_pci_mem_write_2M(adapter,
1032                                                 flashaddr, data))
1033                                 return -EIO;
1034
1035                         flashaddr += 8;
1036                 }
1037         }
1038         msleep(1);
1039
1040         QLCWR32(adapter, QLCNIC_CRB_PEG_NET_0 + 0x18, 0x1020);
1041         QLCWR32(adapter, QLCNIC_ROMUSB_GLB_SW_RESET, 0x80001e);
1042         return 0;
1043 }
1044
1045 static int
1046 qlcnic_validate_firmware(struct qlcnic_adapter *adapter)
1047 {
1048         __le32 val;
1049         u32 ver, bios, min_size;
1050         struct pci_dev *pdev = adapter->pdev;
1051         const struct firmware *fw = adapter->fw;
1052         u8 fw_type = adapter->fw_type;
1053
1054         if (fw_type == QLCNIC_UNIFIED_ROMIMAGE) {
1055                 if (qlcnic_validate_unified_romimage(adapter))
1056                         return -EINVAL;
1057
1058                 min_size = QLCNIC_UNI_FW_MIN_SIZE;
1059         } else {
1060                 val = cpu_to_le32(*(u32 *)&fw->data[QLCNIC_FW_MAGIC_OFFSET]);
1061                 if ((__force u32)val != QLCNIC_BDINFO_MAGIC)
1062                         return -EINVAL;
1063
1064                 min_size = QLCNIC_FW_MIN_SIZE;
1065         }
1066
1067         if (fw->size < min_size)
1068                 return -EINVAL;
1069
1070         val = qlcnic_get_fw_version(adapter);
1071         ver = QLCNIC_DECODE_VERSION(val);
1072
1073         if (ver < QLCNIC_MIN_FW_VERSION) {
1074                 dev_err(&pdev->dev,
1075                                 "%s: firmware version %d.%d.%d unsupported\n",
1076                 fw_name[fw_type], _major(ver), _minor(ver), _build(ver));
1077                 return -EINVAL;
1078         }
1079
1080         val = qlcnic_get_bios_version(adapter);
1081         qlcnic_rom_fast_read(adapter, QLCNIC_BIOS_VERSION_OFFSET, (int *)&bios);
1082         if ((__force u32)val != bios) {
1083                 dev_err(&pdev->dev, "%s: firmware bios is incompatible\n",
1084                                 fw_name[fw_type]);
1085                 return -EINVAL;
1086         }
1087
1088         /* check if flashed firmware is newer */
1089         if (qlcnic_rom_fast_read(adapter,
1090                         QLCNIC_FW_VERSION_OFFSET, (int *)&val))
1091                 return -EIO;
1092
1093         val = QLCNIC_DECODE_VERSION(val);
1094         if (val > ver) {
1095                 dev_info(&pdev->dev, "%s: firmware is older than flash\n",
1096                                 fw_name[fw_type]);
1097                 return -EINVAL;
1098         }
1099
1100         QLCWR32(adapter, QLCNIC_CAM_RAM(0x1fc), QLCNIC_BDINFO_MAGIC);
1101         return 0;
1102 }
1103
1104 static void
1105 qlcnic_get_next_fwtype(struct qlcnic_adapter *adapter)
1106 {
1107         u8 fw_type;
1108
1109         switch (adapter->fw_type) {
1110         case QLCNIC_UNKNOWN_ROMIMAGE:
1111                 fw_type = QLCNIC_UNIFIED_ROMIMAGE;
1112                 break;
1113
1114         case QLCNIC_UNIFIED_ROMIMAGE:
1115         default:
1116                 fw_type = QLCNIC_FLASH_ROMIMAGE;
1117                 break;
1118         }
1119
1120         adapter->fw_type = fw_type;
1121 }
1122
1123
1124
1125 void qlcnic_request_firmware(struct qlcnic_adapter *adapter)
1126 {
1127         struct pci_dev *pdev = adapter->pdev;
1128         int rc;
1129
1130         adapter->fw_type = QLCNIC_UNKNOWN_ROMIMAGE;
1131
1132 next:
1133         qlcnic_get_next_fwtype(adapter);
1134
1135         if (adapter->fw_type == QLCNIC_FLASH_ROMIMAGE) {
1136                 adapter->fw = NULL;
1137         } else {
1138                 rc = request_firmware(&adapter->fw,
1139                                 fw_name[adapter->fw_type], &pdev->dev);
1140                 if (rc != 0)
1141                         goto next;
1142
1143                 rc = qlcnic_validate_firmware(adapter);
1144                 if (rc != 0) {
1145                         release_firmware(adapter->fw);
1146                         msleep(1);
1147                         goto next;
1148                 }
1149         }
1150 }
1151
1152
1153 void
1154 qlcnic_release_firmware(struct qlcnic_adapter *adapter)
1155 {
1156         if (adapter->fw)
1157                 release_firmware(adapter->fw);
1158         adapter->fw = NULL;
1159 }
1160
1161 static int qlcnic_cmd_peg_ready(struct qlcnic_adapter *adapter)
1162 {
1163         u32 val;
1164         int retries = 60;
1165
1166         do {
1167                 val = QLCRD32(adapter, CRB_CMDPEG_STATE);
1168
1169                 switch (val) {
1170                 case PHAN_INITIALIZE_COMPLETE:
1171                 case PHAN_INITIALIZE_ACK:
1172                         return 0;
1173                 case PHAN_INITIALIZE_FAILED:
1174                         goto out_err;
1175                 default:
1176                         break;
1177                 }
1178
1179                 msleep(500);
1180
1181         } while (--retries);
1182
1183         QLCWR32(adapter, CRB_CMDPEG_STATE, PHAN_INITIALIZE_FAILED);
1184
1185 out_err:
1186         dev_err(&adapter->pdev->dev, "Command Peg initialization not "
1187                       "complete, state: 0x%x.\n", val);
1188         return -EIO;
1189 }
1190
1191 static int
1192 qlcnic_receive_peg_ready(struct qlcnic_adapter *adapter)
1193 {
1194         u32 val;
1195         int retries = 2000;
1196
1197         do {
1198                 val = QLCRD32(adapter, CRB_RCVPEG_STATE);
1199
1200                 if (val == PHAN_PEG_RCV_INITIALIZED)
1201                         return 0;
1202
1203                 msleep(10);
1204
1205         } while (--retries);
1206
1207         if (!retries) {
1208                 dev_err(&adapter->pdev->dev, "Receive Peg initialization not "
1209                               "complete, state: 0x%x.\n", val);
1210                 return -EIO;
1211         }
1212
1213         return 0;
1214 }
1215
1216 int qlcnic_init_firmware(struct qlcnic_adapter *adapter)
1217 {
1218         int err;
1219
1220         err = qlcnic_cmd_peg_ready(adapter);
1221         if (err)
1222                 return err;
1223
1224         err = qlcnic_receive_peg_ready(adapter);
1225         if (err)
1226                 return err;
1227
1228         QLCWR32(adapter, CRB_CMDPEG_STATE, PHAN_INITIALIZE_ACK);
1229
1230         return err;
1231 }
1232
1233 static void
1234 qlcnic_handle_linkevent(struct qlcnic_adapter *adapter,
1235                                 struct qlcnic_fw_msg *msg)
1236 {
1237         u32 cable_OUI;
1238         u16 cable_len;
1239         u16 link_speed;
1240         u8  link_status, module, duplex, autoneg;
1241         struct net_device *netdev = adapter->netdev;
1242
1243         adapter->has_link_events = 1;
1244
1245         cable_OUI = msg->body[1] & 0xffffffff;
1246         cable_len = (msg->body[1] >> 32) & 0xffff;
1247         link_speed = (msg->body[1] >> 48) & 0xffff;
1248
1249         link_status = msg->body[2] & 0xff;
1250         duplex = (msg->body[2] >> 16) & 0xff;
1251         autoneg = (msg->body[2] >> 24) & 0xff;
1252
1253         module = (msg->body[2] >> 8) & 0xff;
1254         if (module == LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLE)
1255                 dev_info(&netdev->dev, "unsupported cable: OUI 0x%x, "
1256                                 "length %d\n", cable_OUI, cable_len);
1257         else if (module == LINKEVENT_MODULE_TWINAX_UNSUPPORTED_CABLELEN)
1258                 dev_info(&netdev->dev, "unsupported cable length %d\n",
1259                                 cable_len);
1260
1261         qlcnic_advert_link_change(adapter, link_status);
1262
1263         if (duplex == LINKEVENT_FULL_DUPLEX)
1264                 adapter->link_duplex = DUPLEX_FULL;
1265         else
1266                 adapter->link_duplex = DUPLEX_HALF;
1267
1268         adapter->module_type = module;
1269         adapter->link_autoneg = autoneg;
1270         adapter->link_speed = link_speed;
1271 }
1272
1273 static void
1274 qlcnic_handle_fw_message(int desc_cnt, int index,
1275                 struct qlcnic_host_sds_ring *sds_ring)
1276 {
1277         struct qlcnic_fw_msg msg;
1278         struct status_desc *desc;
1279         int i = 0, opcode;
1280
1281         while (desc_cnt > 0 && i < 8) {
1282                 desc = &sds_ring->desc_head[index];
1283                 msg.words[i++] = le64_to_cpu(desc->status_desc_data[0]);
1284                 msg.words[i++] = le64_to_cpu(desc->status_desc_data[1]);
1285
1286                 index = get_next_index(index, sds_ring->num_desc);
1287                 desc_cnt--;
1288         }
1289
1290         opcode = qlcnic_get_nic_msg_opcode(msg.body[0]);
1291         switch (opcode) {
1292         case QLCNIC_C2H_OPCODE_GET_LINKEVENT_RESPONSE:
1293                 qlcnic_handle_linkevent(sds_ring->adapter, &msg);
1294                 break;
1295         default:
1296                 break;
1297         }
1298 }
1299
1300 static int
1301 qlcnic_alloc_rx_skb(struct qlcnic_adapter *adapter,
1302                 struct qlcnic_host_rds_ring *rds_ring,
1303                 struct qlcnic_rx_buffer *buffer)
1304 {
1305         struct sk_buff *skb;
1306         dma_addr_t dma;
1307         struct pci_dev *pdev = adapter->pdev;
1308
1309         skb = dev_alloc_skb(rds_ring->skb_size);
1310         if (!skb) {
1311                 adapter->stats.skb_alloc_failure++;
1312                 return -ENOMEM;
1313         }
1314
1315         skb_reserve(skb, 2);
1316
1317         dma = pci_map_single(pdev, skb->data,
1318                         rds_ring->dma_size, PCI_DMA_FROMDEVICE);
1319
1320         if (pci_dma_mapping_error(pdev, dma)) {
1321                 adapter->stats.rx_dma_map_error++;
1322                 dev_kfree_skb_any(skb);
1323                 return -ENOMEM;
1324         }
1325
1326         buffer->skb = skb;
1327         buffer->dma = dma;
1328
1329         return 0;
1330 }
1331
1332 static struct sk_buff *qlcnic_process_rxbuf(struct qlcnic_adapter *adapter,
1333                 struct qlcnic_host_rds_ring *rds_ring, u16 index, u16 cksum)
1334 {
1335         struct qlcnic_rx_buffer *buffer;
1336         struct sk_buff *skb;
1337
1338         buffer = &rds_ring->rx_buf_arr[index];
1339
1340         if (unlikely(buffer->skb == NULL)) {
1341                 WARN_ON(1);
1342                 return NULL;
1343         }
1344
1345         pci_unmap_single(adapter->pdev, buffer->dma, rds_ring->dma_size,
1346                         PCI_DMA_FROMDEVICE);
1347
1348         skb = buffer->skb;
1349
1350         if (likely(adapter->rx_csum && cksum == STATUS_CKSUM_OK)) {
1351                 adapter->stats.csummed++;
1352                 skb->ip_summed = CHECKSUM_UNNECESSARY;
1353         } else {
1354                 skb->ip_summed = CHECKSUM_NONE;
1355         }
1356
1357         skb->dev = adapter->netdev;
1358
1359         buffer->skb = NULL;
1360
1361         return skb;
1362 }
1363
1364 static struct qlcnic_rx_buffer *
1365 qlcnic_process_rcv(struct qlcnic_adapter *adapter,
1366                 struct qlcnic_host_sds_ring *sds_ring,
1367                 int ring, u64 sts_data0)
1368 {
1369         struct net_device *netdev = adapter->netdev;
1370         struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx;
1371         struct qlcnic_rx_buffer *buffer;
1372         struct sk_buff *skb;
1373         struct qlcnic_host_rds_ring *rds_ring;
1374         int index, length, cksum, pkt_offset;
1375
1376         if (unlikely(ring >= adapter->max_rds_rings))
1377                 return NULL;
1378
1379         rds_ring = &recv_ctx->rds_rings[ring];
1380
1381         index = qlcnic_get_sts_refhandle(sts_data0);
1382         if (unlikely(index >= rds_ring->num_desc))
1383                 return NULL;
1384
1385         buffer = &rds_ring->rx_buf_arr[index];
1386
1387         length = qlcnic_get_sts_totallength(sts_data0);
1388         cksum  = qlcnic_get_sts_status(sts_data0);
1389         pkt_offset = qlcnic_get_sts_pkt_offset(sts_data0);
1390
1391         skb = qlcnic_process_rxbuf(adapter, rds_ring, index, cksum);
1392         if (!skb)
1393                 return buffer;
1394
1395         if (length > rds_ring->skb_size)
1396                 skb_put(skb, rds_ring->skb_size);
1397         else
1398                 skb_put(skb, length);
1399
1400         if (pkt_offset)
1401                 skb_pull(skb, pkt_offset);
1402
1403         skb->truesize = skb->len + sizeof(struct sk_buff);
1404         skb->protocol = eth_type_trans(skb, netdev);
1405
1406         napi_gro_receive(&sds_ring->napi, skb);
1407
1408         adapter->stats.rx_pkts++;
1409         adapter->stats.rxbytes += length;
1410
1411         return buffer;
1412 }
1413
1414 #define QLC_TCP_HDR_SIZE            20
1415 #define QLC_TCP_TS_OPTION_SIZE      12
1416 #define QLC_TCP_TS_HDR_SIZE         (QLC_TCP_HDR_SIZE + QLC_TCP_TS_OPTION_SIZE)
1417
1418 static struct qlcnic_rx_buffer *
1419 qlcnic_process_lro(struct qlcnic_adapter *adapter,
1420                 struct qlcnic_host_sds_ring *sds_ring,
1421                 int ring, u64 sts_data0, u64 sts_data1)
1422 {
1423         struct net_device *netdev = adapter->netdev;
1424         struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx;
1425         struct qlcnic_rx_buffer *buffer;
1426         struct sk_buff *skb;
1427         struct qlcnic_host_rds_ring *rds_ring;
1428         struct iphdr *iph;
1429         struct tcphdr *th;
1430         bool push, timestamp;
1431         int l2_hdr_offset, l4_hdr_offset;
1432         int index;
1433         u16 lro_length, length, data_offset;
1434         u32 seq_number;
1435
1436         if (unlikely(ring > adapter->max_rds_rings))
1437                 return NULL;
1438
1439         rds_ring = &recv_ctx->rds_rings[ring];
1440
1441         index = qlcnic_get_lro_sts_refhandle(sts_data0);
1442         if (unlikely(index > rds_ring->num_desc))
1443                 return NULL;
1444
1445         buffer = &rds_ring->rx_buf_arr[index];
1446
1447         timestamp = qlcnic_get_lro_sts_timestamp(sts_data0);
1448         lro_length = qlcnic_get_lro_sts_length(sts_data0);
1449         l2_hdr_offset = qlcnic_get_lro_sts_l2_hdr_offset(sts_data0);
1450         l4_hdr_offset = qlcnic_get_lro_sts_l4_hdr_offset(sts_data0);
1451         push = qlcnic_get_lro_sts_push_flag(sts_data0);
1452         seq_number = qlcnic_get_lro_sts_seq_number(sts_data1);
1453
1454         skb = qlcnic_process_rxbuf(adapter, rds_ring, index, STATUS_CKSUM_OK);
1455         if (!skb)
1456                 return buffer;
1457
1458         if (timestamp)
1459                 data_offset = l4_hdr_offset + QLC_TCP_TS_HDR_SIZE;
1460         else
1461                 data_offset = l4_hdr_offset + QLC_TCP_HDR_SIZE;
1462
1463         skb_put(skb, lro_length + data_offset);
1464
1465         skb->truesize = skb->len + sizeof(struct sk_buff) + skb_headroom(skb);
1466
1467         skb_pull(skb, l2_hdr_offset);
1468         skb->protocol = eth_type_trans(skb, netdev);
1469
1470         iph = (struct iphdr *)skb->data;
1471         th = (struct tcphdr *)(skb->data + (iph->ihl << 2));
1472
1473         length = (iph->ihl << 2) + (th->doff << 2) + lro_length;
1474         iph->tot_len = htons(length);
1475         iph->check = 0;
1476         iph->check = ip_fast_csum((unsigned char *)iph, iph->ihl);
1477         th->psh = push;
1478         th->seq = htonl(seq_number);
1479
1480         length = skb->len;
1481
1482         netif_receive_skb(skb);
1483
1484         adapter->stats.lro_pkts++;
1485         adapter->stats.lrobytes += length;
1486
1487         return buffer;
1488 }
1489
1490 int
1491 qlcnic_process_rcv_ring(struct qlcnic_host_sds_ring *sds_ring, int max)
1492 {
1493         struct qlcnic_adapter *adapter = sds_ring->adapter;
1494         struct list_head *cur;
1495         struct status_desc *desc;
1496         struct qlcnic_rx_buffer *rxbuf;
1497         u64 sts_data0, sts_data1;
1498
1499         int count = 0;
1500         int opcode, ring, desc_cnt;
1501         u32 consumer = sds_ring->consumer;
1502
1503         while (count < max) {
1504                 desc = &sds_ring->desc_head[consumer];
1505                 sts_data0 = le64_to_cpu(desc->status_desc_data[0]);
1506
1507                 if (!(sts_data0 & STATUS_OWNER_HOST))
1508                         break;
1509
1510                 desc_cnt = qlcnic_get_sts_desc_cnt(sts_data0);
1511                 opcode = qlcnic_get_sts_opcode(sts_data0);
1512
1513                 switch (opcode) {
1514                 case QLCNIC_RXPKT_DESC:
1515                 case QLCNIC_OLD_RXPKT_DESC:
1516                 case QLCNIC_SYN_OFFLOAD:
1517                         ring = qlcnic_get_sts_type(sts_data0);
1518                         rxbuf = qlcnic_process_rcv(adapter, sds_ring,
1519                                         ring, sts_data0);
1520                         break;
1521                 case QLCNIC_LRO_DESC:
1522                         ring = qlcnic_get_lro_sts_type(sts_data0);
1523                         sts_data1 = le64_to_cpu(desc->status_desc_data[1]);
1524                         rxbuf = qlcnic_process_lro(adapter, sds_ring,
1525                                         ring, sts_data0, sts_data1);
1526                         break;
1527                 case QLCNIC_RESPONSE_DESC:
1528                         qlcnic_handle_fw_message(desc_cnt, consumer, sds_ring);
1529                 default:
1530                         goto skip;
1531                 }
1532
1533                 WARN_ON(desc_cnt > 1);
1534
1535                 if (likely(rxbuf))
1536                         list_add_tail(&rxbuf->list, &sds_ring->free_list[ring]);
1537                 else
1538                         adapter->stats.null_rxbuf++;
1539
1540 skip:
1541                 for (; desc_cnt > 0; desc_cnt--) {
1542                         desc = &sds_ring->desc_head[consumer];
1543                         desc->status_desc_data[0] =
1544                                 cpu_to_le64(STATUS_OWNER_PHANTOM);
1545                         consumer = get_next_index(consumer, sds_ring->num_desc);
1546                 }
1547                 count++;
1548         }
1549
1550         for (ring = 0; ring < adapter->max_rds_rings; ring++) {
1551                 struct qlcnic_host_rds_ring *rds_ring =
1552                         &adapter->recv_ctx.rds_rings[ring];
1553
1554                 if (!list_empty(&sds_ring->free_list[ring])) {
1555                         list_for_each(cur, &sds_ring->free_list[ring]) {
1556                                 rxbuf = list_entry(cur,
1557                                                 struct qlcnic_rx_buffer, list);
1558                                 qlcnic_alloc_rx_skb(adapter, rds_ring, rxbuf);
1559                         }
1560                         spin_lock(&rds_ring->lock);
1561                         list_splice_tail_init(&sds_ring->free_list[ring],
1562                                                 &rds_ring->free_list);
1563                         spin_unlock(&rds_ring->lock);
1564                 }
1565
1566                 qlcnic_post_rx_buffers_nodb(adapter, rds_ring);
1567         }
1568
1569         if (count) {
1570                 sds_ring->consumer = consumer;
1571                 writel(consumer, sds_ring->crb_sts_consumer);
1572         }
1573
1574         return count;
1575 }
1576
1577 void
1578 qlcnic_post_rx_buffers(struct qlcnic_adapter *adapter, u32 ringid,
1579         struct qlcnic_host_rds_ring *rds_ring)
1580 {
1581         struct rcv_desc *pdesc;
1582         struct qlcnic_rx_buffer *buffer;
1583         int producer, count = 0;
1584         struct list_head *head;
1585
1586         producer = rds_ring->producer;
1587
1588         head = &rds_ring->free_list;
1589         while (!list_empty(head)) {
1590
1591                 buffer = list_entry(head->next, struct qlcnic_rx_buffer, list);
1592
1593                 if (!buffer->skb) {
1594                         if (qlcnic_alloc_rx_skb(adapter, rds_ring, buffer))
1595                                 break;
1596                 }
1597
1598                 count++;
1599                 list_del(&buffer->list);
1600
1601                 /* make a rcv descriptor  */
1602                 pdesc = &rds_ring->desc_head[producer];
1603                 pdesc->addr_buffer = cpu_to_le64(buffer->dma);
1604                 pdesc->reference_handle = cpu_to_le16(buffer->ref_handle);
1605                 pdesc->buffer_length = cpu_to_le32(rds_ring->dma_size);
1606
1607                 producer = get_next_index(producer, rds_ring->num_desc);
1608         }
1609
1610         if (count) {
1611                 rds_ring->producer = producer;
1612                 writel((producer-1) & (rds_ring->num_desc-1),
1613                                 rds_ring->crb_rcv_producer);
1614         }
1615 }
1616
1617 static void
1618 qlcnic_post_rx_buffers_nodb(struct qlcnic_adapter *adapter,
1619                 struct qlcnic_host_rds_ring *rds_ring)
1620 {
1621         struct rcv_desc *pdesc;
1622         struct qlcnic_rx_buffer *buffer;
1623         int producer, count = 0;
1624         struct list_head *head;
1625
1626         if (!spin_trylock(&rds_ring->lock))
1627                 return;
1628
1629         producer = rds_ring->producer;
1630
1631         head = &rds_ring->free_list;
1632         while (!list_empty(head)) {
1633
1634                 buffer = list_entry(head->next, struct qlcnic_rx_buffer, list);
1635
1636                 if (!buffer->skb) {
1637                         if (qlcnic_alloc_rx_skb(adapter, rds_ring, buffer))
1638                                 break;
1639                 }
1640
1641                 count++;
1642                 list_del(&buffer->list);
1643
1644                 /* make a rcv descriptor  */
1645                 pdesc = &rds_ring->desc_head[producer];
1646                 pdesc->reference_handle = cpu_to_le16(buffer->ref_handle);
1647                 pdesc->buffer_length = cpu_to_le32(rds_ring->dma_size);
1648                 pdesc->addr_buffer = cpu_to_le64(buffer->dma);
1649
1650                 producer = get_next_index(producer, rds_ring->num_desc);
1651         }
1652
1653         if (count) {
1654                 rds_ring->producer = producer;
1655                 writel((producer - 1) & (rds_ring->num_desc - 1),
1656                                 rds_ring->crb_rcv_producer);
1657         }
1658         spin_unlock(&rds_ring->lock);
1659 }
1660
1661 static struct qlcnic_rx_buffer *
1662 qlcnic_process_rcv_diag(struct qlcnic_adapter *adapter,
1663                 struct qlcnic_host_sds_ring *sds_ring,
1664                 int ring, u64 sts_data0)
1665 {
1666         struct qlcnic_recv_context *recv_ctx = &adapter->recv_ctx;
1667         struct qlcnic_rx_buffer *buffer;
1668         struct sk_buff *skb;
1669         struct qlcnic_host_rds_ring *rds_ring;
1670         int index, length, cksum, pkt_offset;
1671
1672         if (unlikely(ring >= adapter->max_rds_rings))
1673                 return NULL;
1674
1675         rds_ring = &recv_ctx->rds_rings[ring];
1676
1677         index = qlcnic_get_sts_refhandle(sts_data0);
1678         if (unlikely(index >= rds_ring->num_desc))
1679                 return NULL;
1680
1681         buffer = &rds_ring->rx_buf_arr[index];
1682
1683         length = qlcnic_get_sts_totallength(sts_data0);
1684         cksum  = qlcnic_get_sts_status(sts_data0);
1685         pkt_offset = qlcnic_get_sts_pkt_offset(sts_data0);
1686
1687         skb = qlcnic_process_rxbuf(adapter, rds_ring, index, cksum);
1688         if (!skb)
1689                 return buffer;
1690
1691         skb_put(skb, rds_ring->skb_size);
1692
1693         if (pkt_offset)
1694                 skb_pull(skb, pkt_offset);
1695
1696         skb->truesize = skb->len + sizeof(struct sk_buff);
1697
1698         if (!qlcnic_check_loopback_buff(skb->data))
1699                 adapter->diag_cnt++;
1700
1701         dev_kfree_skb_any(skb);
1702         adapter->stats.rx_pkts++;
1703         adapter->stats.rxbytes += length;
1704
1705         return buffer;
1706 }
1707
1708 void
1709 qlcnic_process_rcv_ring_diag(struct qlcnic_host_sds_ring *sds_ring)
1710 {
1711         struct qlcnic_adapter *adapter = sds_ring->adapter;
1712         struct status_desc *desc;
1713         struct qlcnic_rx_buffer *rxbuf;
1714         u64 sts_data0;
1715
1716         int opcode, ring, desc_cnt;
1717         u32 consumer = sds_ring->consumer;
1718
1719         desc = &sds_ring->desc_head[consumer];
1720         sts_data0 = le64_to_cpu(desc->status_desc_data[0]);
1721
1722         if (!(sts_data0 & STATUS_OWNER_HOST))
1723                 return;
1724
1725         desc_cnt = qlcnic_get_sts_desc_cnt(sts_data0);
1726         opcode = qlcnic_get_sts_opcode(sts_data0);
1727
1728         ring = qlcnic_get_sts_type(sts_data0);
1729         rxbuf = qlcnic_process_rcv_diag(adapter, sds_ring,
1730                                         ring, sts_data0);
1731
1732         desc->status_desc_data[0] = cpu_to_le64(STATUS_OWNER_PHANTOM);
1733         consumer = get_next_index(consumer, sds_ring->num_desc);
1734
1735         sds_ring->consumer = consumer;
1736         writel(consumer, sds_ring->crb_sts_consumer);
1737 }
1738
1739 void
1740 qlcnic_fetch_mac(struct qlcnic_adapter *adapter, u32 off1, u32 off2,
1741                         u8 alt_mac, u8 *mac)
1742 {
1743         u32 mac_low, mac_high;
1744         int i;
1745
1746         mac_low = QLCRD32(adapter, off1);
1747         mac_high = QLCRD32(adapter, off2);
1748
1749         if (alt_mac) {
1750                 mac_low |= (mac_low >> 16) | (mac_high << 16);
1751                 mac_high >>= 16;
1752         }
1753
1754         for (i = 0; i < 2; i++)
1755                 mac[i] = (u8)(mac_high >> ((1 - i) * 8));
1756         for (i = 2; i < 6; i++)
1757                 mac[i] = (u8)(mac_low >> ((5 - i) * 8));
1758 }