netxen: add new board types
[safe/jmp/linux-2.6] / drivers / net / netxen / netxen_nic_hw.c
index 9d4e9c9..d0c6935 100644 (file)
@@ -615,6 +615,33 @@ void netxen_p3_nic_set_multi(struct net_device *netdev)
        }
 }
 
+#define        NETXEN_CONFIG_INTR_COALESCE     3
+
+/*
+ * Send the interrupt coalescing parameter set by ethtool to the card.
+ */
+int netxen_config_intr_coalesce(struct netxen_adapter *adapter)
+{
+       nx_nic_req_t req;
+       int rv;
+
+       memset(&req, 0, sizeof(nx_nic_req_t));
+
+       req.qhdr |= (NIC_REQUEST << 23);
+       req.req_hdr |= NETXEN_CONFIG_INTR_COALESCE;
+       req.req_hdr |= ((u64)adapter->portnum << 16);
+
+       memcpy(&req.words[0], &adapter->coal, sizeof(adapter->coal));
+
+       rv = netxen_send_cmd_descs(adapter, (struct cmd_desc_type0 *)&req, 1);
+       if (rv != 0) {
+               printk(KERN_ERR "ERROR. Could not send "
+                       "interrupt coalescing parameters\n");
+       }
+
+       return rv;
+}
+
 /*
  * netxen_nic_change_mtu - Change the Maximum Transfer Unit
  * @returns 0 on success, negative on failure
@@ -651,26 +678,6 @@ int netxen_nic_change_mtu(struct net_device *netdev, int mtu)
        return 0;
 }
 
-void netxen_tso_check(struct netxen_adapter *adapter,
-                     struct cmd_desc_type0 *desc, struct sk_buff *skb)
-{
-       if (desc->mss) {
-               desc->total_hdr_length = (sizeof(struct ethhdr) +
-                                         ip_hdrlen(skb) + tcp_hdrlen(skb));
-               netxen_set_cmd_desc_opcode(desc, TX_TCP_LSO);
-       } else if (skb->ip_summed == CHECKSUM_PARTIAL) {
-               if (ip_hdr(skb)->protocol == IPPROTO_TCP) {
-                       netxen_set_cmd_desc_opcode(desc, TX_TCP_PKT);
-               } else if (ip_hdr(skb)->protocol == IPPROTO_UDP) {
-                       netxen_set_cmd_desc_opcode(desc, TX_UDP_PKT);
-               } else {
-                       return;
-               }
-       }
-       desc->tcp_hdr_offset = skb_transport_offset(skb);
-       desc->ip_hdr_offset = skb_network_offset(skb);
-}
-
 int netxen_is_flash_supported(struct netxen_adapter *adapter)
 {
        const int locs[] = { 0, 0x4, 0x100, 0x4000, 0x4128 };
@@ -2009,6 +2016,8 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter)
        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:
 
@@ -2027,6 +2036,7 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter)
        default:
                printk("%s: Unknown(%x)\n", netxen_nic_driver_name,
                       boardinfo->board_type);
+               rv = -ENODEV;
                break;
        }
 
@@ -2067,12 +2077,22 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter)
        __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)) {
@@ -2102,8 +2122,7 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter)
                                        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;
@@ -2161,16 +2180,12 @@ void netxen_nic_flash_print(struct netxen_adapter *adapter)
                                fw_minor, fw_build);
        }
 
-       if (fw_major != _NETXEN_NIC_LINUX_MAJOR) {
-               adapter->driver_mismatch = 1;
-       }
-       if (fw_minor != _NETXEN_NIC_LINUX_MINOR &&
-                       fw_minor != (_NETXEN_NIC_LINUX_MINOR + 1)) {
+       if (NETXEN_VERSION_CODE(fw_major, fw_minor, fw_build) <
+                       NETXEN_VERSION_CODE(3, 4, 216)) {
                adapter->driver_mismatch = 1;
-       }
-       if (adapter->driver_mismatch) {
-               printk(KERN_ERR "%s: driver and firmware version mismatch\n",
-                               adapter->netdev->name);
+               printk(KERN_ERR "%s: firmware version %d.%d.%d unsupported\n",
+                               netxen_nic_driver_name,
+                               fw_major, fw_minor, fw_build);
                return;
        }
 }