aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/netxen
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/net/netxen')
-rw-r--r--drivers/net/netxen/netxen_nic.h5
-rw-r--r--drivers/net/netxen/netxen_nic_ctx.c16
-rw-r--r--drivers/net/netxen/netxen_nic_hw.c6
-rw-r--r--drivers/net/netxen/netxen_nic_init.c74
-rw-r--r--drivers/net/netxen/netxen_nic_main.c13
5 files changed, 88 insertions, 26 deletions
diff --git a/drivers/net/netxen/netxen_nic.h b/drivers/net/netxen/netxen_nic.h
index 77220687b92..f744d291218 100644
--- a/drivers/net/netxen/netxen_nic.h
+++ b/drivers/net/netxen/netxen_nic.h
@@ -53,8 +53,8 @@
53 53
54#define _NETXEN_NIC_LINUX_MAJOR 4 54#define _NETXEN_NIC_LINUX_MAJOR 4
55#define _NETXEN_NIC_LINUX_MINOR 0 55#define _NETXEN_NIC_LINUX_MINOR 0
56#define _NETXEN_NIC_LINUX_SUBVERSION 75 56#define _NETXEN_NIC_LINUX_SUBVERSION 76
57#define NETXEN_NIC_LINUX_VERSIONID "4.0.75" 57#define NETXEN_NIC_LINUX_VERSIONID "4.0.76"
58 58
59#define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c)) 59#define NETXEN_VERSION_CODE(a, b, c) (((a) << 24) + ((b) << 16) + (c))
60#define _major(v) (((v) >> 24) & 0xff) 60#define _major(v) (((v) >> 24) & 0xff)
@@ -1302,6 +1302,7 @@ int netxen_nic_wol_supported(struct netxen_adapter *adapter);
1302int netxen_init_dummy_dma(struct netxen_adapter *adapter); 1302int netxen_init_dummy_dma(struct netxen_adapter *adapter);
1303void netxen_free_dummy_dma(struct netxen_adapter *adapter); 1303void netxen_free_dummy_dma(struct netxen_adapter *adapter);
1304 1304
1305int netxen_check_flash_fw_compatibility(struct netxen_adapter *adapter);
1305int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); 1306int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val);
1306int netxen_load_firmware(struct netxen_adapter *adapter); 1307int netxen_load_firmware(struct netxen_adapter *adapter);
1307int netxen_need_fw_reset(struct netxen_adapter *adapter); 1308int netxen_need_fw_reset(struct netxen_adapter *adapter);
diff --git a/drivers/net/netxen/netxen_nic_ctx.c b/drivers/net/netxen/netxen_nic_ctx.c
index f16966afa64..a925392abd6 100644
--- a/drivers/net/netxen/netxen_nic_ctx.c
+++ b/drivers/net/netxen/netxen_nic_ctx.c
@@ -163,7 +163,7 @@ nx_fw_cmd_create_rx_ctx(struct netxen_adapter *adapter)
163 rq_size, &hostrq_phys_addr); 163 rq_size, &hostrq_phys_addr);
164 if (addr == NULL) 164 if (addr == NULL)
165 return -ENOMEM; 165 return -ENOMEM;
166 prq = (nx_hostrq_rx_ctx_t *)addr; 166 prq = addr;
167 167
168 addr = pci_alloc_consistent(adapter->pdev, 168 addr = pci_alloc_consistent(adapter->pdev,
169 rsp_size, &cardrsp_phys_addr); 169 rsp_size, &cardrsp_phys_addr);
@@ -171,7 +171,7 @@ nx_fw_cmd_create_rx_ctx(struct netxen_adapter *adapter)
171 err = -ENOMEM; 171 err = -ENOMEM;
172 goto out_free_rq; 172 goto out_free_rq;
173 } 173 }
174 prsp = (nx_cardrsp_rx_ctx_t *)addr; 174 prsp = addr;
175 175
176 prq->host_rsp_dma_addr = cpu_to_le64(cardrsp_phys_addr); 176 prq->host_rsp_dma_addr = cpu_to_le64(cardrsp_phys_addr);
177 177
@@ -318,10 +318,10 @@ nx_fw_cmd_create_tx_ctx(struct netxen_adapter *adapter)
318 } 318 }
319 319
320 memset(rq_addr, 0, rq_size); 320 memset(rq_addr, 0, rq_size);
321 prq = (nx_hostrq_tx_ctx_t *)rq_addr; 321 prq = rq_addr;
322 322
323 memset(rsp_addr, 0, rsp_size); 323 memset(rsp_addr, 0, rsp_size);
324 prsp = (nx_cardrsp_tx_ctx_t *)rsp_addr; 324 prsp = rsp_addr;
325 325
326 prq->host_rsp_dma_addr = cpu_to_le64(rsp_phys_addr); 326 prq->host_rsp_dma_addr = cpu_to_le64(rsp_phys_addr);
327 327
@@ -629,7 +629,7 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
629 } 629 }
630 630
631 memset(addr, 0, sizeof(struct netxen_ring_ctx)); 631 memset(addr, 0, sizeof(struct netxen_ring_ctx));
632 recv_ctx->hwctx = (struct netxen_ring_ctx *)addr; 632 recv_ctx->hwctx = addr;
633 recv_ctx->hwctx->ctx_id = cpu_to_le32(port); 633 recv_ctx->hwctx->ctx_id = cpu_to_le32(port);
634 recv_ctx->hwctx->cmd_consumer_offset = 634 recv_ctx->hwctx->cmd_consumer_offset =
635 cpu_to_le64(recv_ctx->phys_addr + 635 cpu_to_le64(recv_ctx->phys_addr +
@@ -648,7 +648,7 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
648 goto err_out_free; 648 goto err_out_free;
649 } 649 }
650 650
651 tx_ring->desc_head = (struct cmd_desc_type0 *)addr; 651 tx_ring->desc_head = addr;
652 652
653 for (ring = 0; ring < adapter->max_rds_rings; ring++) { 653 for (ring = 0; ring < adapter->max_rds_rings; ring++) {
654 rds_ring = &recv_ctx->rds_rings[ring]; 654 rds_ring = &recv_ctx->rds_rings[ring];
@@ -662,7 +662,7 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
662 err = -ENOMEM; 662 err = -ENOMEM;
663 goto err_out_free; 663 goto err_out_free;
664 } 664 }
665 rds_ring->desc_head = (struct rcv_desc *)addr; 665 rds_ring->desc_head = addr;
666 666
667 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) 667 if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
668 rds_ring->crb_rcv_producer = 668 rds_ring->crb_rcv_producer =
@@ -683,7 +683,7 @@ int netxen_alloc_hw_resources(struct netxen_adapter *adapter)
683 err = -ENOMEM; 683 err = -ENOMEM;
684 goto err_out_free; 684 goto err_out_free;
685 } 685 }
686 sds_ring->desc_head = (struct status_desc *)addr; 686 sds_ring->desc_head = addr;
687 687
688 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) { 688 if (NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
689 sds_ring->crb_sts_consumer = 689 sds_ring->crb_sts_consumer =
diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c
index 5cef718fe35..3f89e57cae5 100644
--- a/drivers/net/netxen/netxen_nic_hw.c
+++ b/drivers/net/netxen/netxen_nic_hw.c
@@ -809,6 +809,9 @@ int netxen_config_hw_lro(struct netxen_adapter *adapter, int enable)
809 u64 word; 809 u64 word;
810 int rv = 0; 810 int rv = 0;
811 811
812 if (!test_bit(__NX_FW_ATTACHED, &adapter->state))
813 return 0;
814
812 memset(&req, 0, sizeof(nx_nic_req_t)); 815 memset(&req, 0, sizeof(nx_nic_req_t));
813 816
814 req.qhdr = cpu_to_le64(NX_HOST_REQUEST << 23); 817 req.qhdr = cpu_to_le64(NX_HOST_REQUEST << 23);
@@ -959,6 +962,9 @@ int netxen_send_lro_cleanup(struct netxen_adapter *adapter)
959 u64 word; 962 u64 word;
960 int rv; 963 int rv;
961 964
965 if (!test_bit(__NX_FW_ATTACHED, &adapter->state))
966 return 0;
967
962 memset(&req, 0, sizeof(nx_nic_req_t)); 968 memset(&req, 0, sizeof(nx_nic_req_t));
963 req.qhdr = cpu_to_le64(NX_HOST_REQUEST << 23); 969 req.qhdr = cpu_to_le64(NX_HOST_REQUEST << 23);
964 970
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
index 7f999671c7b..e8993a76a08 100644
--- a/drivers/net/netxen/netxen_nic_init.c
+++ b/drivers/net/netxen/netxen_nic_init.c
@@ -964,6 +964,35 @@ netxen_need_fw_reset(struct netxen_adapter *adapter)
964 return 0; 964 return 0;
965} 965}
966 966
967#define NETXEN_MIN_P3_FW_SUPP NETXEN_VERSION_CODE(4, 0, 505)
968
969int
970netxen_check_flash_fw_compatibility(struct netxen_adapter *adapter)
971{
972 u32 flash_fw_ver, min_fw_ver;
973
974 if (NX_IS_REVISION_P2(adapter->ahw.revision_id))
975 return 0;
976
977 if (netxen_rom_fast_read(adapter,
978 NX_FW_VERSION_OFFSET, (int *)&flash_fw_ver)) {
979 dev_err(&adapter->pdev->dev, "Unable to read flash fw"
980 "version\n");
981 return -EIO;
982 }
983
984 flash_fw_ver = NETXEN_DECODE_VERSION(flash_fw_ver);
985 min_fw_ver = NETXEN_MIN_P3_FW_SUPP;
986 if (flash_fw_ver >= min_fw_ver)
987 return 0;
988
989 dev_info(&adapter->pdev->dev, "Flash fw[%d.%d.%d] is < min fw supported"
990 "[4.0.505]. Please update firmware on flash\n",
991 _major(flash_fw_ver), _minor(flash_fw_ver),
992 _build(flash_fw_ver));
993 return -EINVAL;
994}
995
967static char *fw_name[] = { 996static char *fw_name[] = {
968 NX_P2_MN_ROMIMAGE_NAME, 997 NX_P2_MN_ROMIMAGE_NAME,
969 NX_P3_CT_ROMIMAGE_NAME, 998 NX_P3_CT_ROMIMAGE_NAME,
@@ -1071,10 +1100,12 @@ static int
1071netxen_validate_firmware(struct netxen_adapter *adapter) 1100netxen_validate_firmware(struct netxen_adapter *adapter)
1072{ 1101{
1073 __le32 val; 1102 __le32 val;
1074 u32 ver, min_ver, bios; 1103 __le32 flash_fw_ver;
1104 u32 file_fw_ver, min_ver, bios;
1075 struct pci_dev *pdev = adapter->pdev; 1105 struct pci_dev *pdev = adapter->pdev;
1076 const struct firmware *fw = adapter->fw; 1106 const struct firmware *fw = adapter->fw;
1077 u8 fw_type = adapter->fw_type; 1107 u8 fw_type = adapter->fw_type;
1108 u32 crbinit_fix_fw;
1078 1109
1079 if (fw_type == NX_UNIFIED_ROMIMAGE) { 1110 if (fw_type == NX_UNIFIED_ROMIMAGE) {
1080 if (netxen_nic_validate_unified_romimage(adapter)) 1111 if (netxen_nic_validate_unified_romimage(adapter))
@@ -1091,16 +1122,18 @@ netxen_validate_firmware(struct netxen_adapter *adapter)
1091 val = nx_get_fw_version(adapter); 1122 val = nx_get_fw_version(adapter);
1092 1123
1093 if (NX_IS_REVISION_P3(adapter->ahw.revision_id)) 1124 if (NX_IS_REVISION_P3(adapter->ahw.revision_id))
1094 min_ver = NETXEN_VERSION_CODE(4, 0, 216); 1125 min_ver = NETXEN_MIN_P3_FW_SUPP;
1095 else 1126 else
1096 min_ver = NETXEN_VERSION_CODE(3, 4, 216); 1127 min_ver = NETXEN_VERSION_CODE(3, 4, 216);
1097 1128
1098 ver = NETXEN_DECODE_VERSION(val); 1129 file_fw_ver = NETXEN_DECODE_VERSION(val);
1099 1130
1100 if ((_major(ver) > _NETXEN_NIC_LINUX_MAJOR) || (ver < min_ver)) { 1131 if ((_major(file_fw_ver) > _NETXEN_NIC_LINUX_MAJOR) ||
1132 (file_fw_ver < min_ver)) {
1101 dev_err(&pdev->dev, 1133 dev_err(&pdev->dev,
1102 "%s: firmware version %d.%d.%d unsupported\n", 1134 "%s: firmware version %d.%d.%d unsupported\n",
1103 fw_name[fw_type], _major(ver), _minor(ver), _build(ver)); 1135 fw_name[fw_type], _major(file_fw_ver), _minor(file_fw_ver),
1136 _build(file_fw_ver));
1104 return -EINVAL; 1137 return -EINVAL;
1105 } 1138 }
1106 1139
@@ -1112,17 +1145,34 @@ netxen_validate_firmware(struct netxen_adapter *adapter)
1112 return -EINVAL; 1145 return -EINVAL;
1113 } 1146 }
1114 1147
1115 /* check if flashed firmware is newer */
1116 if (netxen_rom_fast_read(adapter, 1148 if (netxen_rom_fast_read(adapter,
1117 NX_FW_VERSION_OFFSET, (int *)&val)) 1149 NX_FW_VERSION_OFFSET, (int *)&flash_fw_ver)) {
1150 dev_err(&pdev->dev, "Unable to read flash fw version\n");
1118 return -EIO; 1151 return -EIO;
1119 val = NETXEN_DECODE_VERSION(val); 1152 }
1120 if (val > ver) { 1153 flash_fw_ver = NETXEN_DECODE_VERSION(flash_fw_ver);
1121 dev_info(&pdev->dev, "%s: firmware is older than flash\n", 1154
1122 fw_name[fw_type]); 1155 /* New fw from file is not allowed, if fw on flash is < 4.0.554 */
1156 crbinit_fix_fw = NETXEN_VERSION_CODE(4, 0, 554);
1157 if (file_fw_ver >= crbinit_fix_fw && flash_fw_ver < crbinit_fix_fw &&
1158 NX_IS_REVISION_P3(adapter->ahw.revision_id)) {
1159 dev_err(&pdev->dev, "Incompatibility detected between driver "
1160 "and firmware version on flash. This configuration "
1161 "is not recommended. Please update the firmware on "
1162 "flash immediately\n");
1123 return -EINVAL; 1163 return -EINVAL;
1124 } 1164 }
1125 1165
1166 /* check if flashed firmware is newer only for no-mn and P2 case*/
1167 if (!netxen_p3_has_mn(adapter) ||
1168 NX_IS_REVISION_P2(adapter->ahw.revision_id)) {
1169 if (flash_fw_ver > file_fw_ver) {
1170 dev_info(&pdev->dev, "%s: firmware is older than flash\n",
1171 fw_name[fw_type]);
1172 return -EINVAL;
1173 }
1174 }
1175
1126 NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC); 1176 NXWR32(adapter, NETXEN_CAM_RAM(0x1fc), NETXEN_BDINFO_MAGIC);
1127 return 0; 1177 return 0;
1128} 1178}
@@ -1279,7 +1329,7 @@ void netxen_free_dummy_dma(struct netxen_adapter *adapter)
1279 1329
1280 if (--i == 0) 1330 if (--i == 0)
1281 break; 1331 break;
1282 }; 1332 }
1283 } 1333 }
1284 1334
1285 if (i) { 1335 if (i) {
diff --git a/drivers/net/netxen/netxen_nic_main.c b/drivers/net/netxen/netxen_nic_main.c
index c0788a31ff0..f574edff7fc 100644
--- a/drivers/net/netxen/netxen_nic_main.c
+++ b/drivers/net/netxen/netxen_nic_main.c
@@ -92,7 +92,8 @@ static irqreturn_t netxen_msi_intr(int irq, void *data);
92static irqreturn_t netxen_msix_intr(int irq, void *data); 92static irqreturn_t netxen_msix_intr(int irq, void *data);
93 93
94static void netxen_config_indev_addr(struct net_device *dev, unsigned long); 94static void netxen_config_indev_addr(struct net_device *dev, unsigned long);
95static struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev); 95static struct rtnl_link_stats64 *netxen_nic_get_stats(struct net_device *dev,
96 struct rtnl_link_stats64 *stats);
96static int netxen_nic_set_mac(struct net_device *netdev, void *p); 97static int netxen_nic_set_mac(struct net_device *netdev, void *p);
97 98
98/* PCI Device ID Table */ 99/* PCI Device ID Table */
@@ -520,7 +521,7 @@ static const struct net_device_ops netxen_netdev_ops = {
520 .ndo_open = netxen_nic_open, 521 .ndo_open = netxen_nic_open,
521 .ndo_stop = netxen_nic_close, 522 .ndo_stop = netxen_nic_close,
522 .ndo_start_xmit = netxen_nic_xmit_frame, 523 .ndo_start_xmit = netxen_nic_xmit_frame,
523 .ndo_get_stats = netxen_nic_get_stats, 524 .ndo_get_stats64 = netxen_nic_get_stats,
524 .ndo_validate_addr = eth_validate_addr, 525 .ndo_validate_addr = eth_validate_addr,
525 .ndo_set_multicast_list = netxen_set_multicast_list, 526 .ndo_set_multicast_list = netxen_set_multicast_list,
526 .ndo_set_mac_address = netxen_nic_set_mac, 527 .ndo_set_mac_address = netxen_nic_set_mac,
@@ -1387,6 +1388,10 @@ netxen_nic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
1387 break; 1388 break;
1388 } 1389 }
1389 1390
1391 err = netxen_check_flash_fw_compatibility(adapter);
1392 if (err)
1393 goto err_out_iounmap;
1394
1390 if (adapter->portnum == 0) { 1395 if (adapter->portnum == 0) {
1391 val = NXRD32(adapter, NX_CRB_DEV_REF_COUNT); 1396 val = NXRD32(adapter, NX_CRB_DEV_REF_COUNT);
1392 if (val != 0xffffffff && val != 0) { 1397 if (val != 0xffffffff && val != 0) {
@@ -2110,10 +2115,10 @@ request_reset:
2110 clear_bit(__NX_RESETTING, &adapter->state); 2115 clear_bit(__NX_RESETTING, &adapter->state);
2111} 2116}
2112 2117
2113static struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev) 2118static struct rtnl_link_stats64 *netxen_nic_get_stats(struct net_device *netdev,
2119 struct rtnl_link_stats64 *stats)
2114{ 2120{
2115 struct netxen_adapter *adapter = netdev_priv(netdev); 2121 struct netxen_adapter *adapter = netdev_priv(netdev);
2116 struct net_device_stats *stats = &netdev->stats;
2117 2122
2118 stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts; 2123 stats->rx_packets = adapter->stats.rx_pkts + adapter->stats.lro_pkts;
2119 stats->tx_packets = adapter->stats.xmitfinished; 2124 stats->tx_packets = adapter->stats.xmitfinished;