14d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray/* 2a02d44a02bd2b3f3848f30e335adc3c076b3f905Divy Le Ray * Copyright (c) 2003-2008 Chelsio, Inc. All rights reserved. 34d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray * 41d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * This software is available to you under a choice of one of two 51d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * licenses. You may choose to be licensed under the terms of the GNU 61d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * General Public License (GPL) Version 2, available from the file 71d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * COPYING in the main directory of this source tree, or the 81d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * OpenIB.org BSD license below: 94d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray * 101d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * Redistribution and use in source and binary forms, with or 111d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * without modification, are permitted provided that the following 121d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * conditions are met: 131d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * 141d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * - Redistributions of source code must retain the above 151d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * copyright notice, this list of conditions and the following 161d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * disclaimer. 171d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * 181d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * - Redistributions in binary form must reproduce the above 191d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * copyright notice, this list of conditions and the following 201d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * disclaimer in the documentation and/or other materials 211d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * provided with the distribution. 221d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * 231d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 241d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 251d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 261d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS 271d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 281d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 291d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 301d68e93d65d63814388d1a0b3de028de6dc27ae0Divy Le Ray * SOFTWARE. 314d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray */ 324d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 334d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray/* This file should not be included directly. Include common.h instead. */ 344d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 354d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#ifndef __T3_ADAPTER_H__ 364d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#define __T3_ADAPTER_H__ 374d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 384d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#include <linux/pci.h> 394d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#include <linux/spinlock.h> 404d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#include <linux/interrupt.h> 414d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#include <linux/timer.h> 424d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#include <linux/cache.h> 43a13fbee086310cb99a73958943d4d8103bf52f3aDivy Le Ray#include <linux/mutex.h> 441977f032722c27ee3730284582fd3991ad9ac81bJiri Slaby#include <linux/bitops.h> 454d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#include "t3cdev.h" 464d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#include <asm/io.h> 474d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 485fbf816fe7d72bfdbf22bfec05b4ec3aa6849f72Divy Le Raystruct adapter; 49bea3348eef27e6044b6161fd04c3152215f96411Stephen Hemmingerstruct sge_qset; 50f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xiestruct port_info; 51bea3348eef27e6044b6161fd04c3152215f96411Stephen Hemminger 52f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xieenum mac_idx_types { 53f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie LAN_MAC_IDX = 0, 54f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie SAN_MAC_IDX, 55f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie 56f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie MAX_MAC_IDX 57f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie}; 58f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie 59f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xiestruct iscsi_config { 60f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie __u8 mac_addr[ETH_ALEN]; 61f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie __u32 flags; 62f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie int (*send)(struct port_info *pi, struct sk_buff **skb); 63f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie int (*recv)(struct port_info *pi, struct sk_buff *skb); 64f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie}; 65f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie 664d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct port_info { 675fbf816fe7d72bfdbf22bfec05b4ec3aa6849f72Divy Le Ray struct adapter *adapter; 68bea3348eef27e6044b6161fd04c3152215f96411Stephen Hemminger struct sge_qset *qs; 694d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray u8 port_id; 704d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray u8 nqsets; 714d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray u8 first_qset; 724d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct cphy phy; 734d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct cmac mac; 744d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct link_config link_config; 754d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct net_device_stats netstats; 764d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray int activity; 77a109a5b916bc180e14fad0d1e9c37a08c85652c0Karen Xie __be32 iscsi_ipv4addr; 78f14d42f314cb45a080bf84ecadf8b9b1eebbe9fdKaren Xie struct iscsi_config iscsic; 79bf792094ef830117312b3990b63474320ec864c0Divy Le Ray 80bf792094ef830117312b3990b63474320ec864c0Divy Le Ray int link_fault; /* link fault was detected */ 814d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray}; 824d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 834d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayenum { /* adapter flags */ 844d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray FULL_INIT_DONE = (1 << 0), 854d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray USING_MSI = (1 << 1), 864d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray USING_MSIX = (1 << 2), 8714ab989245069907622ab9fd930275c086cee069Divy Le Ray QUEUES_BOUND = (1 << 3), 88b881955b7d045e7486e9af08398242aeb7199f67Divy Le Ray TP_PARITY_INIT = (1 << 4), 8948c4b6dbb7e246957e13302668acf7c77e4f8b3aDivy Le Ray NAPI_INIT = (1 << 5), 904d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray}; 914d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 92cf992af561cc3ba72d79582535e6262818b00548Divy Le Raystruct fl_pg_chunk { 93cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray struct page *page; 94cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray void *va; 95cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray unsigned int offset; 9610b6d95612672f89deb39b5a60fb677c78ba4844Divy Le Ray unsigned long *p_cnt; 9710b6d95612672f89deb39b5a60fb677c78ba4844Divy Le Ray dma_addr_t mapping; 98cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray}; 99cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray 1004d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct rx_desc; 1014d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct rx_sw_desc; 1024d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 103cf992af561cc3ba72d79582535e6262818b00548Divy Le Raystruct sge_fl { /* SGE per free-buffer list state */ 104cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray unsigned int buf_size; /* size of each Rx buffer */ 105cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray unsigned int credits; /* # of available Rx buffers */ 10626b3871d2c82b7c733a3b6d631a6e48c9ebf1c5aDivy Le Ray unsigned int pend_cred; /* new buffers since last FL DB ring */ 107cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray unsigned int size; /* capacity of free list */ 108cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray unsigned int cidx; /* consumer index */ 109cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray unsigned int pidx; /* producer index */ 110cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray unsigned int gen; /* free list generation */ 111cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray struct fl_pg_chunk pg_chunk;/* page chunk cache */ 112cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray unsigned int use_pages; /* whether FL uses pages or sk_buffs */ 1137385ecf339c504933a98581c2056d83b69b2a82bDivy Le Ray unsigned int order; /* order of page allocations */ 1145e68b772e6efd189d6aca76f6872fb75d51ace60Divy Le Ray unsigned int alloc_size; /* size of allocated buffer */ 115cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray struct rx_desc *desc; /* address of HW Rx descriptor ring */ 116cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray struct rx_sw_desc *sdesc; /* address of SW Rx descriptor ring */ 117cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray dma_addr_t phys_addr; /* physical address of HW ring start */ 118cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray unsigned int cntxt_id; /* SGE context id for the free list */ 119cf992af561cc3ba72d79582535e6262818b00548Divy Le Ray unsigned long empty; /* # of times queue ran out of buffers */ 120e0994eb1d9ead09bb8f6483cf5cf6aa55ce0f3b9Divy Le Ray unsigned long alloc_failed; /* # of times buffer allocation failed */ 1214d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray}; 1224d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 1234d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray/* 1244d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray * Bundle size for grouping offload RX packets for delivery to the stack. 1254d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray * Don't make this too big as we do prefetch on each packet in a bundle. 1264d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray */ 1274d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray# define RX_BUNDLE_SIZE 8 1284d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 1294d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct rsp_desc; 1304d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 1314d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct sge_rspq { /* state for an SGE response queue */ 1324d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int credits; /* # of pending response credits */ 1334d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int size; /* capacity of response queue */ 1344d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int cidx; /* consumer index */ 1354d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int gen; /* current generation bit */ 1364d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int polling; /* is the queue serviced through NAPI? */ 1374d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int holdoff_tmr; /* interrupt holdoff timer in 100ns */ 1384d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int next_holdoff; /* holdoff time for next interrupt */ 1397385ecf339c504933a98581c2056d83b69b2a82bDivy Le Ray unsigned int rx_recycle_buf; /* whether recycling occurred 1407385ecf339c504933a98581c2056d83b69b2a82bDivy Le Ray within current sop-eop */ 1414d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct rsp_desc *desc; /* address of HW response ring */ 1424d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray dma_addr_t phys_addr; /* physical address of the ring */ 1434d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int cntxt_id; /* SGE context id for the response q */ 1444d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray spinlock_t lock; /* guards response processing */ 145147e70e62fdd5af6263106ad634b03c5154c1e56David S. Miller struct sk_buff_head rx_queue; /* offload packet receive queue */ 1467385ecf339c504933a98581c2056d83b69b2a82bDivy Le Ray struct sk_buff *pg_skb; /* used to build frag list in napi handler */ 1474d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 1484d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long offload_pkts; 1494d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long offload_bundles; 1504d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long eth_pkts; /* # of ethernet packets */ 1514d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long pure_rsps; /* # of pure (non-data) responses */ 1524d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long imm_data; /* responses with immediate data */ 1534d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long rx_drops; /* # of packets dropped due to no mem */ 1544d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long async_notif; /* # of asynchronous notification events */ 1554d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long empty; /* # of times queue ran out of credits */ 1564d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long nomem; /* # of responses deferred due to no mem */ 1574d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long unhandled_irqs; /* # of spurious intrs */ 158bae73f44472921008f8d0982344c53ae231445a1Divy Le Ray unsigned long starved; 159bae73f44472921008f8d0982344c53ae231445a1Divy Le Ray unsigned long restarted; 1604d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray}; 1614d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 1624d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct tx_desc; 1634d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct tx_sw_desc; 1644d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 1654d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct sge_txq { /* state for an SGE Tx queue */ 1664d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long flags; /* HW DMA fetch status */ 1674d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int in_use; /* # of in-use Tx descriptors */ 1684d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int size; /* # of descriptors */ 1694d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int processed; /* total # of descs HW has processed */ 1704d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int cleaned; /* total # of descs SW has reclaimed */ 1714d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int stop_thres; /* SW TX queue suspend threshold */ 1724d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int cidx; /* consumer index */ 1734d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int pidx; /* producer index */ 1744d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int gen; /* current value of generation bit */ 1754d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int unacked; /* Tx descriptors used since last COMPL */ 1764d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct tx_desc *desc; /* address of HW Tx descriptor ring */ 1774d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct tx_sw_desc *sdesc; /* address of SW Tx descriptor ring */ 1784d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray spinlock_t lock; /* guards enqueueing of new packets */ 1794d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int token; /* WR token */ 1804d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray dma_addr_t phys_addr; /* physical address of the ring */ 1814d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct sk_buff_head sendq; /* List of backpressured offload packets */ 1824d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct tasklet_struct qresume_tsk; /* restarts the queue */ 1834d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int cntxt_id; /* SGE context id for the Tx q */ 1844d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long stops; /* # of times q has been stopped */ 1854d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long restarts; /* # of queue restarts */ 1864d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray}; 1874d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 1884d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayenum { /* per port SGE statistics */ 1894d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray SGE_PSTAT_TSO, /* # of TSO requests */ 1904d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray SGE_PSTAT_RX_CSUM_GOOD, /* # of successful RX csum offloads */ 1914d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray SGE_PSTAT_TX_CSUM, /* # of TX checksum offloads */ 1924d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray SGE_PSTAT_VLANEX, /* # of VLAN tag extractions */ 1934d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray SGE_PSTAT_VLANINS, /* # of VLAN tag insertions */ 1944d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 1954d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray SGE_PSTAT_MAX /* must be last */ 1964d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray}; 1974d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 1987be2df451fa916f93e37763a58d33483feb0909fHerbert Xustruct napi_gro_fraginfo; 199b47385bd4f67481a7dbfcf1b4b82e9a67ecb846cDivy Le Ray 2004d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct sge_qset { /* an SGE queue set */ 201bea3348eef27e6044b6161fd04c3152215f96411Stephen Hemminger struct adapter *adap; 202bea3348eef27e6044b6161fd04c3152215f96411Stephen Hemminger struct napi_struct napi; 2034d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct sge_rspq rspq; 2044d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct sge_fl fl[SGE_RXQ_PER_SET]; 2054d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct sge_txq txq[SGE_TXQ_PER_SET]; 20676620aafd66f0004829764940c5466144969cffcHerbert Xu int nomem; 207b47385bd4f67481a7dbfcf1b4b82e9a67ecb846cDivy Le Ray void *lro_va; 208bea3348eef27e6044b6161fd04c3152215f96411Stephen Hemminger struct net_device *netdev; 20982ad33297410c1af8e993210da76e114a4c1670dDivy Le Ray struct netdev_queue *tx_q; /* associated netdev TX queue */ 2104d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long txq_stopped; /* which Tx queues are stopped */ 2114d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct timer_list tx_reclaim_timer; /* reclaims TX buffers */ 21242c8ea17e8f78752ed5a354791b0ea1697dc3480Divy Le Ray struct timer_list rx_reclaim_timer; /* reclaims RX buffers */ 2134d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long port_stats[SGE_PSTAT_MAX]; 2144d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray} ____cacheline_aligned; 2154d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2164d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct sge { 2174d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct sge_qset qs[SGE_QSETS]; 2184d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray spinlock_t reg_lock; /* guards non-atomic SGE registers (eg context) */ 2194d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray}; 2204d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2214d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystruct adapter { 2224d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct t3cdev tdev; 2234d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct list_head adapter_list; 2244d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray void __iomem *regs; 2254d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct pci_dev *pdev; 2264d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long registered_device_map; 2274d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long open_device_map; 2284d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long flags; 2294d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2304d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray const char *name; 2314d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray int msg_enable; 2324d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int mmio_len; 2334d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2344d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct adapter_params params; 2354d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int slow_intr_mask; 2364d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned long irq_stats[IRQ_NUM_STATS]; 2374d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2385cda9364f1fbc330f0d82f534505a8e375d0a66cDivy Le Ray int msix_nvectors; 2394d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct { 2404d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned short vec; 2414d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray char desc[22]; 2424d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray } msix_info[SGE_QSETS + 1]; 2434d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2444d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray /* T3 modules */ 2454d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct sge sge; 2464d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct mc7 pmrx; 2474d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct mc7 pmtx; 2484d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct mc7 cm; 2494d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct mc5 mc5; 2504d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2514d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct net_device *port[MAX_NPORTS]; 2524d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray unsigned int check_task_cnt; 2534d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct delayed_work adap_check_task; 2544d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct work_struct ext_intr_handler_task; 25520d3fc11505a2706a33b4c9a932af036d836727fDivy Le Ray struct work_struct fatal_error_handler_task; 256bf792094ef830117312b3990b63474320ec864c0Divy Le Ray struct work_struct link_fault_handler_task; 2574d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 258e998f245c4b2d36ae2c35446e54ccbf1fb29d9deSteve Wise struct work_struct db_full_task; 259e998f245c4b2d36ae2c35446e54ccbf1fb29d9deSteve Wise struct work_struct db_empty_task; 260e998f245c4b2d36ae2c35446e54ccbf1fb29d9deSteve Wise struct work_struct db_drop_task; 261e998f245c4b2d36ae2c35446e54ccbf1fb29d9deSteve Wise 2624d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct dentry *debugfs_root; 2634d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2644d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray struct mutex mdio_lock; 2654d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray spinlock_t stats_lock; 2664d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray spinlock_t work_lock; 26774b793e1ef79edc49bc031a88d62f1e93fc6b30fDivy Le Ray 26874b793e1ef79edc49bc031a88d62f1e93fc6b30fDivy Le Ray struct sk_buff *nofail_skb; 2694d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray}; 2704d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2714d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystatic inline u32 t3_read_reg(struct adapter *adapter, u32 reg_addr) 2724d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray{ 2734d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray u32 val = readl(adapter->regs + reg_addr); 2744d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2754d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray CH_DBG(adapter, MMIO, "read register 0x%x value 0x%x\n", reg_addr, val); 2764d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray return val; 2774d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray} 2784d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2794d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystatic inline void t3_write_reg(struct adapter *adapter, u32 reg_addr, u32 val) 2804d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray{ 2814d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray CH_DBG(adapter, MMIO, "setting register 0x%x to 0x%x\n", reg_addr, val); 2824d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray writel(val, adapter->regs + reg_addr); 2834d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray} 2844d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2854d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystatic inline struct port_info *adap2pinfo(struct adapter *adap, int idx) 2864d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray{ 2874d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray return netdev_priv(adap->port[idx]); 2884d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray} 2894d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 2905e659515569220701bfe3c8936dcab67554cc286Divy Le Raystatic inline int phy2portid(struct cphy *phy) 2915e659515569220701bfe3c8936dcab67554cc286Divy Le Ray{ 2925e659515569220701bfe3c8936dcab67554cc286Divy Le Ray struct adapter *adap = phy->adapter; 2935e659515569220701bfe3c8936dcab67554cc286Divy Le Ray struct port_info *port0 = adap2pinfo(adap, 0); 2945e659515569220701bfe3c8936dcab67554cc286Divy Le Ray 2955e659515569220701bfe3c8936dcab67554cc286Divy Le Ray return &port0->phy == phy ? 0 : 1; 2965e659515569220701bfe3c8936dcab67554cc286Divy Le Ray} 2975e659515569220701bfe3c8936dcab67554cc286Divy Le Ray 2984d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#define OFFLOAD_DEVMAP_BIT 15 2994d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 3004d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#define tdev2adap(d) container_of(d, struct adapter, tdev) 3014d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 3024d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Raystatic inline int offload_running(struct adapter *adapter) 3034d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray{ 3044d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray return test_bit(OFFLOAD_DEVMAP_BIT, &adapter->open_device_map); 3054d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray} 3064d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 3074d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayint t3_offload_tx(struct t3cdev *tdev, struct sk_buff *skb); 3084d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 3094d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayvoid t3_os_ext_intr_handler(struct adapter *adapter); 3104d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayvoid t3_os_link_changed(struct adapter *adapter, int port_id, int link_status, 3114d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray int speed, int duplex, int fc); 312044979827eda13675abab99879ebe3ea535d59faDivy Le Rayvoid t3_os_phymod_changed(struct adapter *adap, int port_id); 313bf792094ef830117312b3990b63474320ec864c0Divy Le Rayvoid t3_os_link_fault(struct adapter *adapter, int port_id, int state); 314bf792094ef830117312b3990b63474320ec864c0Divy Le Rayvoid t3_os_link_fault_handler(struct adapter *adapter, int port_id); 3154d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 3164d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayvoid t3_sge_start(struct adapter *adap); 3174d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayvoid t3_sge_stop(struct adapter *adap); 3183156378993b0fc0f9f12f5f297f0a9b4c4fe0fc8Divy Le Rayvoid t3_start_sge_timers(struct adapter *adap); 3190ca41c0413a4d9ca58767d53d23accea9aa1cdefDivy Le Rayvoid t3_stop_sge_timers(struct adapter *adap); 3204d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayvoid t3_free_sge_resources(struct adapter *adap); 3214d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayvoid t3_sge_err_intr_handler(struct adapter *adapter); 3227c2399756ab8ccb2c57da4630b4aa4a1d61b3846Jeff Garzikirq_handler_t t3_intr_handler(struct adapter *adap, int polling); 32361357325f377889a1daffa14962d705dc814dd0eStephen Hemmingernetdev_tx_t t3_eth_xmit(struct sk_buff *skb, struct net_device *dev); 32414ab989245069907622ab9fd930275c086cee069Divy Le Rayint t3_mgmt_tx(struct adapter *adap, struct sk_buff *skb); 3254d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayvoid t3_update_qset_coalesce(struct sge_qset *qs, const struct qset_params *p); 3264d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Rayint t3_sge_alloc_qset(struct adapter *adapter, unsigned int id, int nports, 3274d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray int irq_vec_idx, const struct qset_params *p, 32882ad33297410c1af8e993210da76e114a4c1670dDivy Le Ray int ntxq, struct net_device *dev, 32982ad33297410c1af8e993210da76e114a4c1670dDivy Le Ray struct netdev_queue *netdevq); 330e998f245c4b2d36ae2c35446e54ccbf1fb29d9deSteve Wiseextern struct workqueue_struct *cxgb3_wq; 3314d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray 3322e8c07c35b3ffee7689406be61fd1448ee45d3cdDivy Le Rayint t3_get_edc_fw(struct cphy *phy, int edc_idx, int size); 3332e8c07c35b3ffee7689406be61fd1448ee45d3cdDivy Le Ray 3344d22de3e6cc4a09c369b504cd8bcde3385a974cdDivy Le Ray#endif /* __T3_ADAPTER_H__ */ 335