diff options
Diffstat (limited to 'drivers/net/netxen/netxen_nic_init.c')
-rw-r--r-- | drivers/net/netxen/netxen_nic_init.c | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c index bb23f4c360db..1811bcb8c380 100644 --- a/drivers/net/netxen/netxen_nic_init.c +++ b/drivers/net/netxen/netxen_nic_init.c | |||
@@ -139,6 +139,8 @@ int netxen_init_firmware(struct netxen_adapter *adapter) | |||
139 | return err; | 139 | return err; |
140 | } | 140 | } |
141 | /* Window 1 call */ | 141 | /* Window 1 call */ |
142 | writel(INTR_SCHEME_PERPORT, | ||
143 | NETXEN_CRB_NORMALIZE(adapter, CRB_NIC_CAPABILITIES_HOST)); | ||
142 | writel(MPORT_MULTI_FUNCTION_MODE, | 144 | writel(MPORT_MULTI_FUNCTION_MODE, |
143 | NETXEN_CRB_NORMALIZE(adapter, CRB_MPORT_MODE)); | 145 | NETXEN_CRB_NORMALIZE(adapter, CRB_MPORT_MODE)); |
144 | writel(PHAN_INITIALIZE_ACK, | 146 | writel(PHAN_INITIALIZE_ACK, |
@@ -405,10 +407,7 @@ static inline int do_rom_fast_write(struct netxen_adapter *adapter, int addr, | |||
405 | static inline int | 407 | static inline int |
406 | do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) | 408 | do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp) |
407 | { | 409 | { |
408 | if (jiffies > (last_schedule_time + (8 * HZ))) { | 410 | cond_resched(); |
409 | last_schedule_time = jiffies; | ||
410 | schedule(); | ||
411 | } | ||
412 | 411 | ||
413 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); | 412 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr); |
414 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); | 413 | netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3); |
@@ -854,10 +853,10 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose) | |||
854 | netxen_nic_pci_change_crbwindow(adapter, 1); | 853 | netxen_nic_pci_change_crbwindow(adapter, 1); |
855 | } | 854 | } |
856 | if (init_delay == 1) { | 855 | if (init_delay == 1) { |
857 | ssleep(1); | 856 | msleep(2000); |
858 | init_delay = 0; | 857 | init_delay = 0; |
859 | } | 858 | } |
860 | msleep(1); | 859 | msleep(20); |
861 | } | 860 | } |
862 | kfree(buf); | 861 | kfree(buf); |
863 | 862 | ||
@@ -933,10 +932,6 @@ int netxen_initialize_adapter_offload(struct netxen_adapter *adapter) | |||
933 | void netxen_free_adapter_offload(struct netxen_adapter *adapter) | 932 | void netxen_free_adapter_offload(struct netxen_adapter *adapter) |
934 | { | 933 | { |
935 | if (adapter->dummy_dma.addr) { | 934 | if (adapter->dummy_dma.addr) { |
936 | writel(0, NETXEN_CRB_NORMALIZE(adapter, | ||
937 | CRB_HOST_DUMMY_BUF_ADDR_HI)); | ||
938 | writel(0, NETXEN_CRB_NORMALIZE(adapter, | ||
939 | CRB_HOST_DUMMY_BUF_ADDR_LO)); | ||
940 | pci_free_consistent(adapter->ahw.pdev, | 935 | pci_free_consistent(adapter->ahw.pdev, |
941 | NETXEN_HOST_DUMMY_DMA_SIZE, | 936 | NETXEN_HOST_DUMMY_DMA_SIZE, |
942 | adapter->dummy_dma.addr, | 937 | adapter->dummy_dma.addr, |
@@ -945,25 +940,32 @@ void netxen_free_adapter_offload(struct netxen_adapter *adapter) | |||
945 | } | 940 | } |
946 | } | 941 | } |
947 | 942 | ||
948 | void netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val) | 943 | int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val) |
949 | { | 944 | { |
950 | u32 val = 0; | 945 | u32 val = 0; |
951 | int loops = 0; | 946 | int retries = 30; |
952 | 947 | ||
953 | if (!pegtune_val) { | 948 | if (!pegtune_val) { |
954 | val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE)); | 949 | do { |
955 | while (val != PHAN_INITIALIZE_COMPLETE && | 950 | val = readl(NETXEN_CRB_NORMALIZE |
956 | val != PHAN_INITIALIZE_ACK && loops < 200000) { | ||
957 | udelay(100); | ||
958 | schedule(); | ||
959 | val = | ||
960 | readl(NETXEN_CRB_NORMALIZE | ||
961 | (adapter, CRB_CMDPEG_STATE)); | 951 | (adapter, CRB_CMDPEG_STATE)); |
962 | loops++; | 952 | pegtune_val = readl(NETXEN_CRB_NORMALIZE |
953 | (adapter, NETXEN_ROMUSB_GLB_PEGTUNE_DONE)); | ||
954 | |||
955 | if (val == PHAN_INITIALIZE_COMPLETE || | ||
956 | val == PHAN_INITIALIZE_ACK) | ||
957 | return 0; | ||
958 | |||
959 | msleep(1000); | ||
960 | } while (--retries); | ||
961 | if (!retries) { | ||
962 | printk(KERN_WARNING "netxen_phantom_init: init failed, " | ||
963 | "pegtune_val=%x\n", pegtune_val); | ||
964 | return -1; | ||
963 | } | 965 | } |
964 | if (val != PHAN_INITIALIZE_COMPLETE) | ||
965 | printk("WARNING: Initial boot wait loop failed...\n"); | ||
966 | } | 966 | } |
967 | |||
968 | return 0; | ||
967 | } | 969 | } |
968 | 970 | ||
969 | int netxen_nic_rx_has_work(struct netxen_adapter *adapter) | 971 | int netxen_nic_rx_has_work(struct netxen_adapter *adapter) |
@@ -1120,6 +1122,7 @@ netxen_process_rcv(struct netxen_adapter *adapter, int ctxid, | |||
1120 | adapter->stats.csummed++; | 1122 | adapter->stats.csummed++; |
1121 | skb->ip_summed = CHECKSUM_UNNECESSARY; | 1123 | skb->ip_summed = CHECKSUM_UNNECESSARY; |
1122 | } | 1124 | } |
1125 | skb->dev = netdev; | ||
1123 | if (desc_ctx == RCV_DESC_LRO_CTXID) { | 1126 | if (desc_ctx == RCV_DESC_LRO_CTXID) { |
1124 | /* True length was only available on the last pkt */ | 1127 | /* True length was only available on the last pkt */ |
1125 | skb_put(skb, buffer->lro_length); | 1128 | skb_put(skb, buffer->lro_length); |
@@ -1224,6 +1227,7 @@ u32 netxen_process_rcv_ring(struct netxen_adapter *adapter, int ctxid, int max) | |||
1224 | NETXEN_CRB_NORMALIZE(adapter, | 1227 | NETXEN_CRB_NORMALIZE(adapter, |
1225 | recv_crb_registers[adapter->portnum]. | 1228 | recv_crb_registers[adapter->portnum]. |
1226 | crb_rcv_status_consumer)); | 1229 | crb_rcv_status_consumer)); |
1230 | wmb(); | ||
1227 | } | 1231 | } |
1228 | 1232 | ||
1229 | return count; | 1233 | return count; |
@@ -1276,11 +1280,13 @@ int netxen_process_cmd_ring(unsigned long data) | |||
1276 | if (skb && (cmpxchg(&buffer->skb, skb, 0) == skb)) { | 1280 | if (skb && (cmpxchg(&buffer->skb, skb, 0) == skb)) { |
1277 | pci_unmap_single(pdev, frag->dma, frag->length, | 1281 | pci_unmap_single(pdev, frag->dma, frag->length, |
1278 | PCI_DMA_TODEVICE); | 1282 | PCI_DMA_TODEVICE); |
1283 | frag->dma = 0ULL; | ||
1279 | for (i = 1; i < buffer->frag_count; i++) { | 1284 | for (i = 1; i < buffer->frag_count; i++) { |
1280 | DPRINTK(INFO, "getting fragment no %d\n", i); | 1285 | DPRINTK(INFO, "getting fragment no %d\n", i); |
1281 | frag++; /* Get the next frag */ | 1286 | frag++; /* Get the next frag */ |
1282 | pci_unmap_page(pdev, frag->dma, frag->length, | 1287 | pci_unmap_page(pdev, frag->dma, frag->length, |
1283 | PCI_DMA_TODEVICE); | 1288 | PCI_DMA_TODEVICE); |
1289 | frag->dma = 0ULL; | ||
1284 | } | 1290 | } |
1285 | 1291 | ||
1286 | adapter->stats.skbfreed++; | 1292 | adapter->stats.skbfreed++; |
@@ -1446,6 +1452,7 @@ void netxen_post_rx_buffers(struct netxen_adapter *adapter, u32 ctx, u32 ringid) | |||
1446 | writel(msg, | 1452 | writel(msg, |
1447 | DB_NORMALIZE(adapter, | 1453 | DB_NORMALIZE(adapter, |
1448 | NETXEN_RCV_PRODUCER_OFFSET)); | 1454 | NETXEN_RCV_PRODUCER_OFFSET)); |
1455 | wmb(); | ||
1449 | } | 1456 | } |
1450 | } | 1457 | } |
1451 | } | 1458 | } |