diff options
Diffstat (limited to 'drivers/net/netxen')
-rw-r--r-- | drivers/net/netxen/netxen_nic.h | 5 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_ctx.c | 16 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_hw.c | 6 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 74 | ||||
-rw-r--r-- | drivers/net/netxen/netxen_nic_main.c | 13 |
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); | |||
1302 | int netxen_init_dummy_dma(struct netxen_adapter *adapter); | 1302 | int netxen_init_dummy_dma(struct netxen_adapter *adapter); |
1303 | void netxen_free_dummy_dma(struct netxen_adapter *adapter); | 1303 | void netxen_free_dummy_dma(struct netxen_adapter *adapter); |
1304 | 1304 | ||
1305 | int netxen_check_flash_fw_compatibility(struct netxen_adapter *adapter); | ||
1305 | int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); | 1306 | int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val); |
1306 | int netxen_load_firmware(struct netxen_adapter *adapter); | 1307 | int netxen_load_firmware(struct netxen_adapter *adapter); |
1307 | int netxen_need_fw_reset(struct netxen_adapter *adapter); | 1308 | int 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 | |||
969 | int | ||
970 | netxen_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 | |||
967 | static char *fw_name[] = { | 996 | static 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 | |||
1071 | netxen_validate_firmware(struct netxen_adapter *adapter) | 1100 | netxen_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); | |||
92 | static irqreturn_t netxen_msix_intr(int irq, void *data); | 92 | static irqreturn_t netxen_msix_intr(int irq, void *data); |
93 | 93 | ||
94 | static void netxen_config_indev_addr(struct net_device *dev, unsigned long); | 94 | static void netxen_config_indev_addr(struct net_device *dev, unsigned long); |
95 | static struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev); | 95 | static struct rtnl_link_stats64 *netxen_nic_get_stats(struct net_device *dev, |
96 | struct rtnl_link_stats64 *stats); | ||
96 | static int netxen_nic_set_mac(struct net_device *netdev, void *p); | 97 | static 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 | ||
2113 | static struct net_device_stats *netxen_nic_get_stats(struct net_device *netdev) | 2118 | static 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; |