Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/kaber/nf-2.6
[firefly-linux-kernel-4.4.55.git] / drivers / net / netxen / netxen_nic_hw.c
index e8a0eed0078e7c804f62d35bc8e2c4972b7e3810..7fea77088108ddb217ba17bfc086085f8a3d750d 100644 (file)
@@ -503,17 +503,15 @@ netxen_send_cmd_descs(struct netxen_adapter *adapter,
 
        i = 0;
 
+       netif_tx_lock_bh(adapter->netdev);
+
        producer = adapter->cmd_producer;
        do {
                cmd_desc = &cmd_desc_arr[i];
 
                pbuf = &adapter->cmd_buf_arr[producer];
-               pbuf->mss = 0;
-               pbuf->total_length = 0;
                pbuf->skb = NULL;
-               pbuf->cmd = 0;
                pbuf->frag_count = 0;
-               pbuf->port = 0;
 
                /* adapter->ahw.cmd_desc_head[producer] = *cmd_desc; */
                memcpy(&adapter->ahw.cmd_desc_head[producer],
@@ -531,6 +529,8 @@ netxen_send_cmd_descs(struct netxen_adapter *adapter,
 
        netxen_nic_update_cmd_producer(adapter, adapter->cmd_producer);
 
+       netif_tx_unlock_bh(adapter->netdev);
+
        return 0;
 }
 
@@ -631,6 +631,19 @@ int netxen_p3_nic_set_promisc(struct netxen_adapter *adapter, u32 mode)
                                (struct cmd_desc_type0 *)&req, 1);
 }
 
+void netxen_p3_free_mac_list(struct netxen_adapter *adapter)
+{
+       nx_mac_list_t *cur, *next;
+
+       cur = adapter->mac_list;
+
+       while (cur) {
+               next = cur->next;
+               kfree(cur);
+               cur = next;
+       }
+}
+
 #define        NETXEN_CONFIG_INTR_COALESCE     3
 
 /*
@@ -693,28 +706,6 @@ int netxen_nic_change_mtu(struct net_device *netdev, int mtu)
        return rc;
 }
 
-int netxen_is_flash_supported(struct netxen_adapter *adapter)
-{
-       const int locs[] = { 0, 0x4, 0x100, 0x4000, 0x4128 };
-       int addr, val01, val02, i, j;
-
-       /* if the flash size less than 4Mb, make huge war cry and die */
-       for (j = 1; j < 4; j++) {
-               addr = j * NETXEN_NIC_WINDOW_MARGIN;
-               for (i = 0; i < ARRAY_SIZE(locs); i++) {
-                       if (netxen_rom_fast_read(adapter, locs[i], &val01) == 0
-                           && netxen_rom_fast_read(adapter, (addr + locs[i]),
-                                                   &val02) == 0) {
-                               if (val01 == val02)
-                                       return -1;
-                       } else
-                               return -1;
-               }
-       }
-
-       return 0;
-}
-
 static int netxen_get_flash_block(struct netxen_adapter *adapter, int base,
                                  int size, __le32 * buf)
 {
@@ -943,7 +934,7 @@ int netxen_load_firmware(struct netxen_adapter *adapter)
 {
        int i;
        u32 data, size = 0;
-       u32 flashaddr = NETXEN_BOOTLD_START, memaddr = NETXEN_BOOTLD_START;
+       u32 flashaddr = NETXEN_BOOTLD_START;
 
        size = (NETXEN_IMAGE_START - NETXEN_BOOTLD_START)/4;
 
@@ -955,10 +946,8 @@ int netxen_load_firmware(struct netxen_adapter *adapter)
                if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0)
                        return -EIO;
 
-               adapter->pci_mem_write(adapter, memaddr, &data, 4);
+               adapter->pci_mem_write(adapter, flashaddr, &data, 4);
                flashaddr += 4;
-               memaddr += 4;
-               cond_resched();
        }
        msleep(1);
 
@@ -2040,7 +2029,13 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter)
                rv = -1;
        }
 
-       DPRINTK(INFO, "Discovered board type:0x%x  ", boardinfo->board_type);
+       if (boardinfo->board_type == NETXEN_BRDTYPE_P3_4_GB_MM) {
+               u32 gpio = netxen_nic_reg_read(adapter,
+                               NETXEN_ROMUSB_GLB_PAD_GPIO_I);
+               if ((gpio & 0x8000) == 0)
+                       boardinfo->board_type = NETXEN_BRDTYPE_P3_10G_TP;
+       }
+
        switch ((netxen_brdtype_t) boardinfo->board_type) {
        case NETXEN_BRDTYPE_P2_SB35_4G:
                adapter->ahw.board_type = NETXEN_NIC_GBE;
@@ -2059,7 +2054,6 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter)
        case NETXEN_BRDTYPE_P3_10G_SFP_QT:
        case NETXEN_BRDTYPE_P3_10G_XFP:
        case NETXEN_BRDTYPE_P3_10000_BASE_T:
-
                adapter->ahw.board_type = NETXEN_NIC_XGBE;
                break;
        case NETXEN_BRDTYPE_P1_BD:
@@ -2069,9 +2063,12 @@ int netxen_nic_get_board_info(struct netxen_adapter *adapter)
        case NETXEN_BRDTYPE_P3_REF_QG:
        case NETXEN_BRDTYPE_P3_4_GB:
        case NETXEN_BRDTYPE_P3_4_GB_MM:
-
                adapter->ahw.board_type = NETXEN_NIC_GBE;
                break;
+       case NETXEN_BRDTYPE_P3_10G_TP:
+               adapter->ahw.board_type = (adapter->portnum < 2) ?
+                       NETXEN_NIC_XGBE : NETXEN_NIC_GBE;
+               break;
        default:
                printk("%s: Unknown(%x)\n", netxen_nic_driver_name,
                       boardinfo->board_type);
@@ -2116,12 +2113,16 @@ 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 */
+       if (!netif_carrier_ok(adapter->netdev)) {
+               adapter->link_speed   = 0;
+               adapter->link_duplex  = -1;
+               adapter->link_autoneg = AUTONEG_ENABLE;
+               return;
+       }
 
+       if (adapter->ahw.board_type == NETXEN_NIC_GBE) {
                adapter->hw_read_wx(adapter,
                                NETXEN_PORT_MODE_ADDR, &port_mode, 4);
                if (port_mode == NETXEN_PORT_MODE_802_3_AP) {
@@ -2147,7 +2148,7 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter)
                                        adapter->link_speed = SPEED_1000;
                                        break;
                                default:
-                                       adapter->link_speed = -1;
+                                       adapter->link_speed = 0;
                                        break;
                                }
                                switch (netxen_get_phy_duplex(status)) {
@@ -2170,7 +2171,7 @@ void netxen_nic_set_link_parameters(struct netxen_adapter *adapter)
                                goto link_down;
                } else {
                      link_down:
-                       adapter->link_speed = -1;
+                       adapter->link_speed = 0;
                        adapter->link_duplex = -1;
                }
        }