diff -Naru linux-2.6.16_orig/drivers/net/netxen/netxen_nic_config.h linux-2.6.16/drivers/net/netxen/netxen_nic_config.h --- linux-2.6.16_orig/drivers/net/netxen/netxen_nic_config.h 1969-12-31 16:00:00.000000000 -0800 +++ linux-2.6.16/drivers/net/netxen/netxen_nic_config.h 2006-03-24 14:13:57.000000000 -0800 @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2003 - 2006 NetXen Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * The full GNU General Public License is included in this distribution + * in the file called LICENSE. + * + * Contact Information: + * [EMAIL PROTECTED] + * NetXen, 3965 Freedom Circle, Fourth Floor, + * Santa Clara, CA 95054 + */ +/* $Id: netxen_nic_config.h,v 1.6 2005/06/17 01:20:11 sanjeev Exp $ */ +#ifndef _NetXen_NIC_CONFIG_H_ +#define _NetXen_NIC_CONFIG_H_ + +/* NIC configuration */ +#undef NetXen_IP_DEFRAG_ENABLED + +#define NO_EPG_PROXY 1 + +#define HOST_CPU_64_BIT 1 + +#endif + diff -Naru linux-2.6.16_orig/drivers/net/netxen/netxen_nic.h linux-2.6.16/drivers/net/netxen/netxen_nic.h --- linux-2.6.16_orig/drivers/net/netxen/netxen_nic.h 1969-12-31 16:00:00.000000000 -0800 +++ linux-2.6.16/drivers/net/netxen/netxen_nic.h 2006-03-24 14:13:57.000000000 -0800 @@ -0,0 +1,561 @@ +/* + * Copyright (C) 2003 - 2006 NetXen Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * The full GNU General Public License is included in this distribution + * in the file called LICENSE. + * + * Contact Information: + * [EMAIL PROTECTED] + * NetXen, 3965 Freedom Circle, Fourth Floor, + * Santa Clara, CA 95054 + */ +#ifndef _NetXen_NIC_ +#define _NetXen_NIC_ + +#include <linux/skbuff.h> +#ifdef NETIF_F_HW_VLAN_TX +#include <linux/if_vlan.h> +#endif +#ifndef MODULE +#include <asm/i387.h> +#endif + +#include "netxen_nic_hw.h" +#include "nic_cmn.h" +#include "netxen_inc.h" /* For MAX_RCV_CTX */ +#include "netxen_brdcfg.h" + +#define BAR_0 0 +#define PCI_DMA_64BIT 0xffffffffffffffffULL +#define PCI_DMA_32BIT 0x00000000ffffffffULL + +#define NETDEV_STATUS 0x1 + +#define ADDR_IN_WINDOW1(off) \ + ((off > NetXen_CRB_PCIX_HOST2) && (off < NetXen_CRB_MAX)) ? 1 : 0 + +/* normalize a 64MB crb address to 32MB PCI window + * To use CRB_NORMALIZE, window _must_ be set to 1 + */ +#define CRB_NORMALIZE(adapter, reg) \ + (void *)(uptr_t)(adapter->ahw.pci_base+ (reg) - NetXen_CRB_PCIX_HOST2 + NetXen_CRB_PCIX_HOST) + +/* + * The PCI VendorID and DeviceID for our board. + */ +#define PCI_VENDOR_ID_NetXen 0x4040 +#define PCI_DEVICE_ID_NetXen 0x0001 +#define PCI_DEVICE_ID_NetXen_4PORT 0x0001 /* XXX */ + +/* Phantom is multi-function. For our purposes, use function 0 */ +#define PHAN_FUNC_NUM 0 + +#define PFX "netxen: " + +/* FIXME vijo */ +extern int netxen_nic_debug; +#define netxen_nic_debug_on do { netxen_nic_debug = 1; } while(0) +#define netxen_nic_debug_off do { netxen_nic_debug = 0; } while(0) + +/* FIXME, vijo: port[0] is not correct */ +/* Note: Make sure to not call this before adapter->port is valid */ +#if defined(NDEBUG) +#define DPRINTK(nlevel, klevel, fmt, args...) do { \ + } while (0) +#else /* NDEBUG */ +#define DPRINTK(nlevel, klevel, fmt, args...) do { \ + /* (void)((NETIF_MSG_##nlevel & adapter->msg_enable) && */\ + if (netxen_nic_debug) \ + printk(KERN_##klevel PFX "%s: %s: " fmt, __FUNCTION__,\ + (adapter != NULL && adapter->port != NULL && \ + adapter->port[0] != NULL && \ + adapter->port[0]->netdev != NULL) ? \ + adapter->port[0]->netdev->name : NULL, \ + ## args); } while(0) +#endif + +#define NetXen_MAX_INTR 10 + +#define NetXen_RXBUFFER 2048 + +/* Number of status descriptors to handle per interrupt */ +#define MAX_STATUS_HANDLE (128) + +/* Number of status descriptors to process before posting buffers */ +#define MAX_RX_THRESHOLD (MAX_STATUS_HANDLE*2) + +/* netif_wake_queue ? count*/ +#define NetXen_TX_QUEUE_WAKE 16 + +/* After NetXen_RX_BUFFER_WRITE have been processed, we will repopulate them */ +#define NetXen_RX_BUFFER_WRITE 64 + +/* only works for sizes that are powers of 2 */ +#define NetXen_ROUNDUP(i, size) ((i) = (((i) + (size) - 1) & ~((size) - 1))) + +#ifndef TAILQ_FIRST +#define TAILQ_FIRST(head) ((head)->tqh_first) +#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL) +#endif + +/* For the MAC Address:experimental ref. pegnet_types.h */ +#define NetXen_MAC_OUI "00:0e:1e:" +#define NetXen_MAC_EXPERIMENTAL ((unsigned char)0x20) + +/* + * netxen_skb_frag{} is to contain mapping info for each SG list. This + * has to be freed when DMA is complete. This is part of netxen_tx_buffer{}. + */ +struct netxen_skb_frag { + uint64_t dma; + uint32_t length; +}; + +/* Following defines are for the state of the buffers */ +#define NetXen_BUFFER_FREE 0 +#define NetXen_BUFFER_BUSY 1 + +/* + * There will be one netxen_buffer per skb packet. These will be + * used to save the dma info for pci_netxenap_page() + */ +struct netxen_cmd_buffer { + struct { + struct netxen_cmd_buffer *tqe_next; + struct netxen_cmd_buffer **tqe_prev; + } link; + + struct sk_buff *skb; + struct netxen_skb_frag fragArray[MAX_BUFFERS_PER_CMD+1]; + uint32_t totalLength; + uint32_t mss; + uint32_t port:16, + cmd:8, + fragCount:8; + unsigned long time_stamp; + + uint32_t state; +}; + +/* In rx_buffer, we do not need multiple fragments as is a single buffer */ +struct netxen_rx_buffer { + struct { + struct netxen_rx_buffer *tqe_next; + struct netxen_rx_buffer **tqe_prev; + } link; + + struct sk_buff *skb; + uint64_t dma; + uint32_t refHandle:16, + state:16; +}; + +/* Board types */ +#define NetXen_NIC_GBE 0x01 +#define NetXen_NIC_XGBE 0x02 + +/* + * One hardware_context{} per adapter + * contains interrupt info as well shared hardware info. + */ +typedef struct _hardware_context { + struct pci_dev *pdev; + unsigned long pci_base; /* base of mapped phantom memory */ + unsigned long pci_len; /* length of mapped phantom memory */ + uint16_t vendor_id; + uint16_t device_id; + uint8_t revision_id; + uint16_t pci_cmd_word; + uint16_t board_type; + uint16_t max_ports; + netxen_board_info_t boardcfg; + uint32_t xg_linkup; + + struct netxen_adapter *adapter; + + cmdDescType0_t *cmdDescHead; /* Address of cmd ring in Phantom */ + + uint32_t cmdProducer; + uint32_t cmdConsumer; + uint32_t rcvFlag; + uint32_t statusRxProducer; + uint32_t statusRxConsumer; + uint32_t crb_base; + + uint32_t cmdDesc_physAddr; +} hardware_context, *phardware_context; + +#define MAX_BUFFERS 2000 + +#define MINIMUM_ETHERNET_FRAME_SIZE 64 /* With FCS */ +#define ETHERNET_FCS_SIZE 4 + +struct netxen_adapter_stats { + uint64_t ints; + uint64_t hostints; + uint64_t otherints; + uint64_t process_rcv; + uint64_t process_xmit; + uint64_t noxmitdone; + uint64_t xmitcsummed; + uint64_t post_called; + uint64_t posted; + uint64_t lastposted; + uint64_t goodskbposts; +}; + +/* + * Ring which will hold the skbs which can be fed to receive ring + */ +#define NetXen_SKB_ARRAY_SIZE 1024 + +typedef struct netxen_recv_skb_ring_s { + struct sk_buff **skb_array; + uint32_t interrupt_index; + uint32_t tasklet_index; + uint32_t data_size; +} netxen_recv_skb_ring_t; + +/* descriptor types */ +#define RCV_RING_STD RCV_DESC_NORMAL +#define RCV_RING_JUMBO RCV_DESC_JUMBO + +/* + * Rcv Descriptor Context. One such per Rcv Descriptor. There may + * be one Rcv Descriptor for normal packets, one for jumbo and may be others. + */ +typedef struct netxen_rcv_desc_context_s { + uint32_t flags; + uint32_t producer; + + /* Num of bufs posted in phantom */ + uint32_t rcv_pending; + /* Num of bufs in free list */ + uint32_t rcv_free; + + uint32_t phys_addr; + /* address of rx ring in Phantom */ + rcvDesc_t *desc_head; + + uint32_t MaxRxDescCount; + uint32_t dma_size; + uint32_t skb_size; + /* rx buffers for receive */ + struct netxen_rx_buffer *rx_buf_arr; + /* physical address of above */ + dma_addr_t rx_buf_phys; + + netxen_recv_skb_ring_t *skb_ring; + + struct free_rbuf_list { + struct netxen_rx_buffer *tqh_first; + struct netxen_rx_buffer **tqh_last; + } free_rxbuf_list; + struct busy_rbuf_list { + struct netxen_rx_buffer *tqh_first; + struct netxen_rx_buffer **tqh_last; + } busy_rxbuf_list; + + +} netxen_rcv_desc_ctx_t; + +/* + * Receive context. There is one such structure per instance of the + * receive processing. Any state information that is relevant to + * the receive, and is must be in this structure. The global data may be + * present elsewhere. + */ +typedef struct netxen_recv_context_s { + netxen_rcv_desc_ctx_t rcv_desc[NUM_RCV_DESC_RINGS]; + + uint32_t statusRxProducer; + uint32_t statusRxConsumer; + + uint32_t rcvStatusDesc_physAddr; + statusDesc_t *rcvStatusDescHead; +} netxen_recv_context_t; + +#define NetXen_NIC_MSI_ENABLED 0x02 + +/* this structure by all ports on the adapter */ +typedef struct netxen_adapter_s { + hardware_context ahw; + /* struct netxen_cmd_info cmd_info; + struct netxen_rx_info rx_info; + struct netxen_status_info status_info; FIXME..unused. temp fix */ + int portCount; /* Number of configured ports */ + int activePorts; /* Number of open ports */ + struct netxen_port **port; /* ptr to each port */ + spinlock_t tx_lock; + rwlock_t adapter_lock; + spinlock_t lock; + struct work_struct watchdog_task; + struct work_struct tx_timeout_task[4]; + struct timer_list watchdog_timer; + struct tasklet_struct tx_tasklet; + struct tasklet_struct rx_tasklet; + + uint32_t curr_window; + + uint32_t cmdProducer; + uint32_t cmdConsumer; + + uint32_t lastCmdConsumer; + /* Num of bufs posted in phantom */ + uint32_t pendingCmdCount; + uint32_t freeCmdCount; /* Num of bufs in free list */ + uint32_t MaxTxDescCount; + uint32_t MaxRxDescCount; + uint32_t MaxJumboRxDescCount; + /* Num of instances active on cmd buffer ring */ + uint32_t procCmdBufCounter; + volatile uint32_t cmdPegConsumer; + + /*Use to keep track of xmit threads*/ + uint32_t num_threads, total_threads; + + uint32_t flags; + int driver_mismatch; + + struct netxen_adapter_stats stats; + + struct netxen_cmd_buffer *cmd_buf_arr; /* Command buffers for xmit */ + struct netxen_rx_buffer *rx_buf_arr; /* rx buffers for receive */ + + /* + * Receive instances. These can be either one per port, + * or one per peg, etc. + */ + netxen_recv_context_t recv_ctx[MAX_RCV_CTX]; + + netxen_recv_skb_ring_t std_ring; + netxen_recv_skb_ring_t jumbo_ring; + struct netdev_list_s *netlist; + int number; + int is_up; + int work_done; +} netxen_adapter; /* netxen_adapter structure */ + +typedef struct netdev_list_s netdev_list_t; +struct netdev_list_s { + netdev_list_t *next; + struct net_device *netdev; +}; + +typedef struct _port_hw { + unsigned char mac_addr[MAX_ADDR_LEN]; + int mtu; + struct pci_dev *pdev; + struct netxen_port *port; +} port_hw, *pport_hw; + + +/* Following structure is for specific port information */ + +#define PORT_UP 0 +#define PORT_DOWN 1 +#define PORT_INITIALIAZED 2 +#define PORT_SUSPEND 3 + +#define MAX_HD_DESC_BUFFERS 4 /* number of buffers in 1st desc */ + +/*Max number of xmit producer threads that can run simultaneously*/ +#define MAX_XMIT_PRODUCERS 16 + +struct netxen_port_stats { + uint64_t rcvdbadskb; + uint64_t xmitcalled; + uint64_t xmitedframes; + uint64_t xmitfinished; + uint64_t badskblen; + uint64_t nocmddescriptor; + uint64_t polled; + uint64_t uphappy; + uint64_t updropped; + uint64_t uplcong; + uint64_t uphcong; + uint64_t upmcong; + uint64_t updunno; + uint64_t skbfreed; + uint64_t txdropped; + uint64_t txnullskb; + uint64_t csummed; + uint64_t no_rcv; + uint64_t rxbytes; + uint64_t txbytes; +}; + +struct netxen_port { + struct netxen_adapter_s *adapter; + + port_hw hw; /* port hardware structure */ + uint16_t portnum; /* GBE port number */ + uint16_t link_speed; + uint16_t link_duplex; + uint16_t state; /* state of the port */ + uint16_t link_autoneg; + + int flags; + spinlock_t stats_lock; + + struct net_device *netdev; + struct pci_dev *pdev; + struct net_device_stats net_stats; + struct netxen_port_stats stats; +}; + +#define PROC_ENTRY_NAME "netxen" +#define PROC_PARENT NULL + +extern char netxen_nic_driver_name[]; + +void netxen_nic_pci_change_crbwindow(netxen_adapter *adapter, uint32_t wndw); + +static inline void +netxen_nic_reg_write (netxen_adapter *adapter, u64 off, __uint32_t val) +{//Only for window 1 + void *addr; + + read_lock(&adapter->adapter_lock); + + if (adapter->curr_window != 1) { + netxen_nic_pci_change_crbwindow(adapter, 1); + } + addr = CRB_NORMALIZE(adapter, off); + DPRINTK(1, INFO, "writing to base %lx offset %llx addr %p data %x\n", + adapter->ahw.pci_base, off, addr, val); + NetXen_NIC_PCI_WRITE_32 (val, addr); + + read_unlock(&adapter->adapter_lock); +} + +static inline int +netxen_nic_reg_read (netxen_adapter *adapter, u64 off) +{//Only for window 1 + void *addr; + int val; + + read_lock(&adapter->adapter_lock); + addr = CRB_NORMALIZE(adapter, off); + DPRINTK(1, INFO, "reading from base %lx offset %llx addr %p\n", + adapter->ahw.pci_base, off, addr); + val = NetXen_NIC_PCI_READ_32(addr); + NetXen_NIC_PCI_WRITE_32 (val, addr); + read_unlock(&adapter->adapter_lock); + + return val; +} + +static inline void +netxen_nic_write_w0(netxen_adapter *adapter, uint32_t index, uint32_t value) +{//Change the window to 0, write and change back to window 1. + unsigned long flags; + void *addr; + + write_lock_irqsave(&adapter->adapter_lock, flags); + netxen_nic_pci_change_crbwindow(adapter, 0); + addr = (void *)(adapter->ahw.pci_base + index); + NetXen_NIC_PCI_WRITE_32(value, addr); + netxen_nic_pci_change_crbwindow(adapter, 1); + write_unlock_irqrestore(&adapter->adapter_lock, flags); +} + +static inline void +netxen_nic_read_w0(netxen_adapter *adapter, uint32_t index, uint32_t *value) +{//Change the window to 0, read and change back to window 1. + unsigned long flags; + void *addr; + + addr = (void *)(adapter->ahw.pci_base + index); + + write_lock_irqsave(&adapter->adapter_lock, flags); + netxen_nic_pci_change_crbwindow(adapter, 0); + *value = NetXen_NIC_PCI_READ_32(addr); + netxen_nic_pci_change_crbwindow(adapter, 1); + write_unlock_irqrestore(&adapter->adapter_lock, flags); +} + +long netxen_niu_gbe_enable_phy_interrupts(long port); +long netxen_niu_xg_enable_phy_interrupts(long port); +long netxen_niu_gbe_disable_phy_interrupts(long port); +long netxen_niu_xg_disable_phy_interrupts(long port); +long netxen_niu_gbe_clear_phy_interrupts(long port); +void netxen_niu_gbe_set_mii_mode(long port, long enable); +void netxen_niu_gbe_set_gmii_mode(long port, long enable); +long netxen_niu_gbe_phy_read (long phy, long reg, netxen_crbword_t *readval); +long netxen_niu_gbe_phy_write (long phy, long reg, netxen_crbword_t val); +long netxen_niu_xginit(void); +void xge_loopback(int on); +long xge_link_status (void); + +/* Functions available from netxen_nic_hw.c */ +int netxen_nic_get_board_info(struct netxen_adapter_s *adapter); +void netxen_nic_hw_block_write(struct netxen_adapter_s *adapter, + u64 off, void *data, int num_words); +int netxen_nic_pci_mem_write(struct netxen_adapter_s *adapter, + u64 off, void *data, int size); +int netxen_nic_pci_mem_read(struct netxen_adapter_s *adapter, + u64 off, void *data, int size); +void netxen_nic_mem_block_read(struct netxen_adapter_s *adapter, u64 off, + void *data, int num_words); +void netxen_nic_mem_block_write(struct netxen_adapter_s *adapter, u64 off, + void *data, int num_words); +int netxen_nic_hw_read_wx (netxen_adapter *adapter, u64 off, void *data, int len); +int netxen_nic_hw_write_wx(netxen_adapter *adapter, u64 off, void *data, int len); +int netxen_nic_macaddr_set(struct netxen_port *port, __uint8_t *addr); +int netxen_nic_macaddr_get(struct netxen_port *port, __uint8_t **addr); +int netxen_nic_macaddr_set(struct netxen_port *port, __uint8_t *addr); +int netxen_nic_macaddr_get(struct netxen_port *port, __uint8_t **addr); +int netxen_nic_set_mtu(struct netxen_port *port, int new_mtu); +long netxen_nic_phy_read(netxen_adapter *adapter, long phy, long , __uint32_t *); +long netxen_nic_phy_write(netxen_adapter *adapter, long phy, long reg, __uint32_t); +long netxen_nic_init_port(struct netxen_port *port); +void netxen_nic_init_niu(struct netxen_adapter_s *adapter); +int netxen_crb_read_adapter (unsigned long off, void *data, struct netxen_adapter_s *adapter); +int netxen_crb_read_val_adapter (unsigned long off, struct netxen_adapter_s *adapter); +int netxen_crb_writelit_adapter (unsigned long off, int data, struct netxen_adapter_s *adapter); + +/* Functions from netxen_nic_init.c */ +void phantom_init(struct netxen_adapter_s *adapter); +void load_firmware(struct netxen_adapter_s *adapter); +int pinit_from_rom(netxen_adapter *adapter, int verbose); +int rom_fast_read(struct netxen_adapter_s *adapter, int addr); + +/* Functions from netxen_nic_isr.c */ +void netxen_nic_isr_other(netxen_adapter *adapter); +void netxen_nic_handle_phy_intr(netxen_adapter *adapter); +long netxen_nic_phy_read (netxen_adapter *adapter,long phy, long reg, + __uint32_t *readval); +long netxen_nic_phy_write (netxen_adapter *adapter,long phy, long reg, + __uint32_t val); +long netxen_nic_enable_phy_interrupts(netxen_adapter *adapter,long port); +long netxen_nic_disable_phy_interrupts(netxen_adapter *adapter,long port); +long netxen_nic_clear_phy_interrupts(netxen_adapter *adapter,long port); +void netxen_nic_set_mii_mode(netxen_adapter *adapter,long port, long enable); +void netxen_nic_set_gmii_mode(netxen_adapter *adapter,long port, long enable); +void netxen_indicate_link_status(netxen_adapter *adapter,u32 port, u32 link); +void netxen_handle_port_int(netxen_adapter *adapter,u32 port, u32 enable); +int tap_crb_mbist_clear(netxen_adapter *adapter); +int netxen_nic_set_promisc_mode(struct netxen_port *port); +int netxen_nic_unset_promisc_mode(struct netxen_port *port); +void netxen_nic_stop_all_ports(struct netxen_adapter_s *adapter); +void netxen_nic_stop_port(struct netxen_port *port); +int netxen_nic_get_board_num(netxen_adapter *adapter); + +#endif diff -Naru linux-2.6.16_orig/drivers/net/netxen/netxen_nic_hw.h linux-2.6.16/drivers/net/netxen/netxen_nic_hw.h --- linux-2.6.16_orig/drivers/net/netxen/netxen_nic_hw.h 1969-12-31 16:00:00.000000000 -0800 +++ linux-2.6.16/drivers/net/netxen/netxen_nic_hw.h 2006-03-24 14:13:57.000000000 -0800 @@ -0,0 +1,171 @@ +/* + * Copyright (C) 2003 - 2006 NetXen Inc. + * All rights reserved. + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + * + * The full GNU General Public License is included in this distribution + * in the file called LICENSE. + * + * Contact Information: + * [EMAIL PROTECTED] + * NetXen, 3965 Freedom Circle, Fourth Floor, + * Santa Clara, CA 95054 + */ +/* + * Structures, enums, and macros for the MAC + */ + +#ifndef _NetXen_NIC_HW_ +#define _NetXen_NIC_HW_ + +#include "netxen_inc.h" + +/* Hardware memory size of 128 meg */ +#define BAR0_SIZE (128 * 1024 * 1024) +/* +It can be calculated by looking at the first 1 bit of the BAR0 addr after bit 4 +#For us lets assume that BAR0 is D8000008, then the size is 0x8000000, 8 represents +#first bit containing 1. temp notes....pg 162 of PCI systems arch... +*/ + +#ifndef readq +static inline __uint64_t readq(void __iomem *addr) +{ + return readl(addr) | + (((__uint64_t)readl(addr+4)) << 32LL); +} +#endif + +#ifndef writeq +static inline void writeq(__uint64_t val, void __iomem *addr) +{ + writel(((__uint32_t)(val)), (addr)); + writel(((__uint32_t)(val >> 32)), (addr + 4)); +} +#endif + + +/* + * Following macros require the mapped addresses to access + * the Phantom memory. + */ +#define NetXen_NIC_PCI_READ_8(ADDR) readb((ADDR)) +#define NetXen_NIC_PCI_READ_16(ADDR) readw((ADDR)) +#define NetXen_NIC_PCI_READ_32(ADDR) readl((ADDR)) +#define NetXen_NIC_PCI_READ_64(ADDR) readq((ADDR)) + +#define NetXen_NIC_PCI_WRITE_8(DATA, ADDR) writeb(DATA, (ADDR)) +#define NetXen_NIC_PCI_WRITE_16(DATA, ADDR) writew(DATA, (ADDR)) +#define NetXen_NIC_PCI_WRITE_32(DATA, ADDR) writel(DATA, (ADDR)) +#define NetXen_NIC_PCI_WRITE_64(DATA, ADDR) writeq(DATA, (ADDR)) + +#define NetXen_NIC_HW_BLOCK_WRITE_64(DATA_PTR, ADDR, NUM_WORDS) \ + do { \ + int i; \ + u64 *a = (u64 *) (DATA_PTR); \ + u64 *b = (u64 *) (ADDR); \ + for (i=0; i< (NUM_WORDS); i++) { \ + writeq(readq(a), b); \ + b++; \ + a++; \ + } \ + } while (0) + +#define NetXen_NIC_HW_BLOCK_READ_64(DATA_PTR, ADDR, NUM_WORDS) \ + do { \ + int i; \ + u64 *a = (u64 *) (DATA_PTR); \ + u64 *b = (u64 *) (ADDR); \ + for (i=0; i< (NUM_WORDS); i++) { \ + writeq(readq(b), a); \ + b++; \ + a++; \ + } \ + } while (0) + +#define NetXen_DEBUG_PVT_32_ADDR(A) \ + (unsigned int)(A) +#define NetXen_DEBUG_PVT_32_VALUE(V) \ + *((unsigned int *)(V)) +#define NetXen_DEBUG_PVT_32_VALUE_LIT(V) \ + (unsigned int)(V) +#define NetXen_DEBUG_PVT_64_ADDR_LO(A) \ + (unsigned int)((unsigned long)(A) & 0xffffffff) +#define NetXen_DEBUG_PVT_64_ADDR_HI(A) \ + (unsigned int)((((unsigned long)(A) >> 16) >> 16) & 0xffffffff) +#define NetXen_DEBUG_PVT_64_VALUE_LO(V) \ + (unsigned int)(*(__uint64_t *)(V) & 0xffffffff) +#define NetXen_DEBUG_PVT_64_VALUE_HI(V) \ + (unsigned int)(((*(__uint64_t *)(V) >> 16) >> 16) & 0xffffffff) +#define NetXen_DEBUG_PVT_64_VALUE_LIT_LO(LV) \ + (unsigned int)((LV) & 0xffffffff) +#define NetXen_DEBUG_PVT_64_VALUE_LIT_HI(LV) \ + (unsigned int)(((LV) >> 32) & 0xffffffff) + +#if defined(CONFIG_X86_64) +typedef unsigned long uptr_t; +#else +typedef unsigned uptr_t; +#endif + +#define NetXen_PCI_MAPSIZE_BYTES (NetXen_PCI_MAPSIZE << 20) + +#define NetXen_NIC_LOCKED_READ_REG(X, Y) \ + addr = (void *)(adapter->ahw.pci_base + X); \ + *(uint32_t *)Y = NetXen_NIC_PCI_READ_32(addr); + +#define NetXen_NIC_LOCKED_WRITE_REG(X, Y) \ + addr = (void *)(adapter->ahw.pci_base + X); \ + NetXen_NIC_PCI_WRITE_32(*(uint32_t *)Y, addr); + +/* For Multicard support */ +#define NetXen_CRB_READ_VAL_ADAPTER(ADDR, ADAPTER) \ + netxen_crb_read_val_adapter((ADDR), (struct netxen_adapter_s *)ADAPTER) + +#define NetXen_CRB_READ_CHECK_ADAPTER(ADDR, VALUE, ADAPTER) \ + do { \ + if (netxen_crb_read_adapter(ADDR, VALUE,(struct netxen_adapter_s *)ADAPTER)) return -1; \ + } while(0) + +#define NetXen_CRB_WRITE_CHECK_ADAPTER(ADDR, VALUE, ADAPTER) \ + do { \ + if (netxen_crb_write_adapter(ADDR, VALUE,(struct netxen_adapter_s *)ADAPTER)) return -1; \ + } while(0) + +#define NetXen_CRB_WRITELIT_ADAPTER(ADDR, VALUE, ADAPTER) \ + do { \ + netxen_crb_writelit_adapter(ADDR, VALUE, (struct netxen_adapter_s *)ADAPTER); \ + } while(0) + +#define NetXen_CRB_WRITE_ADAPTER_PANIC(ADDR, VALUE, ADAPTER, ERRSTR) \ + do { \ + if (netxen_crb_write_adapter(ADDR, VALUE, (struct netxen_adapter_s *)ADAPTER)) panic(ERRSTR); \ + } while(0) + +#define NetXen_CRB_WRITELIT_ADAPTER_PANIC(ADDR, VALUE, ADAPTER, ERRSTR) \ + do { \ + if (netxen_crb_writelit_adapter(ADDR, VALUE, (struct netxen_adapter_s *)ADAPTER)) panic(ERRSTR); \ + } while(0) + + +struct netxen_port; +void netxen_nic_set_link_parameters(struct netxen_port *port); +long xge_mdio_init(void); +struct netxen_adapter_s; +void netxen_nic_flash_print(struct netxen_adapter_s* adapter); + +#endif /* _NetXen_NIC_HW_ */
- To unsubscribe from this list: send the line "unsubscribe netdev" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html