Login
[x]
Log in using an account from:
Fedora Account System
Red Hat Associate
Red Hat Customer
Or login using a Red Hat Bugzilla account
Forgot Password
Login:
Hide Forgot
Create an Account
Red Hat Bugzilla – Attachment 314421 Details for
Bug 457958
Backport NetXen nic driver from upstream kernel to RHEL5.3
[?]
New
Simple Search
Advanced Search
My Links
Browse
Requests
Reports
Current State
Search
Tabular reports
Graphical reports
Duplicates
Other Reports
User Changes
Plotly Reports
Bug Status
Bug Severity
Non-Defaults
|
Product Dashboard
Help
Page Help!
Bug Writing Guidelines
What's new
Browser Support Policy
5.0.4.rh83 Release notes
FAQ
Guides index
User guide
Web Services
Contact
Legal
This site requires JavaScript to be enabled to function correctly, please enable it.
[patch]
Patch 3
netxen-rhel5-patch3.diff (text/plain), 42.55 KB, created by
Dhananjay Phadke
on 2008-08-15 20:50:51 UTC
(
hide
)
Description:
Patch 3
Filename:
MIME Type:
Creator:
Dhananjay Phadke
Created:
2008-08-15 20:50:51 UTC
Size:
42.55 KB
patch
obsolete
>Following commits backported from netdev-2.6 # upstream-fixes > >11d89d639352ef27bb3f0e7513dd406284bf034a >092bc57184842229ee41f87d9c408a3f1302aaa6 >15eef1e1b718667981da92d2fa18283f181c117c >922c4f2c70c156ac38b4e6affbd30d4b1efd5864 >9e410778047d0f2887adb888b44eda4d72d4f67d >9dc28efeee98a4f81d5469d3576f55c5e6d1a5db >11a859e591befae7413505c68dd241ad8e14748c >9ad27643f3a054dff9211bb9938f2323907c2ffe >83821a078a1617e120d76954f455204cec78fe9d >d71e1be8edd355668a12a18660da03ae993dd9df >a70f939338cae650f177ae79562ec44659788bb4 >24a7a45511f89959b4f1dc60a66260d09777901a >4255589293b78c4dab324323e12857876b154863 > >Signed-off-by: Dhananjay Phadke <dhananjay@netxen.com> > >Index: rhel5/drivers/net/netxen/netxen_nic_ctx.c >=================================================================== >--- rhel5.orig/drivers/net/netxen/netxen_nic_ctx.c 2008-08-15 13:13:17.666602000 -0700 >+++ rhel5/drivers/net/netxen/netxen_nic_ctx.c 2008-08-15 13:15:21.281343000 -0700 >@@ -145,8 +145,8 @@ > return rcode; > } > >-u32 >-nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, u32 mtu) >+int >+nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu) > { > u32 rcode = NX_RCODE_SUCCESS; > struct netxen_recv_context *recv_ctx = &adapter->recv_ctx[0]; >@@ -160,7 +160,10 @@ > 0, > NX_CDRP_CMD_SET_MTU); > >- return rcode; >+ if (rcode != NX_RCODE_SUCCESS) >+ return -EIO; >+ >+ return 0; > } > > static int >Index: rhel5/drivers/net/netxen/netxen_nic_ethtool.c >=================================================================== >--- rhel5.orig/drivers/net/netxen/netxen_nic_ethtool.c 2008-08-15 13:13:17.671593000 -0700 >+++ rhel5/drivers/net/netxen/netxen_nic_ethtool.c 2008-08-15 13:15:21.285343000 -0700 >@@ -142,18 +142,32 @@ > if (netif_running(dev)) { > ecmd->speed = adapter->link_speed; > ecmd->duplex = adapter->link_duplex; >- } else >- return -EIO; /* link absent */ >+ ecmd->autoneg = adapter->link_autoneg; >+ } > } else if (adapter->ahw.board_type == NETXEN_NIC_XGBE) { >- ecmd->supported = (SUPPORTED_TP | >- SUPPORTED_1000baseT_Full | >- SUPPORTED_10000baseT_Full); >- ecmd->advertising = (ADVERTISED_TP | >- ADVERTISED_1000baseT_Full | >- ADVERTISED_10000baseT_Full); >+ u32 val; >+ >+ adapter->hw_read_wx(adapter, NETXEN_PORT_MODE_ADDR, &val, 4); >+ if (val == NETXEN_PORT_MODE_802_3_AP) { >+ ecmd->supported = SUPPORTED_1000baseT_Full; >+ ecmd->advertising = ADVERTISED_1000baseT_Full; >+ } else { >+ ecmd->supported = SUPPORTED_10000baseT_Full; >+ ecmd->advertising = ADVERTISED_10000baseT_Full; >+ } >+ > ecmd->port = PORT_TP; > >- ecmd->speed = SPEED_10000; >+ if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { >+ u16 pcifn = adapter->ahw.pci_func; >+ >+ adapter->hw_read_wx(adapter, >+ P3_LINK_SPEED_REG(pcifn), &val, 4); >+ ecmd->speed = P3_LINK_SPEED_MHZ * >+ P3_LINK_SPEED_VAL(pcifn, val); >+ } else >+ ecmd->speed = SPEED_10000; >+ > ecmd->duplex = DUPLEX_FULL; > ecmd->autoneg = AUTONEG_DISABLE; > } else >@@ -194,6 +208,8 @@ > break; > case NETXEN_BRDTYPE_P2_SB31_10G: > case NETXEN_BRDTYPE_P3_10G_SFP_PLUS: >+ case NETXEN_BRDTYPE_P3_10G_SFP_CT: >+ case NETXEN_BRDTYPE_P3_10G_SFP_QT: > case NETXEN_BRDTYPE_P3_10G_XFP: > ecmd->supported |= SUPPORTED_FIBRE; > ecmd->advertising |= ADVERTISED_FIBRE; >Index: rhel5/drivers/net/netxen/netxen_nic.h >=================================================================== >--- rhel5.orig/drivers/net/netxen/netxen_nic.h 2008-08-15 13:13:17.676600000 -0700 >+++ rhel5/drivers/net/netxen/netxen_nic.h 2008-08-15 13:15:21.290340000 -0700 >@@ -54,6 +54,7 @@ > > #include <linux/mm.h> > #include <linux/mman.h> >+#include <linux/vmalloc.h> > > #include <asm/system.h> > #include <asm/io.h> >@@ -65,8 +66,8 @@ > > #define _NETXEN_NIC_LINUX_MAJOR 4 > #define _NETXEN_NIC_LINUX_MINOR 0 >-#define _NETXEN_NIC_LINUX_SUBVERSION 0 >-#define NETXEN_NIC_LINUX_VERSIONID "4.0.0" >+#define _NETXEN_NIC_LINUX_SUBVERSION 11 >+#define NETXEN_NIC_LINUX_VERSIONID "4.0.11" > > #define NETXEN_VERSION_CODE(a, b, c) (((a) << 16) + ((b) << 8) + (c)) > >@@ -508,6 +509,8 @@ > NETXEN_BRDTYPE_P3_10000_BASE_T = 0x0027, > NETXEN_BRDTYPE_P3_XG_LOM = 0x0028, > NETXEN_BRDTYPE_P3_4_GB_MM = 0x0029, >+ NETXEN_BRDTYPE_P3_10G_SFP_CT = 0x002a, >+ NETXEN_BRDTYPE_P3_10G_SFP_QT = 0x002b, > NETXEN_BRDTYPE_P3_10G_CX4 = 0x0031, > NETXEN_BRDTYPE_P3_10G_XFP = 0x0032 > >@@ -1165,6 +1168,36 @@ > nx_nic_intr_coalesce_data_t irq; > } nx_nic_intr_coalesce_t; > >+#define NX_HOST_REQUEST 0x13 >+#define NX_NIC_REQUEST 0x14 >+ >+#define NX_MAC_EVENT 0x1 >+ >+enum { >+ NX_NIC_H2C_OPCODE_START = 0, >+ NX_NIC_H2C_OPCODE_CONFIG_RSS, >+ NX_NIC_H2C_OPCODE_CONFIG_RSS_TBL, >+ NX_NIC_H2C_OPCODE_CONFIG_INTR_COALESCE, >+ NX_NIC_H2C_OPCODE_CONFIG_LED, >+ NX_NIC_H2C_OPCODE_CONFIG_PROMISCUOUS, >+ NX_NIC_H2C_OPCODE_CONFIG_L2_MAC, >+ NX_NIC_H2C_OPCODE_LRO_REQUEST, >+ NX_NIC_H2C_OPCODE_GET_SNMP_STATS, >+ NX_NIC_H2C_OPCODE_PROXY_START_REQUEST, >+ NX_NIC_H2C_OPCODE_PROXY_STOP_REQUEST, >+ NX_NIC_H2C_OPCODE_PROXY_SET_MTU, >+ NX_NIC_H2C_OPCODE_PROXY_SET_VPORT_MISS_MODE, >+ NX_H2P_OPCODE_GET_FINGER_PRINT_REQUEST, >+ NX_H2P_OPCODE_INSTALL_LICENSE_REQUEST, >+ NX_H2P_OPCODE_GET_LICENSE_CAPABILITY_REQUEST, >+ NX_NIC_H2C_OPCODE_GET_NET_STATS, >+ NX_NIC_H2C_OPCODE_LAST >+}; >+ >+#define VPORT_MISS_MODE_DROP 0 /* drop all unmatched */ >+#define VPORT_MISS_MODE_ACCEPT_ALL 1 /* accept all packets */ >+#define VPORT_MISS_MODE_ACCEPT_MULTI 2 /* accept unmatched multicast */ >+ > typedef struct { > u64 qhdr; > u64 req_hdr; >@@ -1282,7 +1315,7 @@ > int (*disable_phy_interrupts) (struct netxen_adapter *); > int (*macaddr_set) (struct netxen_adapter *, netxen_ethernet_macaddr_t); > int (*set_mtu) (struct netxen_adapter *, int); >- int (*set_promisc) (struct netxen_adapter *, netxen_niu_prom_mode_t); >+ int (*set_promisc) (struct netxen_adapter *, u32); > int (*phy_read) (struct netxen_adapter *, long reg, u32 *); > int (*phy_write) (struct netxen_adapter *, long reg, u32 val); > int (*init_port) (struct netxen_adapter *, int); >@@ -1381,11 +1414,6 @@ > int netxen_niu_xgbe_disable_phy_interrupts(struct netxen_adapter *adapter); > int netxen_niu_gbe_disable_phy_interrupts(struct netxen_adapter *adapter); > int netxen_niu_xgbe_clear_phy_interrupts(struct netxen_adapter *adapter); >-int netxen_niu_gbe_clear_phy_interrupts(struct netxen_adapter *adapter); >-void netxen_niu_gbe_set_mii_mode(struct netxen_adapter *adapter, int port, >- long enable); >-void netxen_niu_gbe_set_gmii_mode(struct netxen_adapter *adapter, int port, >- long enable); > int netxen_niu_gbe_phy_read(struct netxen_adapter *adapter, long reg, > __u32 * readval); > int netxen_niu_gbe_phy_write(struct netxen_adapter *adapter, >@@ -1486,15 +1514,14 @@ > void netxen_nic_clear_stats(struct netxen_adapter *adapter); > void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, > u32 ringid); >-void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, u32 ctx, >- u32 ringid); > int netxen_process_cmd_ring(struct netxen_adapter *adapter); > u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctx, int max); > void netxen_p2_nic_set_multi(struct net_device *netdev); > void netxen_p3_nic_set_multi(struct net_device *netdev); >+int netxen_p3_nic_set_promisc(struct netxen_adapter *adapter, u32); > int netxen_config_intr_coalesce(struct netxen_adapter *adapter); > >-u32 nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, u32 mtu); >+int nx_fw_cmd_set_mtu(struct netxen_adapter *adapter, int mtu); > int netxen_nic_change_mtu(struct net_device *netdev, int new_mtu); > > int netxen_nic_set_mac(struct net_device *netdev, void *p); >@@ -1529,7 +1556,9 @@ > {NETXEN_BRDTYPE_P3_10G_SFP_PLUS, 2, "Dual XGb SFP+ LP"}, > {NETXEN_BRDTYPE_P3_10000_BASE_T, 1, "XGB 10G BaseT LP"}, > {NETXEN_BRDTYPE_P3_XG_LOM, 2, "Dual XGb LOM"}, >- {NETXEN_BRDTYPE_P3_4_GB_MM, 4, "Quad GB - March Madness"}, >+ {NETXEN_BRDTYPE_P3_4_GB_MM, 4, "NX3031 Gigabit Ethernet"}, >+ {NETXEN_BRDTYPE_P3_10G_SFP_CT, 2, "NX3031 10 Gigabit Ethernet"}, >+ {NETXEN_BRDTYPE_P3_10G_SFP_QT, 2, "Quanta Dual XGb SFP+"}, > {NETXEN_BRDTYPE_P3_10G_CX4, 2, "Reference Dual CX4 Option"}, > {NETXEN_BRDTYPE_P3_10G_XFP, 1, "Reference Single XFP Option"} > }; >@@ -1607,7 +1636,8 @@ > > > int netxen_is_flash_supported(struct netxen_adapter *adapter); >-int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, u64 mac[]); >+int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 *mac); >+int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac); > extern void netxen_change_ringparam(struct netxen_adapter *adapter); > extern int netxen_rom_fast_read(struct netxen_adapter *adapter, int addr, > int *valp); >Index: rhel5/drivers/net/netxen/netxen_nic_hdr.h >=================================================================== >--- rhel5.orig/drivers/net/netxen/netxen_nic_hdr.h 2008-08-15 13:13:17.680602000 -0700 >+++ rhel5/drivers/net/netxen/netxen_nic_hdr.h 2008-08-15 13:15:21.296341000 -0700 >@@ -724,6 +724,13 @@ > #define XG_LINK_STATE_P3(pcifn,val) \ > (((val) >> ((pcifn) * 4)) & XG_LINK_STATE_P3_MASK) > >+#define P3_LINK_SPEED_MHZ 100 >+#define P3_LINK_SPEED_MASK 0xff >+#define P3_LINK_SPEED_REG(pcifn) \ >+ (CRB_PF_LINK_SPEED_1 + (((pcifn) / 4) * 4)) >+#define P3_LINK_SPEED_VAL(pcifn, reg) \ >+ (((reg) >> (8 * ((pcifn) & 0x3))) & P3_LINK_SPEED_MASK) >+ > #define NETXEN_CAM_RAM_BASE (NETXEN_CRB_CAM + 0x02000) > #define NETXEN_CAM_RAM(reg) (NETXEN_CAM_RAM_BASE + (reg)) > #define NETXEN_FW_VERSION_MAJOR (NETXEN_CAM_RAM(0x150)) >@@ -836,9 +843,11 @@ > > #define PCIE_SETUP_FUNCTION (0x12040) > #define PCIE_SETUP_FUNCTION2 (0x12048) >+#define PCIE_MISCCFG_RC (0x1206c) > #define PCIE_TGT_SPLIT_CHICKEN (0x12080) > #define PCIE_CHICKEN3 (0x120c8) > >+#define ISR_INT_STATE_REG (NETXEN_PCIX_PS_REG(PCIE_MISCCFG_RC)) > #define PCIE_MAX_MASTER_SPLIT (0x14048) > > #define NETXEN_PORT_MODE_NONE 0 >@@ -856,6 +865,7 @@ > #define NETXEN_CAM_RAM_DMA_WATCHDOG_CTRL (0x14) > > #define ISR_MSI_INT_TRIGGER(FUNC) (NETXEN_PCIX_PS_REG(PCIX_MSI_F(FUNC))) >+#define ISR_LEGACY_INT_TRIGGERED(VAL) (((VAL) & 0x300) == 0x200) > > /* > * PCI Interrupt Vector Values. >Index: rhel5/drivers/net/netxen/netxen_nic_hw.c >=================================================================== >--- rhel5.orig/drivers/net/netxen/netxen_nic_hw.c 2008-08-15 13:13:17.687603000 -0700 >+++ rhel5/drivers/net/netxen/netxen_nic_hw.c 2008-08-15 13:15:21.303339000 -0700 >@@ -283,14 +283,7 @@ > #define ADDR_IN_RANGE(addr, low, high) \ > (((addr) <= (high)) && ((addr) >= (low))) > >-#define NETXEN_MAX_MTU 8000 + NETXEN_ENET_HEADER_SIZE + NETXEN_ETH_FCS_SIZE >-#define NETXEN_MIN_MTU 64 >-#define NETXEN_ETH_FCS_SIZE 4 >-#define NETXEN_ENET_HEADER_SIZE 14 > #define NETXEN_WINDOW_ONE 0x2000000 /*CRB Window: bit 25 of CRB address */ >-#define NETXEN_FIRMWARE_LEN ((16 * 1024) / 4) >-#define NETXEN_NIU_HDRSIZE (0x1 << 6) >-#define NETXEN_NIU_TLRSIZE (0x1 << 5) > > #define NETXEN_NIC_ZERO_PAUSE_ADDR 0ULL > #define NETXEN_NIC_UNIT_PAUSE_ADDR 0x200ULL >@@ -539,9 +532,6 @@ > return 0; > } > >-#define NIC_REQUEST 0x14 >-#define NETXEN_MAC_EVENT 0x1 >- > static int nx_p3_sre_macaddr_change(struct net_device *dev, > u8 *addr, unsigned op) > { >@@ -551,8 +541,8 @@ > int rv; > > memset(&req, 0, sizeof(nx_nic_req_t)); >- req.qhdr |= (NIC_REQUEST << 23); >- req.req_hdr |= NETXEN_MAC_EVENT; >+ req.qhdr |= (NX_NIC_REQUEST << 23); >+ req.req_hdr |= NX_MAC_EVENT; > req.req_hdr |= ((u64)adapter->portnum << 16); > mac_req.op = op; > memcpy(&mac_req.mac_addr, addr, 6); >@@ -573,31 +563,35 @@ > nx_mac_list_t *cur, *next, *del_list, *add_list = NULL; > struct dev_mc_list *mc_ptr; > u8 bcast_addr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; >- >- adapter->set_promisc(adapter, NETXEN_NIU_PROMISC_MODE); >- >- /* >- * Programming mac addresses will automaticly enabling L2 filtering. >- * HW will replace timestamp with L2 conid when L2 filtering is >- * enabled. This causes problem for LSA. Do not enabling L2 filtering >- * until that problem is fixed. >- */ >- if ((netdev->flags & IFF_PROMISC) || >- (netdev->mc_count > adapter->max_mc_count)) >- return; >+ u32 mode = VPORT_MISS_MODE_DROP; > > del_list = adapter->mac_list; > adapter->mac_list = NULL; > > nx_p3_nic_add_mac(adapter, netdev->dev_addr, &add_list, &del_list); >+ nx_p3_nic_add_mac(adapter, bcast_addr, &add_list, &del_list); >+ >+ if (netdev->flags & IFF_PROMISC) { >+ mode = VPORT_MISS_MODE_ACCEPT_ALL; >+ goto send_fw_cmd; >+ } >+ >+ if ((netdev->flags & IFF_ALLMULTI) || >+ (netdev->mc_count > adapter->max_mc_count)) { >+ mode = VPORT_MISS_MODE_ACCEPT_MULTI; >+ goto send_fw_cmd; >+ } >+ > if (netdev->mc_count > 0) { >- nx_p3_nic_add_mac(adapter, bcast_addr, &add_list, &del_list); > for (mc_ptr = netdev->mc_list; mc_ptr; > mc_ptr = mc_ptr->next) { > nx_p3_nic_add_mac(adapter, mc_ptr->dmi_addr, > &add_list, &del_list); > } > } >+ >+send_fw_cmd: >+ adapter->set_promisc(adapter, mode); > for (cur = del_list; cur;) { > nx_p3_sre_macaddr_change(netdev, cur->mac_addr, NETXEN_MAC_DEL); > next = cur->next; >@@ -613,6 +607,21 @@ > } > } > >+int netxen_p3_nic_set_promisc(struct netxen_adapter *adapter, u32 mode) >+{ >+ nx_nic_req_t req; >+ >+ memset(&req, 0, sizeof(nx_nic_req_t)); >+ >+ req.qhdr |= (NX_HOST_REQUEST << 23); >+ req.req_hdr |= NX_NIC_H2C_OPCODE_PROXY_SET_VPORT_MISS_MODE; >+ req.req_hdr |= ((u64)adapter->portnum << 16); >+ req.words[0] = cpu_to_le64(mode); >+ >+ return netxen_send_cmd_descs(adapter, >+ (struct cmd_desc_type0 *)&req, 1); >+} >+ > #define NETXEN_CONFIG_INTR_COALESCE 3 > > /* >@@ -625,7 +634,7 @@ > > memset(&req, 0, sizeof(nx_nic_req_t)); > >- req.qhdr |= (NIC_REQUEST << 23); >+ req.qhdr |= (NX_NIC_REQUEST << 23); > req.req_hdr |= NETXEN_CONFIG_INTR_COALESCE; > req.req_hdr |= ((u64)adapter->portnum << 16); > >@@ -651,6 +660,7 @@ > { > struct netxen_adapter *adapter = netdev_priv(netdev); > int max_mtu; >+ int rc = 0; > > if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) > max_mtu = P3_MAX_MTU; >@@ -664,16 +674,12 @@ > } > > if (adapter->set_mtu) >- adapter->set_mtu(adapter, mtu); >- netdev->mtu = mtu; >+ rc = adapter->set_mtu(adapter, mtu); > >- mtu += MTU_FUDGE_FACTOR; >- if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) >- nx_fw_cmd_set_mtu(adapter, mtu); >- else if (adapter->set_mtu) >- adapter->set_mtu(adapter, mtu); >+ if (!rc) >+ netdev->mtu = mtu; > >- return 0; >+ return rc; > } > > int netxen_is_flash_supported(struct netxen_adapter *adapter) >@@ -725,31 +731,56 @@ > return 0; > } > >-int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, u64 mac[]) >+int netxen_get_flash_mac_addr(struct netxen_adapter *adapter, __le64 *mac) > { >- u32 *pmac = (u32 *) & mac[0]; >+ __le32 *pmac = (__le32 *) mac; >+ u32 offset; >+ >+ offset = NETXEN_USER_START + >+ offsetof(struct netxen_new_user_info, mac_addr) + >+ adapter->portnum * sizeof(u64); > >- if (netxen_get_flash_block(adapter, >- NETXEN_USER_START + >- offsetof(struct netxen_new_user_info, >- mac_addr), >- FLASH_NUM_PORTS * sizeof(u64), pmac) == -1) { >+ if (netxen_get_flash_block(adapter, offset, sizeof(u64), pmac) == -1) > return -1; >- } >- if (*mac == ~0ULL) { >+ >+ if (*mac == cpu_to_le64(~0ULL)) { >+ >+ offset = NETXEN_USER_START_OLD + >+ offsetof(struct netxen_user_old_info, mac_addr) + >+ adapter->portnum * sizeof(u64); >+ > if (netxen_get_flash_block(adapter, >- NETXEN_USER_START_OLD + >- offsetof(struct netxen_user_old_info, >- mac_addr), >- FLASH_NUM_PORTS * sizeof(u64), >- pmac) == -1) >+ offset, sizeof(u64), pmac) == -1) > return -1; >- if (*mac == ~0ULL) >+ >+ if (*mac == cpu_to_le64(~0ULL)) > return -1; > } > return 0; > } > >+int netxen_p3_get_mac_addr(struct netxen_adapter *adapter, __le64 *mac) >+{ >+ uint32_t crbaddr, mac_hi, mac_lo; >+ int pci_func = adapter->ahw.pci_func; >+ >+ crbaddr = CRB_MAC_BLOCK_START + >+ (4 * ((pci_func/2) * 3)) + (4 * (pci_func & 1)); >+ >+ adapter->hw_read_wx(adapter, crbaddr, &mac_lo, 4); >+ adapter->hw_read_wx(adapter, crbaddr+4, &mac_hi, 4); >+ >+ mac_hi = cpu_to_le32(mac_hi); >+ mac_lo = cpu_to_le32(mac_lo); >+ >+ if (pci_func & 1) >+ *mac = ((mac_lo >> 16) | ((u64)mac_hi << 16)); >+ else >+ *mac = ((mac_lo) | ((u64)mac_hi << 32)); >+ >+ return 0; >+} >+ > #define CRB_WIN_LOCK_TIMEOUT 100000000 > > static int crb_win_lock(struct netxen_adapter *adapter) >@@ -1409,7 +1440,8 @@ > (netxen_nic_pci_is_same_window(adapter, off+size-1) == 0)) { > write_unlock_irqrestore(&adapter->adapter_lock, flags); > printk(KERN_ERR "%s out of bound pci memory access. " >- "offset is 0x%llx\n", netxen_nic_driver_name, off); >+ "offset is 0x%llx\n", netxen_nic_driver_name, >+ (unsigned long long)off); > return -1; > } > >@@ -1482,7 +1514,8 @@ > (netxen_nic_pci_is_same_window(adapter, off+size-1) == 0)) { > write_unlock_irqrestore(&adapter->adapter_lock, flags); > printk(KERN_ERR "%s out of bound pci memory access. " >- "offset is 0x%llx\n", netxen_nic_driver_name, off); >+ "offset is 0x%llx\n", netxen_nic_driver_name, >+ (unsigned long long)off); > return -1; > } > >@@ -2014,6 +2047,8 @@ > case NETXEN_BRDTYPE_P3_10G_CX4_LP: > case NETXEN_BRDTYPE_P3_IMEZ: > case NETXEN_BRDTYPE_P3_10G_SFP_PLUS: >+ case NETXEN_BRDTYPE_P3_10G_SFP_CT: >+ case NETXEN_BRDTYPE_P3_10G_SFP_QT: > case NETXEN_BRDTYPE_P3_10G_XFP: > case NETXEN_BRDTYPE_P3_10000_BASE_T: > >@@ -2032,6 +2067,7 @@ > default: > printk("%s: Unknown(%x)\n", netxen_nic_driver_name, > boardinfo->board_type); >+ rv = -ENODEV; > break; > } > >@@ -2042,6 +2078,7 @@ > > int netxen_nic_set_mtu_gb(struct netxen_adapter *adapter, int new_mtu) > { >+ new_mtu += MTU_FUDGE_FACTOR; > netxen_nic_write_w0(adapter, > NETXEN_NIU_GB_MAX_FRAME_SIZE(adapter->physical_port), > new_mtu); >@@ -2050,7 +2087,7 @@ > > int netxen_nic_set_mtu_xgb(struct netxen_adapter *adapter, int new_mtu) > { >- new_mtu += NETXEN_NIU_HDRSIZE + NETXEN_NIU_TLRSIZE; >+ new_mtu += MTU_FUDGE_FACTOR; > if (adapter->physical_port == 0) > netxen_nic_write_w0(adapter, NETXEN_NIU_XGE_MAX_FRAME_SIZE, > new_mtu); >@@ -2072,12 +2109,22 @@ > __u32 status; > __u32 autoneg; > __u32 mode; >+ __u32 port_mode; > > netxen_nic_read_w0(adapter, NETXEN_NIU_MODE, &mode); > if (netxen_get_niu_enable_ge(mode)) { /* Gb 10/100/1000 Mbps mode */ >+ >+ adapter->hw_read_wx(adapter, >+ NETXEN_PORT_MODE_ADDR, &port_mode, 4); >+ if (port_mode == NETXEN_PORT_MODE_802_3_AP) { >+ adapter->link_speed = SPEED_1000; >+ adapter->link_duplex = DUPLEX_FULL; >+ adapter->link_autoneg = AUTONEG_DISABLE; >+ return; >+ } >+ > if (adapter->phy_read >- && adapter-> >- phy_read(adapter, >+ && adapter->phy_read(adapter, > NETXEN_NIU_GB_MII_MGMT_ADDR_PHY_STATUS, > &status) == 0) { > if (netxen_get_phy_link(status)) { >@@ -2107,8 +2154,7 @@ > break; > } > if (adapter->phy_read >- && adapter-> >- phy_read(adapter, >+ && adapter->phy_read(adapter, > NETXEN_NIU_GB_MII_MGMT_ADDR_AUTONEG, > &autoneg) != 0) > adapter->link_autoneg = autoneg; >@@ -2160,10 +2206,10 @@ > if (adapter->portnum == 0) { > get_brd_name_by_type(board_info->board_type, brd_name); > >- printk("NetXen %s Board S/N %s Chip id 0x%x\n", >- brd_name, serial_num, board_info->chip_id); >- printk("NetXen Firmware version %d.%d.%d\n", fw_major, >- fw_minor, fw_build); >+ printk(KERN_INFO "NetXen %s Board S/N %s Chip rev 0x%x\n", >+ brd_name, serial_num, adapter->ahw.revision_id); >+ printk(KERN_INFO "NetXen Firmware version %d.%d.%d\n", >+ fw_major, fw_minor, fw_build); > } > > if (NETXEN_VERSION_CODE(fw_major, fw_minor, fw_build) < >Index: rhel5/drivers/net/netxen/netxen_nic_hw.h >=================================================================== >--- rhel5.orig/drivers/net/netxen/netxen_nic_hw.h 2008-08-15 13:13:17.706596000 -0700 >+++ rhel5/drivers/net/netxen/netxen_nic_hw.h 2008-08-15 13:15:21.307338000 -0700 >@@ -173,7 +173,7 @@ > #define netxen_gb_set_preamblelen(config_word, val) \ > ((config_word) &= ~(0xf<<12), (config_word) |= (val & 0xf)<< 12) > #define netxen_gb_set_intfmode(config_word, val) \ >- ((config_word) &= ~(0xf<<8), (config_word) |= (val & 0x3) << 8) >+ ((config_word) &= ~(0x3<<8), (config_word) |= (val & 0x3) << 8) > > #define netxen_gb_get_stationaddress_low(config_word) ((config_word) >> 16) > >@@ -419,12 +419,9 @@ > #define netxen_get_niu_enable_ge(config_word) \ > _netxen_crb_get_bit(config_word, 1) > >-/* Promiscous mode options (GbE mode only) */ >-typedef enum { >- NETXEN_NIU_PROMISC_MODE = 0, >- NETXEN_NIU_NON_PROMISC_MODE, >- NETXEN_NIU_ALLMULTI_MODE >-} netxen_niu_prom_mode_t; >+#define NETXEN_NIU_NON_PROMISC_MODE 0 >+#define NETXEN_NIU_PROMISC_MODE 1 >+#define NETXEN_NIU_ALLMULTI_MODE 2 > > /* > * NIU GB Drop CRC Register >@@ -472,13 +469,11 @@ > > /* Set promiscuous mode for a GbE interface */ > int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, >- netxen_niu_prom_mode_t mode); >+ u32 mode); > int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, >- netxen_niu_prom_mode_t mode); >+ u32 mode); > > /* get/set the MAC address for a given MAC */ >-int netxen_niu_macaddr_get(struct netxen_adapter *adapter, >- netxen_ethernet_macaddr_t * addr); > int netxen_niu_macaddr_set(struct netxen_adapter *adapter, > netxen_ethernet_macaddr_t addr); > >Index: rhel5/drivers/net/netxen/netxen_nic_init.c >=================================================================== >--- rhel5.orig/drivers/net/netxen/netxen_nic_init.c 2008-08-15 13:13:17.869604000 -0700 >+++ rhel5/drivers/net/netxen/netxen_nic_init.c 2008-08-15 13:15:21.312349000 -0700 >@@ -37,6 +37,9 @@ > #include "netxen_nic_hw.h" > #include "netxen_nic_phan_reg.h" > >+static void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, >+ u32 ctx, u32 ringid); >+ > struct crb_addr_pair { > u32 addr; > u32 data; >@@ -52,6 +55,7 @@ > > #define NETXEN_NIC_XDMA_RESET 0x8000ff > >+#if 0 > static inline void > netxen_nic_locked_write_reg(struct netxen_adapter *adapter, > unsigned long off, int *data) >@@ -59,6 +63,7 @@ > void __iomem *addr = pci_base_offset(adapter, off); > writel(*data, addr); > } >+#endif /* 0 */ > > static void crb_addr_transform_setup(void) > { >@@ -360,13 +365,18 @@ > default: > break; > } >+ >+ if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { >+ adapter->set_mtu = nx_fw_cmd_set_mtu; >+ adapter->set_promisc = netxen_p3_nic_set_promisc; >+ } > } > > /* > * netxen_decode_crb_addr(0 - utility to translate from internal Phantom CRB > * address to external PCI CRB address. > */ >-u32 netxen_decode_crb_addr(u32 addr) >+static u32 netxen_decode_crb_addr(u32 addr) > { > int i; > u32 base_addr, offset, pci_base; >@@ -425,7 +435,7 @@ > return 0; > } > >-int netxen_wait_rom_done(struct netxen_adapter *adapter) >+static int netxen_wait_rom_done(struct netxen_adapter *adapter) > { > long timeout = 0; > long done = 0; >@@ -484,7 +494,7 @@ > } > > #if 0 >-int netxen_rom_wip_poll(struct netxen_adapter *adapter) >+static int netxen_rom_wip_poll(struct netxen_adapter *adapter) > { > long timeout = 0; > long wip = 1; >@@ -666,7 +676,7 @@ > return ret; > } > >-int netxen_rom_wrsr(struct netxen_adapter *adapter, int data) >+static int netxen_rom_wrsr(struct netxen_adapter *adapter, int data) > { > int ret; > >@@ -685,7 +695,7 @@ > return netxen_rom_wip_poll(adapter); > } > >-int netxen_rom_rdsr(struct netxen_adapter *adapter) >+static int netxen_rom_rdsr(struct netxen_adapter *adapter) > { > int ret; > >@@ -752,7 +762,7 @@ > return ret; > } > >-int netxen_do_rom_se(struct netxen_adapter *adapter, int addr) >+static int netxen_do_rom_se(struct netxen_adapter *adapter, int addr) > { > netxen_rom_wren(adapter); > netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); >@@ -766,7 +776,7 @@ > return netxen_rom_wip_poll(adapter); > } > >-void check_erased_flash(struct netxen_adapter *adapter, int addr) >+static void check_erased_flash(struct netxen_adapter *adapter, int addr) > { > int i; > int val; >@@ -802,7 +812,7 @@ > return ret; > } > >-int >+static int > netxen_flash_erase_sections(struct netxen_adapter *adapter, int start, int end) > { > int ret = FLASH_SUCCESS; >@@ -1072,10 +1082,12 @@ > > void netxen_free_adapter_offload(struct netxen_adapter *adapter) > { >- int i; >+ int i = 100; > >- if (adapter->dummy_dma.addr) { >- i = 100; >+ if (!adapter->dummy_dma.addr) >+ return; >+ >+ if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { > do { > if (dma_watchdog_shutdown_request(adapter) == 1) > break; >@@ -1083,17 +1095,17 @@ > if (dma_watchdog_shutdown_poll_result(adapter) == 1) > break; > } while (--i); >+ } > >- if (i) { >- pci_free_consistent(adapter->pdev, >- NETXEN_HOST_DUMMY_DMA_SIZE, >- adapter->dummy_dma.addr, >- adapter->dummy_dma.phys_addr); >- adapter->dummy_dma.addr = NULL; >- } else { >- printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n", >- adapter->netdev->name); >- } >+ if (i) { >+ pci_free_consistent(adapter->pdev, >+ NETXEN_HOST_DUMMY_DMA_SIZE, >+ adapter->dummy_dma.addr, >+ adapter->dummy_dma.phys_addr); >+ adapter->dummy_dma.addr = NULL; >+ } else { >+ printk(KERN_ERR "%s: dma_watchdog_shutdown failed\n", >+ adapter->netdev->name); > } > } > >@@ -1502,8 +1514,8 @@ > } > } > >-void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, uint32_t ctx, >- uint32_t ringid) >+static void netxen_post_rx_buffers_nodb(struct netxen_adapter *adapter, >+ uint32_t ctx, uint32_t ringid) > { > struct pci_dev *pdev = adapter->pdev; > struct sk_buff *skb; >@@ -1570,4 +1582,3 @@ > memset(&adapter->stats, 0, sizeof(adapter->stats)); > return; > } >- >Index: rhel5/drivers/net/netxen/netxen_nic_main.c >=================================================================== >--- rhel5.orig/drivers/net/netxen/netxen_nic_main.c 2008-08-15 13:13:18.046601000 -0700 >+++ rhel5/drivers/net/netxen/netxen_nic_main.c 2008-08-15 13:16:00.312577000 -0700 >@@ -156,80 +156,18 @@ > > static struct netxen_legacy_intr_set legacy_intr[] = NX_LEGACY_INTR_CONFIG; > >-static void netxen_nic_disable_int(struct netxen_adapter *adapter) >+static inline void netxen_nic_disable_int(struct netxen_adapter *adapter) > { >- u32 mask = 0x7ff; >- int retries = 32; >- int pci_fn = adapter->ahw.pci_func; >- >- if (adapter->msi_mode != MSI_MODE_MULTIFUNC) >- adapter->pci_write_normalize(adapter, >- adapter->crb_intr_mask, 0); >- >- if (adapter->intr_scheme != -1 && >- adapter->intr_scheme != INTR_SCHEME_PERPORT) >- adapter->pci_write_immediate(adapter, ISR_INT_MASK, mask); >- >- if (!NETXEN_IS_MSI_FAMILY(adapter)) { >- do { >- adapter->pci_write_immediate(adapter, >- ISR_INT_TARGET_STATUS, 0xffffffff); >- mask = adapter->pci_read_immediate(adapter, >- ISR_INT_VECTOR); >- if (!(mask & 0x80)) >- break; >- udelay(10); >- } while (--retries); >- >- if (!retries) { >- printk(KERN_NOTICE "%s: Failed to disable interrupt completely\n", >- netxen_nic_driver_name); >- } >- } else { >- if (adapter->msi_mode == MSI_MODE_MULTIFUNC) { >- adapter->pci_write_immediate(adapter, >- msi_tgt_status[pci_fn], 0xffffffff); >- } >- } >+ adapter->pci_write_normalize(adapter, adapter->crb_intr_mask, 0); > } > >-static void netxen_nic_enable_int(struct netxen_adapter *adapter) >+static inline void netxen_nic_enable_int(struct netxen_adapter *adapter) > { >- u32 mask; >- >- DPRINTK(1, INFO, "Entered ISR Enable \n"); >- >- if (adapter->intr_scheme != -1 && >- adapter->intr_scheme != INTR_SCHEME_PERPORT) { >- switch (adapter->ahw.board_type) { >- case NETXEN_NIC_GBE: >- mask = 0x77b; >- break; >- case NETXEN_NIC_XGBE: >- mask = 0x77f; >- break; >- default: >- mask = 0x7ff; >- break; >- } >- >- adapter->pci_write_immediate(adapter, ISR_INT_MASK, mask); >- } >- > adapter->pci_write_normalize(adapter, adapter->crb_intr_mask, 0x1); > >- if (!NETXEN_IS_MSI_FAMILY(adapter)) { >- mask = 0xbff; >- if (adapter->intr_scheme != -1 && >- adapter->intr_scheme != INTR_SCHEME_PERPORT) { >- adapter->pci_write_normalize(adapter, >- CRB_INT_VECTOR, 0); >- } >+ if (!NETXEN_IS_MSI_FAMILY(adapter)) > adapter->pci_write_immediate(adapter, >- ISR_INT_TARGET_MASK, mask); >- } >- >- DPRINTK(1, INFO, "Done with enable Int\n"); >+ adapter->legacy_intr.tgt_mask_reg, 0xfbff); > } > > static int nx_set_dma_mask(struct netxen_adapter *adapter, uint8_t revision_id) >@@ -291,6 +229,8 @@ > case NETXEN_BRDTYPE_P3_10G_CX4_LP: > case NETXEN_BRDTYPE_P3_IMEZ: > case NETXEN_BRDTYPE_P3_10G_SFP_PLUS: >+ case NETXEN_BRDTYPE_P3_10G_SFP_QT: >+ case NETXEN_BRDTYPE_P3_10G_SFP_CT: > case NETXEN_BRDTYPE_P3_10G_XFP: > case NETXEN_BRDTYPE_P3_10000_BASE_T: > adapter->msix_supported = !!use_msi_x; >@@ -308,6 +248,10 @@ > case NETXEN_BRDTYPE_P3_REF_QG: > case NETXEN_BRDTYPE_P3_4_GB: > case NETXEN_BRDTYPE_P3_4_GB_MM: >+ adapter->msix_supported = 0; >+ adapter->max_rx_desc_count = MAX_RCV_DESCRIPTORS_10G; >+ break; >+ > case NETXEN_BRDTYPE_P2_SB35_4G: > case NETXEN_BRDTYPE_P2_SB31_2G: > adapter->msix_supported = 0; >@@ -506,6 +450,49 @@ > adapter->msix_entries[i].entry = i; > } > >+static int >+netxen_read_mac_addr(struct netxen_adapter *adapter) >+{ >+ int i; >+ unsigned char *p; >+ __le64 mac_addr; >+ struct net_device *netdev = adapter->netdev; >+ >+ if (netxen_is_flash_supported(adapter) != 0) >+ return -EIO; >+ >+ if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { >+ if (netxen_p3_get_mac_addr(adapter, &mac_addr) != 0) >+ return -EIO; >+ } else { >+ if (netxen_get_flash_mac_addr(adapter, &mac_addr) != 0) >+ return -EIO; >+ } >+ >+ p = (unsigned char *)&mac_addr; >+ for (i = 0; i < 6; i++) >+ netdev->dev_addr[i] = *(p + 5 - i); >+ >+ memcpy(netdev->perm_addr, netdev->dev_addr, netdev->addr_len); >+ >+ /* set station address */ >+ >+ if (!is_valid_ether_addr(netdev->perm_addr)) { >+ dev_warn(&adapter->pdev->dev, "%s: Bad MAC address " >+ "%02x:%02x:%02x:%02x:%02x:%02x.\n", >+ netxen_nic_driver_name, >+ netdev->dev_addr[0], >+ netdev->dev_addr[1], >+ netdev->dev_addr[2], >+ netdev->dev_addr[3], >+ netdev->dev_addr[4], >+ netdev->dev_addr[5]); >+ } else >+ adapter->macaddr_set(adapter, netdev->dev_addr); >+ >+ return 0; >+} >+ > /* > * netxen_nic_probe() > * >@@ -534,7 +521,6 @@ > unsigned long mem_base, mem_len, db_base, db_len, pci_len0 = 0; > int i = 0, err; > int first_driver, first_boot; >- u64 mac_addr[FLASH_NUM_PORTS + 1]; > u32 val; > int pci_func_id = PCI_FUNC(pdev->devfn); > struct netxen_legacy_intr_set *legacy_intrp; >@@ -549,6 +535,16 @@ > return -ENODEV; > } > >+ pci_read_config_byte(pdev, PCI_REVISION_ID, &nx_p2_id); >+ revision_id = nx_p2_id; >+ >+ if ((revision_id >= NX_P3_A0) && (revision_id < NX_P3_B1)) { >+ printk(KERN_WARNING "NetXen chip revisions between 0x%x-0x%x" >+ "will not be enabled.\n", >+ NX_P3_A0, NX_P3_B1); >+ return -ENODEV; >+ } >+ > if ((err = pci_enable_device(pdev))) > return err; > >@@ -561,7 +557,6 @@ > goto err_out_disable_pdev; > > pci_set_master(pdev); >- pci_read_config_byte(pdev, PCI_REVISION_ID, &nx_p2_id); > > netdev = alloc_etherdev(sizeof(struct netxen_adapter)); > if(!netdev) { >@@ -580,8 +575,6 @@ > adapter->netdev = netdev; > adapter->pdev = pdev; > adapter->ahw.pci_func = pci_func_id; >- >- revision_id = nx_p2_id; > adapter->ahw.revision_id = revision_id; > > err = nx_set_dma_mask(adapter, revision_id); >@@ -707,13 +700,10 @@ > adapter->status &= ~NETXEN_NETDEV_STATUS; > adapter->rx_csum = 1; > adapter->mc_enabled = 0; >- if (NX_IS_REVISION_P3(revision_id)) { >+ if (NX_IS_REVISION_P3(revision_id)) > adapter->max_mc_count = 38; >- adapter->max_rds_rings = 2; >- } else { >+ else > adapter->max_mc_count = 16; >- adapter->max_rds_rings = 3; >- } > > netdev->open = netxen_nic_open; > netdev->stop = netxen_nic_close; >@@ -788,11 +778,6 @@ > first_driver = 1; > } > >- adapter->crb_addr_cmd_producer = crb_cmd_producer[adapter->portnum]; >- adapter->crb_addr_cmd_consumer = crb_cmd_consumer[adapter->portnum]; >- netxen_nic_update_cmd_producer(adapter, 0); >- netxen_nic_update_cmd_consumer(adapter, 0); >- > if (first_driver) { > first_boot = adapter->pci_read_normalize(adapter, > NETXEN_CAM_RAM(0x1fc)); >@@ -913,7 +898,6 @@ > goto err_out_disable_msi; > > init_timer(&adapter->watchdog_timer); >- adapter->ahw.linkup = 0; > adapter->watchdog_timer.function = &netxen_watchdog; > adapter->watchdog_timer.data = (unsigned long)adapter; > INIT_WORK(&adapter->watchdog_task, >@@ -921,34 +905,9 @@ > INIT_WORK(&adapter->tx_timeout_task, > (void (*)(void *))netxen_tx_timeout_task, netdev); > >- if (netxen_is_flash_supported(adapter) == 0 && >- netxen_get_flash_mac_addr(adapter, mac_addr) == 0) { >- unsigned char *p; >- >- p = (unsigned char *)&mac_addr[adapter->portnum]; >- netdev->dev_addr[0] = *(p + 5); >- netdev->dev_addr[1] = *(p + 4); >- netdev->dev_addr[2] = *(p + 3); >- netdev->dev_addr[3] = *(p + 2); >- netdev->dev_addr[4] = *(p + 1); >- netdev->dev_addr[5] = *(p + 0); >- >- memcpy(netdev->perm_addr, netdev->dev_addr, >- netdev->addr_len); >- if (!is_valid_ether_addr(netdev->perm_addr)) { >- printk(KERN_ERR "%s: Bad MAC address " >- "%02x:%02x:%02x:%02x:%02x:%02x.\n", >- netxen_nic_driver_name, >- netdev->dev_addr[0], >- netdev->dev_addr[1], >- netdev->dev_addr[2], >- netdev->dev_addr[3], >- netdev->dev_addr[4], >- netdev->dev_addr[5]); >- } else { >- adapter->macaddr_set(adapter, netdev->dev_addr); >- } >- } >+ err = netxen_read_mac_addr(adapter); >+ if (err) >+ dev_warn(&pdev->dev, "failed to read mac addr\n"); > > netif_carrier_off(netdev); > netif_stop_queue(netdev); >@@ -1023,6 +982,7 @@ > > if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { > netxen_free_hw_resources(adapter); >+ netxen_release_rx_buffers(adapter); > netxen_free_sw_resources(adapter); > } > >@@ -1071,6 +1031,11 @@ > return -EIO; > } > >+ if (adapter->fw_major < 4) >+ adapter->max_rds_rings = 3; >+ else >+ adapter->max_rds_rings = 2; >+ > err = netxen_alloc_sw_resources(adapter); > if (err) { > printk(KERN_ERR "%s: Error in setting sw resources\n", >@@ -1087,15 +1052,24 @@ > goto err_out_free_sw; > } > >+ if ((adapter->msi_mode != MSI_MODE_MULTIFUNC) || >+ (adapter->intr_scheme != INTR_SCHEME_PERPORT)) { >+ printk(KERN_ERR "%s: Firmware interrupt scheme is " >+ "incompatible with driver\n", >+ netdev->name); >+ adapter->driver_mismatch = 1; >+ goto err_out_free_hw; >+ } >+ > if (adapter->fw_major < 4) { > adapter->crb_addr_cmd_producer = > crb_cmd_producer[adapter->portnum]; > adapter->crb_addr_cmd_consumer = > crb_cmd_consumer[adapter->portnum]; >- } > >- netxen_nic_update_cmd_producer(adapter, 0); >- netxen_nic_update_cmd_consumer(adapter, 0); >+ netxen_nic_update_cmd_producer(adapter, 0); >+ netxen_nic_update_cmd_consumer(adapter, 0); >+ } > > for (ctx = 0; ctx < MAX_RCV_CTX; ++ctx) { > for (ring = 0; ring < adapter->max_rds_rings; ring++) >@@ -1112,7 +1086,7 @@ > flags, netdev->name, adapter); > if (err) { > printk(KERN_ERR "request_irq failed with: %d\n", err); >- goto err_out_free_hw; >+ goto err_out_free_rxbuf; > } > > adapter->is_up = NETXEN_ADAPTER_UP_MAGIC; >@@ -1131,11 +1105,10 @@ > netxen_nic_set_link_parameters(adapter); > > netdev->set_multicast_list(netdev); >- if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) >- nx_fw_cmd_set_mtu(adapter, netdev->mtu); >- else >+ if (adapter->set_mtu) > adapter->set_mtu(adapter, netdev->mtu); > >+ adapter->ahw.linkup = 0; > mod_timer(&adapter->watchdog_timer, jiffies); > > netxen_nic_enable_int(adapter); >@@ -1146,6 +1119,8 @@ > > err_out_free_irq: > free_irq(adapter->irq, adapter); >+err_out_free_rxbuf: >+ netxen_release_rx_buffers(adapter); > err_out_free_hw: > netxen_free_hw_resources(adapter); > err_out_free_sw: >@@ -1170,10 +1145,8 @@ > > netxen_release_tx_buffers(adapter); > >- if (adapter->is_up == NETXEN_ADAPTER_UP_MAGIC) { >- FLUSH_SCHEDULED_WORK(); >- del_timer_sync(&adapter->watchdog_timer); >- } >+ FLUSH_SCHEDULED_WORK(); >+ del_timer_sync(&adapter->watchdog_timer); > > return 0; > } >@@ -1426,20 +1399,17 @@ > > port = adapter->physical_port; > >- if (adapter->ahw.board_type == NETXEN_NIC_GBE) { >- val = adapter->pci_read_normalize(adapter, CRB_XG_STATE); >- linkup = (val >> port) & 1; >+ if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) { >+ val = adapter->pci_read_normalize(adapter, CRB_XG_STATE_P3); >+ val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val); >+ linkup = (val == XG_LINK_UP_P3); > } else { >- if (adapter->fw_major < 4) { >- val = adapter->pci_read_normalize(adapter, >- CRB_XG_STATE); >+ val = adapter->pci_read_normalize(adapter, CRB_XG_STATE); >+ if (adapter->ahw.board_type == NETXEN_NIC_GBE) >+ linkup = (val >> port) & 1; >+ else { > val = (val >> port*8) & 0xff; > linkup = (val == XG_LINK_UP); >- } else { >- val = adapter->pci_read_normalize(adapter, >- CRB_XG_STATE_P3); >- val = XG_LINK_STATE_P3(adapter->ahw.pci_func, val); >- linkup = (val == XG_LINK_UP_P3); > } > } > >@@ -1478,7 +1448,8 @@ > > netxen_nic_handle_phy_intr(adapter); > >- mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); >+ if (netif_running(adapter->netdev)) >+ mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ); > } > > static void netxen_tx_timeout(struct net_device *netdev) >@@ -1537,34 +1508,51 @@ > return stats; > } > >-static inline void >-netxen_handle_int(struct netxen_adapter *adapter) >-{ >- netxen_nic_disable_int(adapter); >- netif_rx_schedule(adapter->netdev); >-} >- > static irqreturn_t netxen_intr(int irq, void *data, struct pt_regs *regs) > { >- struct netxen_adapter *adapter; >- struct net_device *netdev; >- u32 our_int = 0; >+ struct netxen_adapter *adapter = data; >+ u32 status = 0; > > adapter = (struct netxen_adapter *)data; >- netdev = adapter->netdev; > >- our_int = adapter->pci_read_normalize(adapter, CRB_INT_VECTOR); >- /* not our interrupt */ >- if ((our_int & (0x80 << adapter->portnum)) == 0) >+ status = adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); >+ >+ if (!(status & adapter->legacy_intr.int_vec_bit)) > return IRQ_NONE; > >- if (adapter->intr_scheme == INTR_SCHEME_PERPORT) { >+ if (adapter->ahw.revision_id >= NX_P3_B1) { >+ /* check interrupt state machine, to be sure */ >+ status = adapter->pci_read_immediate(adapter, >+ ISR_INT_STATE_REG); >+ if (!ISR_LEGACY_INT_TRIGGERED(status)) >+ return IRQ_NONE; >+ >+ } else { >+ unsigned long our_int = 0; >+ >+ our_int = adapter->pci_read_normalize(adapter, CRB_INT_VECTOR); >+ >+ /* not our interrupt */ >+ if (!test_and_clear_bit((7 + adapter->portnum), &our_int)) >+ return IRQ_NONE; >+ > /* claim interrupt */ >- adapter->pci_write_normalize(adapter, CRB_INT_VECTOR, >- our_int & ~((u32)(0x80 << adapter->portnum))); >+ adapter->pci_write_normalize(adapter, >+ CRB_INT_VECTOR, (our_int & 0xffffffff)); > } > >- netxen_handle_int(adapter); >+ /* clear interrupt */ >+ if (adapter->fw_major < 4) >+ netxen_nic_disable_int(adapter); >+ >+ adapter->pci_write_immediate(adapter, >+ adapter->legacy_intr.tgt_status_reg, >+ 0xffffffff); >+ /* read twice to ensure write is flushed */ >+ adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); >+ adapter->pci_read_immediate(adapter, ISR_INT_VECTOR); >+ >+ netif_rx_schedule(adapter->netdev); > > return IRQ_HANDLED; > } >@@ -1573,7 +1561,11 @@ > { > struct netxen_adapter *adapter = data; > >- netxen_handle_int(adapter); >+ /* clear interrupt */ >+ adapter->pci_write_immediate(adapter, >+ msi_tgt_status[adapter->ahw.pci_func], 0xffffffff); >+ >+ netif_rx_schedule(adapter->netdev); > return IRQ_HANDLED; > } > >Index: rhel5/drivers/net/netxen/netxen_nic_niu.c >=================================================================== >--- rhel5.orig/drivers/net/netxen/netxen_nic_niu.c 2008-08-15 13:13:18.050603000 -0700 >+++ rhel5/drivers/net/netxen/netxen_nic_niu.c 2008-08-15 13:15:21.322344000 -0700 >@@ -299,13 +299,15 @@ > return result; > } > >-int netxen_niu_xgbe_clear_phy_interrupts(struct netxen_adapter *adapter) >+#if 0 >+static int netxen_niu_xgbe_clear_phy_interrupts(struct netxen_adapter *adapter) > { > netxen_crb_writelit_adapter(adapter, NETXEN_NIU_ACTIVE_INT, -1); > return 0; > } >+#endif /* 0 */ > >-int netxen_niu_gbe_clear_phy_interrupts(struct netxen_adapter *adapter) >+static int netxen_niu_gbe_clear_phy_interrupts(struct netxen_adapter *adapter) > { > int result = 0; > if (0 != >@@ -321,7 +323,7 @@ > * netxen_niu_gbe_set_mii_mode- Set 10/100 Mbit Mode for GbE MAC > * > */ >-void netxen_niu_gbe_set_mii_mode(struct netxen_adapter *adapter, >+static void netxen_niu_gbe_set_mii_mode(struct netxen_adapter *adapter, > int port, long enable) > { > netxen_crb_writelit_adapter(adapter, NETXEN_NIU_MODE, 0x2); >@@ -359,7 +361,7 @@ > /* > * netxen_niu_gbe_set_gmii_mode- Set GbE Mode for GbE MAC > */ >-void netxen_niu_gbe_set_gmii_mode(struct netxen_adapter *adapter, >+static void netxen_niu_gbe_set_gmii_mode(struct netxen_adapter *adapter, > int port, long enable) > { > netxen_crb_writelit_adapter(adapter, NETXEN_NIU_MODE, 0x2); >@@ -565,7 +567,7 @@ > * Return the current station MAC address. > * Note that the passed-in value must already be in network byte order. > */ >-int netxen_niu_macaddr_get(struct netxen_adapter *adapter, >+static int netxen_niu_macaddr_get(struct netxen_adapter *adapter, > netxen_ethernet_macaddr_t * addr) > { > u32 stationhigh; >@@ -605,6 +607,9 @@ > unsigned char mac_addr[6]; > int i; > >+ if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) >+ return 0; >+ > for (i = 0; i < 10; i++) { > temp[0] = temp[1] = 0; > memcpy(temp + 2, addr, 2); >@@ -725,7 +730,10 @@ > __u32 mac_cfg0; > u32 port = adapter->physical_port; > >- if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) >+ if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) >+ return 0; >+ >+ if (port > NETXEN_NIU_MAX_GBE_PORTS) > return -EINVAL; > mac_cfg0 = 0; > netxen_gb_soft_reset(mac_cfg0); >@@ -741,6 +749,9 @@ > __u32 mac_cfg; > u32 port = adapter->physical_port; > >+ if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) >+ return 0; >+ > if (port > NETXEN_NIU_MAX_XG_PORTS) > return -EINVAL; > >@@ -753,12 +764,12 @@ > > /* Set promiscuous mode for a GbE interface */ > int netxen_niu_set_promiscuous_mode(struct netxen_adapter *adapter, >- netxen_niu_prom_mode_t mode) >+ u32 mode) > { > __u32 reg; > u32 port = adapter->physical_port; > >- if ((port < 0) || (port > NETXEN_NIU_MAX_GBE_PORTS)) >+ if (port > NETXEN_NIU_MAX_GBE_PORTS) > return -EINVAL; > > /* save previous contents */ >@@ -817,6 +828,9 @@ > u8 temp[4]; > u32 val; > >+ if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) >+ return 0; >+ > if ((phy < 0) || (phy > NETXEN_NIU_MAX_XG_PORTS)) > return -EIO; > >@@ -890,12 +904,12 @@ > } > > int netxen_niu_xg_set_promiscuous_mode(struct netxen_adapter *adapter, >- netxen_niu_prom_mode_t mode) >+ u32 mode) > { > __u32 reg; > u32 port = adapter->physical_port; > >- if ((port < 0) || (port > NETXEN_NIU_MAX_XG_PORTS)) >+ if (port > NETXEN_NIU_MAX_XG_PORTS) > return -EINVAL; > > if (adapter->hw_read_wx(adapter, >Index: rhel5/drivers/net/netxen/netxen_nic_phan_reg.h >=================================================================== >--- rhel5.orig/drivers/net/netxen/netxen_nic_phan_reg.h 2008-08-15 13:13:18.153604000 -0700 >+++ rhel5/drivers/net/netxen/netxen_nic_phan_reg.h 2008-08-15 13:15:21.328339000 -0700 >@@ -95,8 +95,8 @@ > #define CRB_HOST_STS_PROD NETXEN_NIC_REG(0xdc) > #define CRB_HOST_STS_CONS NETXEN_NIC_REG(0xe0) > #define CRB_PEG_CMD_PROD NETXEN_NIC_REG(0xe4) >-#define CRB_PEG_CMD_CONS NETXEN_NIC_REG(0xe8) >-#define CRB_HOST_BUFFER_PROD NETXEN_NIC_REG(0xec) >+#define CRB_PF_LINK_SPEED_1 NETXEN_NIC_REG(0xe8) >+#define CRB_PF_LINK_SPEED_2 NETXEN_NIC_REG(0xec) > #define CRB_HOST_BUFFER_CONS NETXEN_NIC_REG(0xf0) > #define CRB_JUMBO_BUFFER_PROD NETXEN_NIC_REG(0xf4) > #define CRB_JUMBO_BUFFER_CONS NETXEN_NIC_REG(0xf8) >@@ -125,6 +125,8 @@ > #define CRB_SW_INT_MASK_2 NETXEN_NIC_REG(0x1e4) > #define CRB_SW_INT_MASK_3 NETXEN_NIC_REG(0x1e8) > >+#define CRB_MAC_BLOCK_START NETXEN_CAM_RAM(0x1c0) >+ > /* > * capabilities register, can be used to selectively enable/disable features > * for backward compability
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 457958
:
313475
|
313476
|
313477
|
313478
|
313849
|
313850
|
313851
|
314419
|
314420
| 314421 |
315321