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 313851 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
rhl53.patchset4.p3.p12-p25.patch (text/plain), 45.92 KB, created by
Dhananjay Phadke
on 2008-08-08 21:27:16 UTC
(
hide
)
Description:
Patch 3
Filename:
MIME Type:
Creator:
Dhananjay Phadke
Created:
2008-08-08 21:27:16 UTC
Size:
45.92 KB
patch
obsolete
>diff -r --new-file -pu rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_ctx.c rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_ctx.c >--- rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_ctx.c 2008-07-22 18:28:40.567758000 -0700 >+++ rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_ctx.c 2008-08-07 17:32:53.758631000 -0700 >@@ -145,8 +145,8 @@ netxen_issue_cmd(struct netxen_adapter * > 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 @@ nx_fw_cmd_set_mtu(struct netxen_adapter > 0, > NX_CDRP_CMD_SET_MTU); > >- return rcode; >+ if (rcode != NX_RCODE_SUCCESS) >+ return -EIO; >+ >+ return 0; > } > > static int >diff -r --new-file -pu rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_ethtool.c rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_ethtool.c >--- rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_ethtool.c 2008-07-22 18:28:40.572766000 -0700 >+++ rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_ethtool.c 2008-08-07 17:32:53.821629000 -0700 >@@ -142,18 +142,32 @@ netxen_nic_get_settings(struct net_devic > 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 @@ netxen_nic_get_settings(struct net_devic > 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; >diff -r --new-file -pu rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic.h rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic.h >--- rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic.h 2008-07-22 18:28:40.611760000 -0700 >+++ rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic.h 2008-08-07 17:32:53.894628000 -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 @@ typedef enum { > 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 @@ typedef struct { > 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 @@ struct netxen_adapter { > 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_gbe_enable_phy_interrupts > 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_tso_check(struct netxen_adap > 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 @@ static const struct netxen_brdinfo netxe > {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 @@ dma_watchdog_wakeup(struct netxen_adapte > > > 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); >diff -r --new-file -pu rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_hdr.h rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_hdr.h >--- rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_hdr.h 2008-07-22 18:28:40.620761000 -0700 >+++ rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_hdr.h 2008-08-07 17:32:53.902628000 -0700 >@@ -724,6 +724,13 @@ enum { > #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 @@ enum { > > #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 @@ enum { > #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. >diff -r --new-file -pu rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_hw.c rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_hw.c >--- rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_hw.c 2008-07-22 18:28:40.581764000 -0700 >+++ rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_hw.c 2008-08-07 17:32:53.913631000 -0700 >@@ -283,14 +283,7 @@ static unsigned crb_hub_agt[64] = > #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 @@ netxen_send_cmd_descs(struct netxen_adap > 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 @@ static int nx_p3_sre_macaddr_change(stru > 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 @@ void netxen_p3_nic_set_multi(struct net_ > 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 @@ void netxen_p3_nic_set_multi(struct net_ > } > } > >+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 @@ int netxen_config_intr_coalesce(struct n > > 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 @@ int netxen_nic_change_mtu(struct net_dev > { > 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 @@ int netxen_nic_change_mtu(struct net_dev > } > > 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 @@ static int netxen_get_flash_block(struct > 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 @@ static int netxen_nic_pci_mem_read_direc > (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_mem_write_direct(struct n > (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 @@ int netxen_nic_get_board_info(struct net > 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 @@ int netxen_nic_get_board_info(struct net > default: > printk("%s: Unknown(%x)\n", netxen_nic_driver_name, > boardinfo->board_type); >+ rv = -ENODEV; > break; > } > >@@ -2042,6 +2078,7 @@ int netxen_nic_get_board_info(struct net > > 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_gb(struct netxen_ > > 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 @@ void netxen_nic_set_link_parameters(stru > __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 @@ void netxen_nic_set_link_parameters(stru > 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 @@ void netxen_nic_flash_print(struct netxe > 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) < >diff -r --new-file -pu rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_hw.h rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_hw.h >--- rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_hw.h 2008-07-22 18:28:40.626759000 -0700 >+++ rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_hw.h 2008-08-07 17:32:53.921628000 -0700 >@@ -173,7 +173,7 @@ typedef enum { > #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 @@ typedef enum { > #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 @@ typedef enum { > > /* 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); > >diff -r --new-file -pu rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_init.c rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_init.c >--- rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_init.c 2008-07-22 18:28:40.588765000 -0700 >+++ rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_init.c 2008-08-07 17:32:54.121629000 -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 @@ static unsigned int crb_addr_xform[NETXE > > #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 @@ netxen_nic_locked_write_reg(struct netxe > void __iomem *addr = pci_base_offset(adapter, off); > writel(*data, addr); > } >+#endif /* 0 */ > > static void crb_addr_transform_setup(void) > { >@@ -360,13 +365,18 @@ void netxen_initialize_adapter_ops(struc > 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 @@ static inline int rom_lock(struct netxen > 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 @@ static inline void netxen_rom_unlock(str > } > > #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 @@ int netxen_rom_fast_write_words(struct n > 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 @@ int netxen_rom_wrsr(struct netxen_adapte > 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 @@ out_kfree: > 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 @@ int netxen_do_rom_se(struct netxen_adapt > 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 @@ int netxen_rom_se(struct netxen_adapter > 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 @@ int netxen_initialize_adapter_offload(st > > 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 @@ void netxen_free_adapter_offload(struct > 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(struct netxe > } > } > >-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 @@ void netxen_nic_clear_stats(struct netxe > memset(&adapter->stats, 0, sizeof(adapter->stats)); > return; > } >- >diff -r --new-file -pu rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_main.c rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_main.c >--- rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_main.c 2008-07-22 18:28:40.597763000 -0700 >+++ rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_main.c 2008-08-07 17:32:54.911637000 -0700 >@@ -51,13 +51,21 @@ static char netxen_nic_driver_string[] = > NETXEN_NIC_LINUX_VERSIONID; > > static int port_mode = NETXEN_PORT_MODE_AUTO_NEG; >+module_param(port_mode, int, 0); >+MODULE_PARM_DESC(port_mode, "Force port mode Auto-Neg XG, 1G or XG"); > > /* Default to restricted 1G auto-neg mode */ >-static int wol_port_mode = 5; >+static int wol_port_mode = NETXEN_PORT_MODE_AUTO_NEG_1G; >+module_param(wol_port_mode, int, 0); >+MODULE_PARM_DESC(wol_port_mode, "Force WOL port mode XG, 1G or Auto-Neg"); > > static int use_msi = 1; >+module_param(use_msi, bool, 0); >+MODULE_PARM_DESC(use_msi, "Enable or disable MSI interrupts"); > > static int use_msi_x = 1; >+module_param(use_msi_x, bool, 0); >+MODULE_PARM_DESC(use_msi_x, "Enable or disable MSI-X interrupts"); > > u8 nx_p2_id = NX_P2_C0; > >@@ -156,80 +164,18 @@ static uint32_t msi_tgt_status[8] = { > > 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 +237,8 @@ static void netxen_check_options(struct > 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 +256,10 @@ static void netxen_check_options(struct > 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 +458,49 @@ static void netxen_init_msix_entries(str > 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 +529,6 @@ netxen_nic_probe(struct pci_dev *pdev, c > 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 +543,16 @@ netxen_nic_probe(struct pci_dev *pdev, c > 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 +565,6 @@ netxen_nic_probe(struct pci_dev *pdev, c > 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 +583,6 @@ netxen_nic_probe(struct pci_dev *pdev, c > 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 +708,10 @@ netxen_nic_probe(struct pci_dev *pdev, c > 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 +786,6 @@ netxen_nic_probe(struct pci_dev *pdev, c > 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 +906,6 @@ request_msi: > 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 +913,9 @@ request_msi: > 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 +990,7 @@ static void __devexit netxen_nic_remove( > > 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 +1039,11 @@ static int netxen_nic_open(struct net_de > 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 +1060,24 @@ static int netxen_nic_open(struct net_de > 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 +1094,7 @@ static int netxen_nic_open(struct net_de > 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 +1113,10 @@ static int netxen_nic_open(struct net_de > 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 +1127,8 @@ static int netxen_nic_open(struct net_de > > 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 +1153,8 @@ static int netxen_nic_close(struct net_d > > 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 +1407,17 @@ static void netxen_nic_handle_phy_intr(s > > 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 +1456,8 @@ static void netxen_watchdog_task(unsigne > > 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 +1516,51 @@ struct net_device_stats *netxen_nic_get_ > 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 +1569,11 @@ static irqreturn_t netxen_msi_intr(int i > { > 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; > } > >diff -r --new-file -pu rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_niu.c rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_niu.c >--- rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_niu.c 2008-07-22 18:28:40.603776000 -0700 >+++ rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_niu.c 2008-08-07 17:32:55.133636000 -0700 >@@ -299,13 +299,15 @@ int netxen_niu_gbe_disable_phy_interrupt > 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 @@ int netxen_niu_gbe_clear_phy_interrupts( > * 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 @@ void netxen_niu_gbe_set_mii_mode(struct > /* > * 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 @@ int netxen_niu_gbe_handle_phy_interrupt( > * 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 @@ int netxen_niu_macaddr_set(struct netxen > 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 @@ int netxen_niu_disable_gbe_port(struct n > __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 @@ int netxen_niu_disable_xg_port(struct ne > __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 @@ int netxen_niu_disable_xg_port(struct ne > > /* 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 @@ int netxen_niu_xg_macaddr_set(struct net > 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_macaddr_get(struct net > } > > 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, >diff -r --new-file -pu rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_phan_reg.h rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_phan_reg.h >--- rhl53.p3.p01-p11/drivers/net/netxen/netxen_nic_phan_reg.h 2008-07-22 18:28:40.630760000 -0700 >+++ rhl53.p3.p12-p25/drivers/net/netxen/netxen_nic_phan_reg.h 2008-08-07 17:32:55.926653000 -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