Merge master.kernel.org:/home/rmk/linux-2.6-arm
[pandora-kernel.git] / drivers / net / netxen / netxen_nic_init.c
index f7bb8c9..229aa1c 100644 (file)
 #include "netxen_nic_phan_reg.h"
 
 struct crb_addr_pair {
-       long addr;
-       long data;
+       u32 addr;
+       u32 data;
 };
 
+unsigned long last_schedule_time;
+
 #define NETXEN_MAX_CRB_XFORM 60
 static unsigned int crb_addr_xform[NETXEN_MAX_CRB_XFORM];
-#define NETXEN_ADDR_ERROR ((unsigned long ) 0xffffffff )
+#define NETXEN_ADDR_ERROR (0xffffffff)
 
 #define crb_addr_transform(name) \
        crb_addr_xform[NETXEN_HW_PX_MAP_CRB_##name] = \
@@ -252,10 +254,10 @@ void netxen_initialize_adapter_ops(struct netxen_adapter *adapter)
  * netxen_decode_crb_addr(0 - utility to translate from internal Phantom CRB
  * address to external PCI CRB address.
  */
-unsigned long netxen_decode_crb_addr(unsigned long addr)
+u32 netxen_decode_crb_addr(u32 addr)
 {
        int i;
-       unsigned long base_addr, offset, pci_base;
+       u32 base_addr, offset, pci_base;
 
        crb_addr_transform_setup();
 
@@ -404,9 +406,14 @@ static inline int do_rom_fast_write(struct netxen_adapter *adapter, int addr,
 static inline int
 do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp)
 {
+       if (jiffies > (last_schedule_time + (8 * HZ))) {
+               last_schedule_time = jiffies;
+               schedule();
+       }
+
        netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ADDRESS, addr);
        netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 3);
-       udelay(70);             /* prevent bursting on CRB */
+       udelay(100);            /* prevent bursting on CRB */
        netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
        netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_INSTR_OPCODE, 0xb);
        if (netxen_wait_rom_done(adapter)) {
@@ -415,7 +422,7 @@ do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp)
        }
        /* reset abyte_cnt and dummy_byte_cnt */
        netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_ABYTE_CNT, 0);
-       udelay(70);             /* prevent bursting on CRB */
+       udelay(100);            /* prevent bursting on CRB */
        netxen_nic_reg_write(adapter, NETXEN_ROMUSB_ROM_DUMMY_BYTE_CNT, 0);
 
        *valp = netxen_nic_reg_read(adapter, NETXEN_ROMUSB_ROM_RDATA);
@@ -499,7 +506,10 @@ static inline int do_rom_fast_write_words(struct netxen_adapter *adapter,
                while(1) {
                        int data1;
 
-                       do_rom_fast_read(adapter, addridx, &data1);
+                       ret = do_rom_fast_read(adapter, addridx, &data1);
+                       if (ret < 0)
+                               return ret;
+
                        if (data1 == data)
                                break;
 
@@ -717,6 +727,14 @@ netxen_flash_erase_primary(struct netxen_adapter *adapter)
        return ret;
 }
 
+void netxen_halt_pegs(struct netxen_adapter *adapter)
+{
+        netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_0 + 0x3c, 1);
+        netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_1 + 0x3c, 1);
+        netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_2 + 0x3c, 1);
+        netxen_crb_writelit_adapter(adapter, NETXEN_CRB_PEG_NET_3 + 0x3c, 1);
+}
+
 int netxen_flash_unlock(struct netxen_adapter *adapter)
 {
        int ret = 0;
@@ -745,7 +763,7 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
        int n, i;
        int init_delay = 0;
        struct crb_addr_pair *buf;
-       unsigned long off;
+       u32 off;
 
        /* resetall */
        status = netxen_nic_get_board_info(adapter);
@@ -802,14 +820,13 @@ int netxen_pinit_from_rom(struct netxen_adapter *adapter, int verbose)
                        if (verbose)
                                printk("%s: PCI:     0x%08x == 0x%08x\n",
                                       netxen_nic_driver_name, (unsigned int)
-                                      netxen_decode_crb_addr((unsigned long)
-                                                             addr), val);
+                                      netxen_decode_crb_addr(addr), val);
                }
                for (i = 0; i < n; i++) {
 
-                       off = netxen_decode_crb_addr((unsigned long)buf[i].addr);
+                       off = netxen_decode_crb_addr(buf[i].addr);
                        if (off == NETXEN_ADDR_ERROR) {
-                               printk(KERN_ERR"CRB init value out of range %lx\n",
+                               printk(KERN_ERR"CRB init value out of range %x\n",
                                        buf[i].addr);
                                continue;
                        }
@@ -916,6 +933,10 @@ int netxen_initialize_adapter_offload(struct netxen_adapter *adapter)
 void netxen_free_adapter_offload(struct netxen_adapter *adapter)
 {
        if (adapter->dummy_dma.addr) {
+               writel(0, NETXEN_CRB_NORMALIZE(adapter,
+                       CRB_HOST_DUMMY_BUF_ADDR_HI));
+               writel(0, NETXEN_CRB_NORMALIZE(adapter,
+                       CRB_HOST_DUMMY_BUF_ADDR_LO));
                pci_free_consistent(adapter->ahw.pdev,
                                    NETXEN_HOST_DUMMY_DMA_SIZE,
                                    adapter->dummy_dma.addr,
@@ -1246,7 +1267,7 @@ int netxen_process_cmd_ring(unsigned long data)
         * the netdev which is associated with that device.
         */
 
-       consumer = *(adapter->cmd_consumer);
+       consumer = le32_to_cpu(*(adapter->cmd_consumer));
        if (last_consumer == consumer) {        /* Ring is empty    */
                DPRINTK(INFO, "last_consumer %d == consumer %d\n",
                        last_consumer, consumer);
@@ -1340,7 +1361,7 @@ int netxen_process_cmd_ring(unsigned long data)
        if (adapter->last_cmd_consumer == consumer &&
            (((adapter->cmd_producer + 1) %
              adapter->max_tx_desc_count) == adapter->last_cmd_consumer)) {
-               consumer = *(adapter->cmd_consumer);
+               consumer = le32_to_cpu(*(adapter->cmd_consumer));
        }
        done = (adapter->last_cmd_consumer == consumer);